While you wait·terminal·MIT
Storytime
A 260K-parameter transformer inside the mod writes a story about what Claude is doing.

Storytime writes a short story above the Claude Code prompt about whatever Claude is doing right now. The writer is a 260K-parameter transformer that runs inside the mod’s own TypeScript, so every word is generated on your machine and a story costs zero API tokens. The story follows Claude’s work: each prompt you send and each tool call can reseed it.
What it does
- Hero by tool. Each tool has its hero: a pencil for Edit, a pen for Write, a notebook for NotebookEdit, a book for Read, a robot for Bash and PowerShell, a dog for Grep, a bird for Glob, a fish for WebFetch, an owl for WebSearch, a bear for Agent, a wizard for Skill and a cat for AskUserQuestion. Your own prompt gets a girl, and any other tool a mouse.
- Name by file or command. The stem of the path Claude touched becomes the name, so
auth-service.tsgives Auth. A shell command lends its program, sogit statusgives Git. With neither, the mod cycles through six stock names such as Lily and Ben. - Thing by prompt. Developer jargon is translated first: an error or a crash becomes a bug, a test a puzzle, a merge a bridge, a commit a gift, a server a castle, a password a lock. Failing that, the first word of your prompt that appears on a list of about ninety everyday things (ball, cake, kite, dragon) is used. The opening then reads “Once upon a time, there was a little pencil named Auth. One day, Auth found a puzzle.” and the model continues from there. Without a match, the opening stops after the hero’s name.
- Reseeding. A new story starts with each prompt you send and with each tool call, at most once every twelve seconds.
- Commands.
/storywrites a new story,/story <name>writes one about a hero with that name,/story offhides the band and remembers that across sessions, and/story onbrings it back.
Install
Needs Claude Code 2.1.272 or later with function hooks enabled and an interactive terminal.
claude plugin marketplace add maddiedreese/cc-storytime
claude plugin install storytime@cc-storytime
Start claude and the first story begins above the prompt. Work as usual, or run /story whenever you want a fresh one.
How it works
The model is Andrej Karpathy’s stories260K checkpoint from karpathy/tinyllamas, trained on the TinyStories dataset: 64 dimensions, five layers, eight attention heads with four key-value heads and a 512-piece vocabulary. The same checkpoint powers the author’s gbc-transformer on a Game Boy Color, where a single token takes 2 minutes 49 seconds. Here it manages a few thousand tokens a second.
hooks/model.ts is a port of llama2.c’s run.c to TypeScript: RMSNorm, rotary position embeddings, grouped-query attention with a key-value cache, SwiGLU and tied embeddings, all as float32 math on typed arrays. A hooks module gets web globals only, neither Node nor the DOM, and the mod uses no WebAssembly. The weights, quantized to int8 by rows (276 KB), and the tokenizer live inside hooks/weights.ts as base64 strings, because a hooks module cannot open binary files on its own. They are decoded and dequantized once, when the first story starts. A tools/verify.ts script confirms that the port produces the same greedy output as the C original.
Generation runs on a $.clock.every timer rather than inside a hook: two tokens every 80 ms, so the text appears at typing speed and no single hook call runs long. At the author’s few thousand tokens a second, a tick spends under a millisecond in the model. A story ends at the model’s end token, at 60 generated tokens, or at the first sentence end after 24 tokens.
The band takes the AbovePrompt component and stacks itself under whatever other mods draw there: a dim title row, the story with a cursor while it types, and a dim footer naming what seeded it (seeded by Edit auth-service.ts), the measured tokens per second and /story. With fewer than three rows of space only the story shows. The author credits cc-arcade for the idea of drawing above the prompt.
Privacy: the tool.call hook sees every tool call, including the file path and the text of each shell command, and the turn.start hook sees each prompt you send. From these it keeps only the file’s base name or the command’s first word for the current story and its footer, and one matched word from the prompt. The only thing written to Claude Code’s plugin store is the on/off flag behind /story off. The story itself lives in memory and is gone when the session ends. Nothing is sent anywhere: the weights are inside the module and the code makes no network calls.
Limitations
- Draws only in interactive terminal sessions. Nothing appears in
claude -p, the desktop app or mobile. - The model knows few words. Its 512-piece vocabulary holds almost no whole words, which is why the thing from your prompt comes from a fixed list rather than from the prompt itself. Any file stem works as a name, because any token does.
More mods
The whole directory →claude-slots
An ASCII slot machine instead of the spinner. Reels spin while Claude works, zero tokens.
claude plugin install claude-slots@claude-slots-localmindful-claude
Guided breathing above the prompt while Claude works. Four techniques, zero tokens.
claude plugin install mindful-claude@mindful-claudeagent-flow
Every subagent of the session in a live tree beside the transcript. Zero tokens.
claude plugin install agent-flow@claude-agent-flowanchorwatch-mod
Blocks rm -rf, force pushes, DROP TABLE, curl | sh and cat .env before they run.
claude --plugin-dir ./anchorwatch/plugins/anchorwatch-mod
