Inspiration
Most to-do apps assume you’ll stop and type. I’m usually already moving—between meetings, on a walk, or halfway through something else. Twick started from a simple idea: capture a task as fast as saying it out loud, then get reminders that match real life—not only “due now,” but “you still have yesterday’s list open” when a new day starts. I also wanted a product that could sustain itself. Subscriptions shouldn’t be an afterthought, so RevenueCat was part of the design from early on: trial, entitlements, and paywalls on both mobile platforms without duplicating store logic.
What it does
Twick: Smart Reminders is a Kotlin Multiplatform task app. Voice-first tasks — add and manage work by speaking, with an AI assistant. Smart scheduling — categories, overdue views (including Yesterday), sleep mode, and local due-time notifications. Cloud sync — signed-in users sync tasks and can access them from multiple devices. Two layers of reminders OneSignal triggers overdue follow-ups and a morning digest for incomplete tasks that were due yesterday. Extras — home-screen widgets, task sharing (user can share their tasks via a link, which allows anybody with the link to mark a task as complete without installing the app)
How we built it
Client (KMP) Shared UI and domain logic in commonMain. Platform code handles OneSignal/RevenueCat, push registration, widgets, and notifications. Task edits debounce to Supabase. Backend (Supabase) Postgres for tasks, categories, and device tokens; Auth for sign-in; Edge Functions for reminders, OpenAI chat/realtime (JWT-gated), OneSignal overdue and yesterday-digest sends, and device-token claiming. pg_cron triggers functions on a schedule.
Monetization (RevenueCat) A shared subscription layer drives post-auth gating, trial welcome, paywall UI, and Customer Center on iOS and Android from the same KMP codebase.
Engagement (OneSignal) The app sets External ID and tags; cron + Edge Functions decide who gets digest and follow-up pushes, respecting in-app notification preferences.
Challenges we ran into
Voice-to-voice AI — Real-time conversation over WebSockets was tricky, especially on iOS where we hit crashes and had to adjust our approach.
Push on iOS + Android — Due reminders, sync alerts, and OneSignal nudges all behave differently per platform. Managing when to register, refresh, or clear device tokens—especially after reinstall or switching accounts—took real effort.
Backend + cron — Some reminders lived in Edge Functions that weren’t wired to cron or the database yet, so features looked “done” in code but didn’t fire in production until ops caught up.
Accomplishments that we're proud of
Live on Google Play — Twick is shipped and usable by real users on Android today. iOS build ready — Full iOS app built and tested on device (including release); App Store submission is the next step, not done yet. One codebase for both — Kotlin Multiplatform + Compose powers Android production and iOS from the same shared logic. Voice-to-voice AI — Talk to Twick to create and manage tasks, with AI handled securely on the backend. Smart reminders — Due-time alerts plus re-engagement nudges (e.g. when yesterday’s tasks are still open).
What we learned
Kotlin Multiplatform is worth it — One shared app core let us ship on Google Play first while keeping iOS on the same codebase instead of maintaining two products.
Monetization belongs in the architecture — RevenueCat early (trials, entitlements, paywall) saved us from scattering store logic across screens; Android is live today, iOS is ready when we submit to the App Store.
OneSignal fits re-engagement, not every ping — We use FCM/APNs + Supabase for due-time and sync alerts, and OneSignal for loops that bring people back: overdue follow-ups and a morning “still open from yesterday” digest. That split kept timing reliable and let us write clearer, campaign-style copy in OneSignal.
What's next for Twick: Smart Reminders
App Store launch — iOS is built and tested on device; next step is TestFlight and public release so both platforms match Google Play. Smarter OneSignal journeys — Expand segments and campaigns (inactive users, overdue patterns) while keeping due-time alerts on FCM/APNs. Richer voice + Pro — More voice assistant capabilities and Pro-only limits/features tied to entitlements. Polish and scale — Widgets, sharing, and monitoring for push delivery and Edge Functions as usage grows.
Built With
- firebase
- kmp
- kotlin
- onesignal
- superbase
Log in or sign up for Devpost to join the conversation.