{"id":16906635,"url":"https://github.com/rsms/fontctrl","last_synced_at":"2025-04-11T15:26:43.921Z","repository":{"id":48432204,"uuid":"117501433","full_name":"rsms/fontctrl","owner":"rsms","description":"Font manager, keeping font files up to date with a distributed repository model","archived":false,"fork":false,"pushed_at":"2018-01-16T08:08:10.000Z","size":27,"stargazers_count":24,"open_issues_count":0,"forks_count":3,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-11T12:41:48.207Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":false,"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/rsms.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-01-15T05:33:37.000Z","updated_at":"2024-05-24T10:06:32.000Z","dependencies_parsed_at":"2022-09-22T06:11:03.501Z","dependency_job_id":null,"html_url":"https://github.com/rsms/fontctrl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsms%2Ffontctrl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsms%2Ffontctrl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsms%2Ffontctrl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsms%2Ffontctrl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rsms","download_url":"https://codeload.github.com/rsms/fontctrl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248429901,"owners_count":21101911,"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","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":"2024-10-13T18:43:41.442Z","updated_at":"2025-04-11T15:26:43.888Z","avatar_url":"https://github.com/rsms.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Font Control\n\nA font manager for keeping your font files up-to date\n\n1. Distributed, plain \u0026 simple repository model\n   1. There's a default, main repository of fonts that are free\n      (as in free to distribute) that the working group hosts and maintains.\n   2. Anyone can setup a repository; e.g. host fonts internally at your company\n      and restrict access to people who have licenses for the fonts.\n   3. A repository is [just a set of files](#font-repository)\n      served over HTTP(S) and should be serviceable from any HTTP server\n      (no dynamic content generation required.) E.g. AWS S3, GitHub, etc.\n2. A small and portable program (`fontctrl`) that manages fonts on a computer\n   and serves as the client for accessing repositories.\n   1. Can be configured to operate on any number of repositories via a simple\n      JSON configuration file (`~/.fontctrl.json` on Posix systems, )\n   2. Memorizing the user's preference of fonts and any versions limitations\n      (e.g. `\"inter-ui = 2.*\"`)\n   3. Keeps font files up to date according to the user's preference and\n      availability in configured repositories, by\n\nLong-term goal is to make it easy for designers to keep all their font files\nup to date, including updates to fonts they have purchased licenses for.\nOperation should be as automatic as possible, optimally operating without user\nintervention (e.g. via scheduled invocation or as a service.)\n\n\nCurrently supported systems:\n\n- macOS\n\n\n## Font Repository\n\nA font repository is a source for fonts served over HTTP.\n\nPaths:\n\n```txt\n/index.json\n# machine-readable index of the state of the repo\n\n/\u003cfont-name\u003e/\u003cfont-name\u003e-\u003cversion\u003e.zip\n# archive containing the font files for \u003cversion\u003e of \u003cfont-name\u003e\n\n/\u003cfont-name\u003e/\u003cfont-name\u003e-\u003cversion\u003e.json\n# description of \u003cversion\u003e of \u003cfont-name\u003e\n```\n\nShape of `/index.json`:\n\n```json\n{\n  \"fonts\": {\n    \"\u003cfont-name\u003e\": {\n      \"name\":     \"\u003cfamily-name\u003e\",\n      \"versions\": [ \"\u003cversion\u003e\" ]\n    }\n  }\n}\n```\n\nShape of `/\u003cfont-name\u003e/\u003cfont-name\u003e-\u003cversion\u003e.json`:\n\n```json\n{\n  \"version\":     \"\u003cversion\u003e\",\n  \"checksum\":    \"\u003csha1-checksum\u003e\",\n  \"name\":        \"\u003cfamily-name\u003e\",\n  \"styles\":      [ \"\u003cstyle\u003e\" ],\n\n  \"archive_url\": \"\u003carchive_url\u003e\",\n  \"description\": \"\u003cdescription\u003e\",\n  \"info_url\":    \"\u003cinfo-url\u003e\",\n  \"authors\":     [ \"\u003cauthor\u003e\" ],\n  \"license\":     \"\u003clicense\u003e\"\n}\n```\n\nParameters:\n\n- `\u003cversion\u003e` should be a\n  [SemVer](https://github.com/semver/semver/blob/master/semver.md) formatted\n  version string. E.g. \"1.1.141+2013\"\n  If `\u003cversion\u003e` is not in the SemVer format, it is interpreted as an opaque\n  identifier. I.e. `2.003 \u003c 2.004 =\u003e false` but `\"2.003\" == \"2.003\" =\u003e true`.\n- `\u003cfont-name\u003e` should be a short name for the font using only the following\n  characters: `A-Z`, `a-z`, `0-9`, `-`, `_`, `.` (regexp `[A-Za-z0-9_\\-\\.]+`)\n  E.g. \"inter-ui\"\n- `\u003cfamily-name\u003e` should be the human-readable name of the font family.\n  This should match the `typoFamilyName` record of the font files'\n  `name` tables. E.g. \"Inter UI\"\n- `\u003csha1-checksum\u003e` should be the hexadecimal representation of the\n  SHA-1 checksum of the zip archive.\n- `\u003cstyle\u003e` should be the same name as in the respective font file's\n  `typoSubfamilyName` record of the `name` table. E.g. \"Medium Italic\".\n\nOptional parameters:\n\n- `\u003carchive_url\u003e` URL pointing to a font-file archive in an external location.\n  Note that `\u003csha1-checksum\u003e` must match the archive file even if it's served\n  from an external location.\n- `\u003cdescription\u003e` should be a human-readable description of the typeface.\n- `\u003cinfo-url\u003e` a well-formed URL pointing to a resource with more information\n  about the typeface.\n- `\u003cauthor\u003e` should be the name (and optionally an electronic address) of a\n  person or entity that is the (co-)author of the typeface.\n- `\u003clicense\u003e` should either be a copyright statement, a complete end-user\n  license or a url to a complete end-user license for the font files.\n\n\n## Client configuration\n\nfontctrl reads its configuration from a text file that you can edit to change\nwhat sources (repositories) your fonts are being installed from.\nfontctrl looks for the configuration file in the following locations, in order:\n\n- `./.fontctrl.yml`\n- `./fontctrl.yml`\n- [macOS, linux] `~/.fontctrl.yml`\n- [windows] `%USERPROFILE%\\AppData\\Local\\fontctrl\\fontctrl.yml`\n\nShape of the configuration file:\n\n```yml\nfont-dir: \u003cfont-dir\u003e\nrepos:\n  - url: \u003crepo-url\u003e\nfonts:\n  \u003cfont-name\u003e: \u003cfont-version-pattern\u003e\n  \u003cfont-name\u003e: \u003cfont-subscription\u003e\n    version: \u003cfont-version-pattern\u003e\n    styles: [ \u003cfont-style\u003e ]\n```\n\n- `repos` contain an ordered listing of repositories from which to fetch fonts.\n  A repo listed earlier takes precedence over a repo listed further down.\n- `\u003crepo-url\u003e` should be fully-qualified URL to a [repository](/publish/)\n- `\u003cfont-dir\u003e` is optional and when present overrides the file system location\n  where fontctrl will install and manage local font files.\n- `fonts` is the only required property and is the list of fonts you are\n  subscribing to.\n- `\u003cfont-name\u003e` is the name of a font as used in repositories\n- `\u003cfont-version-pattern\u003e` is a semver version pattern declaring what versions\n  of the font you are interested in. E.g. `\"2.*\"`, \"1.3.0-beta\", \"\u003e=2.0\", etc.\n  An empty string or `\"*\"` means \"most recent stable release\".\n  The special string `\"latest\"` means \"most recent release\", which included\n  pre-releases.\n- `\u003cfont-subscription\u003e` can be used instead of just a version pattern to also\n  limit font styles. `\u003cfont-subscription\u003e`\n- `\u003cfont-style\u003e` case-insensitive name of a specific style,\n  e.g. \"bold\", \"medium italic\". When styles are specified, only those styles\n  will be installed and managed. (this is not yet implemented; may never be.)\n\n\u003e Note: In the future, the configuration file will be expanded to include\n\u003e account identity for accessing restricted repositories.\n\nExample:\n\n```yml\nfont-dir: ~/Library/Fonts/fontctrl\nrepos:\n  - url: https://fontctrl.org/fonts/\nfonts:\n  inter-ui: \"\u003e=2.*\"\n```\n\n\n## Building \u0026 developing\n\n[Posix]\n\nFirst-time setup:\n\n```\n$ ln -s /abs/path/to/misc/fontctrl.json ~/.fontctrl.json\n$ ./init.sh\n```\n\nBuild:\n\n```txt\n$ client/build.sh\n$ ./build/fontctrl version\n```\n\nRun unit tests:\n\n```txt\n$ client/test.sh\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsms%2Ffontctrl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frsms%2Ffontctrl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsms%2Ffontctrl/lists"}