{"id":28393039,"url":"https://github.com/harfbuzz/harfrust","last_synced_at":"2026-01-07T22:13:10.923Z","repository":{"id":248615124,"uuid":"829031665","full_name":"harfbuzz/harfrust","owner":"harfbuzz","description":"HarfBuzz port to Rust","archived":false,"fork":false,"pushed_at":"2025-09-23T20:01:07.000Z","size":9974,"stargazers_count":151,"open_issues_count":15,"forks_count":12,"subscribers_count":19,"default_branch":"main","last_synced_at":"2025-09-23T22:05:21.726Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/harfbuzz.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-07-15T16:04:15.000Z","updated_at":"2025-09-23T20:01:06.000Z","dependencies_parsed_at":"2024-08-09T03:20:44.201Z","dependency_job_id":"05dfe0bf-0543-483c-95bf-34b9e983c447","html_url":"https://github.com/harfbuzz/harfrust","commit_stats":{"total_commits":806,"total_committers":21,"mean_commits":38.38095238095238,"dds":0.6501240694789081,"last_synced_commit":"12a87b5232b8b11641da42e248df39bc1d202a6d"},"previous_names":["harfbuzz/harfruzz","harfbuzz/harfrust"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/harfbuzz/harfrust","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harfbuzz%2Fharfrust","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harfbuzz%2Fharfrust/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harfbuzz%2Fharfrust/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harfbuzz%2Fharfrust/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/harfbuzz","download_url":"https://codeload.github.com/harfbuzz/harfrust/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harfbuzz%2Fharfrust/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002411,"owners_count":26083373,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-31T15:10:31.402Z","updated_at":"2025-10-10T01:04:22.795Z","avatar_url":"https://github.com/harfbuzz.png","language":"Rust","funding_links":[],"categories":["Rust","Font/Text Library"],"sub_categories":["Rust 2D renderer"],"readme":"[![Build Status](https://github.com/harfbuzz/harfrust/actions/workflows/main.yml/badge.svg)](https://github.com/harfbuzz/harfrust/actions/workflows/main.yml)\n[![Crates.io](https://img.shields.io/crates/v/harfrust.svg)](https://crates.io/crates/harfrust)\n[![Documentation](https://docs.rs/harfrust/badge.svg)](https://docs.rs/harfrust)\n\n# HarfRust\n\nHarfRust is a Rust port of [HarfBuzz](https://github.com/harfbuzz/harfbuzz) text shaping engine.\nSee [Major changes](#major-changes) below for major differences between HarfRust and HarfBuzz.\n\nHarfRust started as a fork of [RustyBuzz](https://docs.rs/rustybuzz) to explore porting from `ttf-parser` to\n[`read-fonts`](https://docs.rs/read-fonts) to avoid shipping (and maintaining)\nmultiple implementations of core font parsing for [`skrifa`](https://docs.rs/skrifa) consumers.\nFurther context in https://github.com/googlefonts/fontations/issues/956.\n\nMatches HarfBuzz [v11.4.5](https://github.com/harfbuzz/harfbuzz/releases/tag/11.4.5).\n\n## Why?\n\nhttps://github.com/googlefonts/oxidize outlines Google Fonts motivations to try to migrate font\nproduction and consumption to Rust.\n\n## Major changes\n\n- No font size property. Shaping is always using UnitsPerEm. You should scale the result manually.\n- Most of the font loading and parsing is done using [`read-fonts`](https://docs.rs/read-fonts).\n- HarfRust doesn't provide any integration with external libraries, so no FreeType, CoreText, or Uniscribe/DirectWrite font-loading integration, and no ICU, or GLib Unicode-functions integration, as well as no `graphite2` library support.\n- `mort` table is not supported, since it's deprecated by Apple.\n- No `graphite` font support.\n\n## Conformance\n\nThe following conformance issues need to be fixed:\n\n- HarfRust for the most part passes the HarfBuzz test and fuzzing suites, but there are some known issues. See [HARFBUZZ.md](./HARFBUZZ.md) for details.\n- Malformed fonts will cause an error. HarfBuzz uses fallback/dummy shaper in this case.\n- No Arabic fallback shaper. This requires the ability to build lookups on the fly. In HarfBuzz (C++) this requires serialization code that is associated with subsetting.\n- Experimental HarfBuzz features like most of the boring-expansion-spec are not supported yet.\n\n## Performance\n\nHarfRust is less than 25% slower than HarfBuzz on most common fonts. For a comparison see this [spreadsheet][3].\nYou can run `cargo bench` to see the performance of HarfRust on your machine.\n\n\n## Notes about the port\n\nHarfRust is not a full port of HarfBuzz. HarfBuzz (C++ edition) can roughly be split into 6 parts:\n\n1. shaping, ported to HarfRust\n2. Unicode routines, ported to HarfRust\n3. font parsing, handled by [`read-fonts`](https://docs.rs/read-fonts)\n4. subsetting, handled by [`klippa`](https://github.com/googlefonts/fontations/tree/main/klippa)\n5. custom containers and utilities (HarfBuzz doesn't use C++ standard library), reimplemented in [`fontations`](https://github.com/googlefonts/fontations) where appropriate (e.g. int set)\n6. glue for system/3rd party libraries, not ported\n\n## Safety\n\nThe library is completely safe.\n\nThere are no `unsafe` in this library and in most of its dependencies (excluding `bytemuck`).\n\n## Developer documents\n\nFor notes on the backporting process of HarfBuzz code, see [docs/backporting.md](docs/backporting.md).\n\nFor notes on generating state machine using `ragel`, see [docs/ragel.md](docs/ragel.md).\n\nThe following HarfBuzz _studies_ are relevant to HarfRust development:\n\n- 2025 - [Introducing HarfRust][2]\n- 2025 – [Caching][1]\n\n## License\n\nHarfRust is licensed under the **MIT** license.\n\nHarfBuzz is [licensed](https://github.com/harfbuzz/harfbuzz/blob/main/COPYING) under the **Old MIT**\n\n[1]: https://docs.google.com/document/d/1_VgObf6Je0J8byMLsi7HCQHnKo2emGnx_ib_sHo-bt4/preview\n[2]: https://docs.google.com/document/d/1aH_waagdEM5UhslQxCeFEb82ECBhPlZjy5_MwLNLBYo/preview\n[3]: https://docs.google.com/spreadsheets/d/1lyPPZHXIF8gE0Tpx7_IscwhwaZa4KOpdt7vnV0jQT9o/preview\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharfbuzz%2Fharfrust","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fharfbuzz%2Fharfrust","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharfbuzz%2Fharfrust/lists"}