Karpathy의 HackerTube 만드는 법:Claude Code / Codex로 Hacker News 댓글에서 영상을 찾아 알고리즘 없는 영상 사이트 만들기(실측)

Karpathy는 Claude Code와 Opus 5.5로 약 2시간 만에 HackerTube를 만들었습니다. Hacker News에서 20년 동안 반복해서 추천된 YouTube 영상 6,454개를 골라낸 사이트입니다. 이 글에서는 저희 API Key로 Claude Code와 Codex에 각각 축소판을 만들게 했습니다. HN 공식 Algolia API로 두 달 치 댓글을 가져와 YouTube 링크를 추출하고, 중복을 제거해 집계한 뒤 정적 페이지를 생성합니다. 전체 프롬프트, 소요 시간, 두 클라이언트 비교, HackerTube까지 남은 단계를 정리했습니다.

11 分钟阅读
Karpathy의 HackerTube 만드는 법:Claude Code / Codex로 Hacker News 댓글에서 영상을 찾아 알고리즘 없는 영상 사이트 만들기(실측)

결론부터:HackerTube의 아이디어는 단순합니다. Hacker News 댓글에 올라온 YouTube 링크를 모두 찾아서, 서로 다른 많은 사람이 서로 다른 여러 달에 걸쳐 추천한 영상만 남기고, 로그인도 추천 알고리즘도 없는 영상 사이트로 만드는 것입니다. Claude Code나 Codex라면 프롬프트 하나로 작동하는 축소판을 만들 수 있습니다.

  • Karpathy의 원래 게시물(UTC 기준 11월 1일)에 따르면, 그는 YouTube 추천이 마음에 들지 않아 Claude에게 HN 20년 치 약 4,300만 개 댓글을 걸러 반복 추천된 영상 6,454개를 고르게 했습니다. Claude Code 데스크톱 앱과 Opus 5.5(Medium effort)로 약 2시간이 걸렸습니다. 그가 직접 한 일은 YouTube 메타데이터 조회용 Google Cloud 키 만들기, VPS 띄우기, 도메인 구입 세 가지뿐입니다. 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년입니다. 좋아요, 시청 기록, 나중에 볼 동영상은 브라우저에만 저장되고 계정이 없습니다. 썸네일은 업로더가 최적화한 이미지가 아니라 영상 중간의 한 장면입니다.

About 페이지의 「How it was built」에 따르면 과정은 다섯 단계입니다:

단계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.8MB zip을 받을 수 있고, videos.jsonl, mentions.jsonl, 주제 목록, 임베딩, 에이전트용으로 쓴 DATA.md가 들어 있으며 라이선스는 ODC-By 1.0입니다. Karpathy는 게시물에서 이것을 자신의 Claude에게 주고 나만의 버전을 만들어 달라고 하라고 권합니다.

X 트렌드 요약(1, 2)에 따르면, 게시물이 나온 뒤 arXiv 논문판 Hacker Papers와 책, 블로그 추천 모음도 곧바로 만들어졌습니다.

축소판에서 할 일

20년 치를 그대로 재현하려면 HN 아카이브 전체를 내려받아야 해서 처음 해 보기에는 부담이 큽니다. 이번에는 기간을 두 달로 줄이고, 키가 필요 없는 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 한 장site/index.html

1단계:API Key를 만들고 Claude Code나 Codex에 연결하기

  1. aicodewith.ai에 가입하고 로그인한 뒤, 키 관리에서 키를 만들고 전체 문자열을 복사합니다.
  2. Claude Code:주소와 키를 설정하고, 빈 폴더를 만들어 그 안에서 실행합니다:
bash
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에서 어떤 모델을 쓸까를 참고하세요.

  1. Codex:~/.codex/config.toml에 다음 설정을 넣고, 키는 experimental_bearer_token에 직접 씁니다:
toml
# ~/.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를 직접 호출해 보기

시작 전에 요청을 한 번 보내 데이터 모양을 확인해 둡니다. 아래 요청은 2026-09-01에 올라온 댓글 중 youtu가 들어간 것을 가져옵니다(youtube.com과 youtu.be 모두 잡힙니다):

