PREVIEW · the site is new and still changing
Nerdict
← TestsSimulation and interaction

Aquarium

Build an aquarium: fish of different species swim, you click to drop food, it sinks, the nearest fish come to eat it and grow.

Same prompt for every model, one shot. A robot checks 15 things the model never sees. What it checks ↓ · The prompt ↓

Results

12 setups · the middle run of each
sort
Press “+ Compare” on two results to put them side by side.

Anthropic models run in Claude Code 2.1.296 · OpenAI models run in Codex CLI 0.162.0 · no harness of our own (yet) · why it matters

What the robot checks

The same 15 items for every model, written from the prompt. Scores are always out of 15, even when a page breaks halfway.

  1. Opens without a page error
  2. Test hooks present (fish, food, tank)
  3. Canvas fills the window (at least 1280×720)
  4. Animation is alive (frames keep changing)
  5. Smooth: median frame time under 25 ms
  6. At least 6 fish of at least 2 species
  7. Fish swim (80% move 30 px in 2 s)
  8. Fish never leave the water
  9. Clicking the water drops food where you clicked
  10. Food sinks
  11. Fish go to the food and eat it
  12. Fish that ate grew
  13. No uncaught exception during the session
  14. No console errors
  15. No network attempts

Left to the human eye

  • real fish on screen (not just in the state)
  • fish facing where they swim
  • plants, bubbles and light
  • food settling on the sand
  • beauty and calm

The prompt

Sent as is to every model. Test v1 · checks v1: any change makes a new version.

Build an interactive aquarium simulation as ONE self-contained HTML file.

Hard rules
Read the whole prompt
Build an interactive aquarium simulation as ONE self-contained HTML file.

Hard rules
- Everything lives in a single HTML file: inline CSS and JavaScript only. No external URLs of any kind: no CDNs, web fonts, remote images or network requests. The file will be opened offline, straight from disk.
- It must run in a current desktop Chrome at 1920×1080 with zero console errors.
- Render the scene with a <canvas> and requestAnimationFrame.

The aquarium
1. A tank that fills the window: water, sand, plants that sway, rising bubbles, light rays.
2. At least 6 fish of at least 2 different species, drawn procedurally (no image files). They swim with natural, varied motion at a lively pace (roughly 40–150 px per second), turn smoothly, always face the direction they swim, and never leave the water.
3. Feeding: a left click anywhere in the water drops one food pellet at that point. Pellets sink slowly (roughly 20–60 px per second). Fish start hungry and get hungry again a while after eating. A hungry fish notices any pellet within 600 px, swims to it and eats it (the pellet disappears when a fish reaches it). Each pellet eaten makes that fish grow by about 5–10% of its length, up to a maximum size. Uneaten pellets settle on the sand.
4. It stays smooth (around 60 fps).
5. Make it beautiful and calming, like a premium screensaver.

Testing contract (an automated tester relies on these, so they must be exact)
- The main canvas has the attribute data-scene and covers the window.
- window.nerdict.getState() returns:
  { fish: [{ id, species, x, y, size }], food: [{ id, x, y }], tank: { left, top, right, bottom } }
  where every coordinate is in CSS pixels of the page (the same coordinates as a mouse click), x/y is the center of the fish or pellet, size is the fish's body length in CSS pixels, tank is the water area, and ids never change.
- The simulation starts by itself as soon as the page loads.

Output format: reply with the complete file inside a single ```html code block and nothing else.

Credit. Inspired by Theo's "Fish Slop" (t3.gg), the aquarium game he runs on every new model, reduced here to one page. Prompt and checks by Nerdict.