
Oddah
One shared space for two people — pair by QR, plan together, and get an AI nudge that lands on both phones at once.


Overview
What is Oddah
Oddah is a relationship app for couples who have already chosen each other — explicitly not a dating app. Two people pair their phones and share one space: to-dos and goals, a joint calendar, love letters that arrive on a future date, light games, and a daily AI nudge that lands on both phones at the same moment. It ships to iOS and Android from one Expo codebase.
- Role
- Founder & engineer — designed and built the product end to end: app, API, AI, billing and release.
- Platform
- iOS · Android
- Stack
- Expo · Node.js · MongoDB · Gemini
- Billing
- App Store · PayPal
- Status
- Live, v2.9
- Web
- oddah.com
Contribution
What I built
- 01Modelled the product around a single Couple record so every feature — goals, events, letters, games — is shared by default and each query reduces to one couple filter.
- 02Built the pairing funnel: email, link and in-person QR invites on a ten-minute hashed token; accepting one creates the couple and revokes the rest.
- 03Designed the daily nudge: a scheduler asks Gemini for two complementary prompts — one partner asks, the other shares — with curated fallbacks so a slow model never blocks the push.
- 04Ran billing on two rails — Apple in-app purchase verified server-side and PayPal from the web — resolved by one entitlement rule that covers both partners.
- 05Owned quality and release: 57 API test suites on an in-memory MongoDB, Maestro end-to-end flows, Sentry on app and API, store builds through EAS.
How it works
How the data moves
The core paths through the system — a dot travels each hop, and the caption says what happens there.
Pairing two phones
The riskiest moment in onboarding — two strangers to the system become one couple, in person.
Swipe sideways to see the whole chart.
invite requestPhone A asks the API for a QR invite.
Decisions
Calls that shaped it
A Couple record, not user-to-user joins
Making the pair its own document turns shared ownership into the default and keeps every feature query to a single couple filter.
Invite tokens hashed and short-lived
The raw QR token is never stored — only its hash, for ten minutes — so an old screenshot is useless and one scannable code is valid at a time.
Entitlement computed, never copied
Premium is derived per couple from the preview window, either partner's subscription and a global switch — one rule across App Store and PayPal, nothing to drift out of sync.
Gemini behind a fallback
Every generated surface keeps hand-written fallbacks, so a rate-limited model degrades the experience instead of breaking it.
Stack
- Expo
- React Native
- Node.js
- MongoDB
- Gemini
- Apple IAP
- PayPal