RemindMe - Project Story

Inspiration

We've all been there—forgetting important tasks, missing deadlines, or losing track of recurring responsibilities. Existing reminder apps often feel fragmented, locked to a single platform, or lack the flexibility power users need. We wanted to build something different: a truly cross-platform reminder solution that syncs seamlessly across Android, iOS, Desktop, and Web, with modern features like customizable snooze durations, rich recurrence patterns, and premium capabilities through a fair subscription model.

The rise of Kotlin Multiplatform (KMP) gave us the perfect opportunity to share 90%+ of our codebase across all platforms while still delivering native experiences.

What it does

RemindMe is a feature-rich, cross-platform reminder application that helps users:

  • 📅 Create reminders with flexible scheduling—one-time, daily, weekly, monthly, or custom recurrence patterns (RFC 5545 compliant)
  • Smart snoozing with customizable durations (5 min, 15 min, 30 min, 1 hour, or custom)
  • 🔔 Native notifications with actionable buttons (Complete, Snooze) on all platforms
  • ☁️ Cloud sync via Firestore REST API—your reminders follow you everywhere
  • 💎 Premium features powered by RevenueCat for IAP management
  • 🎨 Beautiful Material 3 UI with dark mode, adaptive layouts, and smooth animations

How we built it

Layer Technology
Shared Logic Kotlin Multiplatform (KMP)
UI Framework Compose Multiplatform
Database SQLDelight (local) + Firestore REST API (cloud)
Networking Ktor Client
DI Koin
Monetization RevenueCat KMP SDK
Architecture Clean Architecture (Domain/Data/UI layers)
CI/CD GitHub Actions for Android, iOS, Desktop builds

We structured the entire codebase around expect/actual declarations, allowing platform-specific implementations for:

  • Notification scheduling (AlarmManager on Android, UNNotification on iOS)
  • Background sync (WorkManager on Android, BGTaskScheduler on iOS)
  • Platform authentication (Google Sign-In, Firebase Auth)

Challenges we ran into

  1. RevenueCat KMP API Changes — The SDK evolved rapidly; Purchases.shared became Purchases.sharedInstance, and product became storeProduct. We adapted our implementation to match the latest API surface.

  2. Serialization with kotlinx.datetime.Instant — The @Contextual annotation was required for proper Instant serialization across all platforms.

  3. iOS-Specific Paywall UI — RevenueCat's Paywall UI components had different APIs on iOS vs Android, requiring platform-specific implementations.

  4. CI/CD for Multiplatform — Setting up GitHub Actions for Android, iOS (macOS runners), and Desktop builds required careful orchestration of secrets and build steps.

Accomplishments that we're proud of

  • 90%+ shared code across Android, iOS, Desktop, and Web
  • Fully functional cloud sync using Firestore REST API (no Firebase SDK dependency in shared code)
  • Native-feeling notifications with actionable buttons on all platforms
  • RevenueCat integration for subscription management across platforms
  • Clean Architecture that's testable, maintainable, and extensible
  • Automated CI/CD that builds and tests all platforms on every push

What we learned

  • KMP is production-ready — With careful dependency management, you can ship real apps
  • Compose Multiplatform rocks — Sharing UI code dramatically accelerates development
  • Platform abstractions are key — The expect/actual pattern is powerful but requires thoughtful API design
  • Version management matters — A solid libs.versions.toml prevents dependency hell
  • CI catches regressions early — Automated builds across all platforms saved us countless hours

What's next for RemindMe

  • 🌐 Web app with WebAssembly (wasmJs target is already set up!)
  • 🤖 AI-powered reminder suggestions based on calendar and habits
  • 🔗 Calendar integrations (Google Calendar, Apple Calendar)
  • 🎙️ Voice input for creating reminders hands-free
  • 👥 Shared reminders for families and teams
  • 🧩 Widgets for Android and iOS home screens
  • 🌍 Localization for global reach

Built With

Share this project:

Updates