Clarity: Reminders — Project Overview
Inspiration
We loved Sams custom snooze idea ad we ran with it , but not only reminders we think Ideas and notes can be thrown in the bunch too. We wanted a single place where you could dump thoughts into an inbox, turn them into time- or location-based reminders, and get notified when it actually matters—without forcing a subscription just to use the app. That’s Clarity: your ideas and your follow-through in one place, with optional cloud sync for people who want their “second brain” everywhere.
What it does
- Ideas (Inbox) — Capture ideas and notes in one list. Turn any idea into a reminder with one tap.
- Upcoming (Reminders) — Schedule reminders by time or location. Get notified at a specific time or when you arrive at a custom place. Recurring and one-off reminders, with snooze and custom snooze sets.
- Profile — Manage your account: sign in (email/password) for cloud sync, upgrade to Pro via in-app subscription, restore purchases, and tune reminder behavior (snooze sets, etc.).
Free users get full use on one device (ideas + reminders + notifications); data stays local. Pro users (via RevenueCat subscription) get cloud sync across devices, real-time updates, and notes tied to ideas. RevenueCat is the single source of truth for Pro—we don’t gate Pro on our own backend.
How we built it
- React Native (Expo) for iOS and Android, with a custom floating tab bar and stack navigation.
- RevenueCat (
react-native-purchases) for subscriptions: configure on launch, fetch offerings and purchase/restore from the Profile screen, and use a customer info listener in our auth layer so Pro status updates immediately after purchase or restore. Entitlements drive whether we use cloud or local data. - Firebase for optional auth (email/password) and Firestore for Pro users’ synced ideas and reminders. We mirror “is Pro” to Firebase for backend use, but we never derive Pro from Firebase—only from RevenueCat.
- Unified data layer — One
dataServicethat switches between Firestore (Pro + signed in) and AsyncStorage (free or Pro not signed in) based onisProfrom our AuthContext, so every screen stays agnostic. - Expo Notifications for local and scheduled reminders; Expo Location and Google Maps for location-based triggers and custom locations.
Challenges we ran into
- Keeping Pro truth in one place — We had to resist the urge to store “is subscription active?” in Firebase and read it on app load. That would have duplicated state and caused edge cases (e.g. restore on a new device). We committed to RevenueCat as the only source of truth and wired the whole app (AuthContext, dataService, Profile) to that. Getting the listener and
updateProStatus()flow right so the UI and data layer updated immediately after purchase or restore took some iteration. - Free vs Pro data paths — Supporting both local-only and cloud-synced users meant every read/write (reminders, ideas, snooze sets) had to go through a single API that branches on
isProand signed-in state. We refactored to a unifieddataServiceso screens don’t care where data lives. - Expo Go and IAP — In-app purchases don’t work in Expo Go. We had to gracefully skip RevenueCat init and show a sensible state (e.g. “not available”) in development without breaking the rest of the app.
Accomplishments that we're proud of
- RevenueCat as the centerpiece — Entitlements drive the entire Pro experience. One subscription check, one listener, one place to add new Pro features. Clean separation between “did they pay?” (RevenueCat) and “where do we store their data?” (Firebase vs local).
- Freemium that feels fair — The app is fully usable for free on one device. Pro is a clear upgrade (sync, real-time, notes), not a paywall for basic use.
- Unified architecture — Same screens and components for free and Pro users; only the data source (local vs Firebase) and sync behavior change. That made it easier to add features and avoid bugs.
- Location-based reminders — Reminders that fire when you arrive at a custom place, with a focused UX for picking and saving locations.
What we learned
- Single source of truth pays off — Letting RevenueCat own subscription state and only mirroring to Firebase when needed simplified logic and made restore/new-device flows reliable.
- Listeners > polling — Using RevenueCat’s
addCustomerInfoUpdateListenerso the app reacts to purchase/restore/expiry without extra polling made the Pro experience feel instant. - Unified data APIs — Abstracting “where does this go?” behind one service (with a clear
isPro+ userId contract) kept the UI simple and made it easy to add Pro-only behavior without scattering conditionals.
What's next for Clarity
- Smarter defaults — Better default snooze sets and reminder templates based on how people use the app.
- Widgets — Home screen widgets for “next reminder” and quick capture to the inbox.
- More Pro value — Deeper notes/second-brain features, export, and possibly shared reminders or lists, all still gated by the same RevenueCat entitlement.
- Analytics and experiments — Use RevenueCat and our backend to understand conversion and experiment with paywall placement and messaging.
Built With
- expo.io
- react-native
- revenuecat

Log in or sign up for Devpost to join the conversation.