FocusStation v0.1.1 — Shipping Reveals Everything You Missed
v0.1.0 shipped. Then I actually used it.
I was proud of v0.1.0. A menu bar timer built over a few weekends by someone who'd never written Swift. Nineteen files, zero dependencies, shipped.
Then Monday came. I sat down to work and the timer froze. The popover stopped updating. The menu bar went blank. Tasks kept reordering themselves whenever I started one. Editing a running task was impossible — clicking the text field did nothing. Closing my laptop mid-timer made the clock stop.
Every single bug was something I missed because I was testing in isolation. Start a timer, verify it runs, move on. I wasn't living with the app. Real usage exposes everything.
v0.1.1 is five days of fixing what v0.1.0 got wrong. Same feature set. Everything actually works now.
What was broken
The sleep timer
Close your laptop mid-timer. Open it three hours later. v0.1.0 showed the same elapsed time as when you closed it. Your 2-hour meeting still said 2 hours.
The code was actively pausing timers on sleep. That broke the timestamp math — the whole point of timestamp-based timing is that it survives sleep naturally. Fix: stop pausing. Let Date() advance through sleep. Thirteen lines deleted. Zero lines added.
The frozen popover
Elapsed time in the dropdown only updated when you moved the mouse or clicked something. Not smoothly. Not every second.
The app was destroying and recreating the entire popover every single second. Every timer tick nuked your edit state, your hover state, your scroll position. Fix: update the label only. Let the popover live. Six rewrites to get right.
The blank menu bar
Start a task. Popover says it's running. Menu bar shows just a brain icon.
The status item width wasn't updating when content changed. Fix: measure the content, set the width manually, clamp between 24-260px. Called on every tick and every state change.
Other things that broke
- Editing a running task did nothing — background state sync was clobbering the edit form. Fixed by pausing sync during edits.
- Starting a task jumped it to the top of the list — sort was by activity, not insertion order. Fixed by sorting on insertion order only. Drag-and-drop is now the only way to reorder.
- No visual signal when you blow past your target — set 30 minutes, hit 2 hours, timer color never changed. Now elapsed time turns red when you're past target.
What I learned
"It works on my machine" is a lie. Every bug was something I missed testing in short bursts. I wasn't sleeping my Mac mid-timer. I wasn't editing tasks while one was running. I wasn't letting the popover stay open for an hour. You have to live with the product to find the real problems.
Shipping is not the finish line. v0.1.0 was the starting gun. Five days of bug fixes followed. That's the actual work — not the glamorous launch, but the quiet week of making things actually reliable.
The AI can build it, but you have to break it. v0.1.0 was vibe-coded. v0.1.1 was debugged by a human using the actual app, filing concrete bugs, and verifying fixes. The AI wrote the fixes. I found the problems. That's the contract.
What's next
The core loop is solid now. What comes next:
- Today's total — see your cumulative focus time for the day
- Notifications — optional ping when you cross a target
- Keyboard shortcuts — global hotkey to start/pause
- Statistics — daily/weekly breakdown of where time went
- Code signing — proper cert so there's no Gatekeeper warning on first launch
But none of that matters until the foundation is bulletproof. v0.1.1 is that foundation.
Still 19 Swift files. Still zero dependencies. Still built by someone who never shipped Swift before this month.
Previously: The Problem FocusStation Solves → · v0.1.0 First Release →