family.toml¶
Each family lives at:
This file is the source of truth for:
- UI metadata
- preview face definitions
- download/archive metadata
- upstream provenance
- specimen sanitization rules
Practical minimum¶
[details]
name = "Inter"
[source]
archive = "tiparo-inter.tar.gz"
archive_version = "abc1234"
[display]
style = "Regular400"
[style.Regular400]
name = "Regular 400"
file = "inter/web/Inter-Regular.woff2"
Parser limits¶
Tiparo uses a small local parser, not a full TOML implementation. Keep this file simple:
- use quoted strings, booleans, integers, and flat arrays
- use named tables like
[details]and[style.Regular400] - inline
# commentsare fine - avoid multiline strings, inline tables, dates, and other advanced TOML forms
Unknown keys are currently ignored by the toolchain.
Required in practice¶
- At least one
[style.<id>]table must exist. - Every
style.*.filemust resolve to a real synced asset before the app build passes. - If
source.archiveis relative,source.archive_versionis required for manifest generation. source.archiveis required byfonts:publish.
Top-level sections¶
Tiparo currently reads:
[details][source][display][specimen][style.<id>]
[details]¶
Human-facing metadata used in the app.
| Key | Type | Use |
|---|---|---|
name |
string |
Family name shown in the UI. Falls back to <font-id>. |
designer |
string or string[] |
Designer label. |
designer_url |
string or string[] |
Designer links, matched positionally with designer. |
foundry |
string |
Foundry label. |
foundry_url |
string |
Foundry link. |
license |
string |
License label. |
license_url |
string |
License link. |
copyright |
string |
Copyright text. |
website |
string |
Official family URL. |
Example:
[details]
name = "Basteleur"
designer = ["Keussel", "George Triantafyllakos"]
designer_url = ["https://keussel.studio/", "https://backpacker.gr/"]
license = "SIL Open Font License 1.1"
license_url = "http://scripts.sil.org/OFL"
copyright = "Copyright 2021, Keussel"
foundry = "Velvetyne Type Foundry"
foundry_url = "https://velvetyne.fr/"
website = "https://velvetyne.fr/fonts/basteleur/"
[source]¶
Packaging, download, and provenance fields.
| Key | Type | Use |
|---|---|---|
repository |
string |
Upstream project/source link. |
commit |
string |
Upstream version/provenance marker. |
archive |
string |
Relative archive filename or absolute download URL. |
archive_version |
string |
Version path segment for relative archives. |
Example:
[source]
repository = "https://gitlab.com/velvetyne/basteleur"
commit = "f32302d63d46e9b996f329648b0f2df01c9190f5"
archive = "tiparo-basteleur.tar.gz"
archive_version = "2e9d0ec9"
Behavior:
- If
archiveis absolute, the app uses it as-is. - If
archiveis relative, the download URL becomes:
repositoryis used as the source link.websitefrom[details]is preferred as the official link; otherwise the app falls back torepository.
[display]¶
Preferred preview face for list/grid views.
| Key | Type | Use |
|---|---|---|
style |
string |
Preferred preview style. |
Example:
Matching behavior:
- first matches a
[style.<id>]table name - then matches a style
name - otherwise the app falls back to the first normal 400-ish face it can infer
[specimen]¶
Optional per-family preview sanitization rules.
| Key | Type | Use |
|---|---|---|
force_lowercase |
boolean |
Lowercase the preview first. |
supported |
string or string[] |
Allowlist of glyphs or glyph groups. |
unsupported |
string or string[] |
Blocklist of glyphs or glyph groups. |
replace_punctuation |
string |
Replacement for Unicode punctuation. |
note |
string |
UI explanation shown with adjusted previews. |
Example:
[specimen]
force_lowercase = true
supported = ["abcdfghijklmnopqrstuvwxyz", " ", "*"]
replace_punctuation = "*"
note = "Unsupported glyphs are converted or dropped in the preview."
Order of operations:
- lowercase
- punctuation replacement
supportedfilteringunsupportedfiltering
Notes:
- Include
" "insupportedif spaces should survive. - Use this for font-specific preview constraints instead of hardcoding special cases in the UI.
[style.<id>]¶
One table per previewable face.
| Key | Type | Use |
|---|---|---|
name |
string |
Face label. Defaults to <id> if omitted. |
file |
string |
Preview font path inside the upstream tree. |
index |
integer |
Collection index for .ttc files. |
Example:
Collection example:
Notes:
<id>should be stable and human-readable. It is used bydisplay.style, the runtime manifest, and debugging output.fileis relative to the full upstream layout, not just the trackedcontent/fonts/<font-id>/directory.- Tiparo normalizes
filepaths by stripping: - leading
./ - an optional
upstream/prefix - an optional leading
<font-id>/prefix - Prefer
woff2for previews.woff,ttf,otf, andttcalso work. - Weight, italic style, and output format are inferred from the filename and style naming convention.
Recommended conventions¶
- Put public-facing metadata in
[details], not in style names. - Keep
display.styleequal to a style table id when possible. - Keep style ids predictable, such as
Regular400orBold700Italic. - Store only preview assets under
content/fonts/<font-id>/; keep the full source tree incontent/upstreams/<font-id>/. - After editing
family.toml, rerun the normal build flow or at leastbun run content:sync.