bash
# 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개였습니다. 주의할 제한은 두 가지입니다:

  • 쿼리 한 번에 최대 1000건만 돌려줍니다. 두 달을 한 번에 조회하면 youtube.com 하나만으로 4,000건이 넘고, 넘는 부분은 받을 수 없습니다. 그래서 기간을 작은 시간 창으로 나눠야 합니다.
  • youtube로만 검색하면 단축 링크를 놓칩니다. youtu.be/xxxx에는 youtube라는 단어가 없습니다. youtu로 검색하고 로컬에서 정규식으로 정확히 걸러야 합니다.

두 가지 모두 프롬프트에 적었지만, Claude Code와 Codex 모두 파이프라인을 쓰기 전에 직접 요청을 보내 제한을 확인했습니다.

3단계:프롬프트를 에이전트에게 주기

아래 내용을 prompt.txt로 저장해 Claude Code나 Codex에 줍니다. 실측에 쓴 원문 그대로입니다:

text
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.

핵심은 세 가지입니다. 데이터 출처를 공식 API로 한정하면 에이전트가 웹페이지를 긁으러 가지 않습니다. 1000건 제한과 요청 빈도를 미리 알려 주면 중간에야 데이터가 빠진 걸 알아채는 일을 막을 수 있습니다. 다시 실행할 수 있는 build.py를 요구하면 기간이나 기준을 바꿀 때마다 대화를 새로 열 필요가 없습니다.

백그라운드로 돌리려면 비대화형 모드를 씁니다. Claude Code는 --allowedTools로 이번 작업에 필요한 명령만 허용합니다. Codex의 기본 샌드박스는 네트워크에 나갈 수 없어서, 전용 빈 폴더에서 --sandbox danger-full-access를 썼습니다. 권한이 매우 넓으니 중요한 파일이 있는 폴더에서는 쓰지 마세요. 권한 설정은 Codex 자동화 권한 설정을 참고하세요:

bash
# 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 실행

두 클라이언트에 같은 프롬프트를 주고 같은 Linux 머신에서 동시에 실행했습니다. 시점은 2026년 11월 2일 오후입니다:

Claude Code 2.1.316 + Opus 5.5Codex 0.166.0 + GPT-6.1 Sol
소요 시간약 555초, 21턴약 534초, 명령 30개 실행
수집 방식하루 단위 창으로 youtu 검색, 1000건을 넘는 창은 자동으로 반으로 나눔. 요청 61번하루 단위 61개 창으로 youtu 검색, 어느 창도 1000건에 닿지 않음을 확인
YouTube 링크가 있는 댓글3,624개3,619개
서로 다른 영상3,511개3,505개
2명 이상, 남긴 영상193개193개
제목을 못 가져온 영상2개(oEmbed가 403, 401 반환)동일
자체 점검하루치를 전수 스캔해 대조, 둘 다 링크 있는 댓글 87개로 동일테스트 5개 작성, 헤드리스 Chrome으로 페이지를 열어 카드와 검색창 확인
결과물build.py 418줄, index.html 약 258KBbuild.py 258줄, index.html 약 210KB

두 클라이언트 모두 스스로 같은 방식을 골랐습니다. 모든 댓글(두 달에 약 60만 개)을 훑는 대신 날마다 youtu를 검색하고 로컬에서 정확히 거르는 방법입니다. Claude Code는 이 지름길까지 검증했습니다. 9월 1일치를 전수 스캔한 결과가 사전 필터와 완전히 같았고, youtube로 검색했다면 단축 링크 댓글 20개를 놓쳤을 것이라고 짚었습니다.

상위 10개는 양쪽이 거의 같았고 상위 3개는 완전히 같았습니다. 추가로 각 영상의 언급 중 한 스레드에서 나온 것이 몇 개인지도 세어 봤습니다:

순위영상사람 수언급 수달 수한 스레드 최대
1216,000,000 Spy TVs – The LG Smart TV Problem151827
2Kernel Recipes 2026 - Security in the LLM age122112
3The FLYING Tesla Roadster explained by the man who engineered it1112112
4LG Says We're Fake News6716
5Reinventing Entropy – Compression is Intelligence Part 16623

data/videos.json의 각 영상은 이런 모양이고, 인용문에는 HN 원래 댓글 링크가 붙어 있습니다:

json
{
  "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 버전 예시):

bash
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)

