Say hello
Back to work
Water Ring Toss on its graphite device: the painted tank with three pegs and eight rings, and the leaderboard on the device's screen.

Case Study · Side project · 2026

A childhood toy, rebuilt and run like a product.

The water ring toss we all had as kids, rebuilt as a web game and launched from one Instagram story: 250+ visitors in the first six hours.

RoleDesign, product, launch
Timeline~10 hrs over 2 days · Oct 2026
ToolsClaude Code, HTML Canvas, Cloudflare
TeamSolo, with Claude Code building
Idea
The plastic water ring toss: pump the water, land all eight rings on the pegs. A toy almost everyone had.
Challenge
It's a small game with no install and no ads. It had to win people over in seconds, then give them a reason to come back.
Solution
A no-install web game that feels like the real toy, a fair leaderboard, and a dashboard to run it live. I made the calls; Claude Code wrote the code.
Impact
One Instagram story, no ads. In the first six hours: 250+ visitors, 172 players and 576 minutes of play. The fastest time fell 7 times that afternoon.
Problem

The toy was easy to remember, hard to make feel right.

The toy works because you can feel it: the thump of the button, the near miss off a peg. Copied literally, it's just circles moving on a screen.

01Feel, not looks. If the water felt fake, nothing else mattered.
02Seconds to hook. No install, no sign-up, no instructions.
03A reason to finish. The last rings are fiddly. People need a payoff.
04Strangers, live. Abuse, duplicates and limits, all while people play.
Strategy

Design the feel first, then run it like a product.

I directed, Claude Code built.

Every design and product call was mine. Claude Code wrote the code, and I reviewed every build.

Intervention 01

A link, not an app

I considered an app and decided against it. People don't install an app for a few minutes of play. The leaderboard brings them back, but an install asks for commitment before the first round. For a game this size, a link wins.

APP: Tap the story → app store → install → open → play WEB: Tap the story → playing
Intervention 02

Physics that behaves like water

The real toy's jet shoots straight up, yet the rings swing out in a lazy arc and drift back down, now and then landing on a peg. That motion is the game, so I tuned it until the rings moved the same way. When one catches, it slides down and hangs at the bottom, like real plastic.

OLD: Rings pass through stems → hop between pegs → flicker NEW: Jet pushes straight up → rings drift out in an arc → catch, slide and hang
Intervention 03

A device, not a webpage

I wanted an object, not a website, and looked to Dieter Rams: less, but better. A quiet graphite body, nothing on it that doesn't do something, and colour saved for what you press: the orange pumps, the way Braun used a single accent. A Tank | Board switch turns the same screen into the leaderboard.

The device in Tank mode: painted water, three pegs, eight rings on the seabed, two orange pump buttons.
The device in Board mode: the leaderboard shown on the device's own screen, fastest times first.
Intervention 04

A dramatic ending

The last ring is the fiddliest, and the real toy gives you nothing for it. I wanted a bang. The tank stays calm while you play, then, the moment all eight rings land, a graffiti hammerhead sweeps in and swallows the whole school in one gulp.

And the drama comes before the score. Nothing interrupts it: the shark eats, the tank goes quiet, and only then does your time land. By the time you save it, it's not just a number, it's the moment you earned it.

The last ring lands, the shark eats, then the score.
Intervention 05

A leaderboard people could trust

Competition kept people replaying, so I was strict about what counts:

01Names. Required to save, unique (ignoring case and spacing), 18 characters max, no links.
02Abuse. Blocked in English, Hindi, Tamil and Malayalam, including spaced-out and stretched spellings, while real names like Kshitij and Harshit still pass.
03Ownership. A name belongs to the phone that first saved it, and each phone gets one name. No accounts, no passwords.
04Only faster runs. A save replaces your spot only if it beats your best. A tie doesn't count.
05Real runs only. Anything under 3 seconds or with no pumps is rejected, checked on the server so the page can't be tampered with.
06Spam. One save per phone per minute, so friends on the same Wi-Fi don't block each other.
Intervention 06

Running it live

A private dashboard tracks plays, a visit-to-save funnel and hourly charts, with kill switches and moderation. On day two, storage hit 90% of the free daily limit. I halved the writes that night, then moved to a database with 100x the headroom, with no downtime and no lost scores.

The owner dashboard for launch weekend, Friday 23 to Sunday 25 October: 500 visitors, 14.7 hours of play, 67 people who played without saving a name, 428 games finished, a running total of players, hourly activity and time spent playing.
The owner dashboard, launch weekend (Fri 23 to Sun 25 Oct). Shaded hours are estimates.
OLD: One shared list → saves could overwrite each other → 1,000 writes/day NEW: One row per player → no collisions → 100,000 writes/day
Impact

One story, six hours.

The fastest time fell
7 times

In the first afternoon, the record changed hands seven times, down to 0:14.9. People weren't just playing, they were competing.

2 in 3
visitors played (172 of 250+), from one story
576 min
played in the first six hours
100
names on the leaderboard within two days
Instagram story: the first 6 hours, 250+ visited, 172 played, 576 minutes in the tank, with a players-by-hour chart.
Instagram story: the top 3 on the leaderboard, Alene 0:14.9, Metiss 0:15.9, Maddy 0:16.8.

Closing the loop. I shared the results back as stories: the crowd players were part of, and the names at the top for everyone else to chase.

Honest note. Anonymous stats from one launch to a small, friendly audience: it shows the game held attention, not that it would scale.
Reflection

Shipping was the start, not the end.

Feel is a design problem.

Most iterations went into how rings move. Knowing what "right" felt like mattered more than writing the physics.

Real users find the edges in hours.

Rude names, duplicates, storage limits: none showed up in testing. After launch, the job was fixing the next painful thing, the same day.

Directing AI still takes judgement.

Claude Code made a two-day build possible. What to cut and what's fair were still my calls.