An AI-powered couples app that learns what your partner needs through natural conversation, then surfaces specific, well-timed suggestions instead of generic reminders. Product, backend, AI pipeline, billing, and the full App Store review process, designed and built solo.
A shared calendar or a static preferences form captures a fact once and lets it go stale. The harder, more valuable problem is turning an ongoing stream of unstructured signal, whether a journal entry, a passing comment, or a location visit, into an accurate, evolving model of what someone actually cares about, and then acting on that model at the right moment, not just storing it.
Every signal, whether a journal entry, a conversation, or a location pattern, is ingested and distilled into a structured personal record: preferences, love language, important dates, behavioral patterns. Continuously merged and de-duplicated against what's already known, not just appended.
Vector embeddings, backed by Postgres, power matching between signals that don't share exact keywords. A mention of a specific restaurant and a later signal about wanting a particular cuisine get connected, even without overlapping words.
A retrieval step packages the relevant slice of a partner's knowledge model as context, which Claude composes into a specific, timely suggestion, never a generic templated reminder.
Repetition suppression, quiet-hours gating, and confidence thresholds keep low-value or badly-timed suggestions from ever reaching a device.
Native StoreKit in-app purchases (monthly, annual, lifetime) alongside a Stripe-based web checkout, with shared pairing-level billing. Either partner can pay, and either can hand off billing responsibility to the other through a bilateral request/confirm mechanism rather than a unilateral toggle.
Identity runs on phone-number authentication with real SMS verification via Firebase, using native APNs-backed silent verification rather than a fallback CAPTCHA flow. Account lifecycle covers invite-based pairing, mutual commitment, and a compliant, bilateral deletion flow. Both partners must consent, a disclosed 30-day grace period follows, and either partner can cancel it at any point before a scheduled backend job performs an irreversible hard delete.
Several real, distinct issues surfaced during App Store review, and each was root-caused and fixed properly, not patched around.
Phone verification was silently falling back to an in-app reCAPTCHA flow because the device's APNs registration, needed for Firebase's native, silent phone-auth verification, was only happening after sign-in. A chicken-and-egg bug affecting every first-time user, not just the reviewer. Fixed by registering for remote messages unconditionally at app launch.
The feature existed in code, but the UI path to reach it only rendered once a pairing was already mid-unpair, meaning there was no way to initiate deletion from a normal, healthy account at all. Traced the actual render logic, added a directly reachable entry point, and in the process removed a separate "unpair" feature that didn't delete anything and was creating real user confusion sitting right next to the deletion option.
In-app purchase products existed in App Store Connect but were never registered with the purchase-management layer's real product catalog, so the button existed, but silently failed to trigger Apple's native purchase sheet at all. Traced to a dashboard configuration gap, not a code defect.
After shipping the deletion flow, revisited the grace-period design against Apple's actual published guidance and added the ability to cancel a scheduled deletion mid-grace-period, not just before mutual confirmation, closing the gap between "technically compliant" and the platform's stated intent.
"Shipping solo means there's no handoff. The same person who designs the retrieval architecture also has to trace a native push-notification bug and read Apple's account-deletion guidance closely enough to catch what it actually requires."
Get the app on the App Store