{"id":18295188,"url":"https://github.com/adrientetar/kotlin-ufo","last_synced_at":"2026-04-29T00:34:00.303Z","repository":{"id":170695387,"uuid":"646905105","full_name":"adrientetar/kotlin-ufo","owner":"adrientetar","description":"A library to read/write UFO fonts","archived":false,"fork":false,"pushed_at":"2026-02-26T01:07:56.000Z","size":228,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-26T06:24:32.310Z","etag":null,"topics":["fonts","kotlin-jvm"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","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/adrientetar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2023-05-29T15:54:50.000Z","updated_at":"2026-02-26T01:08:00.000Z","dependencies_parsed_at":"2024-02-26T22:51:18.950Z","dependency_job_id":"69099ff8-7da0-4aab-83b1-8b8196d7a763","html_url":"https://github.com/adrientetar/kotlin-ufo","commit_stats":null,"previous_names":["adrientetar/kotlin-ufo"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/adrientetar/kotlin-ufo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrientetar%2Fkotlin-ufo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrientetar%2Fkotlin-ufo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrientetar%2Fkotlin-ufo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrientetar%2Fkotlin-ufo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adrientetar","download_url":"https://codeload.github.com/adrientetar/kotlin-ufo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adrientetar%2Fkotlin-ufo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32405901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T19:38:08.556Z","status":"ssl_error","status_checked_at":"2026-04-28T19:37:55.688Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["fonts","kotlin-jvm"],"created_at":"2024-11-05T14:33:53.082Z","updated_at":"2026-04-29T00:34:00.297Z","avatar_url":"https://github.com/adrientetar.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\nkotlin-ufo\n==========\n\n**A library to read/write [UFO fonts]**\n\n[![Kotlin](https://img.shields.io/badge/Language-Kotlin-7f52ff.svg)](https://kotlinlang.org/)\n[![Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE.txt)\n[![Maven central](https://img.shields.io/maven-central/v/io.github.adrientetar/kotlin-ufo?color=brightgreen)](https://central.sonatype.com/artifact/io.github.adrientetar/kotlin-ufo)\n[![Code coverage](https://codecov.io/gh/adrientetar/kotlin-ufo/branch/main/graph/badge.svg?token=6VLVM9MTQM)](https://codecov.io/gh/adrientetar/kotlin-ufo)\n\n\u003c/div\u003e\n\nWith this library, one can read and write [UFO fonts], which in turn allows using the [fontmake] compiler.\n\nUFO 3 is supported, as well as UFOZ (ZIP-compressed UFO). UFO 2 import is supported.\n\nMaven library\n-------------\n\n```kotlin\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation(\"io.github.adrientetar:kotlin-ufo:1.2.0\")\n}\n```\n\nUsage\n-----\n\n### Read\n\n```kotlin\nimport com.google.common.truth.Truth.assertThat\nimport io.github.adrientetar.ufo.UFOReader\nimport java.nio.file.Paths\n\nval path = Paths.get(\"/usr/share/MyFont-Regular.ufo\")\n\nval reader = UFOReader(path)\nval info = reader.readFontInfo()\n\nassertThat(info.familyName).isEqualTo(\"My Font\")\nassertThat(info.styleName).isEqualTo(\"Regular\")\n```\n\n### Write\n\n```kotlin\nimport io.github.adrientetar.ufo.FontInfoValues\nimport io.github.adrientetar.ufo.UFOWriter\nimport java.nio.file.Paths\n\nval path = Paths.get(\"/usr/share/MyFont-Regular.ufo\")\n\nval info = FontInfoValues().apply {\n    familyName = \"My Font\"\n    styleName = \"Regular\"\n}\n\nval writer = UFOWriter(path)\nwriter.writeMetaInfo()\nwriter.writeFontInfo(info)\n```\n\n### Round-trip\n\nRead all layers from one UFO and write them to another, using the\n`UFOFormatWriter` interface to target either `.ufo` or `.ufoz`:\n\n```kotlin\nimport io.github.adrientetar.ufo.*\nimport java.nio.file.Paths\n\nval input = Paths.get(\"MyFont-Regular.ufo\")\nval output = Paths.get(\"MyFont-Regular.ufoz\")\n\nval reader = UFOReader(input)\n\n// UFOFormatWriter lets you write to .ufo or .ufoz interchangeably\nval writer: UFOFormatWriter = UFOZWriter.open(output)\nwriter.use {\n    it.writeMetaInfo()\n    it.writeFontInfo(reader.readFontInfo())\n    it.writeLayers(reader.readLayers())\n    it.writeGroups(reader.readGroups())\n    it.writeKerning(reader.readKerning())\n    it.writeLib(reader.readLib())\n    it.writeFeatures(reader.readFeatures())\n}\n```\n\nSee [the tests](/src/test/kotlin/io/github/adrientetar/ufo) for more sample code.\n\nSupported features\n------------------\n\n| Feature | Status |\n|---------|--------|\n| `metainfo.plist` | ✅ Read/Write |\n| `fontinfo.plist` | ✅ Read/Write (comprehensive) |\n| `groups.plist` | ✅ Read/Write (with kerning group helpers) |\n| `kerning.plist` | ✅ Read/Write |\n| `lib.plist` | ✅ Read/Write (with `public.glyphOrder`) |\n| `features.fea` | ✅ Read/Write |\n| `layercontents.plist` | ✅ Read/Write (multiple layers) |\n| `glyphs/` | ✅ Read/Write (all GLIF elements) |\n| `images/` directory | ✅ Read/Write (PNG images) |\n| `data/` directory | ✅ Read/Write (arbitrary data) |\n| `UFOFormatWriter` | ✅ Shared interface for UFO/UFOZ writing |\n| `readLayers()` / `readGlyphs(layerName)` | ✅ Full round-trip layer support |\n\n**GLIF support:** advance, unicode, anchor, outline (contour, component, point), lib, note, image, guideline, and identifier attributes.\n\nBuild\n-----\n\nYou need JDK 11 or later installed.\n\nTo build this library, run `./gradlew jar`.\n\n[UFO fonts]: https://unifiedfontobject.org/\n[fontmake]: https://github.com/googlefonts/fontmake\n[jimfs]: https://github.com/google/jimfs\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrientetar%2Fkotlin-ufo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadrientetar%2Fkotlin-ufo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadrientetar%2Fkotlin-ufo/lists"}