BabyTrack+
When our son was born, my partner and I needed a way to let each other know when the baby had been fed, and how many diapers and hours of sleep there had been that day. So I built BabyTrack+, from April to November 2026: a baby log for feeds, solids, diapers, sleep and growth, made to be shared by two parents. I built the iPhone and Android app, the watchOS app for Apple Watch with its complications, the widgets, the cloud sync and the website.
The log works offline on one phone, without an account. It has a breast timer for the left and right side, bottle amounts in ml or oz, wet, dirty or both for diapers, and sleep stretches. The watchOS app shows the time since the last feed, diaper and sleep, and logs from the wrist, including the breast timer when both hands are full. An entry can also come from a Home Screen or Lock Screen widget, through Siri, or by saying what happened and letting the form fill itself in.
The second parent is why sync exists. With Plus, a second phone sees the same board, including entries logged on the Watch, and the person you invite stays on Free. When one parent starts a sleep, the other parent's iPhone shows "Asleep now" with a running timer on the Lock Screen, and "Woke up" ends it from there.

Two phones and a Watch writing to one log can disagree, and 2 bugs showed it. A single tap on the Watch could reach the phone through 2 channels carrying 2 different ids, and the entry appeared twice, so entries are now matched on the baby, the type and the millisecond they happened instead of on their id. The other bug was the opposite: an entry logged on one phone never reached the other, because the sync pulled by an updated_at that the app itself supplies. It now pulls by a timestamp the server stamps on every write.
Beyond the daily totals, BabyTrack+ plots weight, length and head circumference on WHO growth charts with the percentile for each measurement. It tracks solids by food, with the 9 common allergens following the NHS guidance of one new allergen at a time. Plus adds cloud backup, a second phone, unlimited babies and a PDF report for the pediatrician.

Architecture
One Expo codebase builds the iPhone and Android apps, with Expo Router for navigation and EAS to build and submit both. What Expo can't do is added as small native targets with expo-apple-targets, written in SwiftUI: the Apple Watch app and its complications, the WidgetKit widgets and the Siri shortcuts built on App Intents. That is how a feed gets logged from the wrist, the Lock Screen or by voice without opening the app.
The phone keeps everything in a SQLite database inside an App Group container that the app, the Siri extension and the Watch bridge all use, so logging never waits for a network and needs no account. Widgets read a small JSON snapshot of the day's totals instead of opening the database from several extension processes. The Watch sends its entries to the phone over WatchConnectivity and the phone saves them natively, so an entry logged on the wrist arrives even when the app isn't running.
Sync is the Plus part, and it runs on Supabase: Postgres for the shared board with row-level security, and Supabase Auth for Sign in with Apple, Google and email. The app talks to Supabase directly, so there is no API server of mine in between. Whenever an entry is written, a database trigger calls an Edge Function, notify-co-parents. It sends a silent push through Expo's push service to the other parent's devices, so their widgets and Watch refresh without opening the app. For sleep it starts the "Asleep now" Live Activity straight through APNs, because Expo's push service has no Live Activity support.
RevenueCat sells Plus as a subscription on both stores, and the app reads it as a single plus entitlement. Sentry reports errors from the app and from the Edge Function. The website is a Next.js site on Netlify.
Get it on the App Store or Google Play, or see the full project at babytrack.plus.