실측에서 드러난 세 가지 문제

  1. 링크 수로 정렬하면 「이번 주 화제」가 「고전 추천」이 된다. 3위의 언급 12번은 모두 그 영상을 다룬 한 스레드에서 나왔고, 4위도 6번이 같은 스레드였습니다. HackerTube가 「서로 다른 3개월 이상」을 조건으로 걸고 모델에게 댓글마다 태도를 판단하게 하는 이유입니다. 두 달 치 데이터에서 「3명 이상, 2개월 이상」을 만족한 영상은 22개뿐이었습니다.
  2. 사람들이 올린 URL은 자주 틀려 있고, 두 클라이언트의 처리 방식이 다르다. Claude Code가 Codex보다 댓글 5개를 더 잡았는데, 모두 아래 같은 URL이었습니다. Claude Code는 앞 11자를 잘라 받아들였고, Codex는 표준 URL로 파싱해 버렸습니다. 세 번째는 사실 두 글자가 더 많아서, 11자로 자르면 다른 영상을 가리킬 수 있습니다:
text
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
  1. oEmbed로 모든 영상의 제목을 가져올 수 있는 것은 아니다. 남긴 193개 중 2개는 403이나 401을 돌려줬습니다. 비공개이거나 퍼가기가 꺼진 영상일 가능성이 큽니다. 두 클라이언트 모두 사용 불가로 표시하고 ID만 보여 줬습니다. 길이나 조회수 같은 정보가 필요하면 Karpathy처럼 Google Cloud에서 YouTube Data API 키를 만들어야 합니다.

축소판에서 HackerTube까지 남은 단계

첫째, 모델이 댓글마다 태도를 판단하게 하기. 효과가 가장 큰 단계입니다. 축소판 폴더에서 에이전트에게 이어서 이렇게 말합니다:

text
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.

수천 개 댓글을 하나씩 판단하면 시간이 걸리니 에이전트에게 배치로 나눠 병렬 처리하게 하세요. Codex 작업을 한꺼번에 너무 많이 띄우면 429가 날 수 있습니다. 동시 실행 수 조절은 Codex 429 Too Many Requests 해결 방법을 참고하세요.

둘째, 더 긴 데이터 쓰기. Algolia는 기간별 수집에 적합합니다. 2007년부터 지금까지를 다루려면 HackerTube About 페이지에 나온 open-index/hacker-news 전체 데이터가 더 맞습니다. 가장 쉬운 방법은 HackerTube 데이터 zip을 받아 에이전트에게 먼저 DATA.md를 읽힌 뒤, 화면이나 순위를 취향대로 바꾸는 것입니다.

셋째, 배포하기. 축소판은 정적 페이지라 어떤 정적 호스팅에서도 열립니다. Karpathy의 게시물에 따르면 그는 VPS의 IP를 Claude에게 주고 업데이트, 보안 설정, 하드닝, 배포, 최적화를 맡겼고 Claude가 전부 해냈다고 합니다.

자주 묻는 질문

Algolia에서 받은 건수가 nbHits보다 적다

쿼리 한 번에 최대 1000건이고 nbHits는 전체 개수일 뿐입니다. 창마다 1000건 미만이 될 때까지 시간 범위를 줄이세요. 이번에는 하루 단위로 충분했고, 댓글이 많은 날은 다시 반으로 나누면 됩니다.

youtube로 검색하면 왜 다 못 가져오나

단축 링크 youtu.be에는 youtube가 없습니다. youtu로 검색하고, 로컬 정규식으로 watch?v=, youtu.be/, /embed/, /shorts/ 같은 형식을 거르세요.

댓글 속 링크가 &#x2F;처럼 깨져 보인다

Algolia가 주는 comment_text는 HTML 이스케이프되어 있어 /는 &#x2F;, &는 &amp;가 됩니다. 링크를 뽑기 전에 HTML을 디코딩하지 않으면 정규식이 하나도 맞지 않습니다. 프롬프트 2번 항목에 이를 따로 적은 이유입니다.

논문, 책, 팟캐스트로도 똑같이 하고 싶다

프롬프트의 YouTube를 arxiv.org/abs/, amazon.com/dp/나 팟캐스트 링크로 바꾸면 집계와 페이지 생성 로직은 그대로 쓸 수 있습니다. 논문을 읽는 흐름은 Claude Code로 arXiv 논문 검색하고 정독하기를 이어서 보세요.

