Case study · Consumer game platform · Live at afterimageays.netlify.app

AfterThe After app icon, a ring of Siri colors on ink Games for your senses

One asks how well you see. The other, how well you feel time pass. Both will roast you about it.

Made for fun, as a memory: of colors, and of how time feels. Then the fun got taken seriously: dealt identities, duels, leaderboards, a voice of its own. I made every call; AI wrote the code.

RolePM and builder, end to end
StatusLive, v4.1, real users
FormatInstalls to home screen
A game about the gap between you and your senses
Scroll
409 dealt names, zero typed275 lines that never repeatOne 258 KB fileReal time duelsZero running cost 409 dealt names, zero typed275 lines that never repeatOne 258 KB fileReal time duelsZero running cost
01 · The idea

Made for fun. Finished with love.

After is a small thing I made for fun: a memory, for how we see colors and how we feel time. It started as one color game, and it was too fun to leave alone, so it grew a sibling under one name, one dealt identity, one design system, one voice.

The games test your senses. Afterimage: see a color for five seconds, rebuild it from memory on hue, saturation and brightness rails. Aftertime: feel a duration once, then hold a button for exactly that long. Five rounds each, scored to two decimals, with global leaderboards and duels where every player faces the identical five challenges.

Sign up to playthe industry default: accounts, passwords, and a moderation queue for typed names
Say hi to yourselfthe dice deal you one of 409 pop culture names; claimed atomically, unique forever, yours in every game
02 · The games

Two games are awake.

Five rounds each, scored to two decimals. Solo for your own bests, or send a duel link and everyone faces the identical five challenges. No accounts anywhere: the dice deal you a name, and it is yours forever.

They live at afterimageays.netlify.app. Go see how well your senses hold up. Report back honestly.

Say hi to yourself. Reroll till it hits.
03 · What shipped

A small game, sweated like a big one.

Afterimage: rebuilding a color on hue, saturation and brightness rails
Afterimage, mid round. The color is gone; your memory holds the rails. Hue, saturation, brightness, and a verdict waiting at the end.
Aftertime verdict: the duration versus what you held
Aftertime, judged. The duration was 1.65 seconds, you held 2.09, and the product says what it thinks: "Somewhere, a metronome is crying."
Global ranks with dealt pop culture names
Ranks, honest by design. Top 100 shown, cutoff never stated: the row count doubles as a private, truthful count of players who completed runs. Every name you see was dealt, never typed.
The detail I'm proudest of

Personality as retention infrastructure, with a mathematical no-repeat guarantee.

Roughly 275 original lines sit in five score banded pools: memorize lines, recall prompts, round verdicts, final verdicts, name reactions. The picker remembers its last four picks per pool, and every pool holds at least five lines, so a five round run can mathematically never repeat a line. Verified by simulating ten thousand worst case runs: zero repeats. Players replay partly to see what the game says next, which is the cheapest retention mechanic I have ever shipped.

275 original lines, five pools10,000 worst case runs simulated, 0 repeatsA bad guess earns Cooked
04 · The calls

Choices I'd make again, each with the road not taken.

Even a just-for-fun game gets real decisions. From a log of eleven, these are the ones I'd defend at a party.

01

Dealt names, never typed names.

Rejected: a username field like every other product

Players cannot enter text anywhere. The dice deal an alias from 409 curated pop culture names; the database enforces uniqueness atomically, so ties are physically impossible. Traded away self expression; bought zero moderation forever, because nobody can type anything offensive if nobody can type at all.

02

Five rounds, fixed. No short mode.

Rejected: a requested three round option

The entire scoring economy, personal bests, both leaderboards, and duel standings rest on the five round average. A second round count would pollute the leaderboard with incomparable scores or double every surface. The feature solved a session length problem that does not exist in a two minute game.

03

Aftertime capped at 4 seconds, down from 7.

Rejected: longer, harder holds

Playtesting showed long holds felt like waiting, not playing. The cap brought a full run to about 90 seconds, the correct size for the share and challenge loop. Difficulty is not the same thing as duration.

04

Ranks show 100, and say nothing.

Rejected: a vanity "top 10" with visible copy

The leaderboard quietly fetches 100 rows with no caption about the number. Players see a list; the owner sees an exact count of humans who completed a run. A free, honest analytics instrument with zero instrumentation.

05

One file, raw REST, no SDK.

Rejected: the official Firebase SDK and a fat bundle

The whole product compiles into one HTML file near 258 KB: one artifact, one request, instant loads on Indian mobile networks. Firestore is called through raw REST because the SDK would multiply the bundle. Every network call is explicit and reviewable.

05 · Deliberately not built

The cuts matter as much as the features.

Text input, anywhere

No signup, no chat, no typed names. Zero moderation overhead, forever, by architecture.

The install card

Built, shipped, then deleted after watching real behavior: a player who just finished a run wants to replay or challenge, not install. Interrupting that moment was the product being selfish. Removing a built feature is a decision too.

The Siri glow

A dreamy spectrum border for the naming screen broke layout twice through CSS cascade collisions, and was cut rather than attempted a third time blind. Knowing when to stop is cheaper than being right eventually.

Viral meme audio

Requested, and declined on principle: every viral clip is copyrighted. Every hum, tick and chord in After is synthesized from oscillators in code. Zero assets, zero copyright exposure.

The roadmap holds the rest: synthesized comedy stingers, a quickfire mode designed as its own product, duel notifications, a seasonal name pool refresh. Each waits for evidence, not enthusiasm.

06 · How it was built

AI wrote the code. The taste was mine.

The method

Discuss before building.

Design approved before any code, one reviewable App.jsx of about 2,700 lines, and every feature specified, scoped, reviewed and verified by me on real devices, a Mac and an iPhone, in browser and as an installed app.

The team

AI as the engineering team.

React 18 and Vite compiled to a single file, Netlify CI/CD where git push is the entire deploy pipeline, Firestore over raw REST for shared state, Web Audio for fully synthesized sound. My leverage was judgment: what to build, what to cut, what shipped.

The discipline

Verification runs last, always.

Every ship candidate passes an automated checklist: 58 grep level assertions against the source and the compiled bundle. One production bug escaped precisely because a cleanup ran after the checks; the rule is now absolute.

07 · The numbers
0original written lines, in score banded pools that never repeat within a run
0curated pop culture names in the dealing pool, from sitcoms to Indian cinema
0the entire product, compiled into a single HTML file
0automated checks against source and bundle before any deploy
0worst case runs simulated to prove the no repeat guarantee. Zero repeats.
0effective running cost at current scale, by architecture, not by luck

"Two games are awake. Both think your senses lie."

After's home screen, every evening
Next case study

Neha: The Voice Agent

A bilingual voice AI that calls approved credit card customers who stalled before activation. Seven hostile personas attacked her; the polite ones turned out to be the real threat.

Read it