
Version 0.3.0
Status: Experimental, unstable draft
Software version strings commonly include the following semantics:
The established and widely used SemVer approach to semantic software versioning uses the version number format MAJOR.MINOR.PATCH with a software API-based standard for incremented values during the software development process. Additional metadata are commonly appended to this SemVer syntax to indicate the readiness of the software for general use by the end user as work progresses towards a release milestone (e.g. v1.2.0-alpha, v1.2.0-beta,v1.2.0-rc.1, v1.2.0-rc.2, v1.2.0). Projects that create compiled binary artifacts from source code frequently associate a label with the build artifact to establish a record of the state of the source code at build time (e.g., a git commit SHA1 hash string).
These versioning concepts apply to the development of typeface software and are desirable during the development process; however, they are not all defined under the OpenType font versioning specification. Typeface software version strings are compiled into the nameID 5 record of the OpenType name table and the fontRevision record of the OpenType head table. These records are defined in the OpenType format specification as below, and explained in the SIL Font Development Best Practices documentation (source).
Version string. Should begin with the syntax 'Version .' (upper case, lower case, or mixed, with a space between “Version” and the number).
The string must contain a version number of the following form: one or more digits (0-9) of value less than 65,535, followed by a period, followed by one or more digits of value less than 65,535. Any character other than a digit will terminate the minor number. A character such as “;” is helpful to separate different pieces of version information.
The first such match in the string can be used by installation software to compare font versions. Note that some installers may require the string to start with “Version ”, followed by a version number as above.
(Source)
Set by font manufacturer
(Source)
The OpenType specification defines a version number as MAJOR.MINOR. There is no specification for a PATCH/BUILD version number nor version number metadata strings. Font versioning deviates further from the SemVer version number format as a result of the font compiler convention to include zero padding in MINOR version numbers. While this is not always the case in nameID 5 records, this is a consistent format used in the head.fontRevision record. The interpretation of version numbers with this approach is not intuitive. The version number strings Version 1.1, Version 1.01, and Version 1.001 are all defined as "different" though these numbers may all represent the same stage of development (i.e., one iteration beyond the first major release). These differences in version numbers emerge due to conventions established by project author(s) and by the tools that they use to compile fonts from their source code. The OpenType definitions do not specify a format to indicate the development status of a typeface project relative to its version milestone, nor do they define an approach to maintain information about the source code state at build time within the font build artifact. The lack of a formal standard to address the above issues provided the impetus for this specification.
The Open Font Version (OpenFV) Specification represents a compliant extension of the OpenType name table nameID 5 record and OpenType head.fontRevision record specifications. OpenFV is intended to serve as a typeface software versioning standard for the development, testing, release, and use of typeface source code and the build artifacts (fonts) derived from the source. This specification defines a version number string syntax with semantic underpinnings that maintains informative data for both developers and users.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
Version strings in the OpenType name table ID 5 record MUST be defined as semicolon delimited substrings of mandatory and optional data elements.
The OpenFV Specification syntax for the substring elements of the full version string is:
[Font Version Number]; [Status/State Metadata]; [Other Metadata]
The font version string MUST include:
The font version string MAY include:
The font version number substring:
MAJOR version number digit(s), a period (U+002E), MINOR version number digits.MINOR version number and the semicolon.The MAJOR version number:
The MINOR version number:
MINOR version number. The MINOR version number MUST have a minimum value of 000 and a maximum value of 999.The State metadata substring:
a-zA-Z0-9._-[ as the initial character and the delimiter ] as the final character of the substring. The string contents inside these delimiters SHALL be defined as the "state label". The state label SHOULD be 50 characters or less.The Status metadata substring:
DEVRELEASE-dev-releaseOther metadata substrings:
The font version number in the fontRevision record of the OpenType head table:
MAJOR version number digit(s), a period, MINOR version number digitsMINOR version number that is exactly three digits in length. For MINOR version numbers less than 100, zero padding MUST be used. The MINOR version number MUST have a minimum value of 000 and a maximum value of 999.MAJOR version number nor after the MINOR version numberMAJOR.MINOR version number SHALL be intended to represent a release milestone that MAY be incompletely implemented in the source that is defined with a MAJOR.MINOR version number. The MAJOR.MINOR version number SHALL NOT be intended to represent source code state at build time in build artifacts and MAY NOT be unique across build artifacts as work is carried out to achieve a MAJOR.MINOR version milestone.MAJOR version number SHOULD be set to 0 during the pre-production phase of development before the initial release. MAJOR version number 0 SHALL indicate this pre-production phase of development.MAJOR version number MUST be set to 1 at the time of the initial release to end users. The conversion from MAJOR version number 0 to MAJOR version number 1 SHALL indicate the authors' acknowledgment that source code and build artifacts meet the OpenFV release definition.The semantics for changes to the version number SHALL include an increment by the value of 1 of the:
MAJOR version number for completion of major project-specific milestones and all backward incompatible changes made to the typeface software (e.g., the elimination of support for an entire Unicode code range).MINOR version number for functionality, hotfix, and dependency changes. Examples include:
When the MAJOR version number is incremented, the MINOR version number SHALL be changed to a value of 000.
Examples of name table ID 5 record version strings that meet the OpenFV specification include:
Version 1.001
Version 1.001; DEV
Version 1.001; RELEASE
Version 1.001; [abcd123]
Version 1.001; [abcd123]-dev
Version 1.001; [abcd123]-release
Version 1.001; [abcd123]-dev; here are metadata
Version 1.001; [abcd123]-release; here are metadata
Version 1.001; here are metadata
Version 1.001; here are metadata; here are more metadata
Examples of head table fontRevision record version strings that meet the OpenFV specification include:
1.001
10.010
100.100
CC BY 4.0