CleanBreak — No-contact recovery.

Local-first iOS app that gamifies no-contact after a breakup — a Skia-drawn streak counter, a one-tap PANIC line to an AI friend that stays free forever, and a message decoder. No accounts, no ex's name ever asked, crisis rails never paywalled.

Year
2026
Engagement
Founder-led product, public web surface live
Platforms
iOS
Stack
Expo (iOS) · React Native New Architecture · Skia · Fastify
Days no contact
47
Panic — free
Problem

A hero streak for not texting your ex, and a PANIC line that never dead-ends

Breakup apps either moralize ("just delete their number") or gamify recovery so aggressively it feels hollow the one night it actually matters. Nobody had built the thing you reach for at 3am when your thumb is hovering over their name — something that catches you in that exact second, not a wellness checklist for the next morning.

Approach

A no-contact streak drawn live with Skia — tick dial, gradient numeral, glow — paired with a PANIC line that is architecturally incapable of being paywalled: crisis rails and the AI-friend chat are wired the same way regardless of entitlement tier, and a local grounding flow covers the case where the network is down. The product rule is explicit in the domain layer: texting, calling, or meeting up resets the streak; checking their social media is logged, never punished.

Architecture
  • Mobile
    Expo SDK 57 + React Native 0.86 with the New Architecture enabled — TypeScript, ES modules only.
  • State
    A single persisted Zustand store (AsyncStorage); the streak is derived, never stored — recomputed from `noContactStart` + slip events on every read.
  • Rendering
    React Native Skia draws the hero counter and backdrop bloom/vignette; Reanimated drives the motion layer.
  • Server
    A small Fastify proxy holds the OpenAI key and streams Coach/Panic replies over SSE; ships a mock mode with no key so the whole app is testable offline. Model is tiered by entitlement — gpt-4o-mini free, gpt-4o Pro.
Outcomes
  • Always free
    The PANIC line and crisis rails (988, National DV Hotline) are wired identically across every entitlement tier — not a feature flag that could regress.
  • Local-first
    Streak, journal, check-ins, and "Text the Void" drafts never leave the device; the Void itself persists nothing by design.
  • Offline-safe
    PANIC falls back to a local grounding exercise and wave timer when the network is down, so the one feature that has to work, works.
What we'd build next
  • Ship the Live Activity urge-timer to the lock screen so the streak stays glanceable without opening the app.
  • Wire the milestone reel GIF export to a shareable MP4 for TikTok/IG, since GIFs don't autoplay as video there.
  • Bring the Android build to parity once the iOS App Store listing is live.
Case study verified against code on 2026-07-15
Have something in mind?

Want one of these for your team?

Two engagements open for Q3 2026. Discovery starts at $24K.

CleanBreak — Case study | 802.software | 802.software