Files
amethyst/tools/material-symbols-subset/README.md
T
Claude 41ef1d89b3 feat(ui): add the OpenTimestamps logo as a custom glyph and use it in the OTS pill
Bake the official OpenTimestamps stamp logo (traced from
opentimestamps/logo vector.svg; monochrome outline, tinted at render
time like every other glyph) into the Material Symbols subset font at
U+F8F0. New tools/material-symbols-subset/add_custom_glyphs.py converts
the traced SVGs in custom/ into TrueType glyphs and is invoked by
subset.sh after pyftsubset, so font regenerations keep them.

With the logo identifying the pill, drop the verbose "OTS:" prefix:
the pill now reads icon + "2y" (or icon + "Pending", new
R.string.pending).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AgEpNtwnetPhETXQSdq4b5
2026-07-14 12:59:30 +00:00

2.2 KiB

Material Symbols Subset

The font shipped at commons/src/commonMain/composeResources/font/material_symbols_outlined.ttf is a subset of Google's Material Symbols Outlined variable font, trimmed to only the codepoints referenced from commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/icons/symbols/MaterialSymbols.kt.

Full upstream Subset
Size ~11 MB ~410 KB
Glyphs ~3500 ~210

The subset cuts >10 MB out of every commons build artifact, every Android APK, and every Desktop app bundle.

When to regenerate

Run subset.sh whenever you:

  • add or remove a MaterialSymbol("\uXXXX") entry in MaterialSymbols.kt
  • pin a newer upstream font version

Prerequisites

pip install fonttools brotli

Regenerating

From the repo root:

./tools/material-symbols-subset/subset.sh

That downloads the upstream variable font, intersects its codepoints with the ones referenced from MaterialSymbols.kt, and overwrites the checked-in material_symbols_outlined.ttf.

If you already have an upstream .ttf on disk:

./tools/material-symbols-subset/subset.sh /path/to/MaterialSymbolsOutlined-Regular.ttf

Commit the regenerated .ttf alongside the MaterialSymbols.kt change.

How it works

pyftsubset (from fonttools) reads the codepoints we care about, drops every glyph and OpenType feature not reachable from those codepoints, and rewrites name, cmap, and GSUB tables accordingly. The Compose resource pipeline treats the result as a normal TTF — no code changes needed.

Custom glyphs

custom/ holds traced SVG outlines for icons the upstream font will never carry (third-party logos — currently the OpenTimestamps stamp). add_custom_glyphs.py bakes them into the subset TTF at end-of-PUA codepoints (U+F8F0 and up); subset.sh runs it automatically after pyftsubset, so regenerating the subset keeps them. To add one: trace the logo to a single-color SVG (potrace output works as-is), drop it in custom/, register it in the CUSTOM map in add_custom_glyphs.py, add the matching MaterialSymbol("\uF8Fx") to MaterialSymbols.kt, and rerun subset.sh (or add_custom_glyphs.py <ttf> to patch the existing font).