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
| System | Command |
|---|---|
| macOS | "/Applications/Fontista Control.app/Contents/MacOS/fontista-control" |
| Windows | fontista-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=Nreads another pass than the current one;--data=folderreads 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.
| Column | Content |
|---|---|
glyphe | glyph name (a, a.ss01, uni0627.fina) |
car | character shown (its own, else its base's) |
code | Unicode code points, U+0061 (several separated by a space), empty for an unencoded glyph |
groupe | Control category (in French: Latin de base, Chiffres, Arabe…) |
style | style name (Regular, Bold, Italic…) |
chasse | advance width, in font units |
contours | number of contours |
xmin ymin xmax ymax | bounding box, in font units; empty for a glyph with no outline |
alerte | vide: 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 |
statut | current review: ok (approved), fix (to fix), empty (not seen yet) |
note | review note (tabs and line breaks replaced by spaces) |
reperes | marks placed on the drawing for this style: x;y;note, separated by | |
Join report (--links-report)
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.
| Column | Content |
|---|---|
paire | both characters, a→n |
groupe | Liaisons : minuscules (lowercase), capitales (caps), accentuées (accented), arabe (Arabic) |
style | style name |
glyphes | glyphs the font chose for the pair, separated by a space (F.short h) |
touche | oui when the two letters touch, non, or ligature (a single glyph) |
ecart | smallest distance between the two letters when they do not touch, in units |
angle | sharpest angle between the two outlines where they cross, in degrees (0: tangent join) |
noeud | bump at the join: height@x;y (font units) |
croisements | number of visible crossings of the two outlines |
suspecte | oui 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 |
ou | point of the sharpest crossing, x;y |
statut note | current 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,okorfix. Anything missing has not been seen yet.liste_a_corriger(list to fix): thefixitems, with note and marks (reperes: position in font units, style when there are several).- Join review:
"liaisons": true,nomis the pair (a→n), and each item also carriesglyphes(glyphs the font chose) andmesure(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:
| System | Folder |
|---|---|
| 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 againFor 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) oropen "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).