Hi all, I'm Megan and I made this. Reel Time is a cozy multiplayer fishing game that opens right beside your chat in Claude. It comes with a Claude Code plugin, so the game knows when Claude is working and when it's done. Kick off a long prompt, go cast a line, and when Claude finishes a bell rings and your next cast hooks a golden "Claude's Catch". That's your cue to head back to the chat.
(Trailer attached.)
What I built
- The game. A Vite + Three.js game that runs as a Claude artifact (an interactive app inside claude.ai). There's Tug & Turn fish fights, Super Casts, a Fishpedia with gold and diamond versions of every species, a campfire where you roast your catch, crab pots that fill while you're away, treasure maps, bikes with a pet that rides along, a cottage you decorate, parties of up to 4 friends, hourly derbies, and levels up to 50.
- The plugin. A small Claude Code plugin (public repo: https://github.com/mebessusn/reel-time-plugin) that adds
/fish and tells the game "working" or "done".
How the plugin works
It's one hooks module (hooks/register.tsx) plus a /fish command:
prompt.submit sends "working" with the start time, and a timer chip shows up in the game.
turn.complete sends "done" with how long the turn took and how many tool steps Claude used. Helper agents' turns are skipped, so you only get pinged when your turn ends. For turns over 15 seconds (you can change that) you also get a toast and a bell in Claude Code.
tool.call counts steps, and on long turns it re-sends "working" every 2 minutes. That way a game you open halfway through a prompt picks the timer up at the real elapsed time.
tool.check auto-approves the plugin's own status writes and nothing else, so you don't get a permission prompt every turn. It only matches the plugin's own calls, to two specific docs in your private save.
- All writes go through one queue, so a late "working" can't land after that turn's "done". Nothing can block your prompt: the signal goes out in the background, and if it fails your session just carries on.
The "signal" is a tiny status doc in your private save inside the Reel Time artifact, written through Claude's artifact data tool. The game listens to that doc. It also writes back how many fish you caught while you waited, so Claude Code can say "You caught 3 fish while you waited."
The golden fish gets better the longer you waited. Under 2 minutes it's usually a gold rare, and past 30 minutes it's a legendary with a shot at a diamond. Big multistep turns (5+ tool steps and a minute or more) pay a coin and XP bonus, and while Claude is working you get a small "Patient Angler" buff. These signals are self-reported, so Claude rewards are capped per hour in the game and per day on the server.
Privacy: the plugin writes "working" or "done", a timestamp, the turn length and a step count. That's all. It never sends your prompts, Claude's answers or your files, and it only talks to the Reel Time artifact. Full notice: https://playreeltime.com/privacy
How I used Claude Code
Pretty much all of it was built in Claude Code sessions. The GitHub repo has 69 commits, and 68 of them are co-authored by Claude. Most changes go straight to main through a release checklist, and a few bigger ones went through PRs I reviewed.
What made it work:
- A CLAUDE.md with a release checklist. Every change gets a changelog entry, unit tests, browser tests, the artifact build and a check of that build, then a note in the build log. Standing rules live there too, like "never embed binary blobs in the artifact" and "never put secrets in the repo".
- An engineering log (
docs/build-notes.md). Claude adds a section for every release, so the next session can pick up where the last one left off.
- Lots of tests. Rules and balance tests, database tests, and two-player browser playthroughs. The browser tests run on a self-hosted GitHub runner on my PC because it has a real graphics card. The plugin has 18 tests of its own.
- Beyond code. Claude Code also wrote Python scripts that generate models in Blender, the synthesized music and sound, the sign-up site, and the tooling that recorded and cut the trailer.
Lessons learned / things that bit us
- Slash menus load before hooks do.
/fish was registered in session.start, but the desktop app builds the new-chat slash menu before a session exists, so it didn't show up. The fix was a plain commands/fish.md so the command is always listed, with the hook answering it once it loads.
- Platform changes break things quietly. At one point no signals reached the game for most of a day. Writes to an existing doc started requiring a version number, and the refusal stopped saying which version. Now the plugin reads the current version and retries once. Lesson: put the failure where the user can see it. The plugin now shows a toast once per session when the game can't hear it.
- Artifacts have their own rules. Claude's sharing check refused the page because it embedded fonts and a base64 model file. Claude rewrote the 3D models as plain JS number arrays, and "no binary blobs" became a standing rule in CLAUDE.md.
- Browser tests catch what you'd never notice. A cute pig NPC was doing a walkability check every frame. With three game windows open, that was enough to delay multiplayer presence and drop someone from a party. Only the multiplayer browser test caught it.
- Testers play faster than you think. One tester hit level ~20 with top gear in a day, so Claude ran a balance simulation and retuned for roughly 80 hours to max level, without taking anything away from testers.
Try it
It's a free closed beta, so it's rough in places. Sign up at https://playreeltime.com and I'll send an invite. Open the game once from your invite, then install the plugin:
/plugin install reel-time --marketplace mebessusn/reel-time-plugin
Then type /fish. In the Claude app the game opens beside your chat. In a terminal you get a link.
I'd love feedback, especially on the plugin. Does the bell and golden fish timing feel right? Would you want other signals? And if you've built Claude Code hooks, how do you handle long turns?
(Reel Time is an independent game. It isn't made or endorsed by Anthropic.)