Problem & Inspiration
College is a new chapter of life, but as first-year college students, we’ve seen firsthand how proximity affects relationships. Advay and Alec both moved from the West Coast to the East Coast for college, and the friends they grew up with seeing every day in high school are now people they’re lucky to see a few times a year. What makes that distance harder is that silence creeps in slowly. You mean to text someone, you think about them, but life happens, and before you know it, six months have passed.
This problem only grows as people get older. Life gets busier, schedules stop overlapping, and friendships that felt effortless start requiring effort that nobody remembers to make. Most people don’t consciously decide to drift apart; it just happens, and by the time you notice, reaching out feels awkward. So, we wanted to build something that quietly watches out for friendships that you care about, and gives you a nudge before the silence becomes permanent.
What It Does
Drift is an iOS app with a macOS backbone. It reads your iMessage history, identifies friends you’re losing touch with using an internally calculated “Drift Score,” and sends personalized AI-generated nudges to help you reconnect.
The Drift Score is calculated from your real message history: the ratio of total messages exchanged to days since your last conversation. A high score means you used to talk a lot but haven’t recently, which is typically the kind of friendship worth saving. Nudges are sorted by this score, so the most urgent reconnections always surface first.
After the Drift Score is calculated, another filtering phase is applied. Gemini performs a semantic pass, reading the last 100 messages per contact, and decides whether the relationship is worth rekindling based on how meaningful the conversations were, whether the conversation ended on bad terms, and whether there are shared interests and inside jokes rather than superficial small talk.
When Drift decides you should reach out to someone, it doesn’t just say “text Jake.” It reads your past conversations, understands your natural texting style, and generates talking points that sound like you, not a generic AI. These show up as push notifications and a card-based feed on your iPhone. You can choose to snooze the nudge for 24 hours, dismiss it permanently, tap a talking point to open iMessage with a message pre-filled and ready to send, or just go straight to chat.
Drift is intentionally lightweight. Most of the value comes from the nudges, with no real need to open the app outside of them. A notification appears with a name and a talking point, and one tap takes you straight to the conversation. The app itself is there when you want to browse your nudges, but we built it so that the most important interaction is frictionless enough to happen in 5 seconds.
How We Built It
Backend (Python on macOS): We built a multi-step pipeline that runs locally. It reads iMessage data directly from ‘~/Library/Messages/chat.db’ via SQLite, then resolves phone numbers to real names by querying the macOS AddressBook database. A hard filter removes contacts with fewer than 50 messages exchanged or people you’ve been silent with for under 30 days or over 4 years. From the remaining candidates, the Drift Score is calculated, and the top contacts are passed to Gemini for semantic filtering. For contacts that pass, Gemini runs a four-step generation pipeline: extract shared interests from the conversation, generate three talking points (one grounded in real current events via Google Search, one inferred from conversation themes, and one about a shared experience to create together), write a full ready to send message for each topic in the user’s own voice, and generate a short subtitle for the nudge card. Tone is matched by sampling the user’s own sent messages to those specific contacts. Everything then syncs to Firebase Firestore.
Frontend (SwiftUI on iOS): The app maintains a real-time Firestore listener, so nudges appear as soon as the pipeline finishes. Push notifications are scheduled weekly at random intervals and show the contact’s name and a generated talking point directly on the lock screen. Tapping the notification deep-links to the correct nudge card, highlighting the specific talking point shown in the notification. Tapping on a talking point opens iMessage with the full conversation starter pre-filled.
Infrastructure: Firebase Firestore as the real-time bridge between the Mac pipeline and iPhone. Re-running the pipeline always updates existing records rather than creating duplicates, so the user’s “dismissed” state is never overwritten.
Challenges
Our biggest challenge was identifying the right people to nudge. Our initial approach was purely metric-based: we calculated a Drift Score from message frequency and recency, and the top results in the app were those with the highest score. After initial testing, we realized that people with whom you were on bad terms would show up, and that a number alone can’t tell you whether a friendship is actually worth rekindling. The metric itself says nothing about whether the conversations were ever meaningful or whether this is someone you actually want back in your life.
With feedback from mentors, we decided to add a semantic filtering layer using Gemini. Instead of ranking purely by score, we now have Gemini read the last 100 messages per contact and make a judgment call. This changed the app's dynamic: rather than feeling gamified by a score for each contact, each recommended nudge felt like a genuine, thoughtful suggestion.
What we learned
On the technical side, we applied our knowledge of Swift to design the UI and of databases like Firebase and Firestore to build a real-time bridge between a local Python pipeline running on macOS and an iOS app. After mentor feedback flagged our purely metric-based Drift Score approach as too shallow, we added the Gemini semantic filtering layer, which makes Drift feel more thoughtful rather than algorithmic.
On the product side, we learned that the hardest part of staying in touch isn’t caring. The real problem is the awkwardness of sending the first message after a long period of silence. Drift’s job is really just to eliminate that step and give the user something real to say.
Next Steps
The most immediate step is to automate scheduling, since the pipeline currently runs manually with main.py. We can use a cron job or a launch agent to run it daily in the background without user intervention.
In terms of long term goals, we plan to integrate this platform so it works on Android as well, likely moving to React Native for this. Also, we will expand beyond iMessages and support other messaging apps like WhatsApp, Instagram DMs, or email. The Beeper platform, a unified messaging platform, would give us access to multiple messaging services (WhatsApp, Instagram, Signal, etc.) through a single API.
Log in or sign up for Devpost to join the conversation.