{"id":13753763,"url":"https://github.com/yeslogic/allsorts","last_synced_at":"2026-05-13T02:13:14.654Z","repository":{"id":36258283,"uuid":"102317847","full_name":"yeslogic/allsorts","owner":"yeslogic","description":"Font parser, shaping engine, and subsetter implemented in Rust","archived":false,"fork":false,"pushed_at":"2026-04-01T01:33:19.000Z","size":28598,"stargazers_count":790,"open_issues_count":33,"forks_count":27,"subscribers_count":31,"default_branch":"master","last_synced_at":"2026-04-05T04:09:57.347Z","etag":null,"topics":["font","font-layout","font-shaping","font-subset","opentype","rust"],"latest_commit_sha":null,"homepage":"https://yeslogic.com/blog/allsorts-rust-font-shaping-engine/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yeslogic.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":"2017-09-04T04:12:12.000Z","updated_at":"2026-04-04T10:31:26.000Z","dependencies_parsed_at":"2024-01-13T16:50:40.187Z","dependency_job_id":"b3ff64b1-fa10-45c8-8909-c644220461da","html_url":"https://github.com/yeslogic/allsorts","commit_stats":{"total_commits":534,"total_committers":11,"mean_commits":48.54545454545455,"dds":0.4269662921348315,"last_synced_commit":"332e29d8667f928bceb123833c139e885226399f"},"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/yeslogic/allsorts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeslogic%2Fallsorts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeslogic%2Fallsorts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeslogic%2Fallsorts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeslogic%2Fallsorts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yeslogic","download_url":"https://codeload.github.com/yeslogic/allsorts/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeslogic%2Fallsorts/sbom","scorecard":{"id":1239706,"data":{"date":"2025-11-03","repo":{"name":"github.com/yeslogic/allsorts","commit":"ddd6a6aa94f4a1369f9bd4ed3d645d5d85291d11"},"scorecard":{"version":"v5.3.1-0.20251106164954-c65a663bf4a9","commit":"c65a663bf4a93c0f6eca32e6d34713d3e3440e11"},"score":3.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/yeslogic/allsorts/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/yeslogic/allsorts/ci.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-11-13T01:18:00.942Z","repository_id":36258283,"created_at":"2025-11-13T01:18:00.942Z","updated_at":"2025-11-13T01:18:00.942Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32964484,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T23:30:32.555Z","status":"online","status_checked_at":"2026-05-13T02:00:07.132Z","response_time":115,"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":["font","font-layout","font-shaping","font-subset","opentype","rust"],"created_at":"2024-08-03T09:01:28.958Z","updated_at":"2026-05-13T02:13:14.649Z","avatar_url":"https://github.com/yeslogic.png","language":"Rust","funding_links":[],"categories":["Rust","Font/Text Library"],"sub_categories":["Rust 2D renderer"],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/yeslogic/allsorts/raw/master/allsorts.svg?sanitize=1\" alt=\"\"\u003e\u003cbr\u003e\n  Allsorts\n\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cstrong\u003eFont parser, shaping engine, and subsetter for OpenType, WOFF, and WOFF2 implemented in Rust\u003c/strong\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/yeslogic/allsorts/actions/workflows/ci.yml\"\u003e\n    \u003cimg src=\"https://github.com/yeslogic/allsorts/actions/workflows/ci.yml/badge.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://docs.rs/allsorts\"\u003e\n    \u003cimg src=\"https://docs.rs/allsorts/badge.svg\" alt=\"Documentation\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://crates.io/crates/allsorts\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/v/allsorts.svg\" alt=\"Version\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/yeslogic/allsorts/blob/master/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/crates/l/allsorts.svg\" alt=\"License\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\nAllsorts is a font parser, shaping engine, and subsetter for OpenType, WOFF, and WOFF2\nwritten entirely in Rust. It was extracted from\n[Prince](https://www.princexml.com/), a tool that typesets and lays out HTML\nand CSS documents into PDF.\n\nThe Allsorts shaping engine was developed in conjunction with [a specification\nfor OpenType shaping](https://github.com/n8willis/opentype-shaping-documents/),\nwhich aims to specify OpenType font shaping behaviour.\n\n## Features\n\n* **Parse** TrueType/OpenType (`glyf`, `CFF`, `CFF2`), WOFF, and WOFF2 files.\n* **Shape** Arabic, Cyrillic, Greek, Hebrew, [Indic\n  scripts](https://en.wikipedia.org/wiki/Languages_of_India) (Bengali,\n  Devanagari, Gujarati, Gurmukhi, Kannada, Malayalam, Oriya, Sinhala, Tamil,\n  Telugu), Khmer, Lao, Latin, Myanmar, Syriac, Thai, and other scripts.\n* **Subset** from TrueType, OpenType, WOFF, and WOFF2 into fonts suitable\n  for PDF embedding.\n* **Instance** variable fonts into non-variable fonts.\n\n## What is font shaping?\n\nFont shaping is the process of taking text in the form of Unicode codepoints\nand a font, and laying out glyphs from the font according to the text. This\ninvolves honouring kerning, ligatures, and substitutions specified by the font.\nFor some languages this is relatively straightforward. For others, such as\nIndic scripts it is quite complex. After shaping, another library such as\n[Pathfinder](https://github.com/servo/pathfinder) or\n[FreeType](https://www.freetype.org/) is responsible for rendering the glyphs.\nTo learn more about text rendering, Andrea Cognolato has a good [overview of\nmodern font rending on\nLinux](https://mrandri19.github.io/2019/07/24/modern-text-rendering-linux-overview.html).\nThe concepts remain similar on other platforms.\n\n## Examples\n\nRefer to the [Allsorts Tools repository](https://github.com/yeslogic/allsorts-tools) for\na set of tools that exercise Allsorts font parsing, shaping, and subsetting.\n\n## Unimplemented Features / Known Issues\n\nWe don't currently support:\n\n* Unicode normalisation.\n\nKnown limitations:\n\n* Allsorts does not do font lookup/matching. For this something like\n  [font-kit](https://github.com/pcwalton/font-kit) is recommended.\n\n## Development Status\n\nAllsorts is still under active development but reached its first release\nmilestone with its inclusion in Prince 13 in 2019. In Prince it is responsible\nfor all font loading, and font shaping.\n\nCurrently, the font parsing code is handwritten. It is planned for this to\neventually be replaced by machine generated code via our [declarative data\ndefinition language project](https://github.com/yeslogic/fathom).\n\n## Platform Support\n\nAllsorts CI runs tests on Linux, macOS, and Windows. Via Prince it is also\nbuilt for FreeBSD.\n\n## Building and Testing\n\n**Minimum Supported Rust Version:** 1.83.0\n\nTo build the crate ensure you have [Rust 1.83.0 or newer installed](https://www.rust-lang.org/tools/install).\n\nBuild with `cargo build` and run the tests with `cargo test`.\n\n### Cargo Features\n\n| Feature          | Description                                      | Default Enabled | Extra Dependencies       |\n|------------------|--------------------------------------------------|:---------------:|--------------------------|\n| `flate2_zlib`    | Use the zlib backend for flate2                  | ✅              | `zlib`                   |\n| `flate2_rust`    | Use the Rust backend for flate2                  | ❌              | `miniz_oxide`            |\n| `flate2_zlib-rs` | Use the zlib-rs backend for flate2               | ❌              | `zlib-rs`                |\n| `prince`         | Enable Prince-specific tests and code            | ❌              |                          |\n| `specimen`       | Enable module for generating HTML font specimens | ❌              | `upon`, `unicode-blocks` |\n\n**Note:** In our testing the `zlib` `flate2` backend was faster but you may\nprefer the Rust backend for a pure Rust solution when compiling to WASM or\nsimilar.\n\n## Contributing\n\nContributions are welcome, please refer to the\n[contributing document](https://github.com/yeslogic/allsorts/blob/master/CONTRIBUTING.md)\nfor more details.\n\n## Code of Conduct\n\nWe aim to uphold the Rust community standards:\n\n\u003e We are committed to providing a friendly, safe and welcoming environment for\n\u003e all, regardless of gender, sexual orientation, disability, ethnicity,\n\u003e religion, or similar personal characteristic.\n\nWe follow the [Rust code of conduct](https://www.rust-lang.org/policies/code-of-conduct).\n\n## Acknowledgements\n\n* [OpenType shaping documents](https://github.com/n8willis/opentype-shaping-documents/)\n  forms the specification from which the shaping engine is implemented.\n* [HarfBuzz](https://github.com/harfbuzz/harfbuzz) the widely used open source\n  font shaping engine was used as reference for test output.\n* The [Adobe Annotated OpenType Specification](https://github.com/adobe-type-tools/aots)\n  test suite is used as part of the Allsorts test suite.\n* [ttf-parser](https://github.com/RazrFalcon/ttf-parser) for CFF CharString parsing code.\n\n## License\n\nAllsorts is distributed under the terms of the Apache License (Version 2.0).\n\nSee [LICENSE](https://github.com/yeslogic/allsorts/blob/master/LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeslogic%2Fallsorts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyeslogic%2Fallsorts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeslogic%2Fallsorts/lists"}