Don't you just love ripping it all up and starting again?
Don’t you just love ripping it all up and starting again?

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

Pretty plain and functional, prints out the content in a semi-readable format.

Look at the keyboard controls! It’s not bad, but, it’s not great either!

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.


Like spending your life mowing with an old-fashioned push mower, and then suddenly being gifted with a huge, super duper power mower (that sometimes forgets it’s a mower)

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 completely re-written dashboard UI, powered by bubbletea

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.

Need to see more of the code around the violation? Just press ‘x’

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.

Documentation for all the rules available right there in the terminal, just press ’d'

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.

No room? No problem. vacuum will make the best use of space available so you can see and operate (even in a tight spot)