Skip to main content

fontmask

Patch a font with the secret-masking rules from Obel Mono Masked.

fontmask copies the ccmp rule set from the bundled Obel font, maps its glyphs to the target through Unicode, adds note glyphs that copy the target's own outlines, and adds the mask dots. The output family is <Family> Masked.

The mask is visual only. Copy and paste still returns the real text.

Install

With Nix:

nix develop
uv sync --extra test

From PyPI:

uvx fontmask inspect Font.ttf
uvx --from 'fontmask==0.1.0' fontmask inspect Font.ttf

From a git tag:

uvx git+https://github.com/mattrobenolt/fontmask@v0.1.0 inspect Font.ttf
uvx git+https://github.com/mattrobenolt/fontmask@v0.1.0 patch Font.ttf -o FontMasked.ttf

The PyPI commands use the latest release. The git commands pin the v0.1.0 tag.

Use

fontmask inspect Font.ttf
fontmask patch Font.ttf -o FontMasked.ttf
fontmask patch Variable.ttf --instance wght=400 -o VariableMasked.ttf

patch --dry-run prints the plan and writes no file.

Turn it on

Install the output font and select <Family> Masked in the app. The masking is always on; there is no separate switch.

App Setting
Terminal.app Settings → Profiles → Text → Font → Change → <Family> Masked
iTerm2 Settings → Profiles → Text → Font → <Family> Masked, then enable Use ligatures
VS Code "editor.fontFamily": "<Family> Masked" and "editor.fontLigatures": true
Zed "buffer_font_family": "<Family> Masked"
Ghostty font-family = "<Family> Masked"
Kitty font_family <Family> Masked
WezTerm font = wezterm.font("<Family> Masked")
Windows Terminal Settings → Profiles → Appearance → Font face → <Family> Masked

Apps that do not shape text, like Alacritty, show the plain string.

Supported fonts

TrueType, CFF, WOFF/WOFF2, static and variable fonts, proportional fonts, fonts with no GSUB, and TTC collections. CFF2 variable output is not supported. Variable fonts are instanced to a static font. Proportional fonts get one mask glyph per advance width, so the line width does not change.

How it works

Obel Mono keeps the rules in ccmp. fontmask copies the 108-lookup closure, maps its glyph names to the target, adds the note and mask glyphs, and appends the lookups to the target's GSUB table. tests/test_patch.py shapes 520 strings in both fonts and compares the output.

Limits

  • The mask changes pixels only. It does not change the text buffer.
  • Mask glyphs are unencoded. The tool does not add cmap entries.
  • Color fonts are not supported. Mask glyphs render as monochrome outlines.
  • Check the target font's license before distributing the patched font.

Development

nix develop, then uv sync --extra test, uv check, and uv run pytest -q.

Credit

The rules and the mask dot are from Obel Mono by Cody Collier and the Obel Mono Project Authors. Read the original post, A typeface that keeps a secret.

License

The tool is MIT. The bundled rules font is SIL OFL 1.1; see src/fontmask/data/OFL.txt. The patched font is a derivative of the target and the Obel material. Check the target's license before distribution.

Metadata

Release files for fontmask 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fontmask 0.1.0
File Size Uploaded Provenance Actions
fontmask-0.1.0.tar.gz 151.7 kB With provenance Details for fontmask-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for fontmask 0.1.0
File Interpreter ABI Platform Actions
fontmask-0.1.0-py3-none-any.whl Python 3 none any Details for fontmask-0.1.0-py3-none-any.whl

Total release size: 306.9 kB

Release files / fontmask-0.1.0.tar.gz

Download URL fontmask-0.1.0.tar.gz
Size 151.7 kB
Tags Source
SHA-256 checksum
How to use checksums
5a965c0349c8f8105a4016187225944071a1f24699820ad143aa526d717ba617
BLAKE2b-256 checksum
How to use checksums
961f1e01e5f13010ca713a31b4a46dab0d8ca7f0e45d48cd5ccd1baf5065b5b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / fontmask-0.1.0-py3-none-any.whl

Download URL fontmask-0.1.0-py3-none-any.whl
Size 155.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
34a45a976e1494e226e7d185b6796fc7031dee8c6a8937c8ff1a2e4504ee6a8a
BLAKE2b-256 checksum
How to use checksums
e270310757ac6215411db26cbc4ccaa2cc0645e0a98692464eb896a917b4ed66
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Security for fontmask 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for fontmask-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page