TTX – From OpenType and TrueType to XML and Back

Once installed you can use the ttx command to convert binary font files (.otf, .ttf, etc) to the TTX XML format, edit them, and convert them back to binary format. TTX files have a .ttx file extension:

ttx /path/to/font.otf
ttx /path/to/font.ttx

The TTX application can be used in two ways, depending on what platform you run it on:

  • As a command line tool (Windows/DOS, Unix, macOS)

  • By dropping files onto the application (Windows, macOS)

TTX detects what kind of files it is fed: it will output a .ttx file when it sees a .ttf or .otf, and it will compile a .ttf or .otf when the input file is a .ttx file. By default, the output file is created in the same folder as the input file, and will have the same name as the input file but with a different extension. TTX will never overwrite existing files, but if necessary will append a unique number to the output filename (before the extension) such as Arial#1.ttf.

When using TTX from the command line there are a bunch of extra options. These are explained in the help text, as displayed when typing ttx -h at the command prompt. These additional options include:

  • specifying the folder where the output files are created

  • specifying which tables to dump or which tables to exclude

  • merging partial .ttx files with existing .ttf or .otf files

  • listing brief table info instead of dumping to .ttx

  • splitting tables to separate .ttx files

  • disabling TrueType instruction disassembly

The TTX file format

The following tables are currently supported:

TTFA, VARC, VDMX, VORG, VVAR, ankr, avar, bsln, cidg, cmap, cvar,
cvt, feat, fpgm, fvar, gasp, gcid, glyf, gvar, hdmx, head, hhea,
hmtx, kern, lcar, loca, ltag, maxp, meta, mort, morx, name, opbd,
post, prep, prop, sbix, trak, vhea and vmtx

Other tables are dumped as hexadecimal data.

TrueType fonts use glyph indices (GlyphIDs) to refer to glyphs in most places. While this is fine in binary form, it is really hard to work with for humans. Therefore we use names instead.

The glyph names are either extracted from the CFF table or the post table, or are derived from a Unicode cmap table. In the latter case the Adobe Glyph List is used to calculate names based on Unicode values. If all of these methods fail, names are invented based on GlyphID (eg glyph00142)

It is possible that different glyphs use the same name. If this happens, we force the names to be unique by appending #n to the name (n being an integer number.) The original names are being kept, so this has no influence on a “round tripped” font.

Because the order in which glyphs are stored inside the binary font is important, we maintain an ordered list of glyph names in the font.

usage: ttx [options] inputfile1 [… inputfileN]

TTX – From OpenType To XML And Back

If an input file is a TrueType or OpenType font file, it will be decompiled to a TTX file (an XML-based text format). If an input file is a TTX file, it will be compiled to whatever format the data is in, a TrueType or OpenType/CFF font file. A special input value of - means read from the standard input.

Output files are created so they are unique: an existing file is never overwritten.

General options

-h Help

print this message.


show version and exit.

-d <outputfolder>

Specify a directory where the output files are to be created.

-o <outputfile>

Specify a file to write the output to. A special value of - would use the standard output.


Overwrite existing output file(s), ie. don’t append numbers.


Verbose: more messages will be written to stdout about what is being done.


Quiet: No messages will be written to stdout about what is being done.


allow virtual glyphs ID’s on compile or decompile.

Dump options


List table info: instead of dumping to a TTX file, list some minimal info about each table.

-t <table>

Specify a table to dump. Multiple -t options are allowed. When no -t option is specified, all tables will be dumped.

-x <table>

Specify a table to exclude from the dump. Multiple -x options are allowed. -t and -x are mutually exclusive.


Split tables: save the TTX data into separate TTX files per table and write one small TTX file that contains references to the individual table dumps. This file can be used as input to ttx, as long as the table files are in the same directory.


Split glyf table: Save the glyf data into separate TTX files per glyph and write a small TTX for the glyf table which contains references to the individual TTGlyph elements. NOTE: specifying -g implies -s (no need for -s together with -g)


Do NOT disassemble TT instructions: when this option is given, all TrueType programs (glyph programs, the font program and the pre-program) will be written to the TTX file as hex data instead of assembly. This saves some time and makes the TTX file smaller.

-z <format>

Specify a bitmap data export option for EBDT: {‘raw’, ‘row’, ‘bitwise’, ‘extfile’} or for the CBDT: {‘raw’, ‘extfile’} Each option does one of the following:

-z raw

export the bitmap data as a hex dump

-z row

export each row as hex data

-z bitwise

export each row as binary in an ASCII art style

-z extfile

export the data as external files with XML references

If no export format is specified ‘raw’ format is used.


Don’t ignore decompilation errors, but show a full traceback and abort.

-y <number>

Select font number for TrueType Collection (.ttc/.otc), starting from 0.

--unicodedata <UnicodeData.txt>

Use custom database file to write character names in the comments of the cmap TTX output.

--newline <value>

Control how line endings are written in the XML file. It can be ‘LF’, ‘CR’, or ‘CRLF’. If not specified, the default platform-specific line endings are used.

Compile options


Merge with TrueType-input-file: specify a TrueType or OpenType font file to be merged with the TTX file. This option is only valid when at most one TTX file is specified.


Don’t recalc glyph bounding boxes: use the values in the TTX file as-is.


Set font ‘modified’ timestamp to current time. By default, the modification time of the TTX file will be used.


Keep the original font ‘modified’ timestamp.

--flavor <type>

Specify flavor of output font file. May be ‘woff’ or ‘woff2’. Note that WOFF2 requires the Brotli Python extension, available at


Use Zopfli instead of Zlib to compress WOFF. The Python extension is available at

class fontTools.ttx.Options(rawOptions, numFiles)[source]
bitmapGlyphDataFormat = 'raw'
disassembleInstructions = True
flavor = None
ignoreDecompileErrors = True
listTables = False
mergeFile = None
newlinestr = '\n'
outputDir = None
outputFile = None
overWrite = False
quiet = False
recalcBBoxes = True
recalcTimestamp = None
splitGlyphs = False
splitTables = False
unicodedata = None
useZopfli = False
verbose = False

Convert OpenType fonts to XML and back

fontTools.ttx.process(jobs, options)[source]
fontTools.ttx.ttCompile(input, output, options)[source]
fontTools.ttx.ttDump(input, output, options)[source]
fontTools.ttx.ttList(input, output, options)[source]