CatMaps
2026
- Rust
- React-Native
- Product
I know every cat on my cycle to work. Not their names, but where they sit and roughly when: the one on the wall by the lights, the one that's always in the same window, the one who comes out to the pavement if you slow down. When one of them stops being there I notice, and I worry, and there's nothing I can do with the worry. You can't ask a street whether its cat is alright.
CatMaps, now in the queue for the app store, is me trying to build the thing you'd check. You photograph an animal you've seen, and it gets matched against the ones people have reported missing nearby.
It's less obvious than it sounds. I've picked up affectionate cats with no collar before, and the instinct is to take them to a vet and have the chip read. But an affectionate cat with no collar is usually just a cat at home in its own territory, and carrying it across town is the thing that actually loses it. I had no way to tell those two apart, and neither does anyone else, so the app has to be as good at talking you out of acting as it is at getting you to report.
That kind of question turned out to be most of the design. I went through the scenarios one at a time: it can't ask people to hand over personal details to take part, it can't publish where somebody's pet reliably is at four in the afternoon, and it can't become a catalogue for anyone minded to steal one. Almost every feature that would obviously help you find a cat fails at least one of those.
And it still has to be worth opening when nothing is wrong. A map of sightings only exists if people contribute to it, and people only contribute to something they already had a reason to look at. What I landed on starts with the posters that are already on the lampposts: a QR code on the poster, so whoever prints it registers their pet while they're at it, and the stranger who stops to read it can join the search from the pavement.
Staying is a different problem from arriving. If a cat you photographed gets home, you hear that you helped. If an animal you've snapped before is reported missing, you hear that too, because you're the one most likely to see it again. Everyone already knows a few cats on their own street. This is what tells them it counted.
Before any of it existed I just did this by hand. A photo of every cat I passed, a photo of every missing poster, and me trying to cross-reference the two out of my own camera roll. Putting the runs on Strava got closer, because a run carries its route with it, so a sighting turns up already knowing where it happened. The problem is who's looking. The person who would recognise that cat is in a local Facebook group, not in my tiny Strava following.
When I told people I was doing this, I realised a pile of sightings is worth more than one cat at a time. Everyone I know with an outdoor cat wonders where it goes and what other lives it's living. I put a Tractive tracker on mine and learned exactly where he was and nothing whatsoever about what he did, and he got it off his neck constantly anyway. What I wanted was the bit only other people can see.
Underneath all of that: Rust, React Native, as little state as I could get away with, and the logic written as deterministic state machines. Partly that's so behaviour can be tested exhaustively rather than hopefully, and partly it's that a codebase shaped like that is one an AI-assisted workflow can be held to, because there's a right answer to check the work against. If people are going to lean on this for an animal's safety, and sometimes for their own, I want to be able to say that it works, not that it seems to.
Widen it out and it stops being about any one animal. Once enough people are looking, the same pile of sightings is the thing shelters keep wishing they had: where the colonies actually are, which streets keep losing dogs, the sort of picture policy currently gets made without because nobody has ever had it.
Mostly though it's the cat on the wall by the lights. I'd like to be able to check they're safe.


