Production names vs. final names

The demands for glyph names during the design process and at the end of the production line are different:

  • During the design process, glyph names should be logical, legible and descriptive – so it’s easy to find a particular glyph while working on a font, and it’s easy to guess what a glyph looks like (even when it’s still empty).

  • At the same time, glyph names in final OpenType fonts must obey certain rules in order to work correctly in all environments.

    For example, in order to enable text search in PDFs, it is necessary that glyph names follow the Adobe Glyph List Specification. In practice, this means that any glyph which does not have a readable name in the AGLFN must be named with its unicode value: uniXXXX.

glyphOrderAndAliasDB aka GOADB

As it turns out, it is possible to get the best of both worlds:

  • use ‘friendly’ glyph names during development
  • switch to ‘final’ glyph names when generating OpenType fonts

This is specially useful when working with scripts other than Latin and Greek, for which the AGL dictates ‘unfriendly’ uniXXXX glyph names.

Under the hood, the switch from production names to final names is enabled by the glyphOrderAndAliasDB (GOADB) file, which can be supplied to makeotf when generating OpenType fonts.

Storing GOADB data in the UFO

The GOADB data can be stored in the UFO lib, so it is passed to makeotf when generating a font.


UFO3/RF3 supports a dictionary with production names (keys) and final names (values) in the font’s lib.plist, under the standard key public.postscriptnames.

f = CurrentFont()
f.lib["public.postscriptNames"] = {"A.test": "A", "Something": "C"}
UFO file (production names)
OTF file (final names)

Notice that .notdef and space glyphs are inserted automatically by the AFDKO.


UFO2/RF1 stores the GOADB data as a string in the lib, under the custom lib key com.typesupply.ufo2fdk.glyphOrderAndAliasDB.

The string follows the original GOADB format: one glyph per line, and every line as a space-separated list with final name, production name and (optional) unicode.

f = CurrentFont()

goadb = """\
A A.test uni0041
C Something

f.lib["com.typesupply.ufo2fdk.glyphOrderAndAliasDB"] = goadb
Last edited on 23/01/2018