Inspiration
The best part of any walk is meeting somebody's dog. Then it's gone and you never see it again.
I wanted the thing I already do, stopping, asking what breed they are, forgetting by the time I get home, to leave something behind.
What it does
A Pokédex for the dogs and cats you meet in real life
Point your phone at any dog or cat. Boop works out the breed on the device, cuts the animal out of the photo into a die-cut sticker, and pins it to a map where you met them. The stickers fill a book. The breeds fill a Breed Book. There is a global leaderboard, catch streaks, and a timed season badge.
Every pet you catch also becomes a battle card. Stats are derived, never authored: HP and move power come from the Kennel Club's own size, exercise and coat data plus the breed's rarity, so a Newfoundland is slow and tanky and a Whippet is fast and fragile because those dogs are. There is no table of 181 hand-balanced breeds, and there shouldn't be. New breeds get sensible cards the day they're added, with no balancing pass.
Cards carry 153 moves, 44 of them written for one breed each. Only a Dachshund gets Tunnel Vision.
Pet personality tests, there are 16 different traits to find and share!
AR MODE - View all your stickers in the real world
Daily quizes, Pet Of The Day, User submitted app icons and so much more!
Free, no account, and nothing is uploaded.
How I built it
I started with Create ML because it's free and built into Xcode. It topped out at 66.8% validation accuracy across 130 breeds. That sounds survivable until you work out what it means in practice: being confidently wrong about somebody's actual dog roughly a third of the time. Being wrong about someone's pet, to their face, is worse than saying nothing at all.
The specific wall was augmentation. Create ML crashes running real augmentation headlessly - no random crop, flip, rotation or colour jitter - and on a fine-grained task like breed, that's where most of the accuracy lives.
So I moved to PyTorch: an EfficientNet-family backbone with
squeeze-and-excitation blocks, roughly 10M parameters, fine-tuned end to end
with proper augmentation, then exported to Core ML at float16. That reached
roughly 85 to 90%, in about 21 MB of weights. The training setup lives
outside the Xcode project so only the exported .mlpackage ships.
Everything runs on the phone. Vision handles animal detection and the subject lift for the cut-out; Core ML names the breed. No upload, no server round trip, no account. Photos of somebody's dog shouldn't have to leave their phone to be useful.
Challenges I ran into
Three App Store rejections.
- 5.1.1(v) - account deletion wasn't findable enough.
- 3.1.2 - subscription terms weren't fully disclosed on the paywall. The reassurance line said "Nothing to pay today, cancel anytime", which states the free part and omits the charge entirely.
- 5.6.3 - I had a "rate the app" screen in onboarding behind a remote flag that defaulted off. The flag was on in the live config. I deleted the screen rather than defaulting it off, because a switch that can turn a guideline violation back on from a JSON file is a rejection waiting for whoever flips it next.
A bug I shipped on launch day. I changed the leaderboard to rank on pets
caught rather than a tap counter, which meant ordering on a new score field
maintained by a Firestore trigger. The trigger only wrote the field when the
value changed, so for anyone with zero catches, 0 !== 0 was false and the
field was never created at all.
Firestore's orderBy silently excludes documents that lack the field you're
ordering on. Not last, not null: gone. Every brand new user vanished from the
leaderboard, which is precisely the group most likely to go looking for
themselves. The board rebuilt every ten minutes and looked perfectly healthy
the whole time. It was just quietly three rows short.
Accomplishments that I am proud of
Beating Create ML by about twenty points by training the model myself. 66.8% to roughly 85–90% on 181 breeds, and the whole classifier fits in about 21 MB of float16 weights. The easy path was available and it wasn't good enough, and going around it is the single decision the whole app rests on.
Nothing leaves the phone. Breed recognition, animal detection and the die-cut subject lift all run on-device. No account, no upload, no server round trip. A pet app that needs your photos on somebody else's computer is a different and worse product, and I never had to make that trade.
The cut-outs are genuinely clean. Fur is horrible to key and a ragged edge ruins the whole illusion. Feathered ears and tails on a golden retriever come out as a sticker you'd actually keep, and that's the detail people react to in person.
It's out, and people who aren't me use it. Shipped solo on 18 August 2026 after weeks of evenings and three App Store rejections. The reviews are from strangers, and the one I keep re-reading is from a mother collecting stickers on walks with his four-year-old daughter, its a use I never designed for and wouldn't have thought of.
Someone in Vietnam found it on their own. No campaign, no press, no idea how they got there.
Card packs that can never be bought. Packs are earned by catching pets and by nothing else. Apple treats paid randomised rewards as gambling-adjacent and guideline 3.1.1 requires odds disclosure before purchase. Rather than comply with that rule I stayed outside it: nothing in the pack system touches StoreKit, so there is no purchase to disclose odds for. 47 card backs, 470 catches to complete the set, and no way to pay to skip it.
The charity pledge is structured so it can't quietly become nothing. 5% of everything Boop makes, off the top rather than off the profit, published quarterly
112 dogs and cats have a printed portrait on their owner's fridge. I take a folding table and a photo printer to parks all over and give them away. #100boops
What I learned
Shipping is not the end of the build. Since launch I've been taking a folding table and a photo printer to London parks, photographing people's dogs and printing them a portrait to keep. Twenty-eight so far, published at boopapp.uk/100-boops. Standing in a park has taught me more about the first-run experience than months of using my own app ever did.
What's next for Boop: Catch Every Dog & Cat
More pets, cat breeds to parity with dogs, more social features and a trimmed download size.
Built With
- cloud-firestore
- cloud-functions
- core-ml
- crashlytics
- create-ml
- css
- ffmpeg
- firebase
- firebase-cloud-messaging
- google-analytics
- html
- ios
- javascript
- mapkit
- ml
- node.js
- python
- pytorch
- revenuecat
- storekit
- swift
- swiftui
- vision
- widgetkit
- xcode
Log in or sign up for Devpost to join the conversation.