File Format
Runebender edits UFO in place. It writes standard data where a standard exists, and namespaced keys where none does.
| Status | Reference |
|---|---|
| Stability | Standard data is stable; the namespaced keys can still change |
Sources
Runebender opens .designspace files, .ufo directories, and folders
that hold them. It saves in the same format, in place.
UFO is a directory of files, so a font source works with version control. Commit your sources and you can see, review, and undo a day’s drawing the way you would any other change.
Runebender writes to your files. Keep them in version control and work on copies while the editor is alpha.
Standard Data
| Outlines | GLIF contours, points, and components. |
|---|---|
| Anchors | Standard GLIF anchors. |
| Kerning | kerning.plist and groups.plist, per master. |
public.kern | Group names follow the standard prefixes. |
public.background | The background layer, saved with the font. |
public.postscriptNames | Production names, used on export. |
| Features | features.fea, one file per master, holding prefixes, classes, and features. |
| Layers | Backup and intermediate layers are ordinary UFO layers. Intermediate layers also add a sparse designspace source. |
| Designspace | Axes, sources, instances, avar mappings, and substitution rules for shape switches. |
com.github.googlei18n.ufo2ft.colorPalettes | The CPAL palette for colour fonts. |
Glyphs Compatibility
Sources that came out of Glyphs keep their smart component data. Runebender reads and writes the glyphsLib keys rather than inventing its own.
com.schriftgestaltung.Glyphs.smartComponentAxes | The axes a smart component carries. |
|---|---|
com.schriftgestaltung.Glyphs.componentsSmartComponentValues | Where a placed component sits in those axes. |
com.schriftgestaltung.Glyphs.glyph.leftMetricsKey | Metric keys, left and right. See Spacing and Kerning. |
Runebender Keys
Anything Runebender needs that UFO does not define lives under its own namespace. Another editor ignores these keys, and the rest of the source still reads correctly.
savedFilters | Filters saved in the left panel. |
|---|---|
annotations | Notes left on a glyph. |
masks | Intermediate mask layers. |
hoiIntermediate | Higher-order interpolation intermediates. |
partSelection | Which part of a smart component is in use. |
Hyperbeziers
A hyperbezier contour is defined by its on-curve points, with the
control points solved rather than placed. Runebender marks these
contours in GLIF with identifier="hyperbezier".
An editor that does not know the identifier reads the points as ordinary curve points, so the file stays valid. Use Path → Hyperbezier to Cubic before handing a source to a tool that needs plain cubics.
What Survives a Round Trip
Runebender aims to write files another tool can read. Standard data stays standard. Glyphs-compatible data uses the glyphsLib
keys rather than a private spelling. Anything genuinely new sits under
com.runebender, which another editor ignores while leaving the rest of
the source intact.
Two things to know before handing a source on:
- Hyperbezier contours read as ordinary curves elsewhere. Convert them if the receiving tool will re-save the file.
- Masks are a Runebender idea. Run Glyph → Bake Masks so the subtraction is real in the outlines.