Between Contractions
Built a calm, privacy-first contraction timer for the web, iOS, Android, watches, widgets, and optional real-time partner coordination.
En esta página 1 sección
Project notes
Active project
A calm timer for a moment that already asks enough
- Estimated reading time
- About 3 minutes
- In this project story
- 6 sections
I built Between Contractions while Alejandra and I were waiting for our son, Aarón. The product begins with one deliberately simple action: tap when a contraction starts and tap again when it ends.
From there, it calculates duration, start-to-start frequency, and recent patterns without turning labor into a dashboard. The timer is available in the browser, on the App Store, and on Google Play.
Outcomes
Delivered one bilingual timer across browser, phone, watch, widget, and desktop surfaces
Kept the core timer free, ad-free, account-free, and local-first
Separated optional Partner Sync from private on-device contraction history
Goals
Reduce cognitive load with one large, obvious timing action and clear recent history.
Keep the core private with local-first storage, no ads, no analytics SDK, and no required account.
Support real households with English and Spanish, light and dark themes, accessibility, widgets, and watch companions.
Treat timing as guidance by presenting the 5-1-1 pattern as a prompt to follow a care plan, never as a diagnosis.
What I built
A bilingual Astro website and browser timer
that works without installation and keeps its history on the current device.
Native Apple experiences
for iPhone and iPad, with SwiftUI, SwiftData, widgets, Live Activities, Apple Watch support, private iCloud continuity, and a companion macOS surface.
Native Android experiences
with Kotlin, Jetpack Compose, Room, Glance widgets, and Wear OS support.
Optional Partner Sync
for households that choose to coordinate a live timer across devices and platforms.
A small Hono and Cloudflare backend
for the explicit shared features, separated from the local-first core timer.
Technical highlights
- Web
Astro,TypeScript,Lumen UI, browser storage, bilingual content, and static delivery.- Apple
Swift,SwiftUI,SwiftData,WidgetKit,WatchConnectivity, and native system integrations.- Android
Kotlin,Jetpack Compose,Room,Glance, andWear OS.- Shared delivery
Turborepo,pnpm, automated checks, release preflights, accessibility coverage, and platform-specific test suites.
Privacy is an architecture decision
The timer does not need a backend to perform its main job. Browser history stays on the current device. Personal Apple history can use private iCloud continuity across the person’s own devices, while optional Partner Sync coordinates a shared timer through a separate service. The local timer remains useful offline.
That separation kept the product promise legible: the free timer is useful on its own, while Partner Sync remains an explicit choice rather than hidden infrastructure.
One family story, two products
Aaronmgz is the warm public space I built while our family waits for Aarón. Between Contractions came from the practical side of the same chapter: preparing for labor and protecting attention when the moment arrives.
The two projects now point to each other because neither story is complete in isolation.
Try the browser timer or read why I built Between Contractions.
De este proyecto
Dentro del trabajo.
Engineering notes
Between Contractions: Local-First Partner Sync
How I designed optional cross-platform Partner Sync without making a contraction timer depend on the network, an account, or a central history database.
Leer artículoProduct story
Why I Built Between Contractions
How waiting for Aarón became a calm, private contraction timer across the web, iOS, Android, watches, widgets, and partner devices.
Leer artículoComparte este artículo
Compártelo.
La copia automática no está disponible.


