Skill
Skill powerful-user/typo/skill
Font management CLI for web and mobile projects.
npx -y skills add powerful-user/typo --skill skillAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Font management CLI for web and mobile projects. Search Fontsource catalog, download fonts, generate next/font/local and @font-face configurations, subset and convert .woff2/.ttf/.otf files. Use when user wants to: (1) add custom fonts to a project, (2) generate font config for Next.js, Tailwind v4, Vite, or Flutter, (3) search for or browse fonts, (4) optimize font file size with subsetting or format conversion, (5) manage a shared font library across projects, or (6) set up @font-face, font-display, or CSS custom properties for fonts. Trigger keywords: fonts, typography, woff2, font-face, next/font, localFont, font-display, Fontsource, font pairing, font loading.
SKILL.md
10.2 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
Typo — Font Management Skill
You orchestrate font workflows using the typo CLI. Your role is deciding the right strategy, running the right commands, and connecting the output to the user's framework.
Font Strategy Thinking
Before running any commands, consider:
- Scope: Single project or monorepo? Monorepo →
init --globalonce,linkfrom each package. - Performance budget: Total font payload target is <100KB (ideal <50KB). A full Inter variable font is ~300KB unsubset; latin subset is ~48KB.
- Variable vs static: Does the design use more than 2 weights? Yes → variable is almost always smaller total payload. Only use static if targeting a single weight.
- Subsetting: Is the audience primarily latin script? Yes → subset immediately after adding, save 60-80% payload.
- Framework implications: Next.js auto-subsets at build time, so manual subsetting is redundant for Next.js projects. Flutter can't use symlinks — copy files instead.
When NOT to Use Typo
Skip typo entirely if:
- Single font via CDN — user just wants
<link href="fonts.googleapis.com/...">. No local files, no value from typo. next/font/googleis sufficient — if the font is on Google Fonts and the project is Next.js,next/font/googlehandles everything. Typo only helps with local/custom fonts in Next.js.- One font, one weight, throwaway project — writing a single
@font-facerule by hand is faster than setting up typo. - React Native / Expo — Metro bundler has symlink issues. Typo doesn't support this yet.
Before Optimizing, Ask
When user asks to optimize fonts, assess before running commands:
- What's the current total payload? Run
typo info <name>for each font to check file count and whether they're already subset. - Is the framework already optimizing? Next.js auto-subsets — manual subsetting is redundant and may conflict.
- What locales does the app serve? Latin-only →
--preset latin. Multi-locale → subset per locale or skip subsetting. - Are there unused weights? If the design only uses 400 and 700 but all weights are linked, re-link with
--weights 400,700before subsetting.
Architecture
~/.typo/ # Global library (typo init --global)
├── config.json # Library settings
├── manifest.json # Font metadata index
├── cache/ # Fontsource catalog cache (24h TTL)
└── fonts/<family>/ # Font files organized by family
project/ # Per-project (typo init)
├── .typo.json # Framework, linked fonts, paths
├── fonts/ # Symlinks → library (gitignore)
├── .fonts/ # Build artifacts from subset/convert (gitignore)
└── src/fonts.ts|css # Generated config (framework-specific)
Commands
typo init [--global] # Initialize config
typo add [name] [--from <path>] # Add font to library (Fontsource or local)
typo link <name> [--variable] # Symlink library font into project
typo list [--project] [--json] # List fonts
typo info <name> [--json] # Show font metadata
typo generate [--framework <id>] # Generate framework config
typo search <query> [--json] # Search Fontsource catalog
typo subset <name> --preset <p> # Subset to Unicode range → .fonts/
typo convert <name> --format <f> # Convert format → .fonts/
Workflows
"Set up fonts for this project"
- Check global library:
typo list. If not initialized →typo init --global. typo initin project root. Checkpoint: read.typo.json— confirmversion: 1andframeworkfield present.- Ask what fonts they want. If unsure, recommend based on project type (see Font Pairing below).
- For each font:
typo add <name>ortypo add --from <path>. typo link <name> --variable(prefer variable; use--weights 400,700only if design is locked to specific weights).typo generate. Checkpoint: read the generated file and verify it contains one declaration per linked font, correct relative paths (../fonts/for files insrc/), and variable fonts use weight range not single weight.- Show the user the generated file and how to wire it up.
MANDATORY: After typo generate, read references/frameworks.md for the target framework to show the user correct usage patterns (layout.tsx className for Next.js, @import order for Tailwind v4, pubspec structure for Flutter). Do NOT load references/commands.md — the inline reference above is sufficient for this workflow.
"Add <font> to my project"
typo add <name>→ downloads variable + static from Fontsource.typo link <name> --variable.typo generate.- Read the generated output file and show it to the user.
"Search for a font"
typo search <query>— presents family, variable support, weights, license.- If they choose one:
typo add <id>.
"Set up fonts across a monorepo"
typo init --globalonce (at repo root or user home — doesn't matter, it's global).typo add <name>for all shared fonts.- In each package that needs fonts:
cd packages/<name> && typo inittypo link <font> --variabletypo generate
- Each package gets its own
.typo.json,fonts/symlinks, and generated config — all pointing to the same global library. - Add
fonts/and.fonts/to the root.gitignore.
"Optimize fonts for production"
typo list --project— check current fonts.- Determine if subsetting helps (skip for Next.js — it auto-subsets at build).
typo subset <name> --preset latin— check the savings % in output.typo generate— regenerates config pointing to.fonts/build artifacts.
MANDATORY: Read references/commands.md for full subset/convert flag reference before running optimization commands. Especially check available presets and format options. Do NOT load references/frameworks.md for this workflow.
Error Recovery
typo addfails with HTTP error: Runtypo search <name>to verify the ID. Fontsource IDs are lowercase-hyphenated (e.g.,plus-jakarta-sans, notPlus Jakarta Sans).typo generateproduces empty output: Runtypo list --project --json— iffontsarray is empty, fonts are added to library but not linked. Runtypo link <name>first.typo subsetfails: Runwhich pyftsubset— if not found, install withpip install fonttools brotli.- Symlinks broken after moving project: Run
ls -la fonts/to confirm broken links, thentypo link <name>to recreate. - Generated paths wrong: Generators resolve paths relative to
src/. If project has nosrc/dir, the../fonts/paths will be wrong — either createsrc/or manually adjust the generated file path.
NEVER
- NEVER link static weights when variable font exists — variable is always smaller total payload and more flexible. The only exception is deliberately targeting a single weight for minimal builds.
- NEVER use
font-display: swapfor above-fold hero text — causes visible text reflow (FOUT). Useoptionalfor critical UI text that must not shift,swapfor body copy. - NEVER skip subsetting for production (except Next.js which auto-subsets) — a full variable font can be 300KB+, latin subset is 50KB. The user won't miss the glyphs, but they'll feel the load time.
- NEVER manually edit generated files (
src/fonts.ts,src/fonts.css) —typo generateoverwrites them. Edit.typo.jsonconfig instead, then regenerate. - NEVER commit
.fonts/orfonts/symlinks — both should be in.gitignore..fonts/is a build artifact;fonts/symlinks resolve to absolute paths that differ per machine. - NEVER mix symlinked and copied font files in the same project — pick one strategy. Symlinks break in Docker builds and some CI environments.
- NEVER use
typo subsetin a Next.js project — Next.js already subsets fonts at build time vianext/font. Manual subsetting creates redundant work and may conflict. - NEVER assume Tailwind v4
@themevariable names are arbitrary — they must follow the--font-*convention to map tofont-*utility classes (e.g.,--font-sans→font-sans).
Font Pairing Recommendations
When asked for pairing advice:
| Project Type | Heading | Body | Mono | Why |
|---|---|---|---|---|
| SaaS / Dashboard | Inter | Inter | JetBrains Mono | Neutral, high readability at small sizes |
| Marketing / Landing | Plus Jakarta Sans | DM Sans | Fira Code | Friendly geometric warmth |
| Vercel-style | Geist | Geist | Geist Mono | Cohesive modern system |
| Editorial / Blog | Newsreader | Source Serif 4 | Source Code Pro | Serif authority for long-form |
| Minimal / Dev tool | IBM Plex Sans | IBM Plex Sans | IBM Plex Mono | Systematic, technical feel |
Framework Quick Reference
| Framework | Output | Content | Notes |
|---|---|---|---|
| Next.js | src/fonts.ts | localFont() with variable CSS prop | Auto-subsets; use in layout.tsx className |
| Tailwind v4 | src/fonts.css | @font-face + @theme { --font-* } | Import AFTER @import "tailwindcss" |
| CSS/Vite | src/fonts.css | @font-face with font-display | Standard; import in entry CSS |
| Flutter | pubspec.yaml | fonts: section merge | Must copy files, not symlink |
For detailed framework usage examples and generated output samples, read references/frameworks.md.
Gives 0 of the 12 instructions most css styling skills give in ~2.4k tokens
Counted across 586 of the 596 authors here whose files we hold, read 2026-08-06
- avoid excessive centered layoutsin 55 of 586, across 12 files
- bundle code into single HTML filein 54 of 586, across 14 files
- Respect prefers-reduced-motion user settingsin 52 of 586, across 35 files
- avoid purple gradientsin 51 of 586, across 11 files
- avoid uniform rounded cornersin 51 of 586, across 11 files
- avoid Inter fontin 51 of 586, across 11 files
- edit generated files to develop artifactin 50 of 586, across 10 files
- animate only transform and opacity propertiesin 43 of 586
- Make touch targets at least 44x44 pixelsin 41 of 586, across 15 files
- Ensure minimum color contrast of 4.5:1in 39 of 586, across 10 files
- use tailwind cssin 39 of 586, across 24 files
- Use SVG icons instead of emojisin 38 of 586, across 11 files
Said here and by no other author read
- prefer variable fonts over static weights
- subset fonts to latin for production
- read the framework reference after generating config
- read the command reference before optimizing fonts
- add the fonts folder to gitignore
- adjust generated paths if lacking a source folder
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.