draw-your-font: turn a photo of your handwriting into an installable TTF
Turn a photo of your handwriting into a real font (TTF/WOFF/WOFF2) - free, open source, no uploads. Node CLI + Claude Code skill.
At a glance
- What is it?
- A Node CLI and Claude Code skill that segments letters from a photo, vectorizes them with potrace, and fits every glyph into a shared 1000-unit em square. It runs locally, ships under MIT, and skips kerning and ligatures entirely.
- Who is it for?
- Adopt it if you want a display or personal font from one or two photographs and you are comfortable running npx; the CLI path needs no AI at all. Skip it if you need kerning, ligatures or letter randomization, because the README places those in v2 and says the current output is a clean single-variant font.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 44 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 17, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What draw-your-font solves, and who it is actually for
Handwriting fonts usually mean a browser editor, an account, and a subscription. draw-your-font takes the other route: you write the alphabet on paper, photograph it, and the tooling on your own machine produces MyHand.ttf. The README states that everything runs locally and that your handwriting never leaves the machine. That single constraint explains most of the design. There is no server to pay for, which is why the project can be free under MIT while a hosted competitor charges monthly.
The audience splits in two. The first group is comfortable in a terminal and knows the order in which they wrote their letters; they can drive the CLI directly. The second group wants to hand over a messy photo and talk about the result. For them the project ships a Claude Code skill that finds letters with vision, labels them, builds the font, previews it, and critiques its own work. Both paths sit on the same deterministic CLI, so the AI layer is optional rather than load-bearing.
One detail in the README is worth repeating because it defines the boundary of the tool: AI never draws your letters, it only finds, labels and judges them. The glyphs always come from your own ink.
The pipeline: threshold, blobs, potrace, shared em-square metrics
The README lays out the stages in a single line: photo, adaptive threshold, blob detection, labeling, potrace vectorize, shared em-square metrics, then TTF/WOFF/WOFF2 plus a preview. Each stage is a separate concern and the CLI exposes them separately through template, segment, build, make and preview.
The interesting stage is the last one before output. Every character gets a vertical band inside a shared 1000-unit em square, covering cap height, x-height and descender depth. The README explains the payoff with a concrete example: your g hangs below the line and your o stays small. Without that normalization you would get glyphs of wildly different sizes that never line up, which is the ransom-note failure mode the project explicitly names.
Vectorization is potrace, and the README notes it is the same engine inside FontForge and Inkscape. That matters for expectations. potrace traces a bitmap into outlines, so the quality ceiling is set by the threshold and blob steps upstream, not by the tracing library. A shadow across the page or a spiral binding cutting through a letter will produce a bad crop, and no amount of smoothing fixes a crop that contains the wrong pixels.
Installing draw-your-font and building a first font
There is nothing to install globally. The README uses npx throughout, and package.json declares a single bin entry, draw-your-font, pointing at src/cli.js, with engines set to node >=18. The dependency list is pure npm: pdfkit, potrace, sharp, svg2ttf, svgpath, ttf2woff and wawoff2. The README is explicit that there are zero system dependencies, so no FontForge, ImageMagick or potrace binary is required, and it works on macOS, Linux and Windows wherever Node 18 or newer runs.
The most reliable first run is the template route, because the character order is fixed by the printed grid rather than guessed. Print the A4 grid, fill it with a dark pen, photograph the pages, then build:
npx draw-your-font template -o template.pdf --charset minimal
npx draw-your-font make page1.jpg page2.jpg --charset minimal --name "My Hand"The first command writes template.pdf; the README also lists spanish as an alternative value for --charset. The second command runs segmentation and building in one shot and, per the README, produces MyHand.ttf. Double-clicking that file installs it.
If you already have a freeform photo and know the order you wrote in, you can skip the template and pass the character sequence directly:
npx draw-your-font make photo.jpg --chars "ABCabc" --name "My Hand"The README shows this exact form and notes the output is MyHand.ttf. Run draw-your-font --help for the full flag list. Two refinement flags are documented: --smooth 0..2 for rounder curves and --weight=-2..2 to go thinner or bolder. For web output, --formats ttf,woff,woff2,css adds the web-ready formats plus an @font-face snippet.
Refining a font without rebuilding it, and the web formats
The split between segment and build is the part of the CLI worth understanding before you commit to a long session. segment takes photos and produces crops, a numbered contact sheet and blobs.json. build turns labeled crops into the font, accepting labels either from --labels, from --chars, or from --charset. make simply chains the two.
That split means a bad glyph does not force you to re-photograph everything. You can inspect the contact sheet, identify which crop is wrong, and rebuild from corrected crops. The README's skill examples lean on the same idea conversationally: asking about a specific letter shows the crop and either fixes it or asks for a re-shoot.
For web use, the --formats flag is the practical one. TTF alone is bulky for a website; WOFF2 is the format you actually want to serve, and the css value emits the @font-face snippet so you do not have to assemble it by hand. The README's own example for this is asking for woff2 plus css for a website. The same section mentions a legibility score and the two worst letter pairs, which is a useful sanity check before you ship a handwriting font into body copy.
Where draw-your-font falls short: no kerning, no ligatures, no variants
The README answers the obvious question directly. Kerning, ligatures and letter randomization are listed as v2, with the fonttools calt pipeline described as planned. The current output is described as a clean single-variant font. If your goal is a text face that sets well at small sizes, that is a real gap, not a cosmetic one. Handwriting glyphs vary in width, and without kerning pairs the spacing between difficult combinations is whatever the sidebearings happen to give you.
The second limitation is upstream. The pipeline depends on segmentation finding discrete blobs in a photo. Adaptive thresholding handles uneven lighting, which is why the README claims napkins, notebooks, spiral binding and bad lighting are what the vision step is for. But a letter that touches its neighbor, or a descender that crosses the line below, gives the blob detector an ambiguous region. The template route exists precisely to remove that ambiguity by fixing the layout.
Finally, this is not a font editor. There is no outline node editing, no manual sidebearing control, no way to redraw a single curve by hand. If you need that, you are looking at the wrong class of tool.
How it compares with Calligraphr and FontForge
The README names Calligraphr and gives a candid account of the difference: their cost is servers and a browser editor, while here your machine does the work and the agent is the editor. That is the whole trade. Calligraphr gives you a hosted grid, a browser interface and no local toolchain. draw-your-font gives you a local pipeline with no account and no upload, at the price of running Node and reading a CLI reference.
The comparison with FontForge is different in kind. FontForge is a full font editor; draw-your-font is a converter with an opinionated metrics step. The README points out that potrace, the vectorizer here, is the same engine inside FontForge and Inkscape, so the tracing quality is comparable. What FontForge adds is everything after tracing: manual outline work, kerning classes, OpenType feature authoring. draw-your-font deliberately does none of that, which is why it can be a single npx command.
A reasonable split is to use draw-your-font to get from paper to a TTF quickly, then open that TTF in a real editor if you need to hand-tune spacing. The README does not document that workflow, but nothing in it prevents it.
Licence, maintenance and what an upgrade would cost you
The project is MIT licensed, and the README states plainly that you own the font, including commercial use, because it is your handwriting. MIT covers the code; the glyphs come from your own writing, so the licence question is mostly about the software rather than the output. This is not legal advice, and if you plan to redistribute a font built from someone else's handwriting you should think about that separately.
The version in package.json is 0.1.0, and the repository was last pushed on 2026-08-05. It is not archived. The dependency set is small and stable: sharp and potrace do the heavy lifting, svg2ttf, ttf2woff and wawoff2 handle conversion, pdfkit generates the template. There are no native binaries to compile beyond what sharp ships, which keeps the upgrade surface narrow.
The upgrade cost that matters is the one the README already flags. When the v2 calt pipeline lands, fonts built today will not retroactively gain kerning or ligatures; you would rebuild from the same crops. Keeping blobs.json and the labeled crops around is cheap insurance, and the segment command is what produces them.
Editorial conclusion
Adopt it if you want a display or personal font from one or two photographs and you are comfortable running npx; the CLI path needs no AI at all. Skip it if you need kerning, ligatures or letter randomization, because the README places those in v2 and says the current output is a clean single-variant font. Before trusting a build, run draw-your-font segment first and open the numbered contact sheet, since a good font depends on clean crops rather than on the vectorizer.
Frequently asked questions
How can I draw my own font with draw-your-font?
Write your alphabet on paper, photograph it, and run the CLI. The README gives two routes: a freeform photo with --chars telling the tool the order you wrote in, or the template command for a printable A4 grid that fixes the order for you. Either way the output is a TTF named after the --name you pass.
How do I make my font with draw-your-font?
The README's one-shot form is npx draw-your-font make photo.jpg --chars "ABCabc" --name "My Hand", which segments and builds in a single step. For best quality it recommends printing a template first, filling it in with a dark pen, and passing the photographed pages with --charset minimal.
Can ChatGPT create a font, or does draw-your-font need an AI at all?
draw-your-font does not need an AI. The README describes the Claude Code skill as a thin layer over a deterministic npm CLI, and the CLI works on its own when you can tell it what you wrote. The project also states that AI never draws your letters; it only finds, labels and judges them.
What app can I use to draw my own font?
draw-your-font is a command line tool rather than a drawing app. The README offers a Claude Code skill for the conversational route and a plain npm CLI for everything else, with no browser editor and no upload. Vectorization is handled by potrace, the same engine inside FontForge and Inkscape.
How do I draw my font with draw-your-font?
Use the template command to print an A4 grid, write your alphabet with a dark pen, photograph the pages and pass them to make with --charset minimal. The README also accepts messy freeform photos when you supply the character order with --chars.
Community notes