Fontista Control on the command line

Fontista Control reviews a font glyph by glyph and join by join. Everything it measures and everything the review holds can also be read without a window: a script, a build pipeline or an AI assistant can run the review, read the results, fix the font, and start again.

Where the program is

SystemCommand
macOS"/Applications/Fontista Control.app/Contents/MacOS/fontista-control"
Windowsfontista-control.exe, in the unzipped folder
Linux./fontista-control, in the unpacked folder (or fontista-control after install.sh)

fontista-control --help lists every option. The examples below write fontista-control.

The three windowless commands

fontista-control My-Font.ttf --glyphs-report=glyphs.tsv         # glyph report
fontista-control My-Font.ttf --links-report=joins.tsv           # join report (pairs)
fontista-control My-Font.ttf --export=review.json               # review of the current pass
fontista-control My-Font.ttf --links --export=joins-review.json # review of the joins
  • The font: .fontista, .glyphs, .glyphspackage, .ufo, .designspace, .ttf, .otf, .woff, .woff2. Several binary files of one family (Regular.ttf Bold.ttf) become the styles of a single font. A variable font gives one style per named instance.
  • - instead of a file name writes to standard output: --glyphs-report=- | grep fix.
  • --pass=N reads another pass than the current one; --data=folder reads the reviews of another folder.
  • These commands read the saved review and never change it; they leave the application's settings alone too. Exit code: 0 when everything is written, 1 when the font cannot be read or the file cannot be written.
  • Rough timing: one second for the glyph report of a 12,000-glyph variable font; about ten seconds for the 1,470 pairs of a Latin font (shaping goes through Fontista's OpenType engine).

Glyph report (--glyphs-report)

Tab-separated text (TSV, UTF-8), one header line, then one line per glyph and per style, in font order. Column names are in French; the values ok, fix, vide, styles, oui, non are fixed keywords.

ColumnContent
glypheglyph name (a, a.ss01, uni0627.fina)
carcharacter shown (its own, else its base's)
codeUnicode code points, U+0061 (several separated by a space), empty for an unencoded glyph
groupeControl category (in French: Latin de base, Chiffres, Arabe…)
stylestyle name (Regular, Bold, Italic…)
chasseadvance width, in font units
contoursnumber of contours
xmin ymin xmax ymaxbounding box, in font units; empty for a glyph with no outline
alertevide: an encoded character (other than spaces and invisible characters) with no outline at all; styles: the contour count differs from one style to another (check interpolation); several alerts separated by a space
statutcurrent review: ok (approved), fix (to fix), empty (not seen yet)
notereview note (tabs and line breaks replaced by spaces)
reperesmarks placed on the drawing for this style: x;y;note, separated by |

One line per pair and per style. The pairs are those of the Joins view (key L): lowercase, capitals, accented, Arabic, each one shaped by the font between neutral letters, with its contextual forms.

ColumnContent
paireboth characters, a→n
groupeLiaisons : minuscules (lowercase), capitales (caps), accentuées (accented), arabe (Arabic)
stylestyle name
glyphesglyphs the font chose for the pair, separated by a space (F.short h)
toucheoui when the two letters touch, non, or ligature (a single glyph)
ecartsmallest distance between the two letters when they do not touch, in units
anglesharpest angle between the two outlines where they cross, in degrees (0: tangent join)
noeudbump at the join: height@x;y (font units)
croisementsnumber of visible crossings of the two outlines
suspecteoui when the join deserves a look: angle above 30°, bump above 0.4% of the em, or a gap in a group whose letters usually join
oupoint of the sharpest crossing, x;y
statut notecurrent join review, as for glyphs

Coordinates are those of the shaped pair: the origin is the starting point of the first letter, on the baseline.

Exported review (--export, Export button)

JSON, the same as the application's Export button and the online version (keys in French):

{
  "police": "Chancelière",
  "fichier": "Chanceliere-Italic.ttf",
  "application": "Fontista Control 1.3.0",
  "passe": 1,
  "exporte": "2026-10-29T09:45:15Z",
  "total": 258, "vus": 12, "valides": 11, "a_corriger": 1,
  "position": "g",
  "liste_a_corriger": [
    {
      "nom": "g", "car": "g", "code": "U+0067", "groupe": "Latin de base",
      "note": "tail too short",
      "reperes": [ { "x": 300.0, "y": -250.0, "style": "Italic", "note": "loop too open" } ]
    }
  ],
  "statuts": { "a": "ok", "g": "fix" }
}
  • statuts (statuses): every item seen, ok or fix. Anything missing has not been seen yet.
  • liste_a_corriger (list to fix): the fix items, with note and marks (reperes: position in font units, style when there are several).
  • Join review: "liaisons": true, nom is the pair (a→n), and each item also carries glyphes (glyphs the font chose) and mesure (measure: raccord 34°, écart 12…).

Importing

A file in the same format can be imported into the current pass: Review › Import, drop the file on the window, or fontista-control My-Font.ttf --import=review.json. Only statuts and, for fix items, the note and marks of liste_a_corriger are read. A script or an AI can therefore prepare a list ("these twelve glyphs look too bold") that someone then reviews in Control.

Passes

The first pass covers the whole font. A new pass (New pass button) only brings back the items marked fix, next to their previous version: fix, save (Control reloads the font by itself), open a pass, review only what changed. Reviews are stored in the application's folder:

SystemFolder
macOS~/Library/Application Support/Fontista Control/revues/
Windows%APPDATA%\Fontista Control\revues\
Linux~/.local/share/Fontista Control/revues/

Their internal format may change between versions: for scripts, go through export and import.

A typical loop with a script or an AI

# 1. review: glyphs to fix and alerts
fontista-control My-Font.ttf --glyphs-report=- | awk -F'\t' 'NR>1 && ($12!="" || $13=="fix")'
# 2. suspect joins
fontista-control My-Font.ttf --links-report=- | awk -F'\t' '$10=="oui"'
# 3. fix the source (Fontista, Lua script, fontmake…), rebuild, start again

For an AI assistant (Claude, for instance): give it the exported review and the reports, ask it to fix the source, then run the reports again to check. Marks place each defect in font units, which is enough to find the node or segment at fault.

With Fontista

  • In Control, "Edit in Fontista" (key E) opens the glyph shown, or both letters of a pair, in Fontista's Edit view. A source (.fontista, .glyphs, .ufo…) opens there if needed; a compiled font (TTF, OTF) is matched to its source, already open, by family name.
  • In Fontista, File › Review in Fontista Control (⌘⇧C, Ctrl+Shift+C) saves the font and opens it in Control on the current glyph. Control then follows every save.
  • On macOS a script can do the same with an address: open "fontista://glyphes?fichier=/path/My-Font.fontista&noms=a%20n" (Fontista) or open "fontista-control://glyphes?fichier=/path/My-Font.ttf&noms=g" (Control). Parameters, URL-encoded: fichier (file), famille (family), noms (glyph names separated by spaces), codes (Unicode code points in hexadecimal, same order, when names differ between the source and the compiled font).