Personal Pomodoro: AI-Built Native Mac App
A complete macOS menu bar Pomodoro timer built by Gemini 3.7 Flash in a single session — 18 Swift files, snooze penalty engine, stats dashboard, and it ships dockless.
18 Swift files · 2,295 LOC · SPM · dockless LSUIElement

Default state. Classic Focus at 25 minutes, Quick Sprint, Deep Work, and custom presets. The 🍅 lives in your menu bar.




A model evaluation disguised as a productivity tool. Give Gemini 3.7 Flash a non-trivial native macOS app to build from scratch — not a web app, not a script, but a real SwiftUI menu bar application — and see how far it gets without intervention.
It got all the way.
What the model built
| Component | Implementation |
|---|---|
| Architecture | 18 Swift files across Models/Services/Views with clean separation |
| Timer engine | DispatchSourceTimer at 250ms against wall-clock target — drift-proof |
| Penalty system | 2 free snoozes → escalating to physical challenges, break time tax, lockout |
| Break tasks | 8 curated micro-tasks: stretches, eye breaks, hydration, breathing |
| Stats | Daily tracking with midnight resets via UserDefaults persistence |
| Sound | NSSound wrapper with 10 alert chimes and live preview in settings |
| Shell | Dockless LSUIElement, NSPopover glass panel, pure menu bar citizen |
The test, not the tool
The real output isn't a Pomodoro timer — it's a datapoint. Can a flash-tier model produce a shippable native macOS application with system-level features, clean architecture, and zero human code intervention?
The answer: yes, with caveats. The initial build compiled and ran. Two bugs surfaced — NSPopover key window focus and tab label overflow — both fixed by the model in the same session. The penalty engine, stats dashboard, and sound system all worked first try.
Under the hood
The app runs as a pure LSUIElement accessory — no Dock icon, no menu bar, just a 🍅 that opens a glass popover. State machines manage timer lifecycle (idle → running → paused → break → complete), and the penalty engine tracks snooze history across sessions to escalate consequences.
Built entirely in a single Antigravity session on August 14, 2026. Shipped to GitHub with 26 files and zero git history.