Agents

Runebender holds no API keys and calls no model service. An agent edits the sources, and the editor follows.

StatusThe file-watching seam works today; there is no in-editor assistant
StabilityStable, 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.

Where each side works
The agentReads and writes UFO sources, runs builds, runs checks, reads the results.
The editorReloads changed files, draws them, and saves your edits back.
The fileThe 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.

What runs where
A coding agentClaude Code, Codex, or any other. It signs in through its own tooling, not through Runebender.
A local modelRuns 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.

  1. Put the sources in a repository, so every edit is reviewable and revertible.
  2. Write down the build and check commands where the agent will read them.
  3. Say what the font’s rules are: the grid, the metrics, the naming.
  4. Point it at https://runebender.org/llms-full.txt for 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.

The rules worth writing down
Point compatibilityMasters must keep the same contours, the same points, in the same order. Break it and the family stops interpolating.
Contour directionOuter contours run one way and counters the other. A reversed contour fills a hole.
Start pointsRotating where a contour starts is invisible in one master and fatal across two.
The gridIf the family is drawn on a unit grid, say the number. Off-grid points survive every check and ruin the drawing.
ComponentsDecomposing is easy and rarely reversible. Say when it is allowed.
SidebearingsPreserving 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.