Engineering blog
What we broke, and what we learned
Written by the people who did the work. Incidents get named plainly, including the ones that cost us customers.
Why we stopped ranking dogs by how often they got tapped
Our first ranking model optimised for engagement and quietly buried every animal that needed help most. Here is what it did, and what we replaced it with.
Search that survives Hungarian
Someone typing "nemet juhasz" without accents should find a németjuhász. Getting there took a Postgres extension, a custom dictionary, and giving up on one popular idea.
The night we sent 40,000 push notifications at 03:14
A daylight-saving transition, a cron expression in the wrong timezone, and a retry loop with no idempotency key. A postmortem.
Shelter Wi-Fi is a hostile network
Staff enter animals standing in a kennel corridor with one bar of signal and a dog on a lead. Offline-first was not a nice-to-have; it was the only design that worked at all.
Twelve megapixels of dog
Shelter staff upload photos straight from a phone camera. We were paying to move 8MB files across a bad connection to produce a 400px thumbnail.
Making "still adopted at a year" the metric
We deleted our engagement dashboard and rebuilt reporting around a number that takes twelve months to know. It changed which features survived.