Or: How I finally realized my beautiful prompt was slowly killing me
I wanted to talk with you about something not usually discussed, terminals and the way one works with them…
I switched Kubernetes contexts for like the hundredth time the other day, and something felt… weird. Different. this is not instant. what would happen if I just disable Powerlevel10k after years used to working with it, essentially an integral part of my workflow.
Holy shit.
Then it hit me like a ton of bricks.
My terminal wasn’t slow. My prompt was.
The Problem I Didn’t Know I Had
Look, I’m a DevOps/SRE engineer, I essentially live in the terminal. Switching Kubernetes contexts? That’s basically my whole day. Production, staging, development. Multiple clusters, multiple namespaces. heck I even aliased kubectx into kx. pure muscle memory at this point.
And for years, every single one of those switches felt… off. Not terrible, you know? Just this tiny bit of lag. That barely-there sluggishness between hitting Enter and seeing my prompt again.
I blamed literally everything:
- iTerm2 is getting old and crusty
- Maybe I need more RAM (always the answer, right?)
- Kubernetes is just slow sometimes
- My Mac is throttling or something
Never once did I think “hey, maybe it’s this beautiful Powerlevel10k/Starship prompts I spent years configuring and tweaking.”
The Great Terminal Hopping
Like probably half the engineers I know, I went through what I’m calling the Great Terminal Migration of the last couple of years…
iTerm2 just felt… archaic? Heavy. All those settings buried in GUI menus somewhere. It worked fine, but it didn’t spark joy, you know?
Ghostty came next — Mitchell Hashimoto’s new project. Blazing fast! But also super minimal. Like, too minimal. Missing features I actually needed. It’s early days for that project.
Kitty seemed perfect. Fast, great config system, clean. But here’s the thing: I actually use my mouse sometimes. And Kitty is extremely keyboard-centric. No right-click menus, very opinionated about mouse usage. As someone whose hand is often on the mouse… yeah, dealbreaker.
Enter WezTerm. GPU-accelerated (written in Rust, because of course), Lua config so you can actually program it, works great with both mouse and keyboard. And it had this thing I didn’t know I desperately needed:
a built-in status bar.
The “Holly Crap!” Moment
The WezTerm status bar is what changed everything for me. Not because it’s pretty (though it is), but because of where it actually lives.
Here’s the thing I didn’t get about prompts: every single time you hit Enter, your prompt blocks your shell while it goes and gathers all this information:
Every. Single. Prompt. Render. P10k/Strarship does these:
kubectl config current-context
git status — porcelain
essentially blocking I/O , even with the P10k instant-prompt , or Starship’s responsivness, felt sluggish.
I decided to do some depressing math, bear with me here!
~150ms overhead per prompt (and that’s being generous)
100 context switches per day = 15 seconds wasted over about 250 working days means I wasted a whole hour per year waiting
Well… real cost wasn’t the time. It was the feeling. That constant low-level friction of waiting, even just for a slight moment, many many of times a day. It adds up psychologically.
Enter Mimimalism
This is it. This is the whole thing
Yep. That’s it. One character. A single arrow. I can’t believe it either.
The hard truth
Okay so here’s the thing that really sealed it for me, and it’s kind of embarrassing.
Even with those fancy prompts showing me the current directory in my prompt, I still typed pwd like dozens of times every single day.
Think about that for a second. I was paying the cost for showing the path in my prompt, but when I actually needed the full path to copy it, verify it, use it in a script, the prompt’s shortened version wasn’t good enough anyway. Here’s an example of what I am talking about:
nice idea but it annoys me…
Look again at that image, the status bar only shows me the name of the current working directory, no full path. invoke pwd when I need it, and moreover, since I am used Zoxide (that’s for another article :-)) I do not mind too much about full paths…
Go do a little test yourself
Give this a shot:
- Install WezTerm:
brew install --cask wezterm - Set up a basic status bar (start simple, you can customize later)
- Disable your fancy prompt — just comment out the P10k/Starship line in your .zshrc
- Make your prompt stupid simple:
PROMPT='❯ 'Use it for a while, switch, navigate, write and test some code, feel the difference.
Liked it? set it up!
Here’s how my Wezterm status bar set, this is pretty straightforward, and shows the current working directory, Git, K8s, and time.
Oh, and no Nerd-Font needed for the matter of fact MacOS Monaco and Menlo fonts does the job well, with those simple yet useful monochrome emojis
wezterm.on('update-status', function(window, pane)
-- Grab current directory
local cwd_uri = pane:get_current_working_dir()
local cwd = cwd_uri and cwd_uri.file_path or ''
local cwd_short = cwd:match("([^/]+)/?$") or cwd
-- Git branch and status (modified/staged/untracked counts)
local git_info = get_git_info(cwd)
-- K8s context and namespace
local k8s_info = get_k8s_info()
-- Time
local time = wezterm.strftime '%H:%M'
-- Left side: directory + git stuff
window:set_left_status(format {
{ Text = '📂 ' .. cwd_short .. ' ' },
{ Text = git_info },
})
-- Right side: kubernetes + time
window:set_right_status(format {
{ Text = k8s_info },
{ Text = '⏰ [' .. time .. '] ' },
})
end)
You probably got yourself questioning
“But I love how my Starship/Powerlevel10k looks!”
You can have the exact same info in a status bar. Actually you can have more info because you’re not limited by prompt width. And it’ll look better and not kill your performance.
“What about other terminals?”
Kitty has status bars. Alacritty is WIP. I think this is where things are going. Even if WezTerm isn’t your thing, this pattern is worth understanding and try it in your favorite terminal.
“Wait, isn’t this just tmux?”
YES. Exactly. Tmux figured this out I think more than 15 years ago… we’re just finally bringing that wisdom to regular terminal emulators. and yeah, you can use WezTerm’s status bar with tmux if you want both.
The bigger thing I learnt
After years of these beautiful, informative, slow prompts, I finally get it
The terminal should do terminal stuff. The shell should do shell stuff.
We had them doing each other’s jobs and that was the problem.
Your prompt lives in your shell. Every time it renders, it blocks your shell. Every check it does adds latency. It’s just the wrong place architecturally for this kind of persistent status information.
The terminal though? It’s designed for this. It can update UI whenever it wants, asynchronously. It can keep state independently. It can show you context without blocking your commands.
We literally had the architecture backwards this whole time.
Liberate your terminal…



Top comments (0)