

I’ve been using Obsidian for a while. Notes, todos, thinking - all markdown files on disk. I love it, but opening a full app just to check off a todo or jot something down(and hoping I don’t get distracted by something else in the process) felt like too much friction.
I kept looking for a menubar app that would just… work with my setup. Something that felt native and polished, kept markdown files as the source of truth, and get out of my way. None of them felt right - I didn’t want yet another app I’d abandon in two weeks because it doesn’t sync with how I actually think and work. I wanted a thin layer on top of what I already had.
So I built it. Flowbar - a native macOS overlay app you can summon with a keyboard shortcut.
Process
I thought it would be quick. Models can write Swift, right? I figured I could just describe what I want and ship it.
That’s… sort of what happened. But also not. The code part was mostly solved. What wasn’t solved was everything else.
I started by prototyping the UI on Stitch. Then moved to Claude Code for all the actual product work. Over ~160 commits, I rarely had to touch code myself. But I still had to be in the loop the entire time. Architecting, refactoring, making sure the app actually felt good, thinking about the right abstractions.
Models don’t have taste. The agent would nail the logic but completely botch how a transition feels, or miss that a panel should dismiss when you click outside it, or not handle the edge case where you rename a file while the timer is running, or add an inconsistent color ruining the aesthetics. These are the things that make an app feel good, something you actually want to use daily from a one-off demo. And there are hundreds of them.
A few things helped a lot. I encoded as much behavior as possible into tests to stop things from regressing. Also wrote a bunch of skills that accumulated architecture decisions, design preference, pitfalls to avoid - reusable instructions the agent could reference to stay consistent across sessions.
Making the agent self-verifying was another unlock. I gave it the ability to build the app, take screenshots, and check how things look before calling it done. Initially it was flaky because the accessibility tree was full of opaque labels like “group 4 of UI element 1”. After renaming all the a11y fields properly though, reliability went way up.
Building the app was only part of it. I also wanted to build a proper website which looks good, a logo and a product video. The logo was easy, generated by Littlebird which also of course helped me write this post, because I can’t be bothered to remember everything I did.
For the website backdrop, I wanted a cinematic looping video, tried it with Sora and Veo, neither worked. But Grok delivered. It wasn’t looping cleanly though, so I got the agent to write a script using ffmpeg and SSIM - structural similarity comparing frames across the video and find the optimal cut point where the start and end match closely enough to feel seamless. That worked.
For the product video, I used Claude Code with Remotion for the video and Gemini for the background AI music. This included some back and forth - fixing text flicker on transitions, getting the pacing right, making it not feel like a “cringe PowerPoint slide” as I kept telling the agent.
The Takeaway
Building a well-crafted app I’d actually want to use daily - something with a good UX and the right feel, is still hard. The “hand-coding” part is mostly solved, sure. But there is so much more that goes into making something good: product sense, architecture, design taste, debugging skills, and the patience to care about details that no model will care about on its own.
But if you have good taste, strong engineering judgment, and you’re willing to stay in the loop, you can build a lot in a very short time and at a quality bar that would’ve been impossible to hit solo before. I barely write Swift.
It still feels magical to me that all this is possible. There’s something child-like about watching an agent trying different things, run builds, take screenshots of its own work, and iterate.
Try Flowbar here.