Inspiration

For the past five years, we’ve built apps designed to help people. Through our work on Sismos México, we learned how valuable clear earthquake information can be.

During earthquakes in Venezuela and elsewhere, we saw people outside Mexico finding the app too. That made something clear to us: information is only the first step. Knowing what happened does not answer the questions a family faces next. Is everyone okay? Who needs help? Do we know what each person should do?

We wanted to help families prepare before those questions become urgent. Agree on a meeting point. Share responsibilities. Practice together. And when a reported earthquake matters to them, give each person a simple way to tell their private circle how they are.

That is why we built Ready Together: to help families prepare, practice, and check in, whether they live under the same roof or far apart.

What it does

Ready Together helps families turn a plan into something they can practice together. Android and iPhone users join the same private drill, confirm they are ready, and receive different responsibilities. Their actions contribute to one shared report, so the family can review the practice together.

Each person practices their part. One shared report helps the circle see what they completed and what to work on next. In the session below, both people participated, and one action Alex left unconfirmed became the next thing to rehearse.

Before practicing, families can agree on a meeting point and share responsibilities. Their private circle connects people who share a home or live far apart, including in different countries. Earthquake context is tailored to their saved areas in Mexico and other supported countries.

When a reported earthquake is relevant to the circle, a check-in notification invites people to respond. Each person can say “I’m okay” or “I need help,” and their family can see the responses for that event. A missing response stays unknown. “I need help” informs the circle; it does not contact emergency services.

The SeedLink-to-check-in path is operating. Seismic observations are correlated with a reviewed earthquake event; Ready Together verifies the event and its relevance to the circle’s saved areas before opening a private check-in and sending a OneSignal invitation to eligible members. A station observation alone does not trigger a family notification. Ready Together does not predict earthquakes or provide official early-warning alerts.

Ready Together works in English and Spanish. Earthquake context, the private circle, check-ins, household agreements, day and night drills, and the essential report stay free. Family Supporter is an optional one-time purchase that adds two practice scenarios: pets and guests at home. RevenueCat manages the purchase and entitlement, helping us support the project without putting essential coordination behind a paywall.

Alex on iPhone and Sam on Android practice in the same room with different responsibilities. Both screens show DRILL — NOT A REAL ALERT.

The shared report from that session records 108 seconds, 2 of 2 participants, and one unconfirmed action to rehearse with Alex.

Illustrative example: an earthquake check-in notification offers I’m okay and I need help; a help request informs the private circle through OneSignal.

How we built it

We built Ready Together with Kotlin Multiplatform and Compose Multiplatform. Android and iOS share Compose UI, MVI presentation state, domain rules, and networking. Pure business rules live separately from versioned client-server contracts and data access, so a change to a transport or native SDK does not redefine what a check-in or drill state means.

Native integrations stay explicit: Android uses Google Maps Compose, while iOS uses MapKit through UIKitView. Purchases and Family Supporter entitlements are managed through the RevenueCat SDK. Notifications, authentication, and lifecycle behavior use platform integrations. Shared Kotlin owns the decisions around them, including event relevance and how unknown or stale state is presented.

The backend runs on Kotlin with Ktor. It handles private-circle membership, invitations, event-scoped check-ins, and shared drill sessions. Firebase Authentication manages identity, while Firestore stores circles, memberships, check-ins, and reports.

Shared Kotlin architecture across Android, iOS and the Ktor backend

For the earthquake feed, our Ktor backend consumes earthquake reports through a normalized data adapter. It filters events against each circle’s saved areas and provides the same event context to Android and iOS, including the source, event time, and preliminary or reviewed status.

Our independent detector receives station waveform data through SeedLink and produces preliminary observations. The operating backend path uses signed ingestion, correlation with an exact event from a reviewed source, and independent verification of that event’s current facts and relevance to the circle. For eligible events within enabled country and area configurations, it opens an event-scoped check-in and sends OneSignal notifications to eligible members. Duplicate observations reuse the same coordination event, and each response remains attached to its circle and event. Ambiguous, stale, or unverified observations do not activate a check-in. We explain the flow and its boundaries in From a seismic signal to a family response.

SeedLink integration architecture: station observations, reviewed-event validation, and private check-in

Operating SeedLink-to-check-in path: station observations → reviewed-event verification → circle relevance → private check-in. OneSignal invites eligible members to respond; the backend remains the source of truth.

A synchronized drill makes that architecture tangible. An Android participant and an iPhone participant join the same room, receive different responsibilities, and follow a start time assigned by the Ktor backend. Shared Kotlin interprets the same semantic action IDs and session states on both devices; the server validates transitions and brings their actions into one collective report. A notification can bring someone back to the app, but it is never the session clock.

Practice content is bundled locally so an ongoing drill can continue through a connection loss. When a device reconnects, it reconciles with the shared session. Delayed or duplicate commands must not repeat completed actions, and an unanswered check-in must remain unknown. These are shared product rules, alongside the shared interface. We explain the module boundaries and native adapters in our architecture article.

