← Write Ups

DoggieDo: A Dog Owner Discovery App

Crystal and I built DoggieDo, an app for dog owners to find dog-friendly places nearby and keep a profile for their dog. We shelved it before it had real users because we didn’t think we could put together a viable business model.

The concept

We built two key pieces of functionality on the consumer side. The first is a map of dog-friendly parks, vets, cafes, and groomers that you can filter by category. Each place shows tips and activity counts from other owners. The second is a pet profile builder. It’s a short wizard. You enter your dog’s name, breed, and age. Then you add personality and health notes. Then you add a photo and bio.

Alongside that, we built out DoggieDo for Business. The idea was to make DoggieDo a two-sided platform: dog owners get a free, useful app, and pet care businesses (vets, groomers, cafes, boarding) pay to advertise directly to the owners already using it in their neighborhood. The consumer app was the audience; the business side was the revenue.

The tech

We used FastAPI on the backend because it paired well with SQLModel, which let us define a table once and get both the Postgres schema and the API’s request/response types from it. Postgres also gave us PostGIS for location queries, which the map needed. On the frontend we used React with TanStack Router and Tailwind, and ran the whole stack locally with Docker Compose.

Where it fell short

DoggieDo is a “telephone” app: the map and tips only get good once enough dog owners in an area are using it. Without that density, there’s not much for a new owner to see, and not much for a business to advertise against.

One option was to geo-restrict launch to NYC to build density faster. But a smaller footprint meant DoggieDo for Business was competing for the same pet care advertising dollars as every other local marketing channel in one of the most contested markets around, with none of the reach that would make it worth a business’s while.

Try it

These are quick recreations of the two features in plain JS, not the original app.