Skip to main content

Babelfont

crates.io docs.rs

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 (.glyphs and .glyphspackage)
  • ufo - Support for UFO and DesignSpace formats
  • fontlab - Support for FontLab VFJ (JSON) format
  • fontforge - Support for FontForge SplineFont formats (.sfd, .sfdir)
  • fontra - Support for Fontra format
  • robocjk - Support for the RoboCJK subset workflow format
  • ttf / fontir - Compilation to binary font formats (.ttf)
  • types - Typeshare annotations for generating TypeScript type definitions of the JSON format
  • rayon - Rayon-based parallelism in norad
  • cli - Command-line interface (builds the babelfont binary; 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 axis
  • DropInstances - Remove named instances
  • DropKerning - Remove all kerning data
  • DropFeatures - Remove OpenType feature code
  • DropGuides - Remove all guidelines
  • DropSparseMasters - Convert sparse masters to associated layers
  • ResolveIncludes - Resolve feature file include statements
  • ScaleUpem - 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 data
  • Glyph - A single glyph with its layers and metadata
  • Layer - A glyph's outline in a particular master
  • Master - A design master in a variable/multiple master font
  • Axis - A variation axis definition
  • Instance - A named instance (static font variant)
  • Features - OpenType feature code representation
  • Shape - 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
  • 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)

Source distribution for babelfont-rs 0.2.4
File Size Uploaded
babelfont_rs-0.2.4.tar.gz 1.8 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for babelfont-rs 0.2.4
File
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

This release

0.2.4 This release

8 release files

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