swageswagehandshape practice

on-device · no upload · 24 handshapes

Show your hand. It names the handshape, live.

A classifier this project trained and evaluated itself — 4,200 parameters, 39.3KB, committed to the repo — grades your webcam frame in the browser. The camera feed never leaves your device.

This checks handshapes, not ASL. ASL is a full language with its own grammar and facial and body grammar this tool doesn't see.

no accounts no server write path no LLM

eval-report.json · 281 held-out samplesprovisional
A1.00
B0.91
C1.00
D0.90
E0.95
F0.94
G0.90
H1.00
I1.00
K0.95
L1.00
M0.96
N0.96
O1.00
P1.00
Q0.97
R0.90
S0.92
T0.95
U0.97
V0.92
W1.00
X0.93
Y0.96

F1 ≥ 0.950.85–0.95below 0.85J and Z are absent: both need traced motion

Confusable pairs the eval actually found: X/G · D/B · D/E · F/B · G/Q · K/V. The practice drill picks from this list — the published eval decides what to drill, not a hardcoded guess.

95.7%provisional accuracy281 held-out samples
24handshapesJ and Z need motion
39.3KB of weights~4,200 parameters, committed
0frames uploadedone model fetch, then nothing

the number, with its caveat attached

95.7% — and why that is not the ship bar.

The full 24×24 confusion matrix and the per-letter precision/recall/F1 table come from this same run and are published in full on Concept & eval — not summarised in prose here.

no black box

Every prediction runs these seven steps, in your browser.

The page imports the same normalize.ts the trainer imports, so the model and the code running it cannot silently drift apart.

21 landmarks → 63-dim vector → MLP (63 · 48 · 24) → held letter
normalize.ts + classifier.ts pipelineTwenty-one raw hand landmarks are mirrored to a canonical right hand, translated so the wrist is the origin, scaled by the wrist-to-middle-knuckle distance, and rotated to a fixed angle, producing a 63-dimensional vector. A small MLP (63 to 48 to 24) turns that vector into a letter, shown in amber once the prediction is held stable.21 raw landmarksmirror (L→R)translatescalerotate63-dim vectorMLP (48 hidden)held letter

MediaPipe's Hand Landmarker produces 21 raw points. They are mirrored to a canonical right hand, translated to the wrist, scaled by the wrist-to-knuckle distance and rotated to a fixed angle. The only network request this product makes is MediaPipe's one-time download.

stated up front

What it deliberately does not do.

Translate or understand ASL

It matches a static handshape against a target letter. Nothing more.

Offer J or Z

A B C D E F G H I K L M N O P Q R S T U V W X Y — 24 classes. Both missing letters need traced motion a single held frame cannot see.

Keep accounts or send analytics

Progress lives in your browser's localStorage and nowhere else.

Call an LLM

The classifier is ~4,200 numbers, trained once and committed to the repo.

Twelve named failure modes — no camera, GPU rejected, model fetch fails, low-confidence prediction, localStorage unavailable, and eight more — each with a stated contract instead of a silent broken state. The full table · Limitations · Source