Brainrot
Sludge content, but the top half is something you need to learn. One HTML
file shaped like a phone (9:16, TikTok-style): on top, the lesson in short
spoken beats with the current word highlighted and blown up as a caption;
underneath, Minecraft-style 3D parkour: a blocky guy running over a void,
jumping gaps and fences and sidestepping walls, forever (or real gameplay
footage if the user supplies a YouTube link). The parkour is synced to the
lesson: every beat recolors the world into a new biome, the beat's key phrase
launches him off a slime block through an arc of coins, and finishing turns
everything gold. Narration is pre-rendered with a neural TTS voice at build
time (OpenAI or ElevenLabs, whichever key is in the environment), TikTok
narrator energy, with word timings driving the captions. The eyes have
somewhere to go, so the ears can do the work.
You write the beats. A bundled script turns them into the page and opens it.
Two modes
teach — the user names a topic and you write the lesson. If the topic is a
real API, library, spec, or CLI, fetch the docs first (WebFetch, or the
defuddle skill for articles) so method names and flags are real and current.
Remembered API surfaces are where narrated lessons go wrong, and a confident
voice reading a wrong flag is worse than a hedge.
focus — the user hands over text, a file, or a URL they need to get
through. Read the whole thing before writing a single beat. Beats carry the
source's actual content, chunked and lightly rephrased for the ear. Put the
analogy in the eli5 field so text can stay faithful. Never add claims the
source doesn't make; if a passage is ambiguous, say so in the beat.
Pick focus whenever there is source material. Pick teach when there isn't.
Workflow
- Get the material (see modes above).
- Write the beats JSON (schema below) to a temp file, for example
${TMPDIR:-/tmp}/brainrot-<slug>.json.
- Build and open:
node <skill-dir>/scripts/build.mjs <beats.json> [--video <youtube url|id>] [--out <file>] [--no-open]
<skill-dir> is the directory containing this SKILL.md. With
OPENAI_API_KEY (or ELEVENLABS_API_KEY) in the environment the script
narrates every beat with a neural voice first (about 10 to 30 seconds for
a dozen beats, roughly a cent, cached by text so rebuilds are free), then
prints the output path (default ~/.cache/brainrot/<slug>-<stamp>.html)
and opens it. Read its stderr: it warns about beats that are too long or
whose key isn't in the text, and tells you which voice narrated. Fix
warnings and rebuild before handing over.
- Reply in one or two lines: the path, and "click to start, space pauses,
⚙ for speed, C for smooth brain mode." If the build fell back to the
browser voice, say so and name the missing key. The page is the
deliverable. Don't paste the lesson into chat.
Beat schema
{
"title": "PKCE, but make it sludge",
"subtitle": "OAuth for apps that can't keep a secret",
"mode": "teach",
"source": "optional label: file name, URL host, or 'from memory'",
"video": { "youtube": null },
"beats": [
{
"emoji": "🔑",
"title": "The problem",
"text": "Your phone app wants to log in with OAuth. But it can't keep a secret, because anyone can unzip the app and read the code.",
"key": "can't keep a secret",
"eli5": "It's a diary with the key taped to the cover.",
"code": "optional, eight lines max",
"lang": "ts"
}
]
}
Required: top-level title and each beat's text. Everything else is
optional. mode defaults to teach. Always write key anyway; see below.
Writing beats
- 8 to 20 beats. Fewer and the runner barely gets going; more and
attention leaves before the end.
text is 1 to 3 sentences, 40 words or fewer. It is read aloud. Browser
speech gets flaky past about fifteen seconds of continuous speech, and
nobody holds a sixty-word sentence by ear. The build script warns at 60.
- One idea per beat. If a beat needs "and also", split it.
- Write for the ear. Short sentences. Contractions. Concrete nouns. No
parentheses, no semicolons, no lists inside
text. Skip things speech
engines mangle: raw URLs, snake_case identifiers, hex, version strings. Put
those in code instead, where they're shown, not spoken.
key is the punchline: 1 to 5 words copied verbatim from text. When
narration reaches it the runner does his stunt and the phrase slams onto
the video in big letters, so pick the words that carry the idea ("no
token", "never leaves your app"), never a connective. Case-insensitive
match; if it isn't found the stunt fires about 70% through the beat.
title is spoken first as its own sentence. Five words or fewer.
eli5 is shown, never spoken. One sentence. It's where the analogy
lives so text can stay precise.
code is eight lines or fewer and looks runnable. It's the one place
precision beats voice.
- Order: the hook (why care) → the one idea → mechanism in steps → the
gotcha → what to do now → a closer a sleepy person could repeat back.
Narrator voice
Unhinged is the delivery. The facts stay boring and correct. The runner and
the captions are the entertainment budget; the content doesn't need to spend
any.
- Talk like a friend explaining something at 1am, not a textbook. Second
person, present tense.
- One concrete metaphor per beat, from daily life: bouncers, bank tellers,
group chats, lost luggage. Not three metaphors.
- Hype only where it lands: "this is the whole trick" on the one idea, not on
every beat.
- Fine: "okay so", "here's the thing", "no really", "this part is dumb but it
matters". Not fine: stacked slang, fake enthusiasm on every line, anything
you wouldn't say out loud. One "cooked" per lesson, max.
- Mild swearing is fine when it fits. Don't reach for it.
- Never invent. No made-up stats, versions, dates, or flag names. In teach
mode, if you can't verify a name, fetch the docs or write "check the docs
for the exact name" into the beat. In focus mode, keep the source's meaning
exactly; rephrase only for the ear.
Textbook: "PKCE mitigates authorization code interception by binding the
token request to the client that initiated the authorization request via a
cryptographically random code verifier and its transformed code challenge."
Brainrot: "Here's the whole trick. Before you ask to log in, you make up a
big random secret and send only its hash. Later, when you trade the code for a
token, you show the original. Doesn't hash to the same thing? No token."
(eli5: "You mail a photo of your key first, then show up with the key.")
Focus mode, source says: "Retries use exponential backoff with full
jitter, capped at 30 seconds." Beat: "When a request fails, it waits a
random amount before trying again. The wait roughly doubles each time, but
never goes past thirty seconds." (eli5: "Knock, wait a bit, knock, wait
longer. Stop waiting longer at thirty seconds.")
Options
--video <url|id> starts on real gameplay footage instead of the built-in
runner. Use it when the user names a video or asks for "actual subway
surfers". Don't guess a video id from memory: ids can't be verified
without fetching, and the owner may have disabled embedding. The page has
a paste box, so the user can supply one later either way.
--tts auto|openai|elevenlabs|none picks the narrator. auto (default)
uses ElevenLabs if its key is set, else OpenAI, else the browser voice.
--voice <name|id> overrides the voice: an OpenAI voice name (default
ash; onyx, echo, verse are the other male options) or an ElevenLabs
voice id (default: the first premade male voice on the account).
--style "<instructions>" replaces the OpenAI delivery instructions. The
default asks for a fast, upbeat TikTok narrator. Use it when the user wants
calmer or weirder.
--no-align skips whisper word alignment on OpenAI (captions then use
proportional timing; the key-phrase stunt may land a few hundred ms off).
--no-cache re-renders clips even if cached.
--out <path> overrides the default output location.
--no-open skips launching the browser.
Exporting a video
The page has a 🎬 button (or press E) that records the whole lesson as a
clean 1080×1920 file with narration and sound effects, ready to post. It
uses the browser's tab capture: the share dialog opens, the user picks
this tab (keep "share tab audio" on), the bar and cursor disappear, the
lesson restarts from beat one, and about four seconds after GG the file
lands in Downloads as <slug>-9x16.mp4 (WebM on browsers that can't mux
MP4). Clicking the red REC pill stops early. Works in Chromium browsers
(Chrome, Helium, Brave, Edge, Arc); Safari and Firefox can capture but
can't crop to the phone, so the export would include the page margins.
Tell the user to leave the tab visible while it records.
Gotchas
- Don't ship this through an Artifact tool. Speech synthesis and the
YouTube iframe are blocked in artifact sandboxes. The page needs a real tab.
The build script writes the file and opens it; that's the delivery.
- The 3D runner loads three.js from cdnjs. Offline, the video panel shows
a one-line notice and the lesson still narrates; 📺 with a YouTube link
also works once online. Nothing to fix in the beats.
- Browsers won't speak until the user clicks. The page opens on a "tap to
start" gate on purpose.
- Narration quality depends on a key being present. With OpenAI or
ElevenLabs the voice is neural and TikTok-paced. Without a key the page
falls back to browser speech synthesis, ranked by name toward known male
voices, and on browsers without Google or Edge voices (Safari, Helium,
Brave, ungoogled Chromium) that means a compact macOS voice like Daniel,
which sounds robotic. Tell the user which happened. There is no voice or
pitch control in the page by design; use
--voice and --style.
- Audio is embedded as data URIs, so the page stays one file. A dozen
beats add roughly half a megabyte. The build prints the final size.
- Export needs a click in the share dialog. That's the browser's rule for
capturing a tab; it can't be automated. If the dialog shows other windows,
the user should pick the current tab, not the whole screen.
- Chrome's cloud voices don't report word boundaries. The page estimates
word timing for those; local voices (Samantha and friends on macOS)
highlight exactly. Nothing to fix.
- Changing speed restarts the current beat from the current word.
Browser speech can't change rate mid-utterance.
- "Too cringe" means the beats, not the format. Calm the voice in the
JSON and leave smooth brain mode off. The runner alone is quiet.
Example requests
- "brainrot me on how DNS resolution works" → teach, about 12 beats, from
general knowledge (no API surface to verify).
- "/brainrot ./docs/ARCHITECTURE.md" → focus, read the file, chunk faithfully.
- "I can't focus on this RFC, https://… just read it to me with the subway
surfers thing" → focus, fetch with
defuddle, chunk; mention the paste
box if they want real footage.
- "teach me tanstack router loaders, make it dumb" → teach, fetch the docs
first, then write;
code fields carry the real function names.
1---2name: brainrot3description: Turn any topic, doc, article, README, or wall of text into "sludge content": a split-screen web page with a narrated ELI5-style lesson on the left (browser text-to-speech, one-word-at-a-time TikTok captions) and an endless pixel platformer or Subway-Surfers-style gameplay video on the right. USE WHEN the user says brainrot, sludge, subway surfers, smooth brain, "I can't focus on this", "too much text", "read this to me", "teach me X but make it fun / unhinged", "explain this like a TikTok", "help me get through this doc", or pastes something long and wants to actually absorb it rather than skim. Also for "eli5 with audio" or "narrate this". NOT FOR: a plain summary or TL;DR, a serious reference document, a diagram-first explanation (use eli5 or show-me), or deep comprehension with quizzes (use explain-this).4---56# Brainrot78Sludge content, but the top half is something you need to learn. One HTML9file shaped like a phone (9:16, TikTok-style): on top, the lesson in short10spoken beats with the current word highlighted and blown up as a caption;11underneath, Minecraft-style 3D parkour: a blocky guy running over a void,12jumping gaps and fences and sidestepping walls, forever (or real gameplay13footage if the user supplies a YouTube link). The parkour is synced to the14lesson: every beat recolors the world into a new biome, the beat's key phrase15launches him off a slime block through an arc of coins, and finishing turns16everything gold. Narration is pre-rendered with a neural TTS voice at build17time (OpenAI or ElevenLabs, whichever key is in the environment), TikTok18narrator energy, with word timings driving the captions. The eyes have19somewhere to go, so the ears can do the work.2021You write the beats. A bundled script turns them into the page and opens it.2223## Two modes2425**teach** — the user names a topic and you write the lesson. If the topic is a26real API, library, spec, or CLI, fetch the docs first (WebFetch, or the27`defuddle` skill for articles) so method names and flags are real and current.28Remembered API surfaces are where narrated lessons go wrong, and a confident29voice reading a wrong flag is worse than a hedge.3031**focus** — the user hands over text, a file, or a URL they need to get32through. Read the whole thing before writing a single beat. Beats carry the33source's actual content, chunked and lightly rephrased for the ear. Put the34analogy in the `eli5` field so `text` can stay faithful. Never add claims the35source doesn't make; if a passage is ambiguous, say so in the beat.3637Pick focus whenever there is source material. Pick teach when there isn't.3839## Workflow40411. Get the material (see modes above).422. Write the beats JSON (schema below) to a temp file, for example43 `${TMPDIR:-/tmp}/brainrot-<slug>.json`.443. Build and open:45 ```bash46 node <skill-dir>/scripts/build.mjs <beats.json> [--video <youtube url|id>] [--out <file>] [--no-open]47 ```48 `<skill-dir>` is the directory containing this SKILL.md. With49 `OPENAI_API_KEY` (or `ELEVENLABS_API_KEY`) in the environment the script50 narrates every beat with a neural voice first (about 10 to 30 seconds for51 a dozen beats, roughly a cent, cached by text so rebuilds are free), then52 prints the output path (default `~/.cache/brainrot/<slug>-<stamp>.html`)53 and opens it. Read its stderr: it warns about beats that are too long or54 whose `key` isn't in the text, and tells you which voice narrated. Fix55 warnings and rebuild before handing over.564. Reply in one or two lines: the path, and "click to start, space pauses,57 ⚙ for speed, C for smooth brain mode." If the build fell back to the58 browser voice, say so and name the missing key. The page is the59 deliverable. Don't paste the lesson into chat.6061## Beat schema6263```json64{65 "title": "PKCE, but make it sludge",66 "subtitle": "OAuth for apps that can't keep a secret",67 "mode": "teach",68 "source": "optional label: file name, URL host, or 'from memory'",69 "video": { "youtube": null },70 "beats": [71 {72 "emoji": "🔑",73 "title": "The problem",74 "text": "Your phone app wants to log in with OAuth. But it can't keep a secret, because anyone can unzip the app and read the code.",75 "key": "can't keep a secret",76 "eli5": "It's a diary with the key taped to the cover.",77 "code": "optional, eight lines max",78 "lang": "ts"79 }80 ]81}82```8384Required: top-level `title` and each beat's `text`. Everything else is85optional. `mode` defaults to teach. Always write `key` anyway; see below.8687## Writing beats8889- **8 to 20 beats.** Fewer and the runner barely gets going; more and90 attention leaves before the end.91- **`text` is 1 to 3 sentences, 40 words or fewer.** It is read aloud. Browser92 speech gets flaky past about fifteen seconds of continuous speech, and93 nobody holds a sixty-word sentence by ear. The build script warns at 60.94- **One idea per beat.** If a beat needs "and also", split it.95- **Write for the ear.** Short sentences. Contractions. Concrete nouns. No96 parentheses, no semicolons, no lists inside `text`. Skip things speech97 engines mangle: raw URLs, snake_case identifiers, hex, version strings. Put98 those in `code` instead, where they're shown, not spoken.99- **`key` is the punchline: 1 to 5 words copied verbatim from `text`.** When100 narration reaches it the runner does his stunt and the phrase slams onto101 the video in big letters, so pick the words that carry the idea ("no102 token", "never leaves your app"), never a connective. Case-insensitive103 match; if it isn't found the stunt fires about 70% through the beat.104- **`title` is spoken first as its own sentence.** Five words or fewer.105- **`eli5` is shown, never spoken.** One sentence. It's where the analogy106 lives so `text` can stay precise.107- **`code` is eight lines or fewer** and looks runnable. It's the one place108 precision beats voice.109- **Order:** the hook (why care) → the one idea → mechanism in steps → the110 gotcha → what to do now → a closer a sleepy person could repeat back.111112## Narrator voice113114Unhinged is the delivery. The facts stay boring and correct. The runner and115the captions are the entertainment budget; the content doesn't need to spend116any.117118- Talk like a friend explaining something at 1am, not a textbook. Second119 person, present tense.120- One concrete metaphor per beat, from daily life: bouncers, bank tellers,121 group chats, lost luggage. Not three metaphors.122- Hype only where it lands: "this is the whole trick" on the one idea, not on123 every beat.124- Fine: "okay so", "here's the thing", "no really", "this part is dumb but it125 matters". Not fine: stacked slang, fake enthusiasm on every line, anything126 you wouldn't say out loud. One "cooked" per lesson, max.127- Mild swearing is fine when it fits. Don't reach for it.128- Never invent. No made-up stats, versions, dates, or flag names. In teach129 mode, if you can't verify a name, fetch the docs or write "check the docs130 for the exact name" into the beat. In focus mode, keep the source's meaning131 exactly; rephrase only for the ear.132133**Textbook:** "PKCE mitigates authorization code interception by binding the134token request to the client that initiated the authorization request via a135cryptographically random code verifier and its transformed code challenge."136137**Brainrot:** "Here's the whole trick. Before you ask to log in, you make up a138big random secret and send only its hash. Later, when you trade the code for a139token, you show the original. Doesn't hash to the same thing? No token."140(`eli5`: "You mail a photo of your key first, then show up with the key.")141142**Focus mode, source says:** "Retries use exponential backoff with full143jitter, capped at 30 seconds." **Beat:** "When a request fails, it waits a144random amount before trying again. The wait roughly doubles each time, but145never goes past thirty seconds." (`eli5`: "Knock, wait a bit, knock, wait146longer. Stop waiting longer at thirty seconds.")147148## Options149150- `--video <url|id>` starts on real gameplay footage instead of the built-in151 runner. Use it when the user names a video or asks for "actual subway152 surfers". Don't guess a video id from memory: ids can't be verified153 without fetching, and the owner may have disabled embedding. The page has154 a paste box, so the user can supply one later either way.155- `--tts auto|openai|elevenlabs|none` picks the narrator. `auto` (default)156 uses ElevenLabs if its key is set, else OpenAI, else the browser voice.157- `--voice <name|id>` overrides the voice: an OpenAI voice name (default158 `ash`; `onyx`, `echo`, `verse` are the other male options) or an ElevenLabs159 voice id (default: the first premade male voice on the account).160- `--style "<instructions>"` replaces the OpenAI delivery instructions. The161 default asks for a fast, upbeat TikTok narrator. Use it when the user wants162 calmer or weirder.163- `--no-align` skips whisper word alignment on OpenAI (captions then use164 proportional timing; the key-phrase stunt may land a few hundred ms off).165- `--no-cache` re-renders clips even if cached.166- `--out <path>` overrides the default output location.167- `--no-open` skips launching the browser.168169## Exporting a video170171The page has a 🎬 button (or press `E`) that records the whole lesson as a172clean 1080×1920 file with narration and sound effects, ready to post. It173uses the browser's tab capture: the share dialog opens, the user picks174**this tab** (keep "share tab audio" on), the bar and cursor disappear, the175lesson restarts from beat one, and about four seconds after GG the file176lands in Downloads as `<slug>-9x16.mp4` (WebM on browsers that can't mux177MP4). Clicking the red REC pill stops early. Works in Chromium browsers178(Chrome, Helium, Brave, Edge, Arc); Safari and Firefox can capture but179can't crop to the phone, so the export would include the page margins.180Tell the user to leave the tab visible while it records.181182## Gotchas183184- **Don't ship this through an Artifact tool.** Speech synthesis and the185 YouTube iframe are blocked in artifact sandboxes. The page needs a real tab.186 The build script writes the file and opens it; that's the delivery.187- **The 3D runner loads three.js from cdnjs.** Offline, the video panel shows188 a one-line notice and the lesson still narrates; 📺 with a YouTube link189 also works once online. Nothing to fix in the beats.190- **Browsers won't speak until the user clicks.** The page opens on a "tap to191 start" gate on purpose.192- **Narration quality depends on a key being present.** With OpenAI or193 ElevenLabs the voice is neural and TikTok-paced. Without a key the page194 falls back to browser speech synthesis, ranked by name toward known male195 voices, and on browsers without Google or Edge voices (Safari, Helium,196 Brave, ungoogled Chromium) that means a compact macOS voice like Daniel,197 which sounds robotic. Tell the user which happened. There is no voice or198 pitch control in the page by design; use `--voice` and `--style`.199- **Audio is embedded as data URIs**, so the page stays one file. A dozen200 beats add roughly half a megabyte. The build prints the final size.201- **Export needs a click in the share dialog.** That's the browser's rule for202 capturing a tab; it can't be automated. If the dialog shows other windows,203 the user should pick the current tab, not the whole screen.204- **Chrome's cloud voices don't report word boundaries.** The page estimates205 word timing for those; local voices (Samantha and friends on macOS)206 highlight exactly. Nothing to fix.207- **Changing speed restarts the current beat from the current word.**208 Browser speech can't change rate mid-utterance.209- **"Too cringe" means the beats, not the format.** Calm the voice in the210 JSON and leave smooth brain mode off. The runner alone is quiet.211212## Example requests213214- "brainrot me on how DNS resolution works" → teach, about 12 beats, from215 general knowledge (no API surface to verify).216- "/brainrot ./docs/ARCHITECTURE.md" → focus, read the file, chunk faithfully.217- "I can't focus on this RFC, https://… just read it to me with the subway218 surfers thing" → focus, fetch with `defuddle`, chunk; mention the paste219 box if they want real footage.220- "teach me tanstack router loaders, make it dumb" → teach, fetch the docs221 first, then write; `code` fields carry the real function names.