Set up local AI
Install two programs, clone one repo, and train your first model in five minutes.
| Status | Hello world demos are public; the models are small on purpose |
|---|---|
| Stability | Experimental; commands and model formats can change |
What You Need
A mid-range computer: an Apple Silicon laptop, a Linux PC with a gaming GPU, or a plain CPU with patience. Rust stable from rustup.rs. About 1 GB of disk for the chat model, more for the larger sizes.
Everything runs on your machine. No account, no API key, and nothing is sent anywhere.
Install Two Programs
runebender is the editor. font-ml runs and trains the models. Build font-ml with metal on macOS, cuda on Linux with a working NVIDIA toolkit, and no feature flag otherwise.
cargo install --git https://github.com/fontgarden/runebendercargo install --git https://github.com/eliheuer/font-ml --features metalcargo install --git https://github.com/eliheuer/font-ml --features cudacargo install --git https://github.com/eliheuer/font-ml The last three commands are alternatives. Check both programs answer:
runebender --helpfont-ml tasks font-ml tasks is authoritative: only tasks marked ready are usable. The demos use draw, train-draw, bolden, and train.
Clone the Demo Repo
runebender-local-ai-demo holds everything the demos need: a small font family made for training, scripts, node graphs, and a checked-in copy of the first model in case your training run fails. Large models are never in the repo; a script downloads them from a named URL and checks the hash.
git clone https://github.com/eliheuer/runebender-local-ai-democd runebender-local-ai-demo Work through the numbered folders in order. Each has a README.
| Demo | What you do |
|---|---|
01-draw-from-text | Train a shapes model inside the editor, then drag a box, type “star”, and the local AI shapes tool fills it |
02-train-and-bolden | Train a model on the Shapes font, then bolden a new shape in the editor |
03-chat-model | Download a small open chat model from Hugging Face and ask it about the font |
04-nodes | The same train and bolden steps as a node graph |
05-real-font | The bolden loop on Virtua Grotesk, a real typeface |
Train Your First Model
runebender fonts/Shapes.ufo Open any glyph. In the toolbar, hold the shapes button and pick Local AI Shapes. The right panel shows the Local AI Shapes section: with no model yet it offers Quick or Thorough training and two buttons, Train From This Font and Train From the Sample Shapes. Click the second. The panel shows the time left and what the model draws right now; a quick run takes about twelve minutes on a laptop GPU, a thorough one about thirty.
When it finishes, the panel lists the shapes the model knows. Click one, then drag a box on the glyph. The model fills the box with a ghost. Enter keeps it as one undo step, Tab asks for another option, Esc drops it. Drag the box’s handles to resize it and the shape is drawn again to fit.
The model knows only the shapes in the font and the words for them. A glyph named circle taught it “circle”; “heart” is not in the list until you draw one and click Add This Font’s Shapes, which adds it to the model in about two minutes. That is the whole lesson: your drawings in, a model out, the model used from a tool.
The demo repo has the same run as a script, 01-draw-from-text/train.sh, and 01-draw-from-text/get-base-model.sh, which downloads a trained base from the repo’s releases with a checksum, to skip the wait.
Where Models Live
A model is a directory. The editor reads them from ~/Runebender/models, a visible folder you can open in Finder and drop a model into, sorted by kind: shapes/, bolden/, chat/. A font’s own models live beside it in MyFont.models/, so they travel with the font. RUNEBENDER_MODELS overrides the root for one run, and ~/Runebender/model_paths lists extra folders, one per line. The older ~/.runebender/models is still read.
| Kind | Files | Comes from |
|---|---|---|
| Shapes model | config.json, weights.safetensors, vocab.txt, manifest.json | The Local AI shapes tool trains it from a UFO |
| Bolden model | config.json, weights.safetensors, vocab.txt | font-ml run train from two masters |
| Chat model | model.gguf, tokenizer.json | You download it; the demo script fetches Qwen3 from Hugging Face |
The kinds are different artifacts. A chat model does not draw shapes, and a shapes model does not talk.
Recover from Common Failures
- No model in the editor: the directory must sit under
~/Runebender/models/<kind>/or beside the font inMyFont.models/<kind>/. CheckRUNEBENDER_MODELSif you set it. font-mlis missing: Cargo’s bin directory is not onPATH.- A GPU request fails: add
--device cpu, or rebuildfont-mlwithout the feature flag. - Training fails: run
./01-draw-from-text/get-base-model.shin the demo repo and carry on with the editor steps. - A download fails: the script resumes where it stopped. Run it again.
- A chat answer is wrong: expected at 0.6B. The script fetches 1.7B and 4B too; 4B is what the Chat panel was built with.
Continue with Local Models for what the editor does with a model, and Type design with agents for the working method.