
I hate this
Running the lint
command on vacuum would result in the same ugly mess spewed out of
my terminal; haphazard, uncoordinated, and higgledy-piggledy. Not to mention the quite awful dashboard
command would
frustrate the pants off anyone trying to depend on it.
Sloppy and slapdash, it looked like AI had generated it, except it hadn’t.
I had generated it and created that mess.
Time to fix that.
More specifically, time to fix the fact that vacuum’s terminal experience was built without any design in mind.
In the beginning
It started with just sketching up ideas with the UX, until it worked. There was never really the opportunity to circle back and clean things up, and really take the time to think deeply about the experience.
To be honest, there was never any expectation for vacuum to become a critical part of so many workflows, so all the effort went into the lower-level guts of the machine (which is what pb33f is all about).
First steps
Let’s go back in time and take a look at the vacuum in its earliest days. Here is v0.0.26


I mean, it worked (mostly) and did the job, and so the focus shifted to working on libopenapi and other pb33f tools and utilities, to really get in under the skin of OpenAPI.
A strong core, ugly face
The last couple of years focused on the components that vacuum is composed of and in particular, libopenapi, libopenapi validator, and the doctor library.
These core components are what power the higher-level applications that I build. If these elements are shit, then my apps are shit.
It’s been an amazing journey so far…
- 3,687 commits
- 988 pull requests
- 674 closed issues
- 142 contributors
- 2,163 stars
- 245 forks
All this hacking has resulted in a robust, solid, fast, and now widely used tool. It’s just fucking ugly in the terminal.
Well, it was…
Claude, what if?
A few weeks back, while hacking some code and working with Claude Code, a thought popped into my head as I was dragging a screenshot from my desktop into the terminal.
I was trying to show Claude a picture of the latest mess it had created.
When suddenly it dawned on me.
The terminal is back where it’s at.
All day long, all day! That’s how much time I am spending in the terminal nowadays. Terminal UIs (TUIs) are hot again and AI and agentic coding have been providing the tailwind on the movement.
Over the past couple of years, I’ve tried out a bunch of different TUI frameworks that are built in Go, mainly because it’s one of my specialities, but primarily because I like trying things out until I find the SDK that fits my hands the best.
If you’re interested, some remarkable frameworks I have used in the past are:
One of the absolute best TUI frameworks out there for Go is bubbletea and the ecosystem they have created. I’ve been itching for an opportunity to learn it, understand how it works, and use it.
The problem is always time.
So, I asked Claude…
“Hey Claude, I really want to revamp the vacuum UX, how much work would it be to replace pterm and termui with bubbletea”
And for the next five days, I vanished into a black hole. The hunger got to me, unable to stop; The addiction took over.
My thoughts on AI coding right now
AI coding has passed a fulcrum point, in particular Claude Code
If you have not tried it, please for the love of everything that you hold dear, do try it.
I am a proud $200 a month max user. I use it for everything now, particularly the Opus model. It’s mostly a joy to work with, and it’s all terminal-based.
The value isn’t that the tool is terminal-based, the value comes from the sheer amount of code I no longer have to write.
Typing a vast amount of code every day has taken a physical toll on my arms, particularly my forearms.
Tennis elbow in both arms, all the time!
Massage and NSAIDs can only go so far. Some moments felt like my days coding ahead were limited.
Just moving my hands and wrists was causing pain, and my typing was becoming slower and more erratic.
As a software engineer, this is highly concerning; something has to give, but what?
- Slowdown or stop coding? NEVER!, Hacker for life!
- Employ someone else to code for me? What’s the point?
- Ask a robot to do it?
Ask a robot to do it, indeed. This is why Claude has changed the game. The robots can mostly do it now.
Almost there. Left a bit, no right a bit…
Well, mostly because it has taken some time to learn how to get the AI to do what I want, how I want it, and where I want it. Like all new power tools, once that muscle memory forms, the output to input ratio becomes exponential, like fusion power!
Claude Code allows me to
- Read and understand a complex codebase in minutes vs days.
- Hold huge amounts of context in my working memory.
- Diagnose strange glitches in complex code.
- Debug everything! Query everything!
- Generate the vast majority of my code
- Work in multiple codebases at the same time in real time.
- Build significantly more (I mean 300–400% more) valuable code.
Power is being able to do more, with less, without taking a hit on fidelity or quality.
With decades of software engineering experience, being able to unleash all of it at scale without having to type, or having to adhere to the emotional needs of brilliant yet sometimes emotionally challenged engineers is life-changing.

Five days later
ENOUGH! It is ENOUGH Quobix! Stop!
And the job was done, no more polishing, no more cleaning, no more ‘just one more thing’.

A modern, mouse-enabled, fast, slick, cool, and useful terminal UI for vacuum.
Much better!
Always on watch
The dashboard now includes a --watch
or -W
flag that will monitor all changes as you edit, and relint and reload as you continue editing.
Zoom in, enhance…
Sometimes a snippet of code isn’t enough, and we need to see the violation in context.

RTFM
One of the more annoying aspects of a linter is understanding the ‘why’ behind the what. So what if a user could press ’d’ when looking at a rule, and the docs load up. No need to ask your AI or even Google it anymore.

I love this
vacuum should look good at any resolution, it should feel, look, and operate like a well-oiled machine at every point, And until recently, it wasn’t.
vacuum’s lint
and dashboard
commands are now completely revamped and backwards compatible.
vacuum is now also responsive, so it does a good job of resizing output correctly based on the available space, even at the smallest widths.
