All projects
01MOBILE APP · AI2023
Oddah app icon: a white speech bubble with a heart on a crimson background

Oddah

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

Visit oddah.comiOS · Android
Oddah welcome screen: "Love intentionally. Connect deeply and build a relationship that feels like home." with a Get started button
Oddah dashboard showing todos, events and days-together counters, quick actions, the quote of the day and upcoming events

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

YESNOStart
Phone A requests a QR invite
API mints a 10-minute token, stores only its hash
QR shown on Phone A as a universal link
Phone B scans and accepts
Token matches & unexpired?
Create the Couple, revoke other invites
Both phones paired · 7-day premium preview
End
Expired or reused — rejected

Swipe sideways to see the whole chart.

01 / 10invite request

Phone 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