Case Study · Mobile · AI · Solo-built

Building tended,
0 to App Store, alone.

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.

React Native · Expo Node · Firebase · Postgres Anthropic Claude API RevenueCat · Stripe
175
countries at launch
1
person, full stack
0→1
idea to App Store approval

most "relationship apps" store data. they don't understand it.

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.

a real retrieval + generation pipeline, aimed at a relationship instead of a document set.

Per-user knowledge model

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.

Semantic retrieval

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.

LLM composition layer

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.

Guardrails

Repetition suppression, quiet-hours gating, and confidence thresholds keep low-value or badly-timed suggestions from ever reaching a device.

dual monetization, shared between two people.

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.

shipping the product was one project. getting it approved was a second one.

Several real, distinct issues surfaced during App Store review, and each was root-caused and fixed properly, not patched around.

A genuine login bug, not a policy issue

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.

A structural account-deletion gap

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.

A billing infrastructure gap

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.

A compliance refinement

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.

approved, and live in 175 countries.

"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