Fish Tank 1 Month — saltwater reef across 30 days with named fish across generations
A 3D EPOCH demo: 75-gallon reef across 30 days with 12 named fish (Big Mister Tang, Scampi & Tomato, King Reggie, Goldie…) spawning, aging, and being replaced by Scampi II — coral grows polyp-by-polyp, algae bloom and clear, persistent memory across reseeds.
What this is
A 3D recreation of one month inside a 75-gallon saltwater reef tank, built as a continuous autoplay loop where reseeds advance the calendar instead of restarting it. Eight sub-locations sit on one tank: reef wall left, reef wall right, sand bed with 900 instanced grains, cleanup crew zone, anemone garden, reef cave, surface bubble curtain, and refugium tucked behind. A branching coral starts at three polyps on Day 1 and grows polyp-by-polyp toward thirty by Day 30. An algae bloom rises on a sin curve through the middle of the month, peaks around Day 15 with the water tinting green, and clears by Day 22. Twelve named featured fish — Big Mister Tang, the clownfish couple Scampi & Tomato, Royal Gramma King Reggie, Yellow Wrasse Goldie, Cleaner Shrimp Mantis Snip, Hermit Crab Hank, goby Sandy Pete, chromis Spark, eel Mortimer, anthias Comet, and snail Sir Turbington — share the tank with fifty instanced small fish and forty instanced microfauna, all swimming on a sin-wave body wiggle.
The tank remembers. localStorage saves every named fish's age, species, and lineage between reseeds. After ten minutes the world advances to Month 2: Scampi has retired to the refugium and her daughter Scampi II — same red-and-white stripe, slightly smaller — is the new clownfish on the reef. Generation 2 of 4. Generation 3. Generation 4. Across a Twitch viewer's overnight stream, the same tank ages forward through four months of named lineage with the coral growing visibly bigger every cycle.
You don't play it. You watch it. And it remembers you watching.
Why this is mind-blowing
It's a fish tank that ages. Every Twitch stream of a reef tank has felt the same since 2010 — fish swim, fish swim, fish swim. This one tells a story with the same 12 names across the loop. Day 14 the chyron prints "Scampi pair lays eggs," and the cameras cut to the anemone where the clownfish couple is hovering over a clutch. Day 22 the algae cracks back to clear water and the wrasse cameras dominate the cuts. Day 30 the chyron prints "REEF MATURE — Generation 1 complete" — and ten minutes later the world is on Day 1 of Generation 2 with the same Big Mister Tang now an elder. Eventually Big Mister Tang retires to the refugium and the cameras cut to a juvenile tang named Mister Tang II swimming up to take his spot on the reef wall. It's the cozy aquarium stream you'd put on a second monitor and find an entire ecosystem aged-up the next morning.
Prompt
Build a single-file HTML page that recreates "30 days inside a 75-gallon saltwater reef tank" as a continuous 3D autoplay world. Fish spawn, grow, age, die offscreen, and are replaced by their named descendants. Coral grows. Algae bloom and clear. Persistent across Twitch viewing sessions.
Hard constraints:
- One HTML file, < 200KB.
- three.js r0.160.0 from unpkg, IIFE, strict mode, full disposable cleanup, reseed every ~10 min that ADVANCES the month forward instead of resetting.
- First body line: <!-- ROUND16_EPOCH v1 -->
- localStorage memory under key `fish_tank_memory_v1` — 12 named fish with species + age + state. Reseed advances ages; fish at max age retire to refugium; new fish enter with descendant names ("Scampi II — daughter of original Scampi").
- Generational morph — juvenile color desaturated → adult full color; size scales with age ratio.
- Visible structural change — branching coral starts as 3 polyps and unlocks toward a 30-polyp colony as the month progresses. Algae bloom day 12-18 (sin-curve peak around day 15), then clear by day 22.
- 5+ sub-locations: reef wall left/right, sand bed, cleanup crew zone, anemone garden, refugium tucked behind, surface bubble curtain.
- Mini-map = top-down view of tank with active hotspot.
- 100+ named fish/critters: 12 featured cast (Big Mister Tang, clownfish couple Scampi & Tomato, Royal Gramma King Reggie, Yellow Wrasse Goldie, Cleaner Shrimp Mantis Snip, Hermit Crab Hank, Sandy Pete the goby, Spark the chromis, Mortimer the eel, Comet the anthias, Sir Turbington the snail) + 50 InstancedMesh small fish + 40 InstancedMesh microfauna + 900 InstancedMesh sand grains.
- 15+ director cameras: front pane wide, sand bed bottom, reef cave POV, anemone close, top-down, refugium peek, cleaner shrimp orbit, wrasse chase, surface bubble shimmer.
- Custom water shader with caustics + vertex displacement.
- Chyron rotates: "DAY N/30 — event", "WHO IS [fish name] — [species] — Generation [G]", cross-system events ("Day 14 — Scampi pair lays eggs").
Tone: cozy reef-tank cam vibe. No deaths shown — just "elder Goldie has retired to refugium" off-camera transitions.
Paste this into Claude, Cursor, or Copilot. Change one thing that matters to you.
What I learned shipping it
- How to fake 30 days in a reef tank by gating coral polyp count + algae density + fish age on a 0-30 progress variable
- How to use a custom shader with caustics and vertex displacement to give a flat tank pane the depth of a real reef without lights doing the work
- How to thread localStorage through three.js disposables so a reseed every 10 min advances the *world's calendar* instead of restarting it