Docs / ufo

UFO

Rig names editable-font meaning as rig.font.*. Unified Font Object files stay host mappings at the boundary - same rule as IFC in openbim.md and SVG (design philosophy).

The Contract job is entities, POD components, and schema ids. A .ufo / .ufoz reader (RigKit rigUfo or a sibling tool) is fulfillment, not this catalog.

Thin layer

We do not invent rig.font.ttf or treat a compiled OT/TTF as the source face. A file on disk is rig.media.asset_ref kind font. A canvas run that uses a compiled face is rig.media.text. Outlines compose rig.geometry.path on the glyph entity - do not add a second contour type.

UFO idea Rig
Family / style / UPM / metrics rig.font.face
Layer (public.default, ...) rig.font.layer + rig.meta.named
Glyph name rig.meta.named stableId
Unicodes / advance width rig.font.glyph
Contours rig.geometry.path on the glyph
Component (composite) rig.font.component on a child entity
Anchor rig.font.anchor on a child entity
kerning.plist pair rig.font.kern (left / right are names)
groups.plist rig.font.group
features.fea rig.media.code language fea, pointed at by face.features
fvar axis rig.font.axis (child of face)
avar map rig.font.avar on the axis entity
Live lattice / morph cell rig.font.cell on the glyph (default path stays on geometry.path)
Containment rig.spatial.relationship parent (face, layer, glyph; face, axis)

Encodings (fulfillment)

File Role
.ufo / .ufoz Map into / out of rig.font.* + path
.glif One glyph; same POD as rig.font.glyph + path / component / anchor
.otf / .ttf / .woff2 Compiled instance - asset_ref or export, never the live source

Do not put glyph caches, atlas slots, dirty epochs, or FreeType handles in portable components.

Host trips!

Two hosts that speak rig.font.face + glyph + kern can exchange a UFO-as-Rig document. Round-tripping every lib.plist key or UFO3 guideline is not required. Hosts that morph add axis / avar / cell.

Examples: examples/font-ufo.json, examples/font-var.json.