Agents
Runebender holds no API keys and calls no model service. An agent edits the sources, and the editor follows.
| Status | The file-watching seam works today; there is no in-editor assistant |
|---|---|
| Stability | Stable, because it depends on UFO rather than on an editor API |
The Seam
An agent does not talk to Runebender. It edits the UFO and designspace files on disk, and the editor reloads what changed.
That is the whole integration. It needs no plugin API, no key in the application, and no permission from the editor. The agent works with files, which is what agents are already good at.
| The agent | Reads and writes UFO sources, runs builds, runs checks, reads the results. |
|---|---|
| The editor | Reloads changed files, draws them, and saves your edits back. |
| The file | The only thing both sides touch. |
Keep the editor open while an agent works. Changes appear as you watch, which is the fastest way to catch a bad edit early.
Subscriptions and Keys
Runebender does not store credentials and never sends your work anywhere. You bring your own agent, and it uses whatever account you already pay for.
| A coding agent | Claude Code, Codex, or any other. It signs in through its own tooling, not through Runebender. |
|---|---|
| A local model | Runs on your machine through font-ml. No account, no network. |
Because the seam is the filesystem, changing which service you use changes nothing about Runebender.
Setting Up a Repository
An agent works better on a font repository than on a loose UFO. Give it the same things a new collaborator would need.
- Put the sources in a repository, so every edit is reviewable and revertible.
- Write down the build and check commands where the agent will read them.
- Say what the font’s rules are: the grid, the metrics, the naming.
- Point it at
https://runebender.org/llms-full.txtfor the manual in one file.
runebender-gpui sources/Font.designspacecurl -O https://runebender.org/llms-full.txt Agents read a repository’s own instructions file, AGENTS.md or
CLAUDE.md, before anything else. That file is where the font’s
rules belong.
What an Agent Should Not Break
Type design has constraints that are invisible in a diff and expensive to undo. State them, because an agent will not infer them.
| Point compatibility | Masters must keep the same contours, the same points, in the same order. Break it and the family stops interpolating. |
|---|---|
| Contour direction | Outer contours run one way and counters the other. A reversed contour fills a hole. |
| Start points | Rotating where a contour starts is invisible in one master and fatal across two. |
| The grid | If the family is drawn on a unit grid, say the number. Off-grid points survive every check and ruin the drawing. |
| Components | Decomposing is easy and rarely reversible. Say when it is allowed. |
| Sidebearings | Preserving an advance width is not the same as preserving spacing. |
Ask for a check after every batch, not at the end. A compatibility break found after fifty glyphs costs fifty glyphs.
Grading the Work
An agent produces more drawings than you can review carefully, so separate what it made from what you have accepted.
Mark colors do this. The glyph grid shows them, and the mark travels in the source, so the state survives a restart and a git clone. One workable protocol: the agent marks everything it touches with one color, and only you may set the color that means done.
Runebender stores the meaning of a mark, not just its color, so a theme can draw it differently without changing the font. See File format.
The Command Line
runebender runs the editor’s own operations without a window. Same
code, no interface.
runebender info Font.uforunebender measure Font.ufo --glyph eightrunebender check --a Light.ufo --b Bold.ufo Every command takes --json. The exit codes are 0 ok, 1 findings, 2
usage, 4 failed, so a script can branch without reading text.
check compares two masters for interpolation compatibility. That is the failure worth automating. A mismatch is invisible until
the family stops building, so it belongs in a build rather than in a
window.
Exit code 1 means the command ran and found something. Do not treat it as an error, or a clean run and a failed run look the same.
Building on the Core
For a tool rather than a session, runebender-core is the editing
model as a Rust library with no interface attached. It carries the
operations the editor itself uses: point edits, components, curve
analysis, measurement, shaping, kerning with group fallback.
An agent writing Rust can build a tool on it that makes exactly the edit you want, instead of driving a general one. See Development.
Local Models
font-ml runs machine-learning models over font sources from the
command line. Every command takes --json. The exit codes separate a
usage mistake from an unimplemented job from a real failure, so an
agent can tell what went wrong.
font-ml tasksfont-ml describe <model>font-ml run bolden --model <model> --source Font.ufo --glyph eight Run font-ml tasks before trusting a job exists. Most are declared
and not built. See Local models.
Models live in ~/.runebender/models. A model is a folder holding
config.json, so installing one is putting it there. The editor lists
what it finds at startup. RUNEBENDER_MODELS overrides the location.
Driving the Interface
An agent that controls the screen can use Runebender the way a person does, because it is an ordinary desktop application.
It is the slowest way to do the work and the easiest to get wrong. A click lands or it does not, and neither the agent nor you can see which. Editing the source is faster, reviewable, and revertible.
Reach for screen control only for what has no other path, such as judging how something looks.
What Is Not Here
No assistant in the editor, no chat panel, no prompt box, and no way for the application to call a model service. Runebender has no account system and stores no keys.
This is a deliberate limit rather than a missing feature. The parts that would need a key are the parts that already work better outside the editor.