Browse Google Fonts as full-size specimens and discover display + text pairings — googlefontfinder.com.
pnpm install
pnpm dev # http://localhost:3000No API keys or environment variables are needed to run or host it; the font data
is static JSON committed to the repo. Regenerating that data is the one thing that
needs a key — see the refresh-data skill.
Up next
- #31 — XPLR, revive the fontjoy explorer. #32 and #35 done; #33 (regenerate vectors for the 2026 catalog) is next, #34 (variable fonts) deliberately unspecified until we live with it.
- #24 — Conformance to project-standard. Every child resolved; open until merged.
- #17 — User-editable card themes; the design needs a rewrite against the deleted surfaces.
- #30 — Cache
/at the CDN. Deferred; only matters with real traffic. - Ideas, unordered: #4, #6, #10, #11, #12.
Last shipped
/explorer(#32, #35): full-bleed rail-and-content workspace. Heading / subheading / body slots, each swappable from a grid of every font ranked most-to-least similar, each with its own size stepper (~6% per click, persisted). Runs on fontjoy's 2017 vectors — 1,804 variants across 776 families. Seedocs/reference/font-vectors.md.- Font-name search is gone end to end — UI,
use-viewstate, and theqparam onqueryFonts//api/fonts(where it now reports inignored[]). - Section page titles dropped (the nav already names them);
PageHeaderis now only for headings that name content./colorsis swatches only. /colorssplit intoapp/colors/_components/—view.tsx368 → 105 lines; the two pill toggles collapsed into onePillToggle.pnpm lintfails on a raw color in a*.module.css(#29);raw-color: <why>opts out.- Browse grid is server-seeded (#21); the query lives in
app/_queries/fonts.tsand/api/fontsis its HTTP shell./now renders on demand.