에이전트가 매번 같은 규칙으로 작업하게 하고 싶다

데이터 출처, 기준, 페이지 요구 사항을 프로젝트의 CLAUDE.md나 AGENTS.md에 적어 두세요. 작성법은 Claude Code CLAUDE.md 작성법을 참고하세요.

정리

HackerTube는 「다른 사람의 안목으로 콘텐츠를 거르는」 작은 제품을 이제 코딩 에이전트와 함께 혼자서도 만들 수 있다는 것을 보여 줍니다. 실측해 보니 Claude Code나 Codex로 Hacker News 댓글을 가져와 YouTube 링크를 추출하고 쓸 만한 정적 영상 사이트를 만드는 데 약 9분이 걸렸습니다. 품질을 정말 좌우하는 것은 「무엇을 추천으로 볼 것인가」라는 규칙과 기간이 충분히 긴지입니다.

API Key를 만들고 Claude Code, Codex, Cursor에서 시작하기 →

相关文章

DeepSeek Harness Creator Mode 사용법: 설치, 서드파티 API 연결, 첫 플러그인 만들기 실측

DeepSeek Harness Creator Mode 사용법: 설치, 서드파티 API 연결, 첫 플러그인 만들기 실측

11월 2일 DeepSeek Harness 공식 계정이 Creator Mode를 소개했습니다. 원하는 도구를 한 문장으로 설명하면 에이전트가 플러그인을 작성하고 Harness에 설치한 뒤 로드됐는지까지 확인합니다. 이 글은 Creator Mode가 무엇인지, npx로 Harness를 실행하는 방법, OpenAI 호환 서드파티 API(aicodewith Base URL + Key)를 연결해 Claude, GPT, DeepSeek 모델을 쓰는 방법, Creator Mode로 todo_scan 플러그인을 만드는 과정을 실제 출력, 자주 나는 오류, Claude Code / Codex의 대응 방법과 함께 정리합니다.

Claude Code auto mode가 중계 서버를 거치면 매 턴 실패? 2.1.317에서 게이트웨이 403/422 수정 (업데이트와 테스트)

Claude Code auto mode가 중계 서버를 거치면 매 턴 실패? 2.1.317에서 게이트웨이 403/422 수정 (업데이트와 테스트)

Claude Code 2.1.317(11월 3일 출시)은 ANTHROPIC_BASE_URL이 LLM 게이트웨이를 가리키고, 그 게이트웨이가 서버 측 안전 검사에 403이나 422를 반환할 때 auto mode가 매 턴 실패하던 문제를 고쳤습니다. 무엇이 바뀌었는지, 어떤 서드파티 게이트웨이·중계 사용자가 영향을 받는지, 업데이트와 버전 확인, Base URL과 키 설정, auto mode 켜는 법, 2.1.316과 2.1.317 비교 테스트, 오류 대조표와 FAQ를 정리했습니다.

Claude Message Threads 사용법: Messages API 메시지 스레드 공개 베타, 새 메시지만 보내고 첫 토큰 약 35% 빨라짐 (Claude Code / API 실측)

Claude Message Threads 사용법: Messages API 메시지 스레드 공개 베타, 새 메시지만 보내고 첫 토큰 약 35% 빨라짐 (Claude Code / API 실측)

Anthropic이 11월 2일 Messages API의 Message Threads(메시지 스레드)를 공개 베타로 내놓았습니다. 첫 요청에서 전체 대화를 보내 스레드를 만들고, 이후에는 새 메시지와 직전 응답의 id만 보냅니다. 긴 대화에서 첫 토큰이 더 빨리 오지만 토큰 사용량과 과금은 그대로입니다. 이 글은 공식 문서를 기준으로 thread 파라미터, 베타 헤더, 5분 만료와 404 재전송을 설명하고 curl, Python, TypeScript 예시를 보여 줍니다. 또 aicodewith Key로 실측한 결과, aicodewith를 거치면 현재 thread 필드가 무시되어 이어서 보낸 턴이 앞 맥락을 잃는다는 점, Claude Code는 영향이 없다는 점, 대안과 자주 보는 오류를 정리합니다.