Gajanand Sharma
Build
focusstationShipped

FocusStation v0.1.1 — Shipping Reveals Everything You Missed

·4 min read

Release notes →

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

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:

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 →