Releases: vulcanshen/kbu
Release list
v2.2.2
Quit without the extra keystroke; the splash credits its developer.
qquits immediately. The confirm dialog is gone —qexits on the
spot. Everything that used to happen behind the confirmation still
happens: watchers and log streams stop, a live Alterm / edit / exec PTY
is killed rather than orphaned, and the session snapshot (context,
namespace, kind, cursor, focused panel, active tab) is written before the
process exits, so the next launch resumes where you left off.Ctrl+C
still quits from anywhere, including while a panel search is active.- The splash screen (
V) credits its developer. "developed by" and the
author's email fade in under the tagline, on the same beat as the name,
version, and tagline.
v2.2.1
Fix the Logs tab (panel 3) shattering the whole screen.
- Terminal control bytes in log output no longer break the UI. A
container that emits ANSI escapes — colored console output (Spring Boot,
logback), progress redraws, cursor moves, screen/line erases — or bare
control characters (tabs in stack traces, backspace, form-feed) sent those
bytes straight to your terminal. They moved the real cursor outside panel
3 and painted over the sidebar, table, and borders, corrupting the entire
frame. Log text is now stripped of every escape and control byte the
moment it enters the buffer, and each rendered line is clamped to the panel
width so one over-long line can't push past its column. In-log color is
stripped as a consequence (kbu still colors its own per-container / per-pod
prefix) — matching how k9s and Lens render streaming logs.
v2.2.0
Browse your kubeconfig contexts from inside kbu — a new read-only view.
- KubeConfig ▸ Contexts. A new "KubeConfig" category leads the sidebar
(panel 1) with a read-only Contexts view. It lists every context in your
kubeconfig — Name, Cluster, User, Namespace, Server — with the context
you're currently connected to marked by a trailing*. Panel 3 shows an
Info tab (Context / Cluster / Server / TLS / User / Auth / Namespace), and
Yopens a kubeconfig-shaped YAML view. It reads the kubeconfig directly,
so it works even when the cluster is unreachable. - Read-only by design. No edit / delete — the
E/dhotkeys, the
Space menu, and the YAML popup's own edit are all gated off, and Enter is
inert. Switching context stays on theCpicker. - Credentials are never shown. A kubeconfig user stanza can carry
tokens / passwords / client keys. kbu flattens only non-secret metadata
and builds the YAML from an allowlist, so every credential-bearing field
renders as<redacted>— no secret can reach the panel or the YAML view.
v2.1.2
Fix the detail panel (panel 3) scrolling to a blank body.
- Log/detail scroll no longer lands on a blank screen. Scrolling panel
3 withj/k/u/dcould leave the body blank — most often after
zooming the panel (z) or while streaming logs. The scroll offset was
re-clamped only when the panel width changed, so a taller viewport (zoom
grows the height) or a shrinking body (the log ring buffer trimming old
lines while you were scrolled up) left the offset pointing past the last
screenful, and the render started beyond the content. The offset is now
clamped on any size change and after every content rebuild, so the body
always draws content.
v2.1.1
Fix a copy-fidelity bug in the YAML popup's visual-mode yank.
- Visual yank no longer injects soft-wrap newlines. Selecting across a
long YAML line that the popup soft-wrapped to fit the width used to copy
a newline at every wrap point — but those breaks aren't in the source
YAML. The selection is now reconstructed from the original document by
mapping the visual endpoints back to raw (line, column) and slicing the
source directly, so the copied text matches the YAML byte-for-byte:
newlines only where the document actually has them, and the spaces at
word-wrap boundaries preserved.
v2.1.0
Multi-namespace selection — view several namespaces at once, not just one
or all.
- Multi-select namespace picker.
Nnow opens a checkbox list. Move
withj/k(u/dpage,gg/Gjump), andEntertoggles the
namespace under the cursor — the popup stays open so you can check
several in a row, and each toggle live-applies (panel 2 re-fetches
immediately). Checked namespaces read green.Esc/Spaceclose.
"All Namespaces" and specific namespaces are mutually exclusive:
checking a specific one clears All, unchecking the last falls back to
All./search still works. - Per-namespace fetch, namespace-ordered. A specific selection lists
each namespace separately (client-go's namespaced List) in name order,
rendering incrementally as each returns; "All Namespaces" keeps the
single cluster-wide list. No fetch-all-then-filter. - Namespace column. Every namespaced resource's panel-2 list now
leads with a Namespace column (first, ahead of Name) so rows from
different namespaces are distinguishable; it middle-truncates like Name
(front + tail kept). Cluster-scoped kinds (Nodes, PVs, ClusterRoles,
...) are unchanged. The status bar shows the single namespace, "All
Namespaces", or "N selected" for a multi-selection. - Selection persists, reconciled on launch. The selection is saved to
state.yamland restored next launch. Namespaces that no longer exist
are dropped on startup (kbu lists the live namespaces once and keeps the
survivors); if none survive it falls back to All. Precedence: persisted
selection >default_namespaceconfig > all. Makefileadded with essentials-only targets (build / run / test /
test-race / vet / fmt / help). Release packaging stays with goreleaser.
v2.0.2
Course-correct the v2.0.1 branding experiment and round off a border
detail — no functional or workflow changes.
- In-app display name reverted KubeUI → kbu. v2.0.1 switched the
text the user reads directly to the full name "KubeUI"; v2.0.2 puts
the short name kbu back in the quit confirm dialog, theSpace
menu / hint title, the toast title, the applog startup line, and the
crash messages. The splash easter-egg identity reveal keeps the full
KubeUI, and the READMEkbu — KubeUIsubtitle stays — both are
deliberate full-name surfaces, not in-app chrome. - Border-title trailing cap rounded. Panel 1/2/3 title chips and the
panel-3 tab bar now close their right end with a round half-circle
(PowerlineE0B4) instead of a hard triangle (E0B0), mirroring the
round left cap already in use. Between-tab boundary caps stay
triangular; only the final trailing cap changed. - Docs: added a self-contained "Panel chrome" spec (§8) to the ZLC
implementation doc — border title, tab bar, and border-hint styling,
written portably so other TUIs can reference it.
v2.0.1
Branding polish following the v2.0.0 rename — no functional or workflow
changes, just finishing the visual identity that km8 → kbu started.
- Splash easter egg (
V) redesigned: the pixel logo now spells
KBU (K and B in gold, U as the navy frame that wraps them) instead
of the oldK8. New staged reveal — a dark-gray background sheet
sweeps top-to-bottom, the U frame rises from the base, then the K/B
letters shuffle in; every cell is a single solid-square glyph. - User-facing display text now uses the full name KubeUI where
the product is named to the user: quit confirm dialog, theSpace
menu title, toast title, applog startup line, and crash messages.
Command / identity strings (--version, config dir, migration notes)
keepkbu— they name the binary, not the product. - README icon + GitHub social preview refreshed to the KBU logo (old
K8 art kept asdocs/km8-icon.svg). Social preview wordmark set in the
Tiny5 pixel font on a full-black canvas. - Removed the Go Report Card badge — goreportcard.com was permanently
sunset on 2026-07-01. .gitignorenow ignoreskbu/kbu.exe(was stillkm8/
km8.exe, a v2.0 rename straggler).
v2.0.0
Identity rename: km8 → kbu. The tool doesn't change, just the
name — the tagline for the Family the Kubernetes TUI is the first
member of. Future TUIs Vulcan Shen builds will share a u-ending
naming pattern (u privately means "UI"; kept implicit like Apple's
i prefix). One release, one story, no feature or workflow changes
buried inside — the diff is entirely rename plumbing.
Reason: km8 was a mouthful (three syllables, unclear "M8"),
searched poorly, and didn't compose into a family for later tools.
kbu is three letters, home-row-friendly to type, ends in a vowel
so it reads naturally in any language, and leaves room for filu /
hostu / etc. later. Splash caption changed from KubeMate (the
v1.7.x display name) to KubeUI in the same beat — the long-form
identity that "kbu" is short for.
Six threads make up the rename:
-
Go module + binary + goreleaser.
go.modmodule directive
github.com/vulcanshen/km8→github.com/vulcanshen/kbu(54.go
files touched, symmetric import path replace, no logic change).
.goreleaser.yamlproject_name/binary/ ldflags version
injection module path / brew + scoop homepage all →kbu. Local
build nowgo build -o kbu ./cmd/; release artifacts land as
kbu_2.0.0_<os>_<arch>.tar.gz. -
Config directory + env vars + one-shot migration. Default
config dir moves from~/.config/km8/to~/.config/kbu/(same
on every platform:~/Library/Application Support/kbu/on macOS,
%APPDATA%/kbu/on Windows). First launch on v2.0 detects the
legacy~/.config/km8/and copies its contents into~/.config/ kbu/(recursive file copy —config.yaml,state.yaml,
theme.yaml,logs/). Old directory is left in place for the
user to remove at their leisure. Migration is a one-shot:
subsequent launches find the new dir already populated and skip
silently.Env vars follow the same pattern:
KBU__CONFIGPATH/
KBU__STATEPATH/KBU__ALTERM_SHELL/KBU__ALTERM_LOGIN_SHELL
are the new names. LegacyKM8__*counterparts are still read as
fallbacks in v2.0 (removable in v2.1) so a.zshrcfrom a v1.7.x
install keeps working across the upgrade. When both aKBU__and
its legacyKM8__are set,KBU__wins; a legacy-only value
fires a per-launch deprecation warning in the App Log until the
user renames.The pre-v2.0
KM8__SHELL/KM8__LOGIN_SHELLtier (deprecated
since v1.7.5 in favor ofKM8__ALTERM_*) is fully removed in
v2.0 — that grace period spanned six minor releases, well past
the "remove next release" commitment. Anyone still setting them
after v1.7.5 will get a shell fallback to$SHELL/ non-login,
with no warning noise for the removed tier. -
User-facing strings. Every literal
km8in a rendered
surface —--versionprefix (km8 dev→kbu dev), splash
caption (KubeMate→KubeUI),?help popup title, toast
title ( km8/ km8→ kbu/ kbu), quit hotkey
description, confirm popup message (Quit km8?→Quit kbu?),
startup App Log line, crash banner — all readkbuin v2.0.
The 18×18 splash pixel-art logo still spells K/8 through this
release; a redesign to K/B (or another kbu identity) is deferred
as a separate follow-up so the two decisions can be made
independently. -
Documentation. README.md + README-zh_TW.md rewritten with the
new identity throughout — title line, badges, install commands
(brew install vulcanshen/tap/kbu,scoop install kbu,
go install github.com/vulcanshen/kbu/cmd@latest), quick-start
snippet, feature bullets, keybinding table, env var table,
config path table. Both README variants now open with a v2.0
rename callout so users landing from old km8 links understand
what they're looking at. Every.gofile's dev-facing comments
swept forkm8→kbuwhere the reference is to the current
project (legitimate legacy refs —legacyAppName = "km8", the
Alterm-migrationkm8erm_shelldeprecated key, migration code's
~/.config/km8/path — are preserved verbatim). -
Distribution + promotion. Homebrew tap and Scoop bucket get
newkbuformulas alongside the existingkm8formulas (the
km8formulas stay asdeprecated!shims pointing atkbufor
one release; removable when v2.1 lands). Merged promotion PRs
(kubetools, charm-in-the-wild) get follow-up rename PRs so the
listings match the new identity. -
GitHub repo rename.
github.com/vulcanshen/km8renamed to
github.com/vulcanshen/kbu. GitHub's redirect keeps old URLs
working — anyone with a browser bookmark or agit remotestill
resolves — but the canonical URL is now the new one. Everyone
who cloned the repo before v2.0 shouldgit remote set-url origin git@github.com:vulcanshen/kbu.gitat their convenience;
the redirect is opt-in future insurance, not a permanent
contract.
v1.7.12
Single-thread build fix on top of v1.7.11.
- Static Linux binaries — no glibc dependency. v1.7.11 (and
every prior release) shipped Linux binaries dynamically linked
against the GitHub-hosted runner's glibc (Ubuntu 22.04 →
glibc 2.35+). Users on older distros — Debian 11, Ubuntu 20.04,
RHEL / CentOS 7-8 — sawversion 'GLIBC_2.32' not found/
GLIBC_2.34' not foundwhen trying to launch..goreleaser.yaml
builds now setCGO_ENABLED=0, producing fully static binaries
that link against no shared library at all. km8 has no CGO
dependencies (bubbletea / lipgloss / client-go / viper are all
pure Go), so the switch is a no-op at the code level — same
behaviour on macOS + Windows, functional on any Linux kernel
with the standard syscalls (~2.6.32+). Matches the K8s
ecosystem norm:kubectl/helm/k9sall ship as
CGO_ENABLED=0 static binaries for exactly this reason.
No user-visible behavioural change; if you were running
v1.7.11 fine, v1.7.12 does the same thing, just with a
binary that also runs on your friend's older Ubuntu box.