Why
Webデザインにおいてフォント選択は重要な意思決定の一つですが、他サイトでどのようなフォントが実際に使用されているかを体系的に把握する手段は限られていました。
ブラウザの開発者ツールで1サイトずつ確認する必要がある。大量のサイトを横断的に分析することは困難です。
Google Fonts の人気ランキングと、実際のWebサイトでの使用率にはギャップがある。実際の採用データを収集する仕組みが必要です。
フォントに関する知識を機械可読な形式で整理し、再利用可能な形に保つ仕組みがありませんでした。
Architecture
3層構成のマルチクラウドアーキテクチャ。GitHub でソースを管理し、Vercel でフロントエンド、Cloudflare Workers + D1 でデータ収集と保存を担当します。
図: マルチクラウド3層構成。ユーザーは Vercel 上の UI (zine) を使い、データは Cloudflare D1 に集約される。
ローカル開発時は better-sqlite3 で直接操作し、本番は COLLECTOR_URL 経由のプロキシに切り替わる。
How It Works
スキャン、保存、表示の3つのフェーズで構成されています。
./font-lover.db を直接参照lib/db.ts の遅延初期化でモジュール読み込み時クラッシュ防止buildOkfKnowledge() でライブ生成COLLECTOR_URL 未設定 → ローカルモードlib/data.ts が COLLECTOR_URL を検出しプロキシに切替pipeline/knowledge/*.json を返すOKF v0.2
OKF (Open Knowledge Format) v0.2 準拠の JSON バンドルを、DB の蓄積データから自動生成します。
font_families
font_sightings
font_mdn_refs
Drizzle ORM で
全テーブルを結合クエリ
前回バンドルと比較
new / updated / unchanged
index.json
concepts/fonts/*.json
okf_version: "0.2"
machine-readable
{
"okf_version": "0.2",
"index": {
"generatedAt": "2026-09-14T06:30:24.195Z",
"total": 7,
"byStatus": { "new": 3, "unchanged": 4 },
"concepts": [
{ "id": "fonts/inter", "type": "FontFamily",
"status": "new", "sections": 3 },
{ "id": "fonts/noto-sans-jp", "type": "FontFamily",
"status": "unchanged", "sections": 3 }
]
},
"concepts": [
{
"id": "fonts/inter",
"type": "FontFamily",
"title": "Inter",
"url": "https://fonts.google.com/specimen/Inter",
"meta": {
"type": "FontFamily",
"tags": ["sans-serif", "google-fonts"],
"generated": {
"by": "process:font-lover-collector/0.1.0",
"at": "2026-09-14T06:30:24.195Z"
},
"verified": true,
"stale_after": "2026-12-13T06:30:24.195Z",
"sources": [
{ "site": "vercel.com", "usage_count": 5 }
]
},
"sections": [
{ "heading": "Summary", "level": 2,
"blocks": [{ "type": "text",
"content": "Inter は 25 sight..." }] },
{ "heading": "Sightings", "level": 2,
"blocks": [{ "type": "list", "items": [
"vercel.com (×5)",
"techcrunch.com (×3)"
]}] }
],
"hash": "a1b2c3d4..."
}
]
}
図: /api/okf のレスポンス例。各 concept には sightings から要約した section が含まれ、meta.stale_after でリフレッシュ時期を示す。
Tech Stack
Next.js App Router / Edge Runtime
Hono / nodejs_compat / 無料枠
SQLite ベースのエッジDB / APAC
全体を strict で型安全に
SQLite / D1 共通のスキーマ定義
monorepo ビルドキャッシュ
workspace パッケージ管理
超軽量 Web フレームワーク
Field Notes
2026-09-14、日本の中央省庁・機関 39サイトを light スキャンし、実際に使われているフォントを採集しました。
デジタル庁 / 総務省 / 首相官邸系サイトで標準採用。公的サイトの定番であることを実測で確認。
首相官邸の見出しで使用。セリフ体がフォーマルな文書表現に使われる実例。
文化庁で検出。国産ユニバーサルデザイン書体が行政サイトでも採用されている。
こども家庭庁で検出。丸ゴシックの親しみやすいトーンを選択する事例。
採集データは /api/sites/:domain からサイト別に参照できます。
Live Demo
Vercel でホストされている本番環境を直接お試しいただけます。
API Reference
Endpoint: https://font-lover-collector.watanabe3ti.workers.dev — Bearer Token 認証必須
| Method | Path | 説明 | レスポンス |
|---|---|---|---|
| POST | /api/scan | URL をスキャンし D1 に保存 | {url, mode, fonts[], fontFaces[]} |
| POST | /api/collect | 複数 URL を一括スキャン | {results[], processed, failed} |
| GET | /api/fonts | 全フォントファミリを取得(人気順) | {fonts[]} |
| GET | /api/fonts/:family | 特定フォントの詳細 + sighting | {font, sightings[]} |
| GET | /api/sites/:domain | 特定ドメインで検出されたフォント | {fonts[]} |
| GET | /api/stats | 統計情報(件数・ランキング等) | {totalFonts, totalSightings, topFonts[]} |
| GET | / | ヘルスチェック | {ok: true} |
Endpoint: https://font-lover.vercel.app
| Method | Path | 説明 | 動作 |
|---|---|---|---|
| GET | /api/fonts | フォント一覧 | 本番: Worker → D1 / ローカル: SQLite |
| GET | /api/fonts/:family | フォント詳細 | 同上 |
| GET | /api/sites/:domain | サイト別フォント | 同上 |
| GET | /api/stats | 統計情報 | 同上 |
| GET | /api/okf | OKF v0.2 知識バンドル | コミット済み JSON / ローカル: ライブ生成 |
| GET | /okf | OKF ビューワー(UI) | — |
| GET | /inspector | DB インスペクタ | リモート: リンク集 / ローカル: JSON 表示 |
Tutorial
2つの方法で FONT-LOVER をお試しいただけます。
Worker のエンドポイントと、認証に使う Bearer Token を確認します。ローカルで動作させている場合は http://localhost:8787 と .dev.vars のトークンを使います。
対象の URL を送信します。
curl -X POST https://font-lover-collector.watanabe3ti.workers.dev/api/scan \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","mode":"light"}'
保存されたフォント一覧を取得します。
curl https://font-lover.vercel.app/api/fonts | jq '.fonts[0:3]'
/okf で、全フォントの知見を体系的に閲覧できます。
git clone https://github.com/watanabe3tipapa/font-lover.git
cd font-lover
pnpm install
ローカル D1 にスキーマを適用してから起動します。
# プレーン SQL に変換(statement-breakpoint を除去)
grep -v -- '-->' packages/database/drizzle/0000_unusual_nextwave.sql > /tmp/schema.sql
# ローカル D1 にスキーマ適用
npx wrangler d1 execute font-lover-db --local --file=/tmp/schema.sql
# collector 起動(port 8787)
npx wrangler dev --port 8787
プロキシモードで起動する場合:
# 本番モード(D1 プロキシ)で起動
COLLECTOR_URL=http://localhost:8787 pnpm --filter @font-lover/zine dev
# ローカル SQLite モードで起動
pnpm --filter @font-lover/zine dev
# スキャン
curl -X POST http://localhost:8787/api/scan \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","mode":"light"}'
# 確認
open http://localhost:3000/api/fonts
Self-Host
無料アカウントだけで本番環境を構築する手順です。
wrangler login → wrangler d1 create font-lover-db → 得られた database_id を wrangler.toml に反映。
wrangler d1 execute ... --remote --file=schema.sql → wrangler deploy
Vercel で GitHub リポジトリを紐付け。Root Directory を apps/zine に設定。
Vercel に COLLECTOR_URL と WORKER_TOKEN を設定。Worker にも WORKER_TOKEN をシークレットとして登録。
Token 認証付きで POST /api/scan → フォントデータが蓄積されていきます。
無料枠の目安
Cloudflare Workers: 100,000 req/day • D1: 5 GiB ストレージ • Vercel: 100 GB バンド幅/月
※ Browser Rendering(フルスキャン)は有料プラン (Workers Paid $5/月) が必要です。