Babelfont
Babelfont is a Rust library for working with font source files from different font editing software. It provides a unified interface to load, examine, manipulate, and convert fonts between various formats, abstracting over the differences between font editors' native representations.
Features
- Multi-format Support: Load and save fonts in UFO, DesignSpace, Glyphs, FontLab VFJ, FontForge, and Babelfont's own JSON format
- Format Conversion: Convert fonts between different editor formats seamlessly
- Font Manipulation: Apply filters to subset, scale, or otherwise transform fonts
- JSON Serialization: Full serialization/deserialization of Babelfont's internal representation
- Variable Font Support: Full support for variable/multiple master fonts with axes, masters, and instances
- TTF Compilation: Compile fonts to binary OpenType/TrueType output
- Optional Format Support: Fine-grained feature flags let you pull in only the format support you need
Status
Babelfont is in early development. While the core architecture and many features are implemented, some format support and filters are still works in progress.
- Glyphs file format: Mostly complete for reading and writing Glyphs 2 and Glyphs 3 files.
- UFO/DesignSpace: Reading support is implemented; writing support is in progress.
- FontLab VFJ: Very basic reading support is implemented; writing support is planned.
- Fontra: Basic reading and writing support is implemented.
Installation
Add this to your Cargo.toml:
[dependencies]
babelfont = "0.2"
Feature Flags
By default, all major format support is enabled. You can customize which formats are supported:
[dependencies]
babelfont = { version = "0.2", default-features = false, features = ["glyphs", "ufo"] }
Available features (all enabled by default unless noted):
glyphs- Support for Glyphs 2 and Glyphs 3 files (.glyphsand.glyphspackage)ufo- Support for UFO and DesignSpace formatsfontlab- Support for FontLab VFJ (JSON) formatfontforge- Support for FontForge SplineFont formats (.sfd,.sfdir)fontra- Support for Fontra formatrobocjk- Support for the RoboCJK subset workflow formatttf/fontir- Compilation to binary font formats (.ttf)types- Typeshare annotations for generating TypeScript type definitions of the JSON formatrayon- Rayon-based parallelism innoradcli- Command-line interface (builds thebabelfontbinary; not in default features)linesweeper- Overlap-removal filters (requires external binaries)
Quick Start
Loading and Converting Fonts
use babelfont::{load, BabelfontError};
fn main() -> Result<(), BabelfontError> {
// Load a font from any supported format
let font = load("MyFont.designspace")?;
// Convert to Glyphs format
font.save("MyFont.glyphs")?;
// Or save as JSON
font.save("MyFont.babelfont")?;
Ok(())
}
Subsetting with Filters
use babelfont::{load, BabelfontError};
use babelfont::filters::{FontFilter, RetainGlyphs};
fn main() -> Result<(), BabelfontError> {
// Load a DesignSpace file
let mut font = load("MyFont.designspace")?;
// Create a filter to retain only certain glyphs
let filter = RetainGlyphs::new(vec![
"A".to_string(),
"B".to_string(),
"C".to_string(),
"space".to_string(),
]);
// Apply the filter
filter.apply(&mut font)?;
// Save as a Glyphs file
font.save("MyFont-Subset.glyphs")?;
Ok(())
}
Inspecting Font Metadata
use babelfont::load;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let font = load("MyFont.ufo")?;
// Access font metadata
println!("Font family: {}", font.names.family_name);
println!("Units per em: {}", font.upm);
println!("Number of glyphs: {}", font.glyphs.len());
// Iterate over axes in a variable font
for axis in &font.axes {
println!("Axis: {} ({} to {})", axis.name, axis.min, axis.max);
}
// Access specific glyphs
if let Some(glyph) = font.glyphs.get("A") {
println!("Glyph 'A' has {} layers", glyph.layers.len());
for layer in &glyph.layers {
println!(" Layer: {:?}", layer.id);
}
}
Ok(())
}
Supported Formats
The input and output formats available depend on which feature flags are enabled:
| Format | Extension | Feature Flag |
|---|---|---|
| UFO | .ufo |
ufo |
| DesignSpace | .designspace |
ufo |
| Glyphs 2/3 | .glyphs |
glyphs |
| Glyphs Package | .glyphspackage |
glyphs |
| FontLab VFJ | .vfj |
fontlab |
| FontForge | .sfd / .sfdir |
fontforge |
| Fontra | .fontra |
fontra |
| Babelfont JSON | .babelfont |
(always) |
| TrueType/OpenType | .ttf / .otf |
ttf / fontir |
JSON Serialization
One of Babelfont's unique features is its ability to serialize and deserialize its internal representation to and from JSON. This provides a format-agnostic way to store and exchange font data.
The JSON format is complete and lossless, meaning you can:
- Convert any supported format to JSON and back without data loss
- Use JSON as an intermediate format when converting between editor formats
- Inspect the complete font structure in a human-readable format
- Create programmatic workflows using standard JSON tools
Example:
use babelfont::load;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Load from Glyphs
let font = load("MyFont.glyphs")?;
// Save as JSON
font.save("MyFont.babelfont")?;
// Load from JSON
let font2 = load("MyFont.babelfont")?;
// Convert to DesignSpace
font2.save("MyFont.designspace")?;
Ok(())
}
Font Filters
Babelfont includes several built-in filters for font manipulation:
RetainGlyphs- Keep only specified glyphs, removing all others. Components referencing removed glyphs are automatically decomposed.DropAxis- Remove a variable font axisDropInstances- Remove named instancesDropKerning- Remove all kerning dataDropFeatures- Remove OpenType feature codeDropGuides- Remove all guidelinesDropSparseMasters- Convert sparse masters to associated layersResolveIncludes- Resolve feature file include statementsScaleUpem- Scale the units-per-em value
Filters can be chained together:
use babelfont::{load, filters::*};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut font = load("MyFont.glyphs")?;
// Apply multiple filters
RetainGlyphs::new(vec!["A".into(), "B".into()]).apply(&mut font)?;
DropGuides.apply(&mut font)?;
DropKerning.apply(&mut font)?;
font.save("MyFont-Filtered.glyphs")?;
Ok(())
}
Core Types
Font- The main font structure containing all font dataGlyph- A single glyph with its layers and metadataLayer- A glyph's outline in a particular masterMaster- A design master in a variable/multiple master fontAxis- A variation axis definitionInstance- A named instance (static font variant)Features- OpenType feature code representationShape- A path or component in a glyph layer
Command-Line Interface
With the cli feature enabled, Babelfont also provides a command-line tool:
# Convert between formats
babelfont MyFont.glyphs MyFont.babelfont
# Apply filters
babelfont MyFont.babelfont Subset.babelfont --filter dropaxis=wdth --filter retainglyphs=A,B,C
# Compile to TTF
babelfont Subset.babelfont Subset.ttf
Install it from source with:
cargo install babelfont --features cli
or from PyPI:
pip install babelfont-rs
Related Projects
- fontmerge - merge selected glyphs and layout features from one font into another
- sr-aef - "uncompile" OpenType layout tables back into feature file (fea) source
Babelfont is based on the Python babelfont library. Additional development is now happening here, rather than in the original Python version.
License
Babelfont is available under the MIT or Apache-2.0 licenses, at your option. See LICENSE-MIT and LICENSE-APACHE.
Contributing
Contributions are welcome! Please feel free to submit pull requests or open issues on GitHub.
Metadata
Release files for babelfont-rs 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| babelfont_rs-0.2.4.tar.gz | 1.8 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| babelfont_rs-0.2.4-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| babelfont_rs-0.2.4-py3-none-win32.whl | Python 3 | none | Windows x86-32 | Details |
| babelfont_rs-0.2.4-py3-none-musllinux_1_1_x86_64.whl | Python 3 | none | Linux musl 1.1+ x86-64 | Details |
| babelfont_rs-0.2.4-py3-none-musllinux_1_1_aarch64.whl | Python 3 | none | Linux musl 1.1+ ARM64 | Details |
| babelfont_rs-0.2.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| babelfont_rs-0.2.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| babelfont_rs-0.2.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | Python 3 | none | macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64, macOS 10.12+ x86-64 | Details |
Total release size: 75.5 MB
Release files / babelfont_rs-0.2.4.tar.gz
| Download URL | babelfont_rs-0.2.4.tar.gz |
|---|---|
| Size | 1.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e42f4e79f11d73855583bcaf92c012af88695b305659a89b5caeca6709fd650d
|
|
BLAKE2b-256 checksum How to use checksums |
6b360e95349f1d9f209fd2c882cf6d626551f3ef16d9161ea79012e00407d26c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency logRelease files / babelfont_rs-0.2.4-py3-none-win_amd64.whl
| Download URL | babelfont_rs-0.2.4-py3-none-win_amd64.whl |
|---|---|
| Size | 8.7 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4dab29c964976132b389d0ff5f3e6af7c4815c2c8fefb6b7f7d0b6fb0edf54ce
|
|
BLAKE2b-256 checksum How to use checksums |
9227a7d1a3a575a562919b7f8c5e668b42cef28b34e77a8c1b2f5fab8a70016c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency logRelease files / babelfont_rs-0.2.4-py3-none-win32.whl
| Download URL | babelfont_rs-0.2.4-py3-none-win32.whl |
|---|---|
| Size | 7.9 MB |
| Tags | Python 3 Windows x86-32 |
|
SHA-256 checksum How to use checksums |
7538096c6448e8de49b1783dd0f65238c5069e36727a842c5fe55a11d1f87d37
|
|
BLAKE2b-256 checksum How to use checksums |
07f93a6319758c6b6153c55db46ae100bab3a702410b718bcdb45a7ba92e2564
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency logRelease files / babelfont_rs-0.2.4-py3-none-musllinux_1_1_x86_64.whl
| Download URL | babelfont_rs-0.2.4-py3-none-musllinux_1_1_x86_64.whl |
|---|---|
| Size | 9.9 MB |
| Tags | Linux musl 1.1+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
dfe74a33db89d71d4ade519b118fc8b05e66027f5eec9b80b8fee99b16b5eec9
|
|
BLAKE2b-256 checksum How to use checksums |
8bf0fbb8a79b06fcec91d20942f2b4c657844751090eb85cf613936a706b3b27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency logRelease files / babelfont_rs-0.2.4-py3-none-musllinux_1_1_aarch64.whl
| Download URL | babelfont_rs-0.2.4-py3-none-musllinux_1_1_aarch64.whl |
|---|---|
| Size | 9.5 MB |
| Tags | Linux musl 1.1+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
a8fc3a25dbc91a8c162416964aeda701e977a918afaac379b5622c99e0183e7f
|
|
BLAKE2b-256 checksum How to use checksums |
404a77e74d1d0821a5a691e37ff336ebee4d9a29fabf565f145d2fa35520c61b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency logRelease files / babelfont_rs-0.2.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | babelfont_rs-0.2.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 9.7 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
cff54526847378f83c04380b16ab759cce90fa5043ff3e5863ee7a79b9845781
|
|
BLAKE2b-256 checksum How to use checksums |
9623706270140a6050cd8a80c7b16081ef0c2227346f9016fab8695555c5247e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency logRelease files / babelfont_rs-0.2.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | babelfont_rs-0.2.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 9.7 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
240b116c7dd697e0f6071b87507c906a134e98a94ac380b319e63c89753f8c5f
|
|
BLAKE2b-256 checksum How to use checksums |
636c55f322f3ef396a783f3d8a458580525dd5d35a1e1ce874f43e2ddba420b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency logRelease files / babelfont_rs-0.2.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | babelfont_rs-0.2.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 18.3 MB |
| Tags | Python 3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
81226fe61ad62eee02ab83d2def92a8062d65deb2545ec8e78a67f5d40bad2a9
|
|
BLAKE2b-256 checksum How to use checksums |
c7d9eacc0b96b46e56f1090290fe47f284aec69a00e45ca50b6235ddcf8ccf9b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 12, 2026.
Transparency log