Overview
FocusForge is an iPhone focus timer with a customizable character, session history and cosmetic rewards. I designed and built it to test whether visible progress encourages regular use.
The session flow
A user names a task, chooses a focus duration, and starts the timer. Focus sessions alternate with short or long breaks. Completed sessions show earned XP and coins; the user can then review progress, equip cosmetics, or return to the timer.
I kept the timer screen sparse and moved the character and reward animation to the completion screen. The reward sequence can be skipped and supports Reduce Motion.
What earns rewards
The app rewards completed time and consistency. It does not measure attention or the quality of the work.
- Session rewards: each whole planned focus minute earns one base XP and one coin when the session completes. A completed 25-minute session therefore earns 25 base XP and 25 coins, before bonuses.
- Streak bonus: streak days add an XP multiplier, capped at 50% extra. Coins do not receive that multiplier.
- Other progression: daily and weekly quests offer additional XP and coins. Cosmetics can be bought with coins or unlocked at streak milestones of 3, 7, 14, 30, and 60 days.
- Breaks and abandoned sessions: neither earns session XP or coins. Abandoned sessions remain in the local history with their actual duration.
Coaching from a written catalog
The app labels this feature “AI Coach,” but it uses an on-device template engine, without a hosted language model. It selects written prompts using recent completion and abandonment rates, session length, and streak risk. Task keywords help select a pre-session prompt.
With the relevant coaching settings enabled, users can edit, accept, or dismiss a suggested task framing before starting. After a completed focus session, they can mark a reflection helpful or not helpful. A streak nudge can be opened or dismissed.
The coach engine source contains the written prompts and selection logic.
Local coaching, with Firebase analytics
SwiftData stores task names, session records and progression on the device. Coaching uses those local records. Firebase handles usage analytics and crash reporting.
Firebase Analytics is enabled by default. Session events include planned and actual duration, rewards, and streak information. The reviewed session events send the task name’s character count, rather than the task text. Firebase Crashlytics also provides crash diagnostics.
Users can turn product analytics off under Settings → Privacy → Send anonymous analytics. The preference gates events in the app and Firebase’s analytics collection. It is not a switch for crash reporting.
Current state and next checks
The MVP includes the timer, local session history, character customization, rewards, quests, statistics, and coaching. iPad layouts and CloudKit sync are deferred.
Settings can export local progress as JSON, but v1.0 cannot import that file to restore progress. The export implementation lists the included records.
Beta testing will check whether people return to the app, whether rewards help them work and whether coaching is useful. Native accessibility testing and release preparation are also planned. Retention and focus-quality improvements remain unmeasured.