#font #db #css #truetype #ttf


A simple, in-memory font database with CSS-like queries

16 releases (8 breaking)

0.9.1 Feb 21, 2022
0.8.0 Feb 12, 2022
0.7.0 Oct 3, 2021
0.5.4 May 25, 2021
0.2.0 Jul 21, 2020

#63 in Text processing

Download history 5224/week @ 2022-04-27 5413/week @ 2022-05-04 5897/week @ 2022-05-11 4883/week @ 2022-05-18 4687/week @ 2022-05-25 4351/week @ 2022-06-01 4371/week @ 2022-06-08 4356/week @ 2022-06-15 3692/week @ 2022-06-22 4242/week @ 2022-06-29 4387/week @ 2022-07-06 4338/week @ 2022-07-13 4182/week @ 2022-07-20 4864/week @ 2022-07-27 5539/week @ 2022-08-03 4440/week @ 2022-08-10

19,636 downloads per month
Used in 42 crates (12 directly)

MIT license

923 lines


Build Status Crates.io Documentation Rust 1.42+

fontdb is a simple, in-memory font database with CSS-like queries.


  • The database can load fonts from files, directories and raw data (Vec<u8>).
  • The database can match a font using CSS-like queries. See Database::query.
  • The database can try to load system fonts. Currently, this is implemented by scanning predefined directories. The library does not interact with the system API.
  • Provides a unique ID for each font face.


  • Advanced font properties querying.
    The database provides only storage and matching capabilities. For font properties querying you can use ttf-parser.

  • A font fallback mechanism.
    This library can be used to implement a font fallback mechanism, but it doesn't implement one.

  • Application's global database.
    The database doesn't use static, therefore it's up to the caller where it should be stored.

  • Font types support other than TrueType.

Font vs Face

A font is a collection of font faces. Therefore, a font face is a subset of a font. A simple font (*.ttf/*.otf) usually contains a single font face, but a font collection (*.ttc) can contain multiple font faces.

fontdb stores and matches font faces, not fonts. Therefore, after loading a font collection with 5 faces (for example), the database will be populated with 5 FaceInfo objects, all of which will be pointing to the same file or binary data.


The database performance is largely limited by the storage itself. We are using ttf-parser, so the parsing should not be a bottleneck.

On my machine with Samsung SSD 860 and Gentoo Linux, it takes ~20ms to load 1906 font faces (most of them are from Google Noto collection) with a hot disk cache and ~860ms with a cold one.

On Mac Mini M1 it takes just 9ms to load 898 fonts.


The library relies on memory-mapped files, which is inherently unsafe. But since we do not keep the files open it should be perfectly safe.

If you would like to use a persistent memory mapping of the font files, then you can use the unsafe [Database::make_shared_face_data] function.




~16K SLoC