HandWritingBench: Turns out, LLMs tend to "write" pretty badly

A benchmark testing whether LLMs' writing capabilities transfer to literally being able to write via computer use

Figure 1. Five models handwriting the same letter, replayed from their logged mouse strokes. Each drawing is squeezed into the same three seconds; underneath is how long the model really took and what the scorer read.

Most of what we ask computer-use agents to do is click: buttons, links, the odd dropdown. I wanted to see what happens when you ask for something a little more physical, so in this post I ask a question that sounds almost too simple: can a computer-use agent write by hand? Not type the letter. Push the mouse around and draw it.

HandWritingBench is 5,619 letters from 138 writing systems, one letter per task, each graded by a classifier trained for that script. I ran five cheap models on all of it, three times per letter. Every model can write Latin, but almost none can write Devanagari, Thai or Tamil, and the best predictor of failure is how curvy the letter is. The best model, Claude Haiku 5.5, gets 11.5% of letters right overall and 80% of Latin ones. A scripted agent that just traces a font through the same canvas and scorer gets 96% to 99% everywhere, so the canvas and the grader aren't what's failing.

1. The task

A browser page with a prompt above a white square canvas. The canvas has a solid top line, a dashed middle line and a solid baseline. A Cyrillic zhe is drawn on it, and Clear and Done buttons sit beside it.
Figure 2. The whole task, right after Haiku 5.5 drew a Cyrillic ж. The prompt names the letter and shows it; the guide lines are how the scorer tells c from C.

The agent gets a prompt ("Handwrite the Greek small letter alpha (α) in the white box using the mouse, like you would with a pen"), a box with guide lines, and a mouse. Whatever is on the canvas at the end gets scored. The canvas ignores synthetic JavaScript events and redraws the scored image from logged pointer strokes, so the only way to get ink down is to actually drag.11 None of the five models tried anything else anyway.

Grading crops the ink, skeletonizes it, redraws it at a fixed pen width and hands it to a small CNN for that script. Latin's trains on EMNIST; most others train on fonts, plus human handwriting for the 20 scripts that have a dataset. A benchmark like this is only as good as its scorer, so every scorer gets checked on held-out fonts and writers, on that scripted tracer (the ceiling), and on controls that should score zero, like perfectly drawing the wrong letter (accepted at most 5% of the time in any script).

Scorer accuracy on held-out human handwriting
ScriptDatasetTest samplesAccuracy
LatinEMNIST20,80093.8%
GreekGCDB8,21385%
CyrillicCoMNIST (23 letters)1,96497%
ArabicAHCD3,36090%
DevanagariDHCD + NHCD12,70498%
TamiluTHCD3,44899%
ThaiBurapha-TH8,45997%
JapaneseETL1 + ETL717,90898%

All 20, with licenses, are in the repo. Several are research use only, and so are the scorers trained on them.

2. Every model writes Latin. None writes Devanagari.

I ran five low-cost models with thinking off: Claude Haiku 5.5, GPT-6 Luna, Qwen3.8 Flash, DeepSeek V4.1 Flash and Gemini 3.1 Flash-Lite.

Claude Haiku 5.5
11.5%
Qwen3.8 Flash
10.7%
DeepSeek V4.1 Flash
9.3%
Gemini 3.1 Flash-Lite
8.1%
GPT-6 Luna
7.2%
0%5%10%15%20%
Figure 3. Haiku 5.5 is the most accurate, and the rest sit about a point apart. Accuracy over all 5,619 letters, 3 trials each, with 95% intervals clustered by letter. Continuity, cost and two confidence scores (log probability and Brier, secondary) are in the other tabs; the hollow cost marker is an estimate.

Haiku's lead over Qwen is small, 0.8 points, but holds up in a paired comparison (95% interval 0.1 to 1.4). The more interesting thing is the cliff behind the average (Table 1). Every model gets more than half of Latin right, Greek and Cyrillic aren't far behind, and then it falls apart: under 12% on Devanagari, Thai and Tamil, and 5% to 9% across the other 128 scripts.

