github-wrapped
GitHubの利用状況を、Bilibili風の演出やスムーズな画面遷移、スマホ対応のページ表示で、1枚のHTMLにまとめ、実績を振り返る年次レビューを生成するSkill。
📜 元の英語説明(参考)
Generate a verifiable GitHub Wrapped year-in-review as a single-file HTML (raw gh API JSON saved, Python-built dataset embedded), with a Bilibili-style narrative, smooth transitions, and mobile-friendly paged mode. Requires gh CLI to be authenticated.
🇯🇵 日本人クリエイター向け解説
GitHubの利用状況を、Bilibili風の演出やスムーズな画面遷移、スマホ対応のページ表示で、1枚のHTMLにまとめ、実績を振り返る年次レビューを生成するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o github-wrapped.zip https://jpskill.com/download/9211.zip && unzip -o github-wrapped.zip && rm github-wrapped.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9211.zip -OutFile "$d\github-wrapped.zip"; Expand-Archive "$d\github-wrapped.zip" -DestinationPath $d -Force; ri "$d\github-wrapped.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
github-wrapped.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
github-wrappedフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
GitHub Wrapped (単一ファイル HTML, 検証可能なデータ)
このスキルは、GitHub の「Year in Review / Wrapped」を、単一の自己完結型 HTML ファイルとして、Bilibili スタイルのナラティブ(スクロール/ページシーン、映画のようなトランジション、シェアカード)で生成します。譲れない要件は検証可能性です。すべての数値は、レポートとともにコミットされた保存済みの gh api 生のレスポンスに遡れる必要があります。
譲れないこと
- 捏造されたデータは使用しない: GitHub API がメトリックを提供できない場合は、
—を表示し、ページ内で制限事項を説明します。 - 生の API レスポンスを保存する: レポートは、元の JSON (および使用された GraphQL クエリ) を含む
raw/フォルダがないと無効です。 - 1 つの
.htmlを提供する: ランタイムのgh呼び出しは行わず、データセットを HTML に埋め込みます。 - 外部 CDN はオプション (フォント/アイコン/スクリーンショットライブラリ/音楽) ですが、ロードに失敗した場合でも、コアのナビゲーション/レンダリングを中断してはなりません。
- 段階的に構築する: 小さなスケルトン (≤ ~400 LOC) から始めて、5k–10k LOC の完成したレポートに向けて反復します。一度に完全な「最終」ファイルをリリースしようとしないでください。
最初にユーザーに尋ねるべきこと
YEAR(デフォルト: 現在の年)USER(デフォルト:gh api user --jq .login)- ページコピーの出力言語 (通常、中国のユーザーには中国語が推奨されます。このドキュメントは英語のままです)
- タイムゾーン (デフォルト: 中国のユーザーには
Asia/Shanghai) - 音楽ウィジェットを有効にするかどうか (自動再生がブロックされる可能性があります。ユーザー操作によるフォールバックが必要です)
推奨されるレイアウト
data/github-wrapped-$YEAR/
raw/ # 検証可能な gh API レスポンス (JSON)
processed/ # raw/ から派生した dataset.json
frontend/standalone/
github-wrapped-$YEAR.html
パイプライン (raw → dataset → 単一 HTML)
1) gh api で生の JSON を収集する (常にページネーションを使用)
ページネーションのルール:
- GraphQL:
--paginate --slurp - REST:
--paginate
最小限の生のセット (推奨されるファイル名):
raw/user.json(プロフィール、createdAt)raw/contributions.json(GraphQLcontributionsCollection(from,to))raw/user_repos.json(REST リポジトリリスト。スター/フォークはスナップショット)raw/starred_repos_pages.json(GraphQLSTARRED_ATでソートされたスター付きリポジトリ。トピック/言語を含む)raw/prs_${YEAR}_pages.json(GraphQL Search: その年にマージされた PR。追加/削除)raw/contributed_repos_pages.json(GraphQLrepositoriesContributedTo)raw/events_90d.json(オプション。REST イベント。90 日の制限。ベストエフォートのおまけのみ)
バンドルされたテンプレート (必要なものだけを開く):
scripts/collect_raw.shscripts/queries/*.graphqlreferences/data_sources.mdreferences/single_file_engineering.md
2) 決定論的なデータセットを構築する (Python, 推測はしない)
raw/*.json のみを読み取り、processed/dataset.json を出力するビルダーを作成します。
- 決定論的: 同じ生の入力 → 同じデータセット出力。
- 透明性: 制限事項を
meta.dataProvenance.notes[]に書き込みます。 - レンダリングの安定性: オプションのフィールドは nullable のままにし、破壊的な変更を避けます。
テンプレート: scripts/build_dataset_template.py
スキーマガイダンス: references/dataset_schema.md
より大規模な分析レシピ (月ごとのスターの散布図、タイムゾーンセーフな時間バケット、祝日の検出、カテゴリのヒューリスティック) については、cookbook/python/ を参照してください。
3) dataset.json を HTML に埋め込む (ランタイムフェッチは行わない)
HTML には安定したアンカーが含まれている必要があります。
<script id="dataset" type="application/json">{}</script>
埋め込みルール:
- HTML に書き込む前に、常に
<を\u003cとしてエスケープします。 - データセットブロックがない/破損している場合、埋め込みスクリプトは大きな音を立てて失敗する (または修復する) 必要があります。
- データセットの解析に失敗した場合、ページに目に見えるオーバーレイを表示する必要があります ("カバーのみ、ボタンは無効" を避ける)。
テンプレート: scripts/embed_dataset_into_html_template.py
段階的なデリバリー (400 LOC → 10k LOC)
単一ファイルの映画のようなレポートはすぐに長くなります。正しく、保守しやすい状態を保つために、反復的にリリースします:
- イテレーション 0 (契約): 最小限の
dataset.jsonスキーマに同意し、プレースホルダーをレンダリングします (欠落しているフィールドには—を表示します)。 - イテレーション 1 (≤ 400 LOC): スケルトンを構築します: カバー + "Start"、2〜3 のシーン、ナビゲーションモードの切り替えスタブ、目に見える失敗オーバーレイによるデータセットの解析。
- イテレーション 2 (≤ 1.5k LOC): ナビゲーションエンジン (ページ/フリー)、リビールシステム、および基本的なカード/リストシステムを実装します。
- イテレーション 3 (≤ 4k LOC): コアチャート (ヒートマップ、タワー、レーダー) を追加しますが、シンプルで検証可能な状態に保ちます。
- イテレーション 4 (≤ 7k LOC): モバイルページモード戦略を追加します (
data-mhide="paged"を介して重いブロックを非表示にし、DOM ノードを移動するボトムシートを追加します)。 - イテレーション 5 (≤ 10k LOC): 磨き上げ (モーショントークン、フルスクリーン HUD、シェアカード、オプションの音楽/花火) を行い、デスクトップ + モバイルの回帰テストを行います。
このファイル (SKILL.md) をハイレベルに保ちます。プロンプトの肥大化を避けるために、長いコードサンプルと分析レシピを cookbook/ に、実装ノートを references/ に記述します。
単一ファイル HTML エンジニアリングノート (実戦テスト済み)
- ブートレイヤー: 常に明示的な "Start" ボタンを含めます。スクロールのみの開始に依存しないでください。
- 2 つのナビゲーションモード:
paged(ホイール/キー、およびモバイルでのタッチスワイプ) とfree(通常のスクロール)。 - モバイルページモード: 各シーンは 1 つのビューポートに収まる必要があります。
data-mhide="paged"を介して重いブロックを非表示にし、既存の DOM ノードを移動するボトムシートで開きます (重複する ID を避けます)。 - タッチアフォーダンス: ヒートマップタップ → トースト。レーダーtouchstart → ポイントリフト + ツールチップ。
より深いパターンについては、references/single_file_engineering.md を参照してください。
レスポンシブ UX (デスクトップ + モバイル) — 苦労して得た教訓
ページは 1 つのファイルですが、事実上 2 つの製品です: デスクトップシネマティック と モバイルスライドデッキ。回帰を防ぐために、レスポンシブ作業を外科的に分離された変更として扱います。
デスクトップ (フルスクリーンなしで読みやすい)
- 幅が広く、境界のあるコンテンツ列 (
--maxwをclamp()として) を優先し、タイポグラフィを縮小する代わりに、短いビューポート (例: 高さ 768px) で--gutterをわずかに小さくします。 - コンテンツを切り捨てるのではなく、密度バリアントを使用します。
- 長いリーダーボードの複数列リスト (メタデータを表示したままにします)。
(原文はここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
GitHub Wrapped (Single-file HTML, Verifiable Data)
This skill generates a GitHub “Year in Review / Wrapped” as a single self-contained HTML file with a Bilibili-style narrative (scroll/page scenes, cinematic transitions, share card). The non-negotiable requirement is verifiability: every number must be traceable to saved gh api raw responses committed alongside the report.
Non-negotiables
- No fabricated data: if GitHub APIs cannot provide a metric, show
—and explain the limitation in-page. - Save raw API responses: the report is invalid without a
raw/folder containing the original JSON (and the GraphQL queries used). - Ship one
.html: no runtimeghcalls; embed a dataset into the HTML. - External CDNs are optional (fonts/icons/screenshot libs/music) but must never break core navigation/rendering if they fail to load.
- Build step-by-step: start with a tiny scaffold (≤ ~400 LOC) and iterate towards a 5k–10k LOC finished report; never try to ship the full “final” file in one pass.
What to ask the user first
YEAR(default: current year)USER(default:gh api user --jq .login)- Output language for the page copy (Chinese is usually preferred for CN users; this doc stays English)
- Timezone (default:
Asia/Shanghaifor CN users) - Whether to enable a music widget (autoplay may be blocked; must have a user-gesture fallback)
Recommended layout
data/github-wrapped-$YEAR/
raw/ # verifiable gh API responses (JSON)
processed/ # dataset.json derived from raw/
frontend/standalone/
github-wrapped-$YEAR.html
Pipeline (raw → dataset → single HTML)
1) Collect raw JSON with gh api (always paginate)
Pagination rules:
- GraphQL:
--paginate --slurp - REST:
--paginate
Minimum raw set (recommended filenames):
raw/user.json(profile, createdAt)raw/contributions.json(GraphQLcontributionsCollection(from,to))raw/user_repos.json(REST repos list; stars/forks are snapshots)raw/starred_repos_pages.json(GraphQL starred repos ordered bySTARRED_AT, includes topics/language)raw/prs_${YEAR}_pages.json(GraphQL Search: merged PRs in the year; additions/deletions)raw/contributed_repos_pages.json(GraphQLrepositoriesContributedTo)raw/events_90d.json(optional; REST events; 90-day limit; only for best-effort easter eggs)
Bundled templates (open only what you need):
scripts/collect_raw.shscripts/queries/*.graphqlreferences/data_sources.mdreferences/single_file_engineering.md
2) Build a deterministic dataset (Python, no guessing)
Write a builder that reads only raw/*.json and outputs processed/dataset.json:
- Deterministic: same raw input → same dataset output.
- Transparent: write limitations into
meta.dataProvenance.notes[]. - Stable for rendering: keep optional fields nullable; avoid breaking changes.
Template: scripts/build_dataset_template.py
Schema guidance: references/dataset_schema.md
For larger analysis recipes (stars-by-month scatter points, timezone-safe hour buckets, holiday detection, category heuristics), see cookbook/python/.
3) Embed dataset.json into the HTML (no runtime fetch)
Your HTML must contain a stable anchor:
<script id="dataset" type="application/json">{}</script>
Embed rules:
- Always escape
<as\u003cbefore writing into the HTML. - If the dataset block is missing/corrupted, the embed script should fail loudly (or repair it).
- The page must show a visible overlay if dataset parsing fails (avoid “cover only, buttons dead”).
Template: scripts/embed_dataset_into_html_template.py
Step-by-step delivery (400 LOC → 10k LOC)
Single-file cinematic reports get long fast. To stay correct and maintainable, ship in iterations:
- Iteration 0 (contract): agree on a minimal
dataset.jsonschema and render placeholders (show—for missing fields). - Iteration 1 (≤ 400 LOC): build the skeleton: cover + “Start”, 2–3 scenes, nav mode toggle stub, dataset parse with a visible failure overlay.
- Iteration 2 (≤ 1.5k LOC): implement the navigation engine (paged/free), reveal system, and a basic card/list system.
- Iteration 3 (≤ 4k LOC): add core charts (heatmap, tower, radar), but keep them simple and verifiable.
- Iteration 4 (≤ 7k LOC): add mobile paged-mode strategy (hide heavy blocks via
data-mhide="paged"+ bottom-sheet that moves DOM nodes). - Iteration 5 (≤ 10k LOC): polish (motion tokens, full-screen HUD, share card, optional music/fireworks), and do a regression pass for desktop + mobile.
Keep this file (SKILL.md) high-level. Put long code samples and analysis recipes into cookbook/ and implementation notes into references/ to avoid prompt bloat.
Single-file HTML engineering notes (battle-tested)
- Boot layer: always include an explicit “Start” button; do not rely on scroll-only starts.
- Two navigation modes:
paged(wheel/keys, plus touch swipe on mobile) andfree(normal scroll). - Mobile paged mode: each scene must fit one viewport; hide heavy blocks via
data-mhide="paged"and open them in a bottom-sheet that moves existing DOM nodes (avoid duplicate IDs). - Touch affordances: heatmap tap → toast; radar touchstart → point lift + tooltip.
See references/single_file_engineering.md for deeper patterns.
Responsive UX (Desktop + Mobile) — hard-won lessons
The page is one file, but it’s effectively two products: desktop cinematic and mobile slide deck. Treat responsive work as surgically isolated changes to avoid regressions.
Desktop (readable without full-screen)
- Prefer a wide-but-bounded content column (
--maxwas aclamp()), and reduce--gutterslightly on short viewports (e.g. 768px height) instead of shrinking typography. - Use density variants rather than truncating content:
- Multi-column lists for long leaderboards (keep metadata visible).
- “Dense” list styling (tighter padding/gaps) for better above-the-fold readability.
- Avoid CSS-stretching canvases (radar charts): size canvas from its rendered rect and DPR, or enforce an
aspect-ratioand draw in CSS pixels. - If a 3D/transform section makes buttons unclickable, assume a stacking-context problem first (z-index + transforms + pointer-events).
Mobile (paged-mode = slide deck)
- Gate layout changes with
@media (max-width: 620px) and (pointer: coarse)(width-only rules can accidentally affect small desktop windows). - In mobile
pagedmode, avoid inner scrolling in scenes; hide heavy blocks withdata-mhide="paged"and expose them via a bottom-sheet modal that moves the existing DOM node (so IDs and event listeners remain valid). - Use touch-first affordances: tap feedback (toast), big hit targets, and optionally draggable floating controls (mode toggle / music) respecting safe-area insets.
For implementation patterns (bottom sheet node-moving, draggable HUD controls, canvas DPR sizing, and stacking-context pitfalls), see references/responsive_ui_patterns.md.
Narrative + UI quality bar (Bilibili-style pacing)
Design as a storyboard: each scene answers one question, then transitions.
Suggested pacing:
- Grand cover + “Start” (cinematic; optional fireworks)
- “How long since we met GitHub” (account createdAt → years)
- “Your 2025 pulse” (activity tier + distribution)
- Heatmap/city + streak + craziest day
- “Time Tower” (12 months; month selector + star-time scatter points)
- “Radar / hexagon” (categories; points lift/glow on hover or touch)
- “New interests unlocked” (2025 stars vs previous years)
- “Extreme moments” (night-owl / holidays; clearly mark best-effort)
- “Open Source Award” (external contribution highlight; award ceremony feel)
- Finale share card (screenshot-friendly; optional fireworks)
Interaction rules:
- Every button/card should be clickable with feedback (links when available; otherwise micro-interaction/toast).
- “Free scroll” vs “Page mode” must behave differently (page mode should snap/lock navigation by wheel/keys, and support touch swipe on mobile).
- Unify motion tokens (duration/easing) across scenes; prefer
transform/opacity.
Known data limits (must disclose)
- Contribution calendar provides day-level counts, not a complete commit list per day.
- Events API keeps only ~90 days of history.
- Repo
stargazers_count/forks_countare current snapshots, not year-increment. - Private contributions / hidden settings can skew the public view.
Debug checklist
See references/debug_checklist.md for the full checklist. Common root causes:
- A JS parse error stops all handlers (duplicate
const, missing)) - A broken embedded dataset block breaks JSON parsing
- A blocked external script was treated as required instead of optional
Bundled resources (progressive disclosure)
scripts/: reusable collection/build/embed templates (execute without loading into context)cookbook/: analysis recipes and larger Python snippets (open only what you need)references/: schema + storyboard + debugging notes (open only the specific file you need)