DEV Community

Cover image for We built a pet medication tracker because every other app failed us
krlz
krlz

Posted on

We built a pet medication tracker because every other app failed us

Last year, my partner and I adopted a dog 🐶 (keep reading, pics at the end!)

And with him came a lot of love... and a lot of responsibility.
Vaccines, medications, checkups — all on time.

I first tried using Google Calendar, but it quickly turned into clutter: work meetings, birthdays, reminders — everything mixed together, and pet-related things got lost.

Then I tried many pet apps, but something was always off: some were overdesigned and hard to read, others missed notifications.

At some point we said: hey, we're developers after all.
So together with Marina, as a family project, we decided to build the app we actually needed.

That's how ZooMinder was born — a simple, clear app to track your pet's meds, vaccines, and checkups, without noise or clutter.

What it does

ZooMinder focuses on one thing and does it well: keeping your pet's health schedule organized.

  • Multiple pets — Add all your pets with photos, and birthdate
  • Treatments & medications — Track meds with dosage, frequency (daily, weekly, custom intervals), and time-specific doses
  • Vet appointments — Save clinic info, vet name, phone, and address so everything is in one place
  • Upcoming doses — A clear timeline of what's coming next, across all your pets
  • History — Full timeline of past doses and appointments per pet
  • Local notifications — 'Bark' sound alerts so you never miss a dose, even when the app is closed
  • Offline-first — Works without internet. Data syncs to the cloud when you're back online

The tech behind it

We built it with Flutter (Dart 3.10+), targeting Android first.

Here's the stack:

Layer Tech
Framework Flutter
Local DB SQLite (sqflite)
Backend & Auth Supabase
Notifications flutter_local_notifications + custom sound
Navigation go_router
i18n Flutter's intl (English + Spanish)
In-app purchases in_app_purchase
Sync Custom offline-first sync service

Offline-first architecture

This was the most interesting technical challenge. The app stores everything locally in SQLite first. Every record has a synced flag. When the device comes back online, a SyncService pushes unsynced records to Supabase and pulls remote changes — handling conflicts with timestamps (updated_at).

// Every model carries its sync state
class Treatment {
  final bool synced;
  final DateTime updatedAt;
  // ...
}
Enter fullscreen mode Exit fullscreen mode

This means the app is fully usable on a plane, in a rural area, or anywhere without signal. Your pet's schedule doesn't depend on your WiFi.

Notifications that actually work

We created dedicated Android notification channels for medications and appointments, with a custom notification sound. The service schedules up to 3 upcoming notifications per treatment, recalculating whenever treatments are added or modified.

static const _medicationChannel = AndroidNotificationChannel(
  'medication_reminders_v2',
  'Medication Reminders',
  importance: Importance.high,
  sound: _customSound,
  playSound: true,
);
Enter fullscreen mode Exit fullscreen mode

What we learned

Building a "simple" app is harder than it looks. Some takeaways:

  1. Offline-first is worth it but painful — Sync logic with conflict resolution took more time than all the UI combined. But the UX payoff is huge.

  2. Notifications are a minefield — Between Android permission models, battery optimization killing background processes, and timezone handling... just scheduling a daily reminder at 8am is surprisingly complex.

  3. Scope creep is real — We started with "just track medications" and ended up with appointment management, dose history timelines, vet clinic storage, premium subscriptions, and multi-language support. Saying "no" to features is a skill.

  4. Family projects keep you honest — When your co-developer is also your partner and your first user, feedback is... immediate. And brutally honest. 😄

What's next 🚀

We're just getting started. Here's what we're planning:

  • Family plans — Share pets between household members so everyone can track medications and appointments from their own account. No more "did you give him the pill?" texts.
  • Assign responsibilities — Delegate tasks to family members. Mom handles the morning dose, dad takes the evening one. Everyone knows what they're responsible for.
  • Vet-oriented tools — We want to build features that integrate well with ZooMinder and give vets a better way to stay connected with pet owners — think shared treatment plans, visit summaries, and more.

We believe pet care is a team effort, and ZooMinder should reflect that.

Try it

ZooMinder is available on the Google Play Store. If you have pets and struggle to keep track of their medications and vet visits, give it a try.

We'd love your feedback — and if you're a Flutter dev, we're happy to chat about the offline-first patterns we used.

Want to help? 🙌

If you have suggestions, ideas, or found a bug — feel free to send me a DM here on dev.to! I'm always open to feedback.

Also, if you'd like to help as a beta tester, I'd really appreciate it. In exchange for your collaboration and honest feedback, I can give you full access to the premium version of the app. Just reach out and we'll get you set up.

Every bit of help makes ZooMinder better for all pet parents out there. 💪


As I promised some pics of the little guy who started it all. Here he is 🐾

#flutter #flutterdev #dart #mobiledev #android #sideproject #indiedev
#buildinpublic #petcare #pettech #supabase #offlinefirst #petparents #devlife
#familyproject

Built with Flutter, Supabase, and a lot of dog hair on the keyboard.

Have a great day! 👋🐾

Top comments (0)