Case study · Todd Blocksom · 2026
HIDE/SEEK
A location-based multiplayer game that turns any neighborhood into a game board, for two to eight people, on foot, in an afternoon.
Built solo in twelve calendar weeks: product, design, iOS, backend, web, and release engineering. Now in public TestFlight beta.
Status · App Store submission in review
Why it exists
The origin is one sentence from the product spec, and it never changed: I wanted to play this with my kids, in whatever neighborhood we happened to be in, in a session short enough to fit a weekend afternoon.
The format is borrowed openly. Jet Lag: The Game proved that hide and seek becomes deeply strategic once you add an information economy, but its ruleset assumes a country, public transit, and a full day. The design work was rescaling every mechanic to a neighborhood: radii from miles to hundreds of feet, hiding windows from hours to minutes, landmarks from train stations to mailboxes.
-
Seekers spend coins to buy a clue. The Hider is paid the same number of coins for answering it. -
The Hider spends those same coins on traps and power moves. Every clue the Seekers buy arms the person they are hunting. -
Calm at rest, loud at the moment it matters.
What shipped
A SwiftUI client, a server-authoritative Postgres and PostGIS backend, a web spectator view, a marketing site, load-testing tooling, and the release pipeline. Counts verified against the repo, 21 July 2026.
-
41Active build days
-
2,149Commits across 617 merged PRs
-
274Swift files, roughly 47k lines
-
37Postgres tables, all with row-level security
-
158Database functions, 71 called by the client
-
22TestFlight builds shipped
-
273Swift unit tests
-
477pgTAP database assertions
-
Setup is a join code and a circle on a map. No accounts, no printed materials. -
The Hider's own view. The Seekers' map is the same board with that pin removed at the database, not at the client. -
The tag. Making it fire only when two players are truly face to face is hard problem two.
Three hard problems
-
The Hider's location had to be unknowable. That is a database property.
Seekers never receive the Hider's location, not live, delayed, or fuzzed. Game state is server-authoritative, and Hider pings are withheld at the database layer.
A production privacy review found three paths that exposed the locked hiding coordinate. I fixed the confirmed issues and documented one remaining spectator-link risk as an explicit launch item. The useful lesson: row-level security protects rows; realtime publications and database functions need their own access controls.
The party screen at watch.myneighborhoodgames.com. It polls, and it shows the board from the Seekers' perspective only. -
GPS cannot tell you that two people are standing next to each other.
The tag is the emotional peak of every round, and GPS accuracy under trees and between buildings is tens of meters. So the catch mechanic does not use GPS. It uses ultra-wideband peer ranging through Apple's NearbyInteraction framework, the same technology behind AirTag Precision Finding, which gets sub-meter accuracy under two meters. Devices without the hardware fall back to Bluetooth signal strength with a wider radius.
Then the product decision that cuts against the technology: the app deliberately does not help you find anyone. The takeover only fires under a meter and a half, by which point the two players are already looking at each other, so it works as a celebration rather than a guidance tool. Finding is the player's job. The app's job is the moment.
-
Cost was not the scaling constraint.
A six-player, 45-minute match costs about 7.3 cents at the margin. The first real limit was realtime message rate, not spend, so I instrumented live network usage and tuned broadcasts around the actual ping gate.
Product judgment
-
Five specced screens and a database table, deleted in one review.
Hider invites, buddy multi-select, and buddy invite modals all collapsed into a single self-serve toggle, on the grounds that the tap itself is the consent. The invite functions and the table went with them. I would rather delete a table than ship a confirmation dialog nobody needed.
-
No anti-cheat, on purpose.
No photo freshness checks, no GPS spoof detection, no referee flow. This is a game played in person among people who know each other, and trust lets you cut entire branches of UI and server validation. Disputes resolve the way they always have: let's just replay that round.
-
Declining end-to-end encryption, with an argument.
It would have been the impressive-sounding choice, but the server has to read coordinates to run the game at all, so encryption would have meant either breaking the product or building a facade. The real threat model for a no-accounts family app is over-retention, not a hostile server operator. So I hardened retention instead: everything purges within 24 hours of a session ending, and there is no cross-session identity to accumulate.
How it was built
2,149 commits and 617 pull requests, in twelve calendar weeks and 41 active build days. That came from a practice, not ad-hoc prompting: specs and implementation plans committed to the repo as first-class documents, written behavioral guidelines for AI contributors, a separate git worktree per feature, and pure logic factored out of stateful classes so it could be tested without the hardware.
The honest framing: the AI did not build this. The judgment calls were the actual work.
Play it
HIDE/SEEK is in public TestFlight beta.
Building an ambitious physical-world game or AI product?