Set up local AI

Install two programs, clone one repo, and train your first model in five minutes.

StatusHello world demos are public; the models are small on purpose
StabilityExperimental; 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.

DemoWhat you do
01-draw-from-textTrain a shapes model inside the editor, then drag a box, type “star”, and the local AI shapes tool fills it
02-train-and-boldenTrain a model on the Shapes font, then bolden a new shape in the editor
03-chat-modelDownload a small open chat model from Hugging Face and ask it about the font
04-nodesThe same train and bolden steps as a node graph
05-real-fontThe 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.

KindFilesComes from
Shapes modelconfig.json, weights.safetensors, vocab.txt, manifest.jsonThe Local AI shapes tool trains it from a UFO
Bolden modelconfig.json, weights.safetensors, vocab.txtfont-ml run train from two masters
Chat modelmodel.gguf, tokenizer.jsonYou 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 in MyFont.models/<kind>/. Check RUNEBENDER_MODELS if you set it.
  • font-ml is missing: Cargo’s bin directory is not on PATH.
  • A GPU request fails: add --device cpu, or rebuild font-ml without the feature flag.
  • Training fails: run ./01-draw-from-text/get-base-model.sh in 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.