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

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.

  • Phone screen titled Choose your photo, listing photo challenges a Seeker team can buy with coins: Street Sign at 50, Digits at 50, Curb Appeal at 50, Tallest Tree at 30, Long View at 30, with a coin balance of 300 in the corner.
    Seekers spend coins to buy a clue. The Hider is paid the same number of coins for answering it.
  • Phone screen titled Pick your next move, showing a grid of trap and power move cards: Pickpocket, Question Tax, Smoke Bomb, and Jammer, with a Jammer card enlarged over a Buy button priced at 15 coins.
    The Hider spends those same coins on traps and power moves. Every clue the Seekers buy arms the person they are hunting.
  • Phone screen showing a thermometer answer reveal. Under the question Are we getting hotter or colder, the word HOTTER fills the screen in large white type.
    Calm at rest, loud at the moment it matters.

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.

  • 41
    Active build days
  • 2,149
    Commits across 617 merged PRs
  • 274
    Swift files, roughly 47k lines
  • 37
    Postgres tables, all with row-level security
  • 158
    Database functions, 71 called by the client
  • 22
    TestFlight builds shipped
  • 273
    Swift unit tests
  • 477
    pgTAP database assertions
  • Phone screen showing the HIDE/SEEK lobby: a join code of BH66, a map with an orange play-area circle drawn over New York, a 45 minute round length, and a lineup of one Hider and three Seekers above a Start Round 2 button.
    Setup is a join code and a circle on a map. No accounts, no printed materials.
  • Phone screen showing the in-round map from the Hider's own device. A banner reads YOU'RE HIDING above a 19 minute 26 second clock, Seeker pins move along the streets, coin pickups sit on the map, and the Hider's own position is marked inside a dashed circle.
    The Hider's own view. The Seekers' map is the same board with that pin removed at the database, not at the client.
  • Phone screen celebrating a catch: a large orange map pin over the words THE CATCH, then GOTCHA in heavy white type, and the line Jack tagged Todd.
    The tag. Making it fire only when two players are truly face to face is hard problem two.
A band of night sky, deep indigo shading down into luminous blue.
Todd Blocksom, oil on canvas
  1. 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.

    A wide browser view of the spectator screen: a dark city map with Seeker pins and their walked trails, coin pickups scattered across the play area, a join code and QR code in the top corner, and a bottom bar reading find time 35 minutes 39 seconds, 185 coins, last answer HOTTER.
    The party screen at watch.myneighborhoodgames.com. It polls, and it shows the board from the Seekers' perspective only.
  2. 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.

  3. 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.

  • 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.

A band of crimson brushwork sweeping diagonally into grey.
Todd Blocksom, oil on canvas

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.

HIDE/SEEK is in public TestFlight beta.

Join the beta

Building an ambitious physical-world game or AI product?

Let's talk