ScriptHaiku 5.5Qwen3.8 FlashDeepSeek V4.1 FlashGemini 3.1 Flash-LiteGPT-6 Lunatrace (ceiling)
Latin80%67%70%54%64%100%
Greek78%65%71%49%54%100%
Cyrillic60%57%57%30%38%100%
Hangul36%36%40%40%18%98%
Hebrew24%21%22%17%19%93%
Arabic19%24%17%16%13%100%
Japanese16%12%25%17%17%100%
Devanagari6%3%4%11%3%100%
Thai4%4%5%2%6%100%
Tamil3%5%4%12%1%100%
128 other scripts9%8%6%6%5%97%
Table 1. Accuracy by script. The last column is the scripted tracer, roughly the ceiling for perfect motor control.

You might reasonably suspect the Devanagari scorer is just strict. It isn't: it reads held-out human handwriting at 98% and the tracer at 100%. And these aren't near misses, since the right letter is in the scorer's top five guesses only 20% to 26% of the time.

every drawing takes 3 s here
Figure 4. Clean strokes, wrong shapes. Each model's first trial on eight letters, all squeezed into the same three seconds (the real ones took anywhere from under a second to over four and a half minutes). Green is correct; each cell shows what the scorer read.

What I find weirdest is that the letter is printed right there in the prompt, in 17-pixel text. So this is closer to copying than to recalling, and they still can't do it. Strokes are smooth and land on the guide lines; Hangul ㄱ, two straight lines, comes out right for four models of five. Devanagari क comes out as a box, or as some other letter. I can't tell from this data whether the models can't make out a glyph that small or just can't turn what they see into strokes. Probably some of both, but it really made me think about how lots of people can speak and read all sorts of languages fluently but can barely write; these agents seem to exhibit something similar here.

The scorer gives one more way to look at this. Its last hidden layer is a decent map of what handwriting looks like, so I measured how far each drawing lands from real people's handwriting of the same letter (Figure 5). In Greek and Cyrillic, a model drawing that gets read correctly is about as close to human handwriting as another person's is. In Devanagari and Tamil, even the couple dozen drawings that pass sit four to eight times farther out than a typical human sample. They aren't messy versions of the letter; they're shapes that just happen to land closer to the right letter than to any other.

0.00.20.40.60.8distance to the nearest real handwriting of the same letterGreekGreek, other people: median 0.167 (n=3840)Greek, scripted tracer: median 0.17 (n=48)Greek, models, read correctly: median 0.148 (n=462)Greek, models, read wrong: median 0.505 (n=255)CyrillicCyrillic, other people: median 0.083 (n=1798)Cyrillic, scripted tracer: median 0.062 (n=23)Cyrillic, models, read correctly: median 0.081 (n=181)Cyrillic, models, read wrong: median 0.539 (n=160)DevanagariDevanagari, other people: median 0.062 (n=2640)Devanagari, scripted tracer: median 0.074 (n=33)Devanagari, models, read correctly: median 0.256 (n=25)Devanagari, models, read wrong: median 0.626 (n=466)TamilTamil, other people: median 0.044 (n=2480)Tamil, scripted tracer: median 0.067 (n=31)Tamil, models, read correctly: median 0.339 (n=24)Tamil, models, read wrong: median 0.64 (n=434)
other peoplescripted tracermodels, read correctlymodels, read wrong
Figure 5. Even the successes in Devanagari and Tamil don't look like handwriting. Cosine distance, in the scorer's last hidden layer, from each drawing to the five nearest held-out human samples of the same letter; dots are medians and bars the middle half. All five models are pooled; in Devanagari and Tamil only 25 and 24 of their drawings were read correctly.

A "correct" also isn't always a confident one (Figure 6). When the scorer reads a letter right it's usually sure of it, but in Devanagari, Thai and Tamil the median correct letter gets only 73%, and a quarter of them get under half.

0%25%50%75%100%scorer's confidence in the right letterHaiku 5.5Qwen3.8 FlashDeepSeek V4.1Gemini 3.1 LiteGPT-6 Luna
read correctlyread wrongmean
Hover or tap a row for its mean and standard deviation.
Figure 6. The scorer's confidence in the right letter, for letters it read correctly and for the rest. Dots are medians, bars the middle half, ticks the mean; hover over or tap a row for its standard deviation. Wrong letters almost never get any real probability on the right answer.

3. What makes a letter hard?

