Inspiration

Most apps that couples use every day weren't made for couples. We chat on one app, share photos on another, and listen to music somewhere else. For long-distance partners especially, these little moments get scattered and lost.

I wanted one small, private space made for just two people, where staying close feels effortless and a little bit magical. That idea became SoulMates.

What it does

SoulMates is an iOS app for couples. Once two partners pair up with an invite, they get a shared world:

  • 💬 Private chat with text and voice notes that disappear after 24 hours, so conversations feel light and in the moment
  • 📸 Soul Glimpse: a daily selfie exchange. Your partner's photo stays locked until you post yours, and then both are revealed together
  • 🎶 Listen Together: send an invite and listen to the same song at the same time, with play, pause and track changes synced live
  • 🖼️ Memories: a shared photo vault for your special days, with dates and notes
  • ❓ Daily questions and quizzes to get to know each other better
  • 📅 Date planner and shared notes for planning time together
  • 📱 Home screen widgets showing your days together and your partner's latest selfie

How we built it

  • SwiftUI for the whole interface, using MVVM with ObservableObject view models
  • Supabase as the backend:
    • Auth for accounts
    • Postgres for couples, messages, memories, selfies, and music sessions
    • Realtime channels for instant chat and synced music
    • Storage buckets for photos and voice notes
    • Row Level Security so only the two people in a couple can see their data
  • AVFoundation for voice recording and synced audio playback
  • PhotosUI and the camera for selfies and memory uploads
  • WidgetKit with shared data for the home screen widgets

The synced music works by treating each couple's session as a small shared state (which track, playing or paused, seek time, and who acted last). Both phones listen for changes and react to them in real time.

Challenges we ran into

  • Realtime sync: keeping two phones playing the same song without echo loops, where one phone's action bounces back and triggers itself again, took a lot of careful state handling.
  • Security rules: Row Level Security works separately for database tables and for Storage buckets. A missing Storage policy blocked memory uploads, and it took real debugging to find the cause.
  • Handling disconnects live: if one partner unpairs, the other person's app has to react immediately, without a restart.
  • Swift itself: as a student learning iOS, generic types, Combine, and confusing compiler errors were a steep learning curve.

Accomplishments that we're proud of

  • Building a full-stack, real-time app as a student, from design to backend to widgets
  • Getting music to play in sync between two devices
  • Designing the "locked until you both post" selfie reveal, which makes the daily habit feel special
  • Building a secure setup where each couple's data stays private

What we learned

  • How to structure a real SwiftUI app with view models and shared state
  • How realtime databases, auth, storage, and security policies fit together in Supabase
  • How to debug systematically. One tiny typo or one missing type can cause a wall of errors, and the trick is to find the single root cause
  • That small emotional details, like a locked photo or a disappearing message, matter as much as big features

What's next for SoulMates

  • 💎 A Pro plan with one purchase per couple, so both partners get Pro and the subscription stays with the buyer if they re-pair later
  • 🤖 An Android version
  • 🔔 Smarter reminders and nudges for daily rituals
  • 🎵 A bigger music library and shared playlists
  • 🌍 Multiple languages, so couples everywhere can use it

Built With

  • revenuecat
  • supabase
  • swift
  • swiftui
  • widgetkit
Share this project:

Updates

Submission history