Inspiration

Alarm clocks are designed to be unpleasant. The beep is loud, generic, and it belongs to nobody. But the gentlest way I have ever been woken up was by someone saying "good morning" to me.

So I asked a simple question: what if your alarm was that voice? Not a ringtone picked from a list, but a 15-second clip recorded by your partner, your best friend, or a kind stranger on the other side of the world. That became Monivo.

What it does

  • Wake each other up. Record up to 15 seconds and send it to a friend. It becomes their alarm sound. Set an alarm to "Haruto's latest voice" and it automatically switches to the newest clip he sends.
  • Global Voices. No friends on the app yet? Pick from voices posted by people worldwide, filtered by situation (morning, midday, focus, night, free talk), or let an alarm pick one at random.
  • Ask for a voice. Tell a friend what you need: "I really can't be late tomorrow, wake me up with a firm one!"
  • It really rings. On iOS it is built on AlarmKit, so alarms ring when the app is closed or the phone is on silent.
  • The moment after waking up. Dismissing an alarm opens a screen where you rate the voice, react with a stamp, or save it to your collection.
  • Premium raises saved voices from 5 to 300, recording from 15 to 30 seconds, removes ads, and unlocks four color themes.
  • Available in 12 languages.

How I built it

  • iOS (iOS 26+): SwiftUI, AlarmKit, AppIntents (dismissing an alarm brings the app forward to the rating screen), a Live Activity for the ringing UI, and SwiftData for alarms. Recorded AAC clips are converted to linear PCM CAF files in Library/Sounds so AlarmKit can play them. On-device Speech transcription plus Apple's Foundation Models draft a title, description and hashtags for a voice post. None of that leaves the device.
  • Android: Kotlin + Jetpack Compose, Room, AlarmManager.setAlarmClock with a foreground service, re-scheduling on boot.
  • Backend: Firebase Auth, Firestore, Cloud Storage, Cloud Functions (Node 22) for push notifications, moderation counts and reactions, FCM, and Firebase Hosting for a 12-language website.
  • RevenueCat: one project for both platforms. There is a single premium entitlement with monthly and annual packages, and the annual plan includes a 1-week free trial. Offering metadata (paywall_style) decides which of two paywall layouts to show, so I can run a RevenueCat Experiment (one screen vs. slides) without shipping a new build. Free users see AdMob ads, including an opt-in rewarded ad that adds save slots.

Challenges I ran into

  • My voice alarm played pure noise. When writing the CAF file, I mixed up the on-disk format with the in-memory buffer format, so Float32 samples were read as Int16.
  • Global Voices were silent on Android. iOS writes UUIDs in uppercase and Kotlin writes them in lowercase. Firestore and Storage paths are case-sensitive, so playback failed silently. A single wireID() helper now guards it.
  • Google Play rejected my first Android build because Google sign-in failed for the reviewer. Play App Signing re-signs the app with a key whose SHA-1 was not registered in Firebase. It could never fail on my debug builds.
  • App Store review taught me a lot. I got rejections for untranslated permission dialogs, for prices shown in screenshots, for an ATT prompt that never appeared (requested from scenePhase; it has to be didBecomeActive), and for personalized ads after ATT was denied.

What I learned

Test the build users actually get, on real hardware: the Play-signed APK, AlarmKit on a device, the notification tap. My own data also taught me that most people who opened Monivo never got past sign-in. A social alarm is worth nothing until you hear the first voice.

What's next

Letting people listen to Global Voices without signing in first (already built, shipping next), making it easier to bring a friend in, and more voices for every time of day.

Built With

  • activitykit
  • admob
  • alarmkit
  • appintents
  • avfoundation
  • cloud-firestore
  • cloud-functions
  • fastlane
  • firebase
  • firebase-auth
  • firebase-cloud-messaging
  • firebase-crashlytics
  • firebase-storage
  • foundation-models
  • google-sign-in
  • jetpack-compose
  • kotlin
  • revenuecat
  • room
  • sign-in-with-apple
  • speech
  • swift
  • swiftdata
  • swiftui
  • widgetkit
Share this project:

Updates

Submission history