Script-level numbers hide a lot, so I measured a few things about every letter and checked which ones predict failure. The one that wins is curviness: drive a pen along the letter and add up how far it turns (Figure 7); in regards to afety/alignment, considering that human handwriting tends to be curvy, I'm glad this at least tells us LLMs are (for now) incapable of falsifying signatures.

total turning of the pen
Figure 7. Curviness is the total turning of the pen along the letter, measured on the tracer's drawing of a held-out font. An l turns 0°, an O about 340°, Tamil க about 880°.

The other candidates were how many people use the script (from Unicode's CLDR population data22 Population times the share speaking each language, per country, summed over languages whose main script it is. Second-language speakers count, so Latin comes to about 5 billion and Arabic 1.7 billion; 96 of the 138 scripts aren't any living language's main script. ), the fewest strokes the letter needs, and the alphabet's size, which sets the scorer's chance level.

0%5%10%15%20%25%0–289°1,108 letters289–446°1,108 letters446–609°1,108 letters609–835°1,108 letters835°+1,108 letterstotal turning of the letter’s strokes (fifths of all letters)Claude Haiku 5.5: 24%Claude Haiku 5.5: 15.3%Claude Haiku 5.5: 8.2%Claude Haiku 5.5: 4.6%Claude Haiku 5.5: 2.3%Qwen3.8 Flash: 21.8%Qwen3.8 Flash: 15.2%Qwen3.8 Flash: 8.2%Qwen3.8 Flash: 4.5%Qwen3.8 Flash: 2%DeepSeek V4.1 Flash: 19.3%DeepSeek V4.1 Flash: 13.1%DeepSeek V4.1 Flash: 6.5%DeepSeek V4.1 Flash: 3.5%DeepSeek V4.1 Flash: 1.7%Gemini 3.1 Flash-Lite: 15.1%Gemini 3.1 Flash-Lite: 10.5%Gemini 3.1 Flash-Lite: 5.8%Gemini 3.1 Flash-Lite: 4.3%Gemini 3.1 Flash-Lite: 3%GPT-6 Luna: 12.6%GPT-6 Luna: 9.8%GPT-6 Luna: 4.6%GPT-6 Luna: 3.5%GPT-6 Luna: 3.1%
Claude Haiku 5.5Qwen3.8 FlashDeepSeek V4.1 FlashGemini 3.1 Flash-LiteGPT-6 Luna
Figure 8. Accuracy falls steadily with curviness, for every model. Mean accuracy in each bin, one line per model; curviness bins are fifths of all letters. The jump past a billion users is mostly Latin (the only other script that big is Arabic).

On the least curvy fifth of letters the models average 19%; on the curviest fifth, 2%. The tracer gets 96% to 99% in every one of those bins, so it isn't the scorer. Popularity mostly matters at the very top (57% for Latin and Arabic, 18% for scripts with 100 million to a billion users, 6% to 12% below that), more strokes hurt a little, and alphabet size doesn't matter.

The four measures barely correlate (no pair above 0.15), so a logistic regression can pull them apart.

-1.5-1-0.50+0.5+1change in log-odds of a correct letter, per standard deviationcurviness±337° of turningClaude Haiku 5.5: -1.12 ± 0.20Qwen3.8 Flash: -1.06 ± 0.20DeepSeek V4.1 Flash: -1.18 ± 0.20Gemini 3.1 Flash-Lite: -0.8 ± 0.22GPT-6 Luna: -0.78 ± 0.27script users±3.4 orders of magnitudeClaude Haiku 5.5: +0.38 ± 0.27Qwen3.8 Flash: +0.36 ± 0.27DeepSeek V4.1 Flash: +0.56 ± 0.25Gemini 3.1 Flash-Lite: +0.49 ± 0.22GPT-6 Luna: +0.51 ± 0.27strokes needed±1 strokeClaude Haiku 5.5: -0.31 ± 0.16Qwen3.8 Flash: -0.29 ± 0.12DeepSeek V4.1 Flash: -0.31 ± 0.10Gemini 3.1 Flash-Lite: -0.14 ± 0.10GPT-6 Luna: -0.36 ± 0.16alphabet size×1.5 lettersClaude Haiku 5.5: +0.03 ± 0.16Qwen3.8 Flash: -0.06 ± 0.16DeepSeek V4.1 Flash: +0.02 ± 0.20Gemini 3.1 Flash-Lite: -0.15 ± 0.16GPT-6 Luna: -0.06 ± 0.18
Claude Haiku 5.5Qwen3.8 FlashDeepSeek V4.1 FlashGemini 3.1 Flash-LiteGPT-6 Luna
Figure 9. Change in the log-odds of a correct letter per standard deviation of each measure, all four in one regression per model, 95% intervals clustered by alphabet. One standard deviation of curviness is 337° of turning; of script users, a factor of about 2,300.

Roughly, 340° more turning cuts the odds of a correct letter by 55% to 70%, depending on the model. That's a bigger effect than going from a script with a few hundred thousand users to one with a billion.

4. Haiku lifts the pen, Gemini and Luna retrace.

How the letter gets drawn is its own story. Each letter has a fewest-strokes count (H needs 3, N needs 1), and continuity is how close a correct drawing comes to it without going back over its own lines.33 Stroke ratio (fewest strokes over strokes used) times one minus the share of ink that retraces. It's descriptive here; --continuous asks for few strokes in the prompt and grades it, and I haven't run that yet.

ModelStrokesStroke ratioRetracedActionsSeconds
Haiku 5.52.60.711.0%43.915
Qwen3.8 Flash2.30.831.1%13.864
DeepSeek V4.1 Flash1.90.821.2%10.019
Gemini 3.1 Flash-Lite1.80.875.1%2.93
GPT-6 Luna1.70.866.2%12.029
Table 2. Run profile per letter, means over all 16,857 trials. Stroke ratio and retracing are over correct letters only.

Haiku draws the way people print: separate strokes, lots of tiny mouse moves, almost no retracing. It's the least "continuous" model and also the most accurate. Gemini is the opposite, putting a whole letter down in one or two drags in about three seconds, and going back over five times as much of its own ink.

5. Cost

The full runs cost $28 (Gemini), $38 (Haiku), $41 (Luna), $42 (DeepSeek) and $94 (Qwen, which takes a minute a letter). In case you're wondering: yes—my free credits do not come even close to how much I'd need to test the strongest models available out there (but if you can, please feel free to test them out here or reach out if you'd like to support this project!).

So, can they write?

Sort of. They can hold the pen, and on the script they've most likely seen drawn, they mostly get the letter right. Everywhere else they make clean strokes in the wrong shape, even with the letter printed right above the box. I'd love to see what a frontier model with reasoning does on the bottom of Table 1. The code, data and every run's raw strokes are on GitHub and Hugging Face, --split lite runs a 620-letter version for a few bucks. If you run something bigger on it, please do send me the strokes!

Limitations

  • The scorers. 117 of the 138 have only seen fonts, so a long-tail letter written the way people actually write it can be marked wrong. Their confidence is calibrated with a single temperature fit, which is why the log and Brier scores stay secondary.
  • The models. Five cheap ones, thinking off, three trials per letter.
  • No human baseline. Nobody has written these 5,619 letters through the same canvas with a mouse yet.
  • The difficulty measures. Curviness comes from one held-out font per letter, and the population counts include second-language speakers.
  • Small samples where it matters most. Only 25 Devanagari and 24 Tamil drawings were read correctly, so the bottom two rows of Figure 5 rest on few points.
  • Scope. One letter at a time: no words, no joined Arabic, no CJK.

Footnotes

  1. None of the five models tried anything else anyway. ↩

  2. Population times the share speaking each language, per country, summed over languages whose main script it is. Second-language speakers count, so Latin comes to about 5 billion and Arabic 1.7 billion; 96 of the 138 scripts aren't any living language's main script. ↩

  3. Stroke ratio (fewest strokes over strokes used) times one minus the share of ink that retraces. It's descriptive here; --continuous asks for few strokes in the prompt and grades it, and I haven't run that yet. ↩

Cite this post
@misc{gani2026handwritingbench,
  author = {Gani, Hassam},
  title = {HandWritingBench: Turns out, LLMs tend to "write" pretty badly},
  year = {2026},
  month = {oct},
  url = {https://hassamgani.com/blog/handwritingbench}
}

← All posts