Skip to content

Repository files navigation

FontColle

▌ https://fontcolle.com ▐

FontColle

FontColle is an enhanced Google Fonts Collection that filters OpenType features, variable-font axes, weight/width steps, writing systems, languages, and color vs. monochrome. Preview any weight or named instance live, edit the specimen text inline, and save favorites.

TypeScript Python React 19 TanStack Start Tailwind CSS v4 Vite 8

Host on Cloudflare Workers

Daily incremental harvest Full harvest

File-based routing on Cloudflare Workers, with a static JSON catalog built from src/data/fonts.json and served as CDN-cached assets, with no database (see docs/data-pipeline.md). A Python harvester (scripts/harvester) builds the dataset from the Google Fonts catalog and gflanguages.

Development

pnpm install
pnpm pull:data    # fetch the data assets from R2 (first clone only)
pnpm dev          # vite dev server on :3000

pnpm pull:data needs a CLOUDFLARE_API_TOKEN with R2 read on the fontcolle-assets bucket, which only the maintainers have: see docs/data-pipeline.md. Outside contributors skip itpnpm build falls back to a committed 24-family sample, so pnpm build && pnpm dev runs with no Cloudflare account or API key. Details, and how to harvest more families, in Running without R2 access.

pnpm check runs Biome (with --write) then tsc --noEmit; run it before committing. pnpm build produces the Workers bundle in dist/.

Script What it does
pnpm dev Local dev server
pnpm build Production build (scripts/build.mjs wraps vite build)
pnpm check Biome fix + typecheck
pnpm test Vitest
pnpm gen:og Render per-font Open Graph images to public/og/

The font data is read-only, identical for every visitor, and refreshed once a day, so the app serves it as static JSON rather than querying a database. pnpm build slices src/data/fonts.json into the files the site fetches (scripts/gen-catalog.mjs), so a plain pnpm dev / pnpm build needs no database setup.

Data pipeline

The dataset (harvest → R2 storage → build → deploy) is documented separately:

  • docs/data-pipeline.md — where the data lives, running without R2 access, building the dataset, bootstrapping from scratch, and the daily incremental CI update.
  • src/data/README.md — provenance of each data file and each fonts.json field.

The short version: fonts.json (~21 MB) and the manifest pointer live in R2, not git; the daily workflow harvests only what changed, publishes to R2, and fires a Cloudflare Deploy Hook — a data-only day makes zero commits. Forks with no R2 access build against a committed 24-family sample.

Open Graph images

Each published family has a share card at public/og/<id>.png with the family name set in its own typeface (traced to a path at build time via the CSS2 API + opentype.js, rasterized with resvg). pnpm gen:og renders them all (--force re-renders existing; --ids=<file> restricts to a subset). The per-font route wires og:image; the daily workflow re-renders only changed families and pushes them to R2 as per-object deltas over the base tarball.

Contribution

Contributions are welcome. Run pnpm check before opening a PR.

Font metadata errors (wrong tags, missing languages, bad axis ranges) are best reported as an issue, most trace back to the harvester, not the UI.

License

MIT, covering this project's own code and metadata index only.

The fonts listed in this project are not distributed here; every font file and download links out to Google Fonts. Each font remains under its own license (SIL Open Font License, Apache 2.0, Ubuntu Font License, etc.) as declared by its original authors and foundries. Check a family's license before using it.


Made by ChingRu(@rutopio) - hello[AT]chingru.com

About

https://fontcolle.com - FontColle is an enhanced Google Fonts Collection that filters OpenType features, variable-font axes, weight/width steps, writing systems, languages, and color vs. monochrome. Preview any weight or named instance live, edit the specimen text inline, and save favorites.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages