Skip to content
← Back to work
Case Study / FocusForge

FocusForge

Character-driven Pomodoro for iOS that translates focus sessions into RPG-style character progression. Template-based on-device AI coach for intent framing, post-session reflection, and streak rescue. Built in SwiftUI; feature-complete and entering beta.

SwiftUI + SwiftDataOn-device AI coachFirebase + CrashlyticsWCAG AA + Reduce MotionSource ↗
Translation artifact
2026Solo build
01Problem
Situation: Productivity apps externalize discipline — lists, streaks, gamified habit chains, social accountability — adding friction outside the user and expecting it to translate into focus.
Complication: Streak-based gamification rewards consistency, not focus: a five-minute task done to preserve a streak optimizes the metric and decouples from the underlying goal. External accountability erodes intrinsic motivation. AI productivity coaches handle behavioral data — what you work on, when, for how long — by uploading it to a server, a privacy posture incompatible with the user base most likely to benefit.
Question: Can a focus tool reward the work itself by translating effort into something the user values intrinsically — without ever uploading their behavioral data?
02Requirements
  • Focus user

    Cosmetic progression must gate on streak days, not total minutes — five minutes of deep work advances the character more than thirty of shallow work.

    Resists the streak-preservation farming behavior

  • Privacy-conscious user

    AI coaching must never upload behavioral data; on-device by construction, not by policy.

  • Streak-rescue moment

    A nudge near the loss window that surfaces honest reflection, not shame or a dopamine hit.

  • Accessibility floor

    WCAG AA contrast on every text token; VoiceOver, Dynamic Type, Reduce Motion alternatives across every animated surface.

    Two FFTheme adjustments raised computed contrast to AA

03Decision

Cosmetic progression on streak days plus on-device template-based AI coach over computed behavior signals

chosen
  • meets criterion: Resists farming
  • meets criterion: Preserves intrinsic motivation
  • meets criterion: Privacy by construction
  • partially meets criterion: Build effort

Cosmetic unlocks gate on streak days rather than total minutes, which eliminates the streak-preservation farming behavior trackers usually create. The AI coach is a deterministic template engine over computed behavior signals (completion rate, abandonment rate, average session length, streak risk), producing structured reflections without sending data to a server. Privacy is structural by construction — inference is on-device. The constraint shrinks coach flexibility; the design philosophy welcomes that. An LLM upgrade is reserved for when on-device models can do the job without uploading.

Standard streak/badge tracker with server-side LLM coach

  • does not meet criterion: Resists farming
  • does not meet criterion: Preserves intrinsic motivation
  • does not meet criterion: Privacy by construction
  • meets criterion: Build effort

Cosmetic progression on streak days, no AI coach

  • meets criterion: Resists farming
  • partially meets criterion: Preserves intrinsic motivation
  • meets criterion: Privacy by construction
  • meets criterion: Build effort
04Solution

RPG-style character progression as the meaning layer, with on-device template-based coaching at three behavioral moments — intent framing, post-session reflection, streak rescue.

Character progression as meaning layer
Each focus session feeds an RPG-style character with body/hair/eyes plus three equipment slots. Cosmetic items unlock at streak milestones (days 3, 7, 14, 30, 60) or via a coin economy. Rarity tiers visually distinct at thumbnail size — animated rare items shimmer at 72px. Reframes the relationship from "did I keep my streak" to "what does my character become."
On-device AI coach (template-based)
Deterministic template engine over computed behavior signals. Three coach moments: intent framing before a session, post-session reflective tip, streak rescue near the loss window. User can edit, accept, dismiss, or rate every output. Behavioral data never traverses the network.
Two-mode design system
Focus mode (near-black canvas, minimal UI) and reward mode (deep purple atmosphere, layered glows, particles, dramatic character lighting). Implemented through the FFTheme token system gating colors, type, and spacing. The contrast is load-bearing for the cinematic reward sequence.
05Outcome

Sprints 1–5 functionally complete on main; Sprint 6 (beta runtime, App Store submission, accessibility pass) is the current work. The empirical question — whether character-progression-as-meaning-layer outperforms streak-defending designs on retention — is what comes after beta.

Overview

Most productivity applications externalize discipline. Lists, streaks, gamified habit chains, social accountability — the tools work by adding friction outside the user, expecting that friction to translate into focus. The empirical evidence is mixed: streak-based apps report high install counts and low long-term retention, and the "I broke my streak so I quit" failure mode is well-documented.

FocusForge is a built-from-scratch iOS app testing a different hypothesis: focus tools work better when they translate effort into something the user values intrinsically, rather than tracking it as something the user must defend. Rather than adding friction, the app translates focus sessions into character development inside an RPG-style progression system. The character grows as the user does the work.

RoleStrategy, design, and engineering
Year2026
DomainMobile productivity / behavioral design
StackSwift · SwiftUI · SwiftData · Firebase · Swift Charts
StatusMVP build · entering beta

Problem framing

Three observations underwrite the design:

  1. Streak-based gamification rewards consistency, not focus. A user who completes a five-minute task to preserve a streak is being rewarded for the wrong behavior. The metric optimizes itself and decouples from the underlying goal.
  2. External accountability erodes intrinsic motivation. A growing literature in behavioral psychology — and the lived experience of anyone who has used a habit-tracking app — suggests that surfacing extrinsic rewards crowds out the intrinsic reward of doing the work itself.
  3. AI coaching that uploads user data is increasingly unacceptable. Productivity data — what you work on, when, for how long — is among the most sensitive behavioral data a user produces. Most AI productivity products handle this by sending the data to a server and analyzing it there. The privacy posture is incompatible with the user base most likely to benefit.

Solution

The build commits to three structural design decisions:

Character progression as the meaning layer

Each focus session feeds an RPG-style character that the user customizes during onboarding and continues to develop over time. The user is not tracking minutes — minutes are the input. The output is a character with a visible body, hair, eyes, and equipped cosmetics across three slots (horns, wings, weapon). Cosmetic items unlock at streak milestones (days 3, 7, 14, 30, 60) or via a coin economy earned through completed sessions. Rarity tiers (common, rare, animated rare) are visually distinct at thumbnail size — the animated rare items get a continuous shimmer effect that reads instantly even at the 72-pixel inventory grid.

The deliberate move: the relationship is reframed from "did I keep my streak" to "what does my character become."

On-device AI coaching, template-based

The AI coach is implemented as a deterministic template engine over computed behavior signals — completion rate, abandonment rate, average session length, streak risk score — selecting and rendering structured reflections without sending data to a server. Three coach moments are wired: intent framing before a focus session begins (only with task name + AI Coach enabled), a post-session reflective tip, and a streak rescue nudge near the loss window. The user can edit, accept, dismiss, or rate every coach output.

The privacy commitment is structural, not policy-based. Inference is fully on-device by construction. Behavioral data never traverses the network. This constrains the coach's flexibility — the templates are deterministic — but the design philosophy welcomes that constraint. An LLM upgrade is reserved for when on-device models can do the job without uploading.

Progression that resists farming

The system explicitly does not reward duration over depth. Cosmetic unlocks gate on streak days, not total minutes. Five minutes of deep work advances the character more than thirty minutes of shallow work. Combined with on-device AI nudges that surface honest reflection rather than dopamine hits, this eliminates the streak-preservation behavior that degrades existing tools.

Implementation

The app is built natively in Swift and SwiftUI on iOS 17+, using SwiftData for local persistence. Firebase handles analytics, crash reporting (Crashlytics), and remote config. The design system establishes two emotional registers — focus mode (near-black canvas, minimal UI, restrained) and reward mode (deep purple atmosphere, layered radial glows, particles, dramatic character lighting) — implemented through a token system (FFTheme) that gates all colors, typography, and spacing.

A few implementation notes worth documenting:

  • Sprint structure. Six sprints across timer/sessions, streaks/rewards, character cosmetics, quests/stats, AI coach, and release/QA. Sprints 1–5 are functionally complete on main; Sprint 6 is the current work — beta runtime, App Store submission, accessibility pass.

  • Two-mode UI redesign mid-build. The app underwent a design system overhaul partway through implementation — from default SwiftUI styling to a dark atmospheric system with explicit FFTheme tokens. The redesign replaced sheet-based reward presentation with a full-screen cinematic overlay that runs a five-beat staged reveal animation: ring pulse → background crossfade → checkmark + headline → reward card + count-up → CTA button. Tap anywhere skips to final state. Reduce-motion users get a cross-fade variant.

  • Accessibility before App Store. The app passes WCAG AA contrast on every text token. Computed contrast ratios drove two FFTheme adjustments — Text.tertiary from white(0.30) to white(0.50) (2.58:1 → 5.30:1) and Rarity.rare from #9B59B6 to #B07DCB (4.23:1 → 6.25:1). VoiceOver support, Dynamic Type semantic font scales, and Reduce Motion alternatives are wired across every animated surface. Hit targets meet HIG ≥44pt minimum.

  • Strategic scope decisions. iPad universal layout and CloudKit sync (originally Sprint 5 deliverables) were deferred to v1.1. The PRD's success metrics — D1/D30 retention, focus minutes per DAU, AI suggestion acceptance — are all measurable iPhone-only, and including iPad + sync would have pushed the launch by five-plus weeks for no measurable user benefit.

Reflections

  • The template-based AI coach is the right move for v1.0. Behavioral data is among the most sensitive categories users produce. Shipping a server-side LLM as the productivity coach would have been a stronger product on paper and a worse product in practice. The template engine is deterministic, on-device, and ships today; an LLM upgrade is reserved for when on-device models can do the job without uploading.

  • Cosmetic unlocks tied to streak days, not minutes, defused the farming risk. The concept-stage worry was that minutes-of-focus would dominate the reward calculus. Gating progression on consistency (streak days, milestone unlocks) rather than duration redirects the optimization pressure toward showing up daily — which is the actual behavior the product wants to reinforce.

  • The dark atmospheric redesign was scope creep that paid off. Adding a design system mid-build expanded the timeline, but the alternative — shipping default SwiftUI styling — would have undercut the "this is meaningful, not a checklist" promise. The two-mode philosophy (focus mode = restraint, reward mode = richness) is now load-bearing for the cinematic reward sequence; without the contrast, the reward moment lands as a normal sheet.

  • Backlog hygiene matters more than features past a certain point. At week 9 of a 12-week timeline, half the open issues described work that had already shipped. A simple commit-by-commit triage closed twenty issues in an hour and revealed the real remaining scope (mostly testing and submission, not code).

Closing observation

The hypothesis being tested: productivity tools work better when they translate effort into something the user values intrinsically, rather than tracking it as something the user must defend. A character that grows when you work changes the question from "did I keep my streak" to "what does my character become." That is a different — and possibly more durable — relationship with focus.

Whether the empirical retention data backs that up is the next thing to measure. The answer comes after beta.