font-extractor
Font Extractor
Extract all fonts used on a website and save them locally, organized by font family.
Workflow
- Ask — confirm where to save fonts (default:
./fonts/) - Download — find and download all font files from the site
- Organize — run the bundled script to sort them into family subdirectories
The heavy lifting of family detection is done by reading each font file's internal name table — no need to parse CSS family names.
Step 0: Confirm output location
Before downloading, ask the user where they'd like the fonts saved. Default to ./fonts/ if they don't have a preference. Use their chosen path in place of ./fonts/ throughout the remaining steps.
Step 1: Download all font files
Fetch the page HTML and find font file URLs. Use whatever approach gets the job done fastest:
- Parse
<link rel="stylesheet">tags, fetch each CSS file, extracturl(...)values from@font-faceblocks - Check
<link rel="preload" as="font">tags - Search inline
<style>blocks - If nothing turns up in CSS, search the JS bundle(s) for font file URLs (SPAs often embed them there)
- If using Claude-in-Chrome (
mcp__claude-in-chrome__*),read_network_requestswill catch dynamically loaded fonts
Font file extensions to look for: .woff2, .woff, .ttf, .otf, .eot
Download every font file URL you find into ./fonts/ (flat). Use curl -L with a Referer header matching the page URL — many CDNs require it:
mkdir -p ./fonts
curl -L -H "Referer: <page-url>" -o "./fonts/<filename>" "<font-url>"
Download all unique URLs. Do not deduplicate — different URLs may be different versions or formats of the same font, and the user may want all of them.
Step 2: Organize by family
Run the bundled organize script. It reads each font file's internal metadata to determine its family name, then moves files into ./fonts/<family>/ subdirectories:
uv run ~/git/agent-skills/font-extractor/scripts/organize_fonts.py ./fonts
The script handles everything: reads the font name table, creates family directories, moves files. Fonts whose family can't be read get Unknown-1, Unknown-2, etc.
Step 3: Report
Show the user what was downloaded:
find ./fonts -type f | sort
Include the family count, file count, and total size.
More from trtmn/agent-skills
self-improvement
Run the self-improvement agent to review this session and the ~/.learnings/ log files. Use this skill whenever the user explicitly asks to review learnings, promote entries to CLAUDE.md, do an end-of-session review, or analyze GitHub PRs/issues for recurring patterns. Also use when the user says "promote", "review learnings", "what have we learned", or "self-improvement". Do NOT use this skill just for logging — logging happens automatically without the skill (see Passive Logging below). This skill is specifically for the *review and promotion* workflow.
20cowsay
Generates an ASCII cow saying custom text. Use when the user wants "cowsay", "cow say", or a cow to say something.
12unifi-api
Query and control a UniFi network using the `unifi` CLI (a restish wrapper with 1Password auth) or the REST API as fallback. Use this skill whenever the user wants to manage their UniFi network — listing connected clients, blocking/unblocking devices, managing firewall policies, checking WAN health and speed test results, rebooting devices, managing VLANs or SSIDs, reading traffic stats, port forwarding, or any other UniFi network management task. Prefer the `unifi` CLI for Integration API endpoints; fall back to raw curl/python for legacy API endpoints. Trigger even if the user doesn't say "API" or "UniFi" — phrases like "check my network", "block that device", "show me who's connected", "add a firewall rule", "what's my WAN IP", "how's my internet speed", or "what's on the guest network" are all good triggers.
5homebrew-dev
Package and distribute macOS apps, fonts, CLI tools, and arbitrary files using Homebrew formulas and casks. Use this skill whenever the user wants to create a Homebrew formula or cask, set up a personal tap, package a macOS .app bundle, distribute fonts or pre-built binaries via brew, use `brew create`, bump a formula or cask to a new version, submit a package to homebrew-core or homebrew-cask, or publish anything with Homebrew — even if they just ask how to "make something installable with brew", "share my app through Homebrew", "update my formula", or "get my package into Homebrew".
5tailscale-policy-manager
>
5obsidian-cli
>
4