Back to BlogView the featured project — Oakling
Design

Building Oakling: Three Products to Find One Real Problem

A family-activity app that took three products and one App Store rejection to figure out its real problem wasn't scheduling — it was trust.

Summer Chang

Summer Chang

June 16, 2026 · 9 min read

tl;dr

Oakling helps Bay Area parents discover family activities and coordinate playdates inside trusted circles. It started as a curated resource site, became a coordination PWA, and shipped as a native SwiftUI iOS app. Each pivot sharpened the same insight: parents don't struggle to find things to do — they struggle to get from "anyone free?" to "see you there."

3

products to find the real problem

481+

curated activities

70+

organic users before going native

the problem

The problem — discovery is easy, coordination is hard

Parents already know what they'd love to do with their kids. But group texts get buried, schedules clash, and there's no shared place to actually plan. And underneath the logistics is the real barrier: 1 in 3 parents won't allow a playdate when another family has different screen-time rules. Reaching out to unfamiliar families carries a social cost most parents won't pay.

Parents don't struggle to find things to do. They struggle to get from "anyone free?" to "see you there." That's a coordination problem, not a content problem.
three products

Three products, one problem

Plai

validated the audience — parents of young kids showed up and browsed. But engagement revealed the wrong job-to-be-done: they didn't need more information about activities.

Playdates

(a Lovable + Supabase PWA) proved the coordination need was real — 70+ organic users created events and shared invite links. But the open invite-link model mismatched how trust actually works, and the codebase accrued heavy debt.

Oakling

is the native rebuild where the trust model finally fit.

the highlight

The highlight — open invites vs. Trusted Circles

Open invite links (Playdates)Trusted Circles (Oakling)
TrustComes after the interactionBuilt into the structure
Works forExisting friend groupsBuilding new family connections
CoordinationShare a link, anyone joinsPlan inside a group you've vetted
PlatformWeb PWANative iOS
the rebuild

The rebuild — SwiftUI, and killing 40% of the code

The decision to go native was a full rewrite, not an incremental port.

~40% of the Lovable codebase was dead or duplicated

A full SwiftUI rebuild keeping only the clean patterns, with direct Supabase REST calls — no SDK, no inherited debt.

First results were slow

External Places + LLM calls dominated time-to-first-paint. Fix: a cache-first architecture — a Supabase suggestions table keyed by city and age bucket with a TTL; cache hits render instantly while a background refresh runs; cache misses show a skeleton while an Edge Function fetches.

Content goes stale fast

An evergreen model (a park is always a park; seasonal items get flagged off, never deleted) plus a Friday 5pm rule that shows After-School ideas before 5pm and Weekend ideas after.

the app store gauntlet

The App Store gauntlet

The first submission was rejected — a crash in the share-via-text flow plus a missing account-deletion option. Fix: patched both, built an account-deletion flow with a Supabase edge function for cascading cleanup, wrote detailed review notes, attached screen recordings, and resubmitted. Approved. (The share-via-text flow was the weak link — it's currently disabled, awaiting a clean rebuild rather than a patch.)

results

Results — by the numbers

MetricValue
Products to find the real problem3 (Plai → Playdates → Oakling)
Organic users before native70+ (PWA era)
Curated activities481+, hand-picked and illustrated
Dead code removed in rewrite~40% of the Lovable codebase
StackSwiftUI · Supabase REST · App Store Connect
StatusShipped — live on the App Store, oakling.app

Key Takeaways

  • 1The real problem hides behind the obvious one — the job wasn't discovery, it was trust.
  • 2Trust is architectural — a permission model builds it, a privacy policy doesn't.
  • 3Each pivot should sharpen, not restart — progressive reduction beats starting over.
  • 4Cache-first is a UX decision — perceived speed is part of the product.
  • 5Validate the hard problem before building the easy layer — a few weeks of parent interviews would have surfaced the coordination insight sooner.

Circle invitations — inviting other families into a Circle for coordinated planning.

Profile photos and personalization.

A clean rebuild of the share-via-text flow — the one that caused the rejection deserves a proper redesign, not a patch.

Bay Area growth — Berkeley, Oakland, Alameda, San Francisco.

what's next

Circle invitations — inviting other families into a Circle for coordinated planning. Profile photos and personalization. A clean rebuild of the share-via-text flow — the one that caused the rejection deserves a proper redesign, not a patch. Bay Area growth — Berkeley, Oakland, Alameda, San Francisco.

Share this post