# SkaterTube

> The skate videos skaters keep telling each other to watch. 5,914 YouTube skate videos that real skaters recommend on Reddit, with summaries, topics and an open API and data export. A skateboarding take on Andrej Karpathy's HackerTube.

SkaterTube (https://skatertube.com) ranks skate videos by how many different skaters recommend them on Reddit, and for how long. Everything is free to reuse under ODC-By 1.0. All API endpoints are GET, return JSON, need no key and send `Access-Control-Allow-Origin: *`.

## About

- What it is: a YouTube-style site for 5,914 skate videos, in 37 categories across 8 topic areas. Parts, tutorials, docs, contests, trick science, history.
- How videos get picked: every post and comment from 2008 to 2026 in r/skateboarding, r/NewSkaters, r/SkateboardingHelp, r/skatevideos gets scanned for YouTube links. A video gets in when several different people recommend it; one person posting it ten times counts once. Rank rises with distinct recommenders and with how long they keep recommending it.
- Counts: 5,914 videos, 25,621 Reddit mentions, 10,549 distinct skaters recommending, 1,976 channels.
- Editor's picks: Adam Shomsky's Skateology slow-motion breakdowns are included even without Reddit mentions.
- Cards: Claude wrote each summary, type, level and topic list from YouTube details and what skaters said. A few will be off.
- [About page](https://skatertube.com/about): story, method and credits.

## Data

- [Data page](https://skatertube.com/data): every file, what is left out and why, license.
- [skatertube-data.zip](https://skatertube.com/data/skatertube-data.zip): everything below in one zip, 6.1 MB. Exported 2026-11-04.
- [DATA.md](https://skatertube.com/data/DATA.md): Start here: what every file and field means, how the data was made, scripts for agents.
- [videos.jsonl](https://skatertube.com/data/videos.jsonl): One line per video: id, url, title, channel, summary, why skaters like it, type, level, topics, categories, quote, Reddit stats, score, sources. 5,914 rows.
- [mentions.jsonl](https://skatertube.com/data/mentions.jsonl): One line per Reddit mention of a video: sub, id, permalink, author, date, score, thread title (no comment text). 23,951 rows.
- [related.jsonl](https://skatertube.com/data/related.jsonl): Per video: nearest neighbours by embedding cosine, and videos the same Reddit users also recommended. 5,914 rows.
- [taxonomy.json](https://skatertube.com/data/taxonomy.json): Topic areas and categories with descriptions (version 22f60fd6e92f); rows = categories. 37 rows.
- [embeddings.bin](https://skatertube.com/data/embeddings.bin): int8 vectors, row-major [5914, 256], openai/text-embedding-3-small, unit vectors x 127. 5,914 rows.
- [embedding_ids.json](https://skatertube.com/data/embedding_ids.json): Video id for each row of embeddings.bin, in order. 5,914 rows.
- [sources.json](https://skatertube.com/data/sources.json): Editor's picks: Shomsky allowlist, canon of full-length classics, documentary series. 756 rows.
- [LICENSE.txt](https://skatertube.com/data/LICENSE.txt): ODC-By 1.0 for SkaterTube's derived data; attribution line; Reddit and YouTube content belongs to its owners.
- [Manifest](https://skatertube.com/api/export): file list as JSON with sizes and row counts.
- Not in the export: YouTube durations, view counts and other YouTube numbers (YouTube API terms). Get your own free YouTube Data API key to add them; DATA.md has steps.
- Also left out: Reddit comment text. Comments belong to their authors, so each mention carries a permalink instead.
- License: [ODC-By 1.0](https://opendatacommons.org/licenses/by/1-0/) for SkaterTube's derived files. Credit "SkaterTube (skatertube.com)". Reddit comments belong to their authors. Videos belong to their uploaders.

## API

Base URL https://skatertube.com. GET only, JSON, no auth, CORS open. Machine-readable index at [/api](https://skatertube.com/api).

- [/api](https://skatertube.com/api): This index: every endpoint with params, limits and an example. Returns { name, docs, license, endpoints: [...] }.
  - Example: `https://skatertube.com/api`
- [/api/stats](https://skatertube.com/api/stats): Site counts. Returns { videos, mentions, recommenders, channels, areas, categories, first_year, last_year, sample }.
  - Example: `https://skatertube.com/api/stats`
- [/api/browse](https://skatertube.com/api/browse): Full taxonomy: areas and categories with descriptions and video counts. Returns [{ id, name, description, count, categories: [{ id, name, description, count }] }].
  - Example: `https://skatertube.com/api/browse`
- [/api/list](https://skatertube.com/api/list?cat=classic-parts&sort=top&n=10): Videos, filtered and sorted. Returns [Card] where Card = { vid, title, channel, duration_s, views, published, summary, plus reason (feed) or via (search) when present }.
  - `sort` (string; default top; one of top|recent|gems|new|old): top: most loved. recent: most recently recommended. gems: under 100K YouTube views, best first. new / old: by upload date.
  - `dur` (string; one of short|medium|long|xlong): Length: short under 4 min, medium 4 to 20, long 20 to 60, xlong 60 and up.
  - `type` (string; one of full_part|video_part|tutorial|documentary|contest|montage|history|interview|science|other): Video type.
  - `level` (string; one of beginner|intermediate|advanced|all): Skill level a video suits.
  - `cat` (string; a category id from /api/browse): Only this category.
  - `area` (string; an area id from /api/browse): Only this topic area.
  - `hide` (string; one of fails): fails: leave out slam and fail reels.
  - `offset` (integer; default 0; 0 to 1000000; anything else returns []): Skip this many results, for paging.
  - `n` (integer; default 36; 1 to 100; junk or 0 means 36): How many results.
  - Example: `https://skatertube.com/api/list?cat=classic-parts&sort=top&n=10`
- [/api/search](https://skatertube.com/api/search?q=kickflip%20slow%20motion&n=10): Search by meaning and by words over title, channel, summary, topics and quote. Falls back to word match when embeddings are off. Returns { results: [Card], weak: boolean } (weak: no strong match, results are best guesses).
  - `q` (string; required; first 200 chars used): Query: a trick, skater, spot, video or feeling.
  - `sort` (string; default top; one of top|recent|gems|new|old): top: most loved. recent: most recently recommended. gems: under 100K YouTube views, best first. new / old: by upload date.
  - `dur` (string; one of short|medium|long|xlong): Length: short under 4 min, medium 4 to 20, long 20 to 60, xlong 60 and up.
  - `type` (string; one of full_part|video_part|tutorial|documentary|contest|montage|history|interview|science|other): Video type.
  - `level` (string; one of beginner|intermediate|advanced|all): Skill level a video suits.
  - `cat` (string; a category id from /api/browse): Only this category.
  - `area` (string; an area id from /api/browse): Only this topic area.
  - `hide` (string; one of fails): fails: leave out slam and fail reels.
  - `n` (integer; default 60; 1 to 100; junk or 0 means 60): How many results.
  - Example: `https://skatertube.com/api/search?q=kickflip%20slow%20motion&n=10`
- [/api/related](https://skatertube.com/api/related?vid=hnqg_fkBkNM&n=10): Videos like one video: same channel, shared categories and topics, skaters who recommended both, and meaning. Returns [Card].
  - `vid` (string; required): A YouTube video id.
  - `n` (integer; default 20; 1 to 50; junk or 0 means 20): How many results.
  - Example: `https://skatertube.com/api/related?vid=hnqg_fkBkNM&n=10`
- [/api/docs](https://skatertube.com/api/docs?vids=hnqg_fkBkNM,QkeOAcj8Y5k): Cards for given ids, in the order given. Unknown ids are skipped. Returns [Card].
  - `vids` (string; required; comma-separated YouTube ids, 6 to 20 chars of [A-Za-z0-9_-]; at most 500; invalid ids are dropped): Video ids to fetch.
  - Example: `https://skatertube.com/api/docs?vids=hnqg_fkBkNM,QkeOAcj8Y5k`
- [/api/feed](https://skatertube.com/api/feed?like=hnqg_fkBkNM&seed=42&n=10): Personal Home feed. Videos near liked ones rise, categories of disliked ones sink, seen ones hide, a seed shuffles. Returns [Card] (each with a reason).
  - `like` (string; comma-separated YouTube ids, 6 to 20 chars of [A-Za-z0-9_-]; at most 500; invalid ids are dropped): Liked video ids.
  - `dislike` (string; comma-separated YouTube ids, 6 to 20 chars of [A-Za-z0-9_-]; at most 500; invalid ids are dropped): Disliked video ids.
  - `seen` (string; comma-separated YouTube ids, 6 to 20 chars of [A-Za-z0-9_-]; at most 500; invalid ids are dropped): Already watched ids, left out.
  - `seed` (string; default 0; first 32 chars used): Shuffle seed. Same seed, same order.
  - `hide` (string; one of fails): fails: leave out slam and fail reels.
  - `offset` (integer; default 0; 0 to 1000000; anything else returns []): Skip this many results, for paging.
  - `n` (integer; default 36; 1 to 100; junk or 0 means 36): How many results.
  - Example: `https://skatertube.com/api/feed?like=hnqg_fkBkNM&seed=42&n=10`
- [/api/export](https://skatertube.com/api/export): Download manifest for the open data export. Returns { generated, zip: { name, bytes, url }, files: [{ name, bytes, rows, description, url }], license, docs }.
  - Example: `https://skatertube.com/api/export`

Pages are linkable too: /watch/{vid}, /c/{category}, /a/{area}, /browse?sort=&dur=&type=&level=, /search/{query}.

## Credits

- [HackerTube](https://hackertube.org) by Andrej Karpathy: idea, layout, data page shape and agent-first export all come from it. [His post](https://x.com/karpathy/status/2116957135661945283).
- Reddit's skate communities (r/skateboarding, r/NewSkaters, r/SkateboardingHelp, r/skatevideos), read through [Arctic Shift](https://arctic-shift.photon-reddit.com).
- [Adam Shomsky](https://www.youtube.com/@ashomsky) and Skateology, for years of slow-motion skate footage.
- Labels and summaries by Claude (Anthropic).
- Built by [Steven Townsend](https://townsendsteven.com).

## Optional

- Keyboard shortcuts: `/` search, `j / k` next or previous video, `Enter` open selected video, `l` like, `w` watch later, `p` play, on a video page, `h` Home, `?` show all shortcuts, `Esc` close, or leave search box.
- [Settings](https://skatertube.com/settings): show a frame from mid-video instead of uploader thumbnails (on by default); hide slams and fails.
- No accounts. Likes, history and Watch later live in browser storage only.
- [llms-full.txt](https://skatertube.com/llms-full.txt): this file plus full taxonomy and DATA.md.
