結論から言うと:HackerTube の考え方はシンプルです。Hacker News のコメントに貼られた YouTube リンクをすべて探し出し、多くの異なる人が、多くの異なる月に勧めている動画だけを残して、ログイン不要・推薦アルゴリズムなしの動画サイトにします。Claude Code か Codex なら、プロンプト 1 つで動く縮小版が作れます。
- Karpathy の元の投稿(UTC で 11 月 1 日)によると、YouTube のおすすめに不満を感じた彼は、Claude に HN 20 年分・約 4300 万件のコメントを絞り込ませ、くり返し勧められている 6,454 本の動画を選ばせました。Claude Code のデスクトップアプリと Opus 5.5(Medium effort)で約 2 時間。本人が手を動かしたのは、YouTube のメタデータ取得用に Google Cloud でキーを作る、VPS を起動する、ドメインを買う、の 3 つだけです。11 月 2 日午後(UTC+8)時点で、この投稿は約 330 万回表示、3.97 万いいね、3.4 万ブックマークでした。
- 当サイトの API Key で、Claude Code と Codex にそれぞれ縮小版を作らせました。データは HN 公式 Algolia API の 2026 年 9〜10 月分です。どちらも約 9 分で完了し、YouTube リンクを含むコメント約 3,600 件、異なる動画 3,500 本超を見つけ、2 人以上が貼った 193 本を残しました。上位 3 本は完全に一致しています。
- 縮小版と HackerTube の差は「そのコメントが本当に勧めているか」の判定です。リンク数だけで並べると、その週のニュース動画が上位に来ます。3 位の動画は 12 回の言及がすべて同じスレッドからでした。この判定を足すプロンプトは記事の後半にあります。
API Key を作成して、Claude Code・Codex・Cursor で自分の HackerTube を作る →
HackerTube とは、Karpathy はどう作ったか
HackerTube のキャッチコピーは「Hacker News がお互いに勧め続けている YouTube 動画」です。About ページによると、現在 6,454 本の動画を掲載し、それらに触れた HN コメント 39,834 件を読み、16 分野・150 トピックに分類、期間は 2007〜2026 年です。いいね・履歴・後で見るはブラウザ内だけに保存され、アカウントはありません。サムネイルは投稿者が最適化した画像ではなく、動画の中盤の 1 コマです。
About ページの「How it was built」によると、手順は 5 つです:
| 手順 | HackerTube のやり方 |
|---|---|
| 1. 全コメントを読む | HN の公開アーカイブ全体(open-index/hacker-news データセット)から YouTube リンクを洗い出し、10 万本を大きく超える動画を得る |
| 2. くり返し勧められたものだけ残す | 3 人以上の異なる人が、中身のあるコメントつきで、3 つ以上の異なる月に貼ったもの。残りは約 7,000 本 |
| 3. モデルに各コメントを読ませる | Claude がスレッドのタイトルと合わせて読み、推薦・引用・冗談・批判のどれかを判定し、引用文とトピックを抜き出す |
| 4. 動画ごとにカードを書く | YouTube の情報と HN の全コメントから、要約、HN で好かれる理由、種類、今も通用するかを書く |
| 5. 順位づけ | 勧められた「異なる月の数」で並べる。一度のバズより、何年にもわたってくり返し貼られる方が重い |
About ページには、サイト全体・データパイプライン・検索と推薦は Claude Code 上の Claude Opus 5.5 が作り、コメントのラベルと動画カードは Opus が束ねた Claude Sonnet 5.5 のエージェント群が書いた、とも書かれています。データも公開されています。Data ページから約 17.8 MB の zip を落とせて、videos.jsonl、mentions.jsonl、トピック表、埋め込みベクトル、エージェント向けに書かれた DATA.md が入っています。ライセンスは ODC-By 1.0 です。Karpathy は投稿で、これを自分の Claude に渡して自分版を作らせればいいと勧めています。
X のトレンドまとめ(その 1、その 2)によると、投稿のあとすぐに arXiv 論文版の Hacker Papers や、本・ブログのまとめも作られています。
縮小版でやること
20 年分を再現するには HN のアーカイブ全体のダウンロードが必要で、最初の一歩には重すぎます。今回は期間を 2 か月に絞り、キー不要の HN 公式 Algolia 検索 API だけを使いました:
| 手順 | 方法 | 出力 |
|---|---|---|
| 1. コメント取得 | Algolia search_by_date、tags=comment、時間ウィンドウに分割 | data/comments.jsonl |
| 2. リンク抽出 | 本文から 11 文字の動画 ID を抜き出す。watch?v=、youtu.be/、/shorts/ などに対応 | コメントごとの動画 |
| 3. 重複排除と集計 | 動画ごとの言及数、異なる人数、異なる月数 | 順位 |
| 4. タイトル付与 | YouTube oEmbed(キー不要) | data/videos.json |
| 5. ページ生成 | カードのグリッドとブラウザ側の検索ボックスを持つ静的 HTML 1 枚 | site/index.html |
手順 1:API Key を作成し、Claude Code か Codex に接続する
- aicodewith.ai に登録してログインし、キー管理でキーを作成して文字列全体をコピーします。
- Claude Code:接続先とキーを設定し、空のフォルダを作ってその中で起動します:
export ANTHROPIC_BASE_URL="https://api.aicodewith.ai"
export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY"
mkdir -p ~/hackertube-mini && cd ~/hackertube-mini
claude --model claude-opus-5-5
設定を永続化したい場合や Windows での設定は、Claude Code をサードパーティ API に接続する方法を参照してください。Karpathy は Opus 5.5 を Medium effort で使っていました。段階の選び方は Claude Opus 5.5 の effort の選び方、モデル比較は Claude Code ではどのモデルを使うかへ。
- Codex:
~/.codex/config.tomlに次の設定を書き、キーはexperimental_bearer_tokenに直接書きます:
# ~/.codex/config.toml
model = "gpt-6.1-sol"
model_reasoning_effort = "medium"
model_provider = "aicodewith"
[model_providers.aicodewith]
name = "aicodewith"
base_url = "https://api.aicodewith.ai/chatgpt/v1"
wire_api = "responses"
experimental_bearer_token = "YOUR_API_KEY"
各項目の意味は Codex の config.toml 解説にあります。Codex が初めてなら Codex の使い方と Codex のインストールから。
手順 2:まず HN Algolia API を自分で叩いてみる
始める前に 1 回リクエストして、データの形を確認しておきます。次のリクエストは 2026-09-01 に投稿されたコメントのうち youtu を含むものを取ります(youtube.com も youtu.be もヒットします):
# comments posted on 2026-09-01 (UTC) that contain "youtu"
curl "https://hn.algolia.com/api/v1/search_by_date?query=youtu&tags=comment&hitsPerPage=1000&numericFilters=created_at_i>=1788220800,created_at_i<1788307200"
実測ではこの日の HN コメントは 10,830 件、そのうち youtu を含むのは 197 件でした。注意すべき制限は 2 つです:
- 1 回のクエリで返るのは最大 1000 件。 2 か月まとめて取ると
youtube.comだけで 4,000 件を超え、超えた分は取れません。期間を小さなウィンドウに分ける必要があります。 youtubeで検索すると短縮リンクを取りこぼす。youtu.be/xxxxにはyoutubeという語がありません。youtuで検索し、手元で正規表現を使って正確に絞り込みます。
この 2 点はプロンプトに書きましたが、Claude Code も Codex も、パイプラインを書く前に自分でリクエストを試して上限を確かめていました。
手順 3:プロンプトをエージェントに渡す
次の内容を prompt.txt として保存し、Claude Code か Codex に渡します。実測で使った原文そのままです:
Build a mini "HackerTube" in this folder: a static site of the YouTube videos that Hacker News commenters keep recommending to each other.
1. Fetch data only from the official HN Algolia API (https://hn.algolia.com/api/v1/search_by_date, tags=comment). Take every comment created from 2026-09-01 00:00 UTC to 2026-10-31 23:59 UTC that contains a YouTube link (youtube.com/watch, youtu.be/, /embed/, /shorts/, m.youtube.com, music.youtube.com). Note the API returns at most 1000 hits per query, so split the time range into small enough windows. Be polite: at most 2 requests per second. Save raw hits to data/comments.jsonl.
2. Extract and normalize the 11-character video ids (HTML-unescape the comment text first), and drop the commenter's own repeated links within the same comment.
3. For each video count: mentions, distinct commenters, distinct months, first and last mention, and keep up to 3 short quotes with links to the HN comment (https://news.ycombinator.com/item?id=...). Keep a video only if at least 2 different people linked it. Rank by distinct commenters, then mentions.
4. Get titles for the kept videos from YouTube oEmbed (https://www.youtube.com/oembed?url=...&format=json, no API key); if oEmbed fails keep the id and mark it unavailable. Save data/videos.json.
5. Generate site/index.html: a single static page, no login and no tracking, with a grid of cards (thumbnail from https://i.ytimg.com/vi/<id>/hqdefault.jpg, title, channel, "N people / M mentions", one quote) and a client-side text filter.
6. Write the whole pipeline as a reusable script build.py (stdlib only, with a --since/--until option) and run it. Finally reply with: total comments fetched, unique videos found, videos kept, the top 10 videos (id, title, people, mentions), and any problems you hit.
ポイントは 3 つです。データ源を公式 API に限定することで、エージェントが Web ページをスクレイピングしに行かなくなります。1000 件の上限とリクエスト頻度を先に伝えることで、途中でデータの欠けに気づく手戻りを防げます。再実行できる build.py を求めることで、期間やしきい値を変えるたびに会話をやり直さずに済みます。
バックグラウンドで動かすなら非対話モードを使います。Claude Code は --allowedTools で今回必要なコマンドだけを許可します。Codex のデフォルトのサンドボックスはネットワークに出られないため、専用の空フォルダで --sandbox danger-full-access を使いました。強い権限なので、大事なファイルがあるフォルダでは使わないでください。権限の設定は Codex の自動化権限の設定を参照してください:
# Claude Code, non-interactive: only allow the commands this job needs
cat prompt.txt | claude -p --model claude-opus-5-5 \
--permission-mode acceptEdits \
--allowedTools "Bash(python3:*)" "Bash(curl:*)" "Bash(ls:*)" "Bash(mkdir:*)" "Bash(head:*)" "Bash(wc:*)"
# Codex, non-interactive (reads the prompt from stdin)
codex exec --skip-git-repo-check --sandbox danger-full-access - < prompt.txt
実測:当サイトの Key で Claude Code と Codex を動かす
2 つのクライアントに同じプロンプトを渡し、同じ Linux マシンで同時に動かしました。日時は 2026 年 11 月 2 日の午後です:
| Claude Code 2.1.316 + Opus 5.5 | Codex 0.166.0 + GPT-6.1 Sol | |
|---|---|---|
| 所要時間 | 約 555 秒、21 ターン | 約 534 秒、実行コマンド 30 個 |
| 取得方法 | 1 日単位で youtu を検索し、1000 件を超えるウィンドウは自動で半分に分割。リクエスト 61 回 | 1 日単位の 61 ウィンドウで youtu を検索し、どれも 1000 件未満であることを確認 |
| YouTube リンクを含むコメント | 3,624 件 | 3,619 件 |
| 異なる動画 | 3,511 本 | 3,505 本 |
| 2 人以上が貼った動画(残した数) | 193 本 | 193 本 |
| タイトル取得失敗 | 2 本(oEmbed が 403 と 401) | 同じ |
| 自己チェック | 1 日分を全件スキャンして照合し、どちらも同じ 87 件のリンク付きコメントを検出 | テストを 5 本書き、ヘッドレス Chrome でページを開いてカードと検索ボックスを確認 |
| 成果物 | build.py 418 行、index.html 約 258 KB | build.py 258 行、index.html 約 210 KB |
両者とも自分から同じ取り方を選びました。全コメント(2 か月で約 60 万件)を走査するのではなく、日ごとに youtu を検索して手元で正確に絞り込む方法です。Claude Code はこの近道の検証までしていて、9 月 1 日分を全件スキャンした結果が事前絞り込みと完全に一致したこと、youtube で検索していたら短縮リンクのコメント 20 件を取りこぼしていたことを報告しました。
上位 10 本は両者でほぼ同じ、上位 3 本は完全に同じでした。さらに、各動画の言及のうち同じスレッドから来たものがいくつあるかも数えました:
| 順位 | 動画 | 人数 | 言及数 | 月数 | 1 スレッド内の最大 |
|---|---|---|---|---|---|
| 1 | 216,000,000 Spy TVs – The LG Smart TV Problem | 15 | 18 | 2 | 7 |
| 2 | Kernel Recipes 2026 - Security in the LLM age | 12 | 21 | 1 | 2 |
| 3 | The FLYING Tesla Roadster explained by the man who engineered it | 11 | 12 | 1 | 12 |
| 4 | LG Says We're Fake News | 6 | 7 | 1 | 6 |
| 5 | Reinventing Entropy – Compression is Intelligence Part 1 | 6 | 6 | 2 | 3 |
data/videos.json の各動画はこのような形で、引用には HN の元コメントへのリンクがついています:
{
"id": "6IFVTcM28KA",
"title": "216,000,000 Spy TVs | The LG Smart TV Problem",
"people": 15, "mentions": 18, "months": 2,
"first_mention": "2026-09-07T10:52:26Z",
"last_mention": "2026-10-13T16:41:11Z",
"quotes": [
{"author": "wavesplash", "date": "2026-09-07",
"url": "https://news.ycombinator.com/item?id=49597752",
"text": "... Worth a watch to see how bad this is"}
]
}
生成された build.py は、期間やしきい値を変えて再実行できます(Claude Code 版の例):
python3 build.py --since 2026-09-01 --until 2026-10-31 # full run
python3 build.py --skip-fetch --min-people 3 # rebuild from saved comments with a stricter rule
python3 build.py --full-scan # scan every comment instead of the "youtu" prefilter (slow)
実測でわかった 3 つの問題
- リンク数で並べると「今週の話題」が「定番の推薦」に化ける。 3 位の 12 回の言及はすべて、その動画そのものを扱った 1 つのスレッドからでした。4 位も 6 回が同じスレッドです。HackerTube が「3 つ以上の異なる月」を条件にし、モデルに各コメントの態度を判定させているのはこのためです。2 か月分のデータで「3 人以上かつ 2 か月以上」を満たしたのは 22 本だけでした。
- 貼られた URL はよく間違っていて、両クライアントで扱いが違う。 Claude Code は Codex より 5 件多くコメントを拾いましたが、すべて次のような URL でした。Claude Code は先頭 11 文字を取って採用し、Codex は標準的な URL として解析して捨てました。3 つ目は実は 2 文字多いので、11 文字で切ると別の動画を指す可能性があります:
https://www.youtube.com/watch?v=sCr_gb8rdEI?t=11m <- "?" instead of "&"
https://youtu.be/69o-8Mtd3Kc&t=330 <- "&" instead of "?"
https://www.youtube.com/watch?v=909o_kbCdFgll <- 13 characters, not 11
- oEmbed ですべての動画のタイトルが取れるわけではない。 残した 193 本のうち 2 本は 403 か 401 が返りました。非公開か埋め込み無効の動画でしょう。両クライアントとも利用不可として ID だけを表示しました。長さや再生数などが必要なら、Karpathy と同じく Google Cloud で YouTube Data API のキーを作る必要があります。
縮小版から HackerTube へ、あと何が必要か
1 つ目:モデルに各コメントの態度を判定させる。 効果が一番大きいのはここです。縮小版のフォルダで、エージェントに続けてこう伝えます:
For each comment in data/comments.jsonl, read the comment text and the HN story title,
and label what the commenter does with the video: strong_rec, rec, reference, joke or critical.
Write the labels to data/stance.jsonl. Then only count strong_rec and rec,
keep a video if at least 3 different people recommended it in at least 3 different months,
and rank by the number of distinct months. Rebuild site/index.html.
数千件を 1 件ずつ判定すると時間がかかるので、エージェントにバッチに分けて並列で処理させます。Codex でタスクを同時に増やしすぎると 429 が出ることがあります。並列数の抑え方は Codex 429 Too Many Requests の対処法を参照してください。
2 つ目:もっと長いデータを使う。 Algolia は期間ごとの取得に向いています。2007 年から現在までをカバーするなら、HackerTube の About ページにある open-index/hacker-news の全量データの方が適しています。いちばん手軽なのは HackerTube のデータ zip をダウンロードし、エージェントにまず DATA.md を読ませてから、画面や順位づけを自分好みに変えることです。
3 つ目:公開する。 縮小版は静的ページなので、どの静的ホスティングでも開けます。Karpathy の投稿によると、彼は VPS の IP を Claude に渡して、更新・セキュリティ対策・堅牢化・デプロイ・最適化を指示し、すべて Claude がこなしたそうです。
よくある質問
Algolia の取得件数が nbHits より少ない
1 回のクエリで取れるのは最大 1000 件で、nbHits は総数にすぎません。各ウィンドウが 1000 件未満になるまで時間幅を小さくします。今回は 1 日単位で足り、混んでいる日はさらに半分に分けられます。
youtube で検索すると取りきれないのはなぜ
短縮リンク youtu.be には youtube が含まれません。youtu で検索し、手元の正規表現で watch?v=、youtu.be/、/embed/、/shorts/ などの形を絞り込みます。
コメント内のリンクが / のように化けている
Algolia が返す comment_text は HTML エスケープされていて、/ は /、& は & になります。リンクを抜き出す前に HTML をデコードしないと、正規表現が 1 件もマッチしません。プロンプトの 2 番目に明記したのはこのためです。
論文・本・ポッドキャストでも同じことをしたい
プロンプトの YouTube を arxiv.org/abs/、amazon.com/dp/ やポッドキャストのリンクに置き換えれば、集計とページ生成のロジックはそのまま使えます。論文を読み込む流れは Claude Code で arXiv 論文を検索・精読するへ。
エージェントに毎回同じルールで作業させたい
データ源、しきい値、ページの要件をプロジェクトの CLAUDE.md か AGENTS.md に書いておきます。書き方は Claude Code の CLAUDE.md の書き方を参照してください。
まとめ
HackerTube が示したのは、「他人の目利きでコンテンツを絞り込む」ような小さなプロダクトが、今やコーディングエージェントがあれば 1 人で作れるということです。実測では、Claude Code か Codex で Hacker News のコメントを取得し、YouTube リンクを抜き出して、使える静的動画サイトを作るまで約 9 分でした。品質を本当に左右するのは「何を推薦とみなすか」というルールと、期間が十分に長いかどうかです。



