Lab

Scrawl, your handwriting as a real font

Draw each letter once on your phone or laptop and get back a working .ttf file of your own handwriting, built in a morning with Claude Code.

See it live ↗
The Scrawl drawing screen, with a large pad showing a hand-drawn lowercase g on baseline and x-height guides, next to a grid of all 79 drawn letters, numbers and punctuation marks
Status Prototype
Started September 2026
Role Product owner, producer, and builder
Stack Claude Code · Python (FastAPI) · potrace · fontTools · Cloudflare Workers · Cloudflare Containers · GitHub Actions

The brief

The handwriting-font apps I found keep your letters locked inside their own keyboard, show ads, and charge by the week. I wanted the opposite: draw each letter once, get a real font file you own, pay once, no ads. On iPhone, a keyboard would let you type in your handwriting and paste it as an image into Messages or Instagram.

I wrote the plan on a Saturday night. By late Sunday morning there was a working web version: draw, generate, type in your font, download the .ttf. It’s a prototype; the iPhone app hasn’t been built yet.

The Scrawl drawing screen: a large pad with cap-height, x-height and baseline guides showing a lowercase g, a font name field, and a grid of all 79 glyphs marked as drawn
The drawing screen. For these screenshots I filled the 79 glyphs with test strokes traced from a handwriting-style system font, not my own hand.

How it works

There’s no AI model inside the product. Turning a drawing into a clean font is a precise, repeatable job, so it runs on proven tools: potrace to trace each letter into curves, and fontTools to build the font file. AI is how it got built. Claude Code wrote the code, working from a plan I approved, and every commit after the plan was made in a session with it.

  1. Draw. One large pad per letter, with guides for capitals, lowercase and the baseline, and a grid of all 79 glyphs (a–z, A–Z, 0–9 and 17 punctuation marks) to jump around. Strokes are smoothed so a finger on glass doesn’t look shaky. Drafts save in the browser as you go.
  2. Check at the edge. A Cloudflare Worker serves the page and screens every request before any real work starts: rate limits, size caps, and checks that every image is actually a PNG of a known letter.
  3. Trace and build. A small Python service in a Cloudflare Container traces each letter, nudges letters that float slightly above the baseline onto it, sets the spacing, and writes the .ttf. It reloads the finished file to check it before sending it back.
  4. Use it. The browser loads the font straight away, so you can type in it, download it, or copy your text as an image for apps that ignore custom fonts.

Nothing is stored on the server. Letters come in, a font goes out.

The Your font panel: a generated font previewing a sentence in handwriting, with Generate font, Download .ttf, Copy as image and Save image buttons
After Generate: the sentence is typed live in the new font, which can be downloaded or copied as an image.
A type specimen of a generated handwriting font: large Aa Gg and an orange ampersand and question mark, then the full lowercase, uppercase, numbers, punctuation and two pangrams
A specimen set from the .ttf the tool generated from those test strokes.

Where I sign off

  • The product calls. No ads, a one-time purchase, and the user gets the actual font file. Those three points are the whole case against the competition, and they’re written at the top of the plan so every build decision gets checked against them.
  • Hosting. Claude laid out four options; I picked Cloudflare: one platform, close to $5 a month at launch, and it sleeps when nobody’s using it. The reasoning is written down as a decision record in the repo.
  • Privacy. I chose not to store anyone’s handwriting at all. That ruled out accounts and cloud sync for version one, on purpose.
  • Scope. The plan runs in phases with checkboxes, and I keep it honest: the boxes that aren’t done say why, like the real-phone test that still hasn’t happened.

What broke

  • The server is slower than my laptop. On Cloudflare, a full 79-letter font takes about 3 seconds warm and 4 to 7 seconds after the service has been asleep, against 0.7 seconds on my Mac. Fine for a one-off button press, and it’s measured so I know what it costs.
  • iPad tapping did nothing. After generating, the page put the cursor in the preview box. On iPad that left the box focused with no keyboard showing, so tapping it did nothing. The fix was to stop doing it.
  • Safari can delete your work. Drafts live only in the browser, and Safari can clear site storage on its own. I added a backup-and-restore file before anyone could lose a font.
  • Fonts don’t survive Messages. Pasting text into most chat apps drops the font, so I added “Copy as image”: your sentence as a picture, with ink options for light and dark chats.
  • A plan change for the better. The first plan drew preview images on the server for every keystroke. Browsers can load a font file directly, so that whole step was cut.

What’s next

  • Try the web version on a real phone, then send the link to five people and collect their fonts.
  • Draw a real handwriting set of my own as the test standard.
  • Spacing. Each letter’s width comes from its ink, so a long hook on a j or a 9 opens a gap you can see in the specimen above. There’s no kerning yet.
  • The iPhone app: Apple Pencil drawing, the keyboard, and the one-time unlock.

← All Lab projects