<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SYMBiEX</title>
    <description>The latest articles on DEV Community by SYMBiEX (@symbiex).</description>
    <link>https://dev.to/symbiex</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3224398%2Ffd2e191b-10c6-4c0c-a17c-f4e1f394ec19.png</url>
      <title>DEV Community: SYMBiEX</title>
      <link>https://dev.to/symbiex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/symbiex"/>
    <language>en</language>
    <item>
      <title>Building the AI Fallback Ladder Behind LOCK TF IN (an app that roasts you into working out)</title>
      <dc:creator>SYMBiEX</dc:creator>
      <pubDate>Fri, 24 Jul 2026 04:37:49 +0000</pubDate>
      <link>https://dev.to/symbiex/building-the-ai-fallback-ladder-behind-lock-tf-in-an-app-that-roasts-you-into-working-out-5601</link>
      <guid>https://dev.to/symbiex/building-the-ai-fallback-ladder-behind-lock-tf-in-an-app-that-roasts-you-into-working-out-5601</guid>
      <description>&lt;p&gt;I just shipped my first solo iOS app: &lt;strong&gt;LOCK TF IN&lt;/strong&gt; — a fitness accountability app where an AI drill sergeant roasts you when you skip a workout. Log a session and it leaves you alone. Ghost it, and it goes off on you by name.&lt;/p&gt;

&lt;p&gt;The bit is simple. The engineering behind making that bit reliable for every user, on every device, on every network condition, was not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: the AI &lt;em&gt;is&lt;/em&gt; the product
&lt;/h2&gt;

&lt;p&gt;Most apps can gracefully degrade when a network call fails — show a spinner, retry, fall back to cached data. LOCK TF IN doesn't have that luxury. If the AI coach doesn't respond, there's no app. The roast is the entire value proposition.&lt;/p&gt;

&lt;p&gt;So I built what I've been calling the fallback ladder: three tiers, each one a full replacement for the one above it, not just an error state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 1: On-device Apple Intelligence
&lt;/h2&gt;

&lt;p&gt;When the device supports it, the roast is generated entirely on-device using Apple's local models. No network round trip, no server cost, works offline, and — genuinely important for a satire app — no risk of a cloud provider's safety filter neutering the joke into something toothless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 2: Cloudflare Worker proxying a cloud model
&lt;/h2&gt;

&lt;p&gt;Free users on older devices, or anyone without on-device AI available, still need a &lt;em&gt;real&lt;/em&gt; AI coach — not a worse, static experience. A Cloudflare Worker proxies requests to a cloud model, funded by Pro subscriptions rather than gated behind them. The free tier isn't a stripped demo; it's the same bit, just server-generated instead of on-device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 3: Hand-written roast library
&lt;/h2&gt;

&lt;p&gt;If both AI paths are unreachable — rate limited, offline with no on-device support, cold start — the app falls back to a library of hand-written roasts. This was the part I underestimated hardest. Writing "good enough to not break the illusion" fallback copy took nearly as long as the onboarding flow, because a bad fallback doesn't just feel worse, it breaks character in a product where character is the whole pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;I built the fallback ladder &lt;em&gt;after&lt;/em&gt; the UI, treating it as a hardening pass. In hindsight it should have been the first thing designed, because it drove real architecture decisions (how state is cached, how retries are timed, what "loading" even means when tier 1 is instant and tier 3 needs a network call) that I ended up retrofitting.&lt;/p&gt;




&lt;p&gt;LOCK TF IN is live on the App Store: &lt;a href="https://locktf.com" rel="noopener noreferrer"&gt;locktf.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built solo with SwiftUI. Happy to go deeper on any part of this — the on-device/cloud detection logic, the Worker setup, or the roast-writing process — in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>ios</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
