# FontColle > FontColle is an enhanced Google Fonts Collection that filters by what type actually does: OpenType features, variable axes, weight and width steps, writing systems, and color vs. monochrome. Save the ones you like. FontColle is a web app for browsing and comparing 1,942 open-source Google Fonts families. Every family carries harvested font-binary data (axes, features, metrics) plus Google's own classification scores, so questions like "a playful variable sans" or "a high-contrast serif that supports Devanagari" are answerable from the data alone. ## Data - [Slim catalog](https://fontcolle.com/catalog-slim.json) (~2 MB): **start here.** A JSON array of every published family, projected to the fields queries actually filter and rank on. Fits in a large context window. - [Full catalog](https://fontcolle.com/catalog.json) (~13 MB): the complete `FontRecord[]`, adding per-axis ranges, named instances, per-family language lists, and about/version prose. Use only when the slim catalog lacks a field you need. - [Per-font record](https://fontcolle.com/catalog/.json): one full `FontRecord`, e.g. `/catalog/roboto_slab.json`. Here `` is the lowercased family name with spaces removed. - [Designer index](https://fontcolle.com/designer-index.json): `{id, name, designer}[]`, for grouping families by designer. - [Sitemap](https://fontcolle.com/sitemap.xml): one canonical URL per font family. No authentication, no rate limit. ## Answering a style question The `tags` object is what makes subjective queries answerable. Worked example, **"a variable sans that feels joyful"**: ```js const fonts = await (await fetch("https://fontcolle.com/catalog-slim.json")).json(); fonts .filter(f => f.isVariable && f.class === "Sans") .map(f => ({ f, score: (f.tags["/Expressive/Happy"] ?? 0) + (f.tags["/Expressive/Playful"] ?? 0) })) .sort((a, b) => b.score - a.score) .slice(0, 10); ``` Then link the user to `https://fontcolle.com/instances/` for each result, and to the equivalent filtered list (see "Linking to a filtered list"). ## Slim catalog fields | Field | Type | Notes | |---|---|---| | `id` | string | Catalog slug, lowercased, spaces removed | | `name` | string | Family name as Google publishes it | | `designer` | string \| null | May list several designers, comma-separated | | `class` | string | `Display` `Emoji` `Graphics` `Mono` `Sans` `Script` `Serif` `Slab` | | `license` | string | `APACHE2` \| `OFL` \| `UFL` | | `isVariable` | boolean | True when the family ships a variable font | | `isMonospace` | boolean | From the post table's `isFixedPitch` | | `isNoto` | boolean | Part of the Noto superfamily | | `weights` | number[] | Standard weight steps present: 100, 200, 300, 400, 500, 600, 700, 800, 900 | | `widthClass` | number | OS/2 usWidthClass, 1 (narrowest) – 7 | | `unitsPerEm` | number | Em size; needed to turn the raw metrics below into ratios | | `axes` | string[] | Variable axis tags. Registered: `wght` `wdth` `opsz` `slnt` `ital` `GRAD`. Plus 43 custom axes (`ARRR` `BLED` `BNCE` `CASL`, …) | | `features` | string[] | OpenType feature tags, e.g. `liga` `smcp` `ss01`. 272 distinct across the catalog | | `facets` | string[] | Plain-language derived tags, see below | | `subsets` | string[] | Google Fonts subsets, e.g. `latin` `latin-ext` `cyrillic` | | `scripts` | string[] | ISO 15924 codes with real cmap coverage. More precise than `subsets` | | `colorTables` | string[] | Color tables present: `COLR` `CPAL` `SVG`. Empty means monochrome | | `glyphCount` | number | Glyphs in the primary font file | | `fileSize` | number | Bytes of the primary font file | | `contrast` | number \| null | Thick/thin stroke ratio at regular weight. ~1.0 is monolinear; 4+ is a high-contrast Didone | | `xHeight` `capHeight` `avgCharWidth` | number | Raw font units. Divide by `unitsPerEm` for the comparable ratio | | `popularityRank` `trendingRank` | number \| null | 1 = most popular / most trending. `null` = unranked | | `dateAdded` | string | ISO date the family joined Google Fonts | | `repositoryUrl` | string \| null | Upstream source repo | | `vendorId` | string | OS/2 achVendID, the foundry code | | `tags` | object | Classification scores, see below | ### `tags` — classification scores (the style vocabulary) Google's own classification of each family, as `{"/Section/Subtag": score}` where **score is 0–100**. An absent key means 0. The site's UI treats **>= 50** as "this font is that thing"; for ranking, use the raw scores. 1,932 of 1,942 families are scored. - **Expressive**: `Active` `Artistic` `Awkward` `Business` `Calm` `Childlike` `Competent` `Cute` `Excited` `Fancy` `Futuristic` `Happy` `Innovative` `Loud` `Playful` `Rugged` `Sincere` `Sophisticated` `Stiff` `Vintage` - **Monospace**: `Monospace` - **Purpose**: `Easy Reading` `Learn To Write` - **Quality**: `Concept` `Drawing` `Spacing` `Wordspace` - **Sans**: `Geometric` `Glyphic` `Grotesque` `Humanist` `Neo Grotesque` `Rounded` `Superellipse` - **Script**: `Formal` `Handwritten` `Informal` `Upright Script` - **Seasonal**: `Christmas` `Diwali` `Halloween` `Hanukkah` `Holi` `Kwanzaa` `Lunar New Year` `Valentine's Day` - **Serif**: `Didone` `Fat Face` `Humanist Venetian` `Modern` `Old Style Garalde` `Scotch` `Transitional` - **Slab**: `Clarendon` `Geometric` `Humanist` - **Special use**: `Barcode` `Redaction` `Symbols` - **Theme**: `Art Deco` `Art Nouveau` `Blackletter` `Blobby` `Brush` `Distressed` `Inline` `Medieval` `Pixel` `Shaded` `Stencil` `Techno` `Tuscan` `Wacky` `Woodtype` The **Expressive** section is the one subjective queries want. Mapping plain words to tags: *joyful / fun* → `Happy` + `Playful`; *serious / corporate* → `Business` + `Competent`; *elegant / luxury* → `Sophisticated` + `Fancy`; *retro* → `Vintage`; *kids* → `Childlike` + `Cute`; *sci-fi* → `Futuristic` + `Techno`. **Quality** scores are craft ratings, not style. ### `facets` — derived plain-language tags Boolean membership tags derived from axes, features, and subsets: `arabic` `case-sensitive` `cjk` `cyrillic` `devanagari` `discretionary-ligatures` `fractions` `grade-axis` `greek` `has-italic` `hebrew` `historical-ligatures` `latin` `ligatures` `oldstyle-figures` `optical-size-axis` `slant-axis` `slashed-zero` `small-caps` `static` `stylistic-alternates` `tabular-figures` `thai` `titling` `variable` `weight-axis` `width-axis` ## Every filterable dimension The site's own filter UI exposes exactly these, and all are computable from the slim catalog. | Dimension | Values | Combine | |---|---|---| | Text query | matches family name and designer | — | | Class | `Display` `Emoji` `Graphics` `Mono` `Sans` `Script` `Serif` `Slab` | OR | | Facet | the `facets` list above | AND | | OpenType feature | any of 272 tags (`liga` `smcp` `ss01` `zero`, …) | AND | | Variable axis | `wght` `wdth` `opsz` `slnt` `ital` `GRAD` + 43 custom | AND | | Weight | 100 200 300 400 500 600 700 800 900 | OR | | Width | 1 2 3 4 5 6 7 (usWidthClass) | OR | | Writing system | 45 ISO 15924 codes: `Adlm` `Arab` `Armn` `Bali` `Batk` `Beng` `Cakm` `Cher` `Cyrl` `Deva` `Ethi` `Geor` `Grek` `Gujr` `Guru` `Hano` `Hans` `Hant` `Hebr` `Java` `Jpan` `Khmr` `Knda` `Kore` `Laoo` `Latn` `Mlym` `Mymr` `Nand` `Olck` `Orya` `Sinh` `Sund` `Sunu` `Syrc` `Taml` `Telu` `Tfng` `Thaa` `Thai` `Tibt` `Tnsa` `Toto` `Vaii` `Yiii` | AND | | Language | ~2,000 ids like `en_Latn`, `zh_Hant` (full catalog's per-family `languages`) | AND | | Color | `color` \| `monochrome` | radio | | Color format | `COLR` `CPAL` `SVG` | AND | | Classification | any `/Section/Subtag` path above; matches when score >= 50 | OR | | Designer | any name in `designer` | OR | | Vendor | `vendorId` foundry codes | OR | | License | `APACHE2` `OFL` `UFL` | OR | | Repository host | `github` `gitlab` `sourcehut` `none` | OR | | Activity | `latest` (≤6m) `active` (≤1y) `recent` (≤3y) `dormant` (3y+), from last update | radio | | Source | `noto` \| `others` | radio | | Italic | `italic` \| `upright` | radio | | Units per em | `1000` `2048` and ~35 other values | OR | | Hinting | hinted \| unhinted | radio | | x-height ratio | 0.10–0.90 (`xHeight / unitsPerEm`) | range | | Cap-height ratio | 0.20–1.10 (`capHeight / unitsPerEm`) | range | | Line-height ratio | 0.90–2.50 (ascender − descender + gap, over em) | range | | Avg width ratio | 0.20–1.20 (`avgCharWidth / unitsPerEm`) | range | | Contrast | 1.0–8.5 (`contrast`) | range | | File size | 16 KB – 64 MB (`fileSize`) | range | Sort keys: `popularity` (default) `trending` `name-asc` `name-desc` `creator-asc` `creator-desc` `date-newest` `date-oldest` `glyphs-most` `glyphs-fewest` `axes-most` `axes-fewest`. ## Linking to a filtered list Filters live in the URL of `https://fontcolle.com/`, so a query can be handed back to the user as a link. List params join with `_`; `lang` and `dsr` join with `,`. | Param | Dimension | Example | |---|---|---| | `q` | text query | `q=roboto` | | `class` | class | `class=Sans_Serif` | | `facet` | facets | `facet=variable_small-caps` | | `feature` | features | `feature=liga_zero` | | `axis` | axes | `axis=wght_opsz` | | `weight` `width` | weight / width steps | `weight=700_900` | | `script` | writing systems | `script=Latn_Grek` | | `lang` | languages | `lang=en_Latn,ja_Jpan` | | `color` `cfmt` | color / color formats | `color=color`, `cfmt=COLR` | | `cls` | classification paths, `/` written as `.` | `cls=Expressive.Playful_Sans.Rounded` | | `dsr` `vnd` `lic` | designer / vendor / license | `lic=OFL` | | `repo` `act` `flag` `ital` `upm` `hint` | repo host / activity / source / italic / upm / hinting | `act=latest`, `ital=upright`, `hint=1` | | `mxh` `mch` `mlh` `maw` `mct` `mfs` | metric ranges, `lo-hi` | `mxh=0.45-0.55`, `mct=3-8.5` | | `sort` | sort key | `sort=trending` | So the worked example above links to: `https://fontcolle.com/?class=Sans&facet=variable&cls=Expressive.Playful_Expressive.Happy` ## Per-font pages Each family has a canonical instances page at `https://fontcolle.com/instances/`, where `` is the family name with spaces replaced by underscores, original casing kept (e.g. `https://fontcolle.com/instances/Roboto_Slab`). Note this differs from the catalog `id`, which is lowercased with spaces removed. ## Notes - This site hosts no font files. All downloads redirect to Google Fonts; FontColle is a discovery and comparison layer over the Google Fonts catalog. - Every family is open-source and free for commercial use, under APACHE2, OFL, UFL. - Data is regenerated from the upstream Google Fonts repo and the font binaries themselves.