- [Part 1] Rebuilding an Abandoned Pomodoro App — Why 'Lo-Fi Focus Studio' and 'Focus-to-Earn'? (Current Post)
- [Part 2] Balancing Monetization and Fairness — Rewarded Ads & a 4-Layer Anti-Abuse Architecture
- [Part 3] "Synthetic Audio Sounds Fake" — Adopting Google Studio Field Recordings & a Multi-Channel Ambient Mixer
- [Part 4] Bypassing the iOS 26 JIT Memory Protection Crash & Crafting the Apple Watch Series 10 Circular UI
- [Part 5] A Timer That Never Stops — Mastering Android Doze, iOS Silent Audio Loops, and Bidirectional Watch Sync
After leaving So Simple Pomodoro v1.0 untouched on the stores for a year, we rebuilt the entire codebase from the ground up into v2.0: a cross-platform 'Lo-Fi Focus Studio & Focus-to-Earn' ecosystem spanning Android, iOS, Apple Watch (watchOS), and Galaxy Watch (Wear OS). In Part 1, we diagnose why generic timer utilities fail to retain users and explain how we combined an atmospheric dark studio workspace with a behavioral-economics lottery loop (up to 3 focus tickets per day).
1. Prologue: Reopening a Year-Old Pomodoro App
Almost every developer has started a side project thinking, "Let's build a clean, minimal utility app and ship it to the App Store and Play Store." For me, that project was So Simple Pomodoro. I shipped v1.0 with mobile and smartwatch targets, but if I am honest, the app sat neglected for nearly a year without a single meaningful update.
When I finally booted up the project and opened v1.0 on my phone and watch—evaluating it not as its creator, but as a critical everyday user—the flaws were undeniable:
- Blinding Glare & Zero Emotional Appeal: A stark white background (
#FFFFFF) with a plain25:00label and two buttons. On a dim desk late at night, it strained the eyes and offered zero ambiance. - Broken Background Reliability: Locking the phone screen allowed OS battery savers to throttle or suspend the countdown, causing alarms to fire late or not at all.
- No Retention Loop: Completing a 25-minute session yielded nothing. There was no compelling answer to the question: "Why should anyone open this app every day instead of the built-in OS clock app?"
"Stop building a mere digital stopwatch. Build an atmospheric workspace (Lo-Fi Focus Studio) users want to keep open on their desk, paired with a behavioral reward loop (Focus-to-Earn) that motivates them to complete three real focus sessions every day."
2. Pillar 1: The 'Lo-Fi Focus Studio' Dark UI/UX Architecture
Millions of developers, students, and creators tune into 'Lofi Hip Hop Radio - Beats to Relax/Study to' while working. Why? Because the cozy ambiance of a late-night desk lamp, rain tapping against the window, and warm analog equipment reduces cognitive friction and eases the brain into deep flow.
We threw out the blinding white interface of v1.0 and engineered a cohesive design system around a "Lo-Fi Focus Studio" identity:
| Design Token | HEX Code | Visual & Psychological Role |
|---|---|---|
| Background Surface | #121318 / #1C1E26 |
Deep charcoal studio backdrop that eliminates night glare and saves battery on OLED displays |
| Focus Accent | #F59E0B (Warm Amber) |
Evokes the warm glow of an analog vacuum-tube studio lamp during active focus sessions |
| Break Accent | #10B981 (Soft Emerald) |
Shifts immediately to a calm emerald green during breaks to signal visual and mental decompression |
| Typography | Tabular Figures |
Monospaced numeral metrics prevent horizontal layout jitter as seconds tick down |
Instead of cramming every feature onto a single screen, we organized the experience into a clean 4-Tab Spatial Architecture:
Production Flutter Theme Implementation
In lib/main.dart, our custom studio color tokens are bound to a Material 3 dark color scheme with tabular numeral rendering:
// lib/main.dart — Lo-Fi Focus Studio theme tokens
class StudioColors {
static const Color bgDeep = Color(0xFF121318);
static const Color cardSurface = Color(0xFF1C1E26);
static const Color cardElevated = Color(0xFF252834);
static const Color focusAmber = Color(0xFFF59E0B);
static const Color breakEmerald = Color(0xFF10B981);
static const Color textPrimary = Color(0xFFF3F4F6);
static const Color textSecondary = Color(0xFF9CA3AF);
}
ThemeData buildStudioTheme() {
return ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
scaffoldBackgroundColor: StudioColors.bgDeep,
colorScheme: const ColorScheme.dark(
surface: StudioColors.cardSurface,
primary: StudioColors.focusAmber,
secondary: StudioColors.breakEmerald,
),
fontFamily: 'Pretendard',
);
}
3. Pillar 2: 'Focus-to-Earn' & Behavioral Economics
Even the most polished dark UI won't bring users back on Day 30 without a compelling reward loop. During product discovery, we asked: "How can an indie developer fund ongoing rewards sustainably through ad revenue while giving users a genuinely exciting incentive to focus?"
Why a 'Weekly Lucky Draw' Beats Fixed Micro-Points
Many pedometer or reward apps hand out fractions of a cent per action. For an indie developer, fixed cash liabilities across a growing user base quickly become unsustainable; for users, earning $0.002 after 25 minutes of hard study feels trivial and demotivating.
According to Prospect Theory in behavioral economics, people experience significantly higher anticipation and engagement from a chance at a meaningful weekly prize (such as coffee gift cards or store vouchers) than from tiny guaranteed micro-payouts. That insight led directly to our Weekly Focus Lottery mechanics:
| Policy Parameter | Configured Value | Behavioral & Systems Engineering Rationale |
|---|---|---|
| Minimum Focus Duration | >= 20 minutes |
Prevents 1-minute timer farming and enforces a genuine deep-work threshold |
| Daily Focus Ticket Cap | Max 3 tickets / day |
25m × 3 sessions = 75 minutes of daily deep focus. Stops bot farming and prevents burnout |
| Unique Ticket Issuance | #A7F92C (6-char Hex) |
Pops up a tactile gold ticket modal with a unique serial code immediately upon session completion |
| Weekly Draw Cycle | Every Sunday 23:59 |
Resets the pool weekly so every Monday starts on a level playing field |
The Power of the "3-Session Daily Routine"
Capping focus-earned tickets at 3 per day solved two problems simultaneously. Unlimited tickets would have invited 24/7 emulator farms to monopolize the draw pool. By capping focus tickets at 3 per day, ordinary students and developers get an achievable, satisfying daily quest: "Complete 3 focus sessions today (75 minutes) to max out my daily lottery tickets!"
4. Up Next: Monetization & the 4-Layer Anti-Abuse Architecture
Introducing real-world rewards immediately raised two critical engineering challenges:
- "How do we integrate AdMob monetization without ruining a user's deep focus with annoying pop-up ads?"
- "How do we stop malicious users from fast-forwarding the clock or forging HTTP requests to mint unlimited lottery tickets?"
In [Part 2: Balancing Monetization and Fairness — Rewarded Ads & a 4-Layer Anti-Abuse Architecture], we walk through our zero-interruption opt-in ad model and the 4-layer defense pipeline spanning Dart wall-clock verification to Supabase PostgreSQL SECURITY DEFINER RPCs.