Skip to main content

Tapamine: 102 One-Tap Games to Play With Friends

· 6 min read
Scott Havird
Engineer at Georgia-Pacific · ex-WarnerMedia Innovation Lab (ContentAI) · decade shipping AI-powered platforms

I wanted games I could play one-handed on a train, and send to a friend with "beat this." So I built Tapamine. It has 102 games, and every one uses a single thumb.

TL;DR

Tapamine is a free hub of 102 one-thumb games at tapamine.com. You tap or hold, always in portrait, with no download. Every game has a daily level that is the same for everyone, ghost races against other players' runs, and beat-my-score links. A run is just a seed plus the moments you pressed and let go, so one small replay format drives ghosts, challenges and cheat checks.

Motivation​

Most phone games want both hands, a tutorial, and a 200 MB download. I wanted the opposite: open a link, tap once, and you are playing.

The other half was friends. A high score on its own is lonely. A link that drops your friend straight into a race against your exact run is not.

What​

Go to tapamine.com and pick a game. The hub works offline after the first visit and can be installed as an app from the browser.

The Tapamine hub: today's daily picks at the top and a grid of game cards, each with a level snapshot and a personal best

The hub. Each day there is a numbered daily with three picks, and every card shows your best.

Every game follows the same rules:

  • One thumb. You can only tap or hold. Games never see where your finger is.
  • Portrait only. Every game draws into the same 360×640 world, so it plays the same on every screen.
  • A daily level. Everyone gets the same level today.
  • Ghost races. You race replays of other players. Before real players show up, bots fill in.
  • Beat-my-score links. Share a run, and your friend races your ghost.

The first 30 games are originals, like Updraft, Drop and Slab. Games 31 to 100 are one-thumb takes on arcade, sports, racing and party games people already know. Games 101 and 102 are pool games. Swim's flip turns came from a player's request.

Updraft ready screen: Daily #23, a ghosts toggle, a 2 players button and the controls, tap to flap and hold to glide
Updraft's ready screen: today's daily, ghosts, two-player mode, and the controls.
An Updraft run: the blob splashes into the water below the first wind gate with a score of 0
My run for this screenshot. Score: 0. The first gate is wider than the rest, and I still missed it.

There is more than solo play:

  • Rivals. Every challenge link opens a board with duels, group races and podiums.
  • Couch versus. Two players play side by side on one screen.
  • Game controllers. A controller works too, one per side in versus.
  • 49 languages.

How​

A run is a few hundred bytes​

A run is fully described by four things: the game, the sim version, the seed, and the ticks where you pressed or let go. That is about half a kilobyte.

That one format does five jobs:

  • Ghosts. Another player's run is re-simulated next to yours.
  • Challenges. The replay rides inside the link.
  • Cheat checks. The server re-runs your replay and must hit the same checkpoint hashes.
  • Tests. Fixed replays run in CI.
  • Multiplayer later. Lockstep input frames use the same idea.

For that to work, a game has to land on the same result on every device. Each game's simulation runs the same code in Safari, Chrome, the iOS and Android WebView, Node for tests, and the Cloudflare Worker for verification. It uses a fixed 60 Hz step, integer random numbers and polynomial trig. A lint (check:sim) fails the build if sim code touches Math.random, Math.sin, Date, and similar.

The phone does the heavy lifting​

Ghost simulation, share images and bot runs all happen on the player's device. The bots run in a Web Worker, so they never delay the first tap. If the server is down, daily seeds are still computed on the device, and challenge links fall back to carrying the whole replay in the URL. An outage makes the hub less social. It never stops play.

The architecture doc puts the hub shell at about 20 KB gzipped and each game at 3 to 6 KB. Sounds are synthesized, the font is the system font, and the art is drawn in code.

One small Worker​

Behind it is one Cloudflare Worker with D1. Static files never wake it. It only verifies runs, which is pure math, and stores small rows for scores, ghosts and challenges.

I designed it to fit the Workers Free plan. On November 5 it moved to Workers Paid, which is $5 a month, with a billing alert set.

Adding a game is adding a folder​

Each game lives in its own folder. The hub, the server verifier, the SEO pages, the share images, the end-to-end tests and the sim lint all find it automatically.

Bots play every game in CI to check that it can be beaten and that the difficulty curve holds. A full level audit on October 28 found unreachable coins and two exploits, one from stalling and one from mashing, and fixed them.

Three Weeks​

The repo went up on October 15, 2026.

  • October 15. The first 10 games, the hub, the API and a mobile shell, then 30 games the same day.
  • October 22. 70 more games, taking it to 100.
  • October 23. 49 languages.
  • October 28. Store-ready iOS and Android builds, with Game Center on iOS. Eleven games are left out of the apps to keep a 4+ age rating.
  • October 31. Rivals boards behind every challenge link.
  • November 1. Couch versus, game controllers, push notifications, and games 101 and 102.
  • November 5. The Worker moved to Workers Paid.

That is 164 commits and 57 merged pull requests so far.

Future Ideas​

  • Real-time multiplayer. The replay format already supports lockstep input.
  • Accounts. Right now everyone plays as a guest.

Summary​

Tapamine is 102 free one-thumb games with a daily level, ghosts and challenge links. Under the hood, one small replay format handles ghosts, challenges, cheat checks and tests. The phone does most of the work, so the backend stays tiny.

Play today's daily at tapamine.com, then send a friend your score.