Most word games reward the obvious answer. I wanted the opposite.
Krillion gives everyone the same prompt β "Name a fruit" β and scores you on how rare your answers are. Say what everyone says and you stay near the surface. Find the answer nobody else thinks of and you dive deep. Your score is literally a depth.
That one idea turned into three live games, all running on a single engine:
- π― Dive Krillion β the daily game. One dive a day, plus Unlimited, Marathon and Challenge modes, 8 category packs, and a guest leaderboard.
- βΎοΈ Krillion Infinite β the endless version. No daily limit, just keep diving.
- π Noillirk β the backwards game. Same DNA, but you have to think in reverse. (Yes, the name is "Krillion" backwards.)
The stack
- Next.js on Vercel for all three sites
- Supabase β auth, cloud-saved dive records, and the guest leaderboard (Postgres)
- A shared game engine: a 302-prompt bank, a rarity-scoring model with tiers (common answers score shallow, deep cuts score big), and depth-meter game feel β answers sink, the water darkens as you go deeper
- PWA + web push β a daily reminder when the new dive drops
- Satori-generated share cards β every finished dive becomes a 1200Γ700 PNG score card players can share
Three sites, one codebase philosophy
I didn't build three games. I built one engine and three rule sets:
- Dive Krillion = the daily ritual. One shared dive per day, records in the cloud, streaks and history matter.
- Krillion Infinite = the same engine with the daily lock removed and the content reorganised around endless play.
- Noillirk = the engine mirrored. Prompts and answers run backwards, which sounds like a joke until you play it β your brain genuinely has to rewire.
Theming, rules and content differ; the core (prompts, scoring, tiers, audio, share cards) is shared. Shipping a fix once ships it everywhere.
Lessons that cost me real hours
1. "Midnight" is not a timezone.
Dive Krillion resets at midnight Eastern. Krillion Infinite resets at midnight your local time. Two lines of product copy, two completely different implementations β and players notice immediately when a reset feels wrong. Decide your reset semantics early and write them on the site, in the FAQ, where players can see them.
2. Performance is a feature, not a cleanup task.
These are games people open for 90 seconds on their phones. I got the twin sites to 90β97 on mobile PageSpeed, and the wins were mostly removals: reserving exact layout space from first paint so nothing shifts, deferring engine setup until after first render, lazy-loading analytics, and deleting a decorative poster image that cost more LCP than it was worth. What I removed mattered more than what I added.
3. The share card is the growth loop.
Players don't share links; they share scores. The moment a finished dive produced a good-looking PNG card β depth, stats, "CAN YOU GO DEEPER?" β sharing stopped being a feature I built and became something players just do. If you build a daily game, budget real design time for the card.
4. Accounts should be invisible until they're useful.
Guests can play and appear on the leaderboard without signing up. Accounts exist for one reason: your records follow you across phone and laptop. Conversion into signups took care of itself once the account had an obvious job.
Try them
- Daily dive: divekrillion.com
- Endless mode: krillioninfinite.com
- Backwards mode: krillioninfinite.online
All three are free, no download, works on any phone browser.
I'd genuinely love feedback from other builders: how would you handle the daily-reset problem across timezones? And if you play a dive β how deep did you get?












