Hapoo
Download on the App Store

For the technically curious

One idea, carried through every layer.

Hapoo is a free iPhone app that counts the dog walks you already do using your phone's motion sensor, with no GPS tracking and no account required.

Notice what's already happening, and never ask for more than that needs. The same principle runs through the iPhone app, the watch, the widgets, the character network and the server behind them. Here's the actual shape of it, in the real screens it produces.

Hapoo trotting out of a London front door on a bright morning, lead trailing behind him
The Scout screen, a month calendar of days out
The real Scout screen. Every day on it comes from the motion count, not a GPS trace.

Walk detection

Motion, not GPS, for the everyday count.

Your phone's motion coprocessor already counts steps and distance all day, for practically nothing. Hapoo reads that, and your walking history in Apple Health, after the fact, so there's no GPS running in your pocket and no start button to forget.

GPS only switches on when you explicitly ask for a traced route worth sharing. That's the difference between a walking app that lasts the day and one that doesn't.

Pepper sitting proudly on a low park wall, posing for a portrait

Photos

The dog check happens on the phone.

When you take or choose a photo, Apple's Vision framework checks there's actually a dog in it, on the device itself.

The image is never uploaded to be checked. It either stays on your phone, or it isn't checked at all.

Shadow sitting in a café cloakroom with a blank paper ticket tied to his collar

Identity

No accounts. A device identity instead.

On first launch the app makes up a random identifier and keeps it on the phone, with no name, no email or phone number behind it. Every feature that needs the server (leagues, referrals, the character network, the coach) is keyed by that, not a login.

It's closer to a cloakroom ticket than a membership card: it proves the walks are yours without knowing who you are. No password to forget, and no account database to breach.

The Map screen, with characters placed at parks around Tufnell Park and Upper Holloway
The real Map screen. Every character on it is somewhere you can actually walk to.

The character network

Characters at real park gates, placed today.

Characters spawn at real park entrances and green spaces, rotated daily by an algorithm that tops up whichever area you're actually walking in, on request, not a fixed city-wide list.

Meeting one is an AR moment, and it's GPS-checked on the server: the coordinates have to be plausible for a walk, so nobody collects a character from the sofa.

The Rewards screen: a points total, and the Stray, Settling and Regular levels
The real Rewards screen. Every total on it can be re-derived from the ledger.

Points

Every point is a ledger entry, paid once.

Every point ever earned is an append-only entry, deduplicated by a stable id. The same walk, the same badge, the same daily bonus can never be paid out twice.

So your total is never a single number we simply trust. The full history can always be rebuilt from first principles, level by level.

Juniper nudging the last piece into a finished wooden jigsaw

The stack

Swift end to end, built as one piece.

One language across two runtimes, so the app, the watch, the widgets and the server are one connected system rather than parts bolted together:

  • SwiftUI on iPhone, Apple Watch and the widgets.
  • One shared attributes model behind the Live Activity.
  • Vapor and Fluent on the server, running on an ARM VM.
  • Apple's own frameworks on the device: motion and Apple Health for walks, Vision for photos.

What comes next

Built to grow without a rewrite.

The same principles that keep the app honest about battery and privacy also make it quick to extend. The reward catalogue is data, not a release. A new badge is a config change, not a redeploy. A 22nd character's level ladder slots in without touching the 21 before it.