Skip to main content
← SoftwareBonus material

✒️ Scriptorium

Print a template, fill it in by hand, photograph it, and get back a real OpenType font with letters that change shape as you write. The parts the paid handwriting-font services charge for — large templates and automatic alternate rules — are the cheapest parts of the pipeline to build, so here they are free. Everything runs in your browser; nothing is uploaded.

✒️
Open Scriptorium

Make a template · fill it in · drop the sheets back · download your .otf

Launch →
🔁
Letters that change shape

Draw a handful of versions of each letter and they are wired into a cycle: every repeat of a letter reaches for the next form, so 'aaaa' never shows the same 'a' twice. These are real OpenType contextual alternates, not a gimmick — and they are the specific feature the paid services charge for.

∞
No glyph limit

The template generator has no tier. Ask for 174 cells across three sheets and you get them; ask for more and you get more. Accented letters are assembled from a base letter and a mark you drew once, using Unicode's own decomposition tables, so sixty-odd extra characters cost ten boxes rather than sixty.

🔒
Nothing is uploaded

Tracing, metrics, font assembly and feature generation all run inside the page as WebAssembly. Your handwriting never touches a server, because there isn't one — and the finished font is loaded straight back into the page as a web font, so the preview you type into is the actual output.

🖊️
Non-photo blue guides

Every guide line is printed in a blue the scanner discards outright; only the corner fiducials are black. Taking the red channel erases the grid and leaves the ink, with no thresholding heuristics and no line-removal step. It is the difference between a pipeline that mostly works and one that fights you.

📐
It never guesses the layout

The generator emits the geometry alongside the PDF, recording where every cell sits relative to four corner squares. The scanner finds the squares, solves one perspective transform, and reads cells out by index. A row of marks encodes the sheet number in binary, so sheets can be fed back in any order.

⌨️
A terminal cut, if you want one

Tick one box and every glyph gets an identical cell, properly flagged fixed-pitch. Letters too wide to fit — m, w, W — are narrowed rather than allowed to collide with their neighbours. Your own handwriting, in your editor.

Filling in the sheet

Print at 100% scale — not “fit to page” — or the geometry will not match the paper. Use a black fineliner or gel pen around 0.5 mm; pencil and ballpoint come out too faint and felt tip bleeds. Write each letter as it appears in the middle of a word, not in isolation: letters drawn alone have entry and exit strokes that never meet their neighbours, and that single thing decides whether the font reads as writing or as a ransom note. Keep to the baseline, and let the variants differ the way your hand already differs from itself — deliberately distinct designs read as four fonts fighting rather than one hand writing.

How it works

Ink is isolated by taking the red channel, which the non-photo blue guides vanish from entirely. Each cell is thresholded by Otsu, cleaned with binary morphology, and traced by marching squares; the resulting polygons are simplified by Ramer–Douglas–Peucker and fitted with Schneider’s algorithm into Bézier curves, split at corners first so a sharp reversal cannot be smoothed into a self-intersection. Baselines are regularised, lowercase and uppercase are scaled independently to a chosen cap-height ratio, side bearings are measured from the ink rather than the box, and the result is assembled into a CFF OpenType font with generated calt rules. All of it in pure NumPy — the imaging routines are reimplemented from scratch specifically so the browser build is 7.5 MB rather than 45 MB.

Free software under the GPL · source · fonts you make are yours, the licence covers the tool and not its output.