RevenueCat manages the optional lifetime Family Supporter entitlement on each platform. It unlocks the pets and guests scenarios, while the day and night drills and essential coordination remain free. Billing stays separate from check-in and drill state. Restore uses the current platform’s store account; purchases do not transfer automatically between Android and iOS.

We tested the shared experience across both platforms, including invitations, synchronized practice, check-in responses, and the final report.

We turned lessons from building Ready Together into two open-source agent skills: kmp-spec-driven-design, for planning features across shared and native code, and kmp-proof-of-parity, for verifying behavior across Android and iOS. We published the templates, worked examples, and validation tools in our KMP Spec-Driven Skills repository. Our engineering note explains how another team can use them to plan a shared feature and collect separate Android and iOS evidence.

Challenges we ran into

One of our biggest challenges was making the earthquake feed reliable and useful for families. Bringing in reports was only part of the work. We also had to handle updates, avoid duplicate events, and make the source and status of the information clear.

We shared the idea with a community of earthquake enthusiasts. Those conversations helped us validate that preparation matters alongside earthquake information. Preparedness is also part of civil protection programs in several countries, and we wanted to help families bring that practice into their everyday lives.

Another challenge was making a drill work as one shared experience across Android and iPhone. Each person has a different responsibility, but everyone needs to follow the same timeline and finish with a consistent report. We had to account for delayed messages, connection loss, and people returning to the app.

Push notifications were another challenge across Android and iOS. Permissions, registration, and notification opens behave differently across platforms and providers. We needed to distinguish receiving a notification from opening it, handle cold starts, and prevent duplicate opens from repeating an action. That experience led us to open-source KMP Push Client. It gives KMP apps shared permission, registration, and notification-event handling, with separate FCM and OneSignal adapters and explicit native integration points. We included test fakes and a sample covering foreground notifications, cold-start opens, and duplicate handling, so other developers can test those boundaries in their own apps.

Another challenge was making preparedness feel approachable. We did not want Ready Together to feel like a corporate app full of forms. We wanted something families would feel comfortable opening and using together.

That led us to create Rocky, a friendly rock character who welcomes people and accompanies them as they prepare. Rocky gives the app warmth and personality, while we keep instructions, earthquake information, and check-in responses clear. The challenge was finding that balance: making the experience friendly without making light of the situations families are preparing for.

Rocky and the design decisions that make preparation feel more human

Accomplishments that we're proud of

We’re proud of bringing shared family preparedness to life on Android and iPhone.

During the September 19, 2026 earthquake drill, three beta families who use Sismos México completed a practice with Ready Together. The families had three to four members each, with 11 participants in total.

Seeing an Android phone and an iPhone join the same drill, receive different responsibilities, and finish with one shared report was an important milestone for us. It brought the idea of practicing together to life.

We launched Ready Together on both stores in English and Spanish, keeping essential earthquake information, check-ins, and the main drills free.

After sharing Ready Together with our existing earthquake community, people started using the app in production and leaving store reviews. Seeing it reach people beyond our own testing has been especially rewarding. One of our first reviews recommended it for people whose families live far away, which reflected exactly who we hoped to help.

Early use — September 30

As of September 30 at 16:19 UTC, our retained app records showed 91 circles, including 16 with two or more members. Across 37 circles, 48 app profiles had submitted 72 event-specific check-in responses. Nine circles had completed 15 shared practices with at least two participating profiles.

What we learned

Earthquakes cannot be predicted, but we can prepare for them. Building Ready Together reinforced how important it is to make preparedness part of everyday life: talk with our families, agree on responsibilities, and practice what to do before an earthquake happens.

Conversations with the earthquake community helped us understand that reliable information and practical preparation belong together. Early testing and feedback helped us improve member visibility, clarify responsibilities, and make the next action easier to understand. They also shaped how we present connectivity changes and recovery during practice. Our updated field note, What changed when people tried Ready Together, documents those earlier findings and the later September 19 milestone: three beta families, with 11 participants in total, completed a practice. The next question is whether families repeat the practice and use what they learn to improve their plans.

We also learned that building for Android and iPhone means testing how the devices work together. Shared code helped us keep the experience consistent, but we still needed to test timing, notifications, and reconnection across both platforms.

Finally, launching the app gave us a perspective we could not get from our own testing. The first users and reviews helped us see how people connected Ready Together to their own families, including relatives who live far away. That reminded us to keep the experience simple, personal, and useful.

We documented the journey in our public build journal: product decisions, tests that exposed problems, the fixes that followed, and milestones along the way. The linked field notes explain our architecture and what we learned from building and testing across Android and iPhone.

What's next for Ready Together

We want to keep learning from the families using Ready Together. Their feedback will help us improve the first-time experience, make shared drills easier to repeat, and understand what helps people build a habit of preparation.

We also want to keep improving the reliability of the earthquake feed and check-in notifications, while refining the experience across Android and iPhone.

As we grow, we want to work more closely with preparedness communities and civil protection professionals to review and improve the practice content for different countries.

Our goal is to help more families make a plan, practice it together, and know how to check in when it matters.

Built With

Share this project:

Updates

Submission history