Release notes
What each release of kx changed, newest first. Each version links to its GitHub release, which adds the list of merged changes and the downloads.
v0.13.0
A watch is no longer only something to look at: the rows it draws are numbered, so you can act on what you see changing without listing it again.
- Numbered watches: On a terminal,
kx get pods -wnumbers each row as it appears, andkx describe 3in another terminal reaches the row drawn as 3. - Numbers that stay put: A row keeps its index while it changes or moves under
--sort, and a deleted row’s index is never given to another resource. - Two terminals at once: When you list something else, the watch stops numbering and says so in its footer:
another listing is now current — showing a live view; press Ctrl-C to stop. - Sorted events for agents: The
eventstool onkx mcptakes asort, over the same columns askx events --sort.
Breaking: If you relied on kx get -w leaving your current listing alone, list again after the watch, or point KX_STATE at its own file for the watch: a watch on a terminal now saves its rows as your current listing once the first one arrives.
v0.12.0
A name you already know is now enough to reach a resource, here or on another cluster, and kx’s reports now run from inside k9s.
- Resources by name: Commands that take an index also take kind/name, so
kx diag deploy/apiandkx logs pod/web-7d -fwork wherever3or@apidid. - Other clusters: The
--contextflag sends a kind/name to another cluster, and a prompt names it first:Delete Deployment/api in default on context 'prod'?. - Typos answered plainly: A kind/name that names nothing prints
Deployment/typo was not found in namespace 'default'.and leaves your listing alone. - Marks by name: A mark can pin a resource without a listing, as in
kx mark api deploy/api. - Plugins for k9s: Five keys run
kx diag,tree,scan,eventsandmarkfrom inside k9s (guide).
v0.11.1
Pressing TAB after a descending sort key, as in kx get pods --sort -re<TAB>, now completes it, on every command that takes --sort. It used to complete nothing.
v0.11.0
A release that rounds out sorting, adds a command for Node taints, and gives an agent more of kx to read.
- Sorting events and watches: Events and the live table
kx get --watchdraws now take--sorttoo. - Completion for sort keys: Pressing TAB after
--sortoffers the columns kx last printed for that kind, so--sort status,-re<TAB>completes tostatus,-restarts. - Tainting Nodes: A new command sets a taint, as in
kx taint 1 dedicated=gpu:NoSchedule, and asks first before aNoExecuteone unless you pass--yes. - More for agents: The MCP server gained
describeandrollout_historytools, and its listing tools take asort, all still read-only. - Marks in copies: Either side of
kx cpcan name its Pod by mark, as inkx cp @api:/etc/config.yaml ./config.yaml.
Breaking: If a script runs kx describe <index> on a deleted resource, expect exit 1 and a fresh listing: it used to exit 0 and describe every resource whose name started with the one you asked for.
v0.10.2
The --limit flag from v0.10.1 now reaches health sweeps and vulnerability scans, so the worst of a cluster is one command away.
- The worst few resources: A sweep can stop at its five worst:
kx diag -A --limit 5numbers them 1 to 5, and its caption counts the cut, as in5 of 21 shown. - The most critical images: A scan’s summary can do the same with
kx scan -A --sort -crit,-high --limit 5, though every image is still scanned. - Failures past the cut still count: With
--fail-onbeside--limit, a critical result past the cut still fails the run. - Latest runs for agents: The
list_resourcestool onkx mcptakeslastRun, matchingkx get jobs --last-run.
v0.10.1
A release about getting straight to the rows you came for, and about documentation that travels with the binary.
- Limit before numbering: With
kx get pods -A --sort age --limit 5, the five newest Pods are rows 1 to 5, and an index past them names nothing. - Latest CronJob runs: Each CronJob’s newest Job is one row in
kx get jobs --last-run, sokx logs 1reads that run. - Docs in the binary: The documentation now reads offline with
kx docs <topic>, and adocstool onkx mcpanswers an agent from the same pages. - Completion for krew in zsh: Tab completion now works for a krew install run as
kubectl idxunder zsh.
After upgrading: If you installed through krew and use zsh, run ln -s ~/.krew/bin/kubectl-idx ~/.krew/bin/kubectl_complete-idx to turn that completion on.
v0.10.0
Listings can now be put in the order you care about before kx numbers them, so the row you want is row 1.
- Sort by columns: With
kx get pods --sort -restarts,age, the worst-restarting Pod comes first, and each column sorts as what it holds, AGE as a duration and READY as a ratio. - Every table kx draws: Sorting works on
kx get,kx top,kx secret,kx scanand akx diagsweep, andkx top --sort -mem%orders by a column kubectl’s own--sort-bylacks. - Refresh lines you can paste: When the resource behind an index is gone and a program is reading the output, the line kx prints now keeps the listing’s flags, as in
Run 'kx get pods -n diagnostics --output=wide --sort="nominated node" -m web' to refresh the list. - Kinds as types: Findings name kinds as types, as in
CrashLoopBackOff in Pod cache-oom-cc849dbdb-2qdkw.
Breaking: If a script passes kx diag --full, change it to --show-healthy; kx scan --full keeps its name. If it parses a sweep’s findings or kx top nodes, check it: kinds are spelled as types, and the memory column is always MEM%.
v0.9.2
A patch for the words kx uses, in its errors and its help, and for a config mistake it gave you no way out of.
- One shape for errors: Each error now names the problem, then the fix after a dash, as in
'app' and 'pod-template-hash' are already set — add '--overwrite' to replace themfromkx label. - A config you can repair: An unknown
themeorenginein~/.kx/config.tomlno longer stops the two commands that set them, sokx theme draculafixes the file. - Help for every subcommand: The help for
--sort-byand--show-swaponkx top, and for--revisiononkx rollout, now covers every subcommand that takes them. - Security: The binaries are built with Go 1.26.10, for GO-2026-6809.
v0.9.1
A patch for two defects in output a program reads.
- No trailing blank line: The output of
kx get pods -o jsonnow matcheskubectl get pods -o jsonbyte for byte. - Valid JSON for several manifests: Piping
kx yaml 1 2 -o jsontojqreads one List instead of failing after the first object.
Breaking: If a script reads kx yaml <several indexes> -o json, read .items[] now: several manifests come back as one List, and one index still prints the bare object.
v0.9.0
Commands that forward to kubectl now know kubectl’s own flags, read from a table built from kubectl’s source, where kx used to guess at them.
- Flags in any order: Flags and an index can come in any order, so
kx logs --tail=2 2works where it used to fail. - Help for kubectl’s flags: Each command’s
--helplists kubectl’s flags for it under “Passthrough options”, with kubectl’s own descriptions. - Completion for them too: Pressing TAB offers kubectl’s flags by name and knows their values, such as filenames for a flag that takes a file.
- Typos caught: A mistyped flag now gets
'--bogus' isn't a flag of kubectl describe as of v1.37.1, andkx --versionnames both your kubectl and the table’s. - Match in output formats: A narrowed
kx get pods -m api -o yamlreturns a List of only the matching items, shaped as kubectl prints it. - Clean output for scripts: With
--no-headers, kx’s own lines go to stderr, so the rows stand alone on stdout.
Breaking: If your kubectl takes a flag kx’s table doesn’t know, put it after --, as in kx describe 1 -- --new-flag: an unknown flag is now refused instead of passed on.
v0.8.0
Two new commands work from a listing’s indexes instead of a name you copy out of it, and this release closes five HTTP/2 advisories reachable through client-go.
- Waiting on a resource: The
kx waitcommand blocks until each numbered resource is ready, bound or complete, and a failed Job ends the wait with its reason instead of waiting out the timeout. - Changing images: Each image
kx set imagechanges is printed before and after, so you can see what to put back. - Narrower sweeps: Health checks, scans and trees now take
--matchtoo, as inkx diag -m api. - State for scripts: A script can read what each index means from
kx state --jsoninstead of parsing the table. - An install script: One line installs the newest build for Linux or macOS, checked against the release’s checksums:
curl -fsSL https://jzills.github.io/kx/install.sh | sh.
Breaking: If a script passes -m beside JSON, YAML, a template or --no-headers, expect exit 1: kx now refuses a match it can’t apply instead of printing everything. If you build from source, you need Go 1.26.9, which the published binaries already carry.
v0.7.0
An agent can now read your cluster through kx the way you do: by kind and name, by a mark, or by an index from your current listing.
- An MCP server: The new
kx mcpcommand serves ten tools for listing, diagnosis, events, logs and scans, every one read-only against the cluster. - Setup: Any MCP client starts it as
kx mcp, and Claude Code adds it withclaude mcp add kx -- kx mcp. - Shared listings, if you want them: With
--write-listings, what the agent lists joins your history, numbered and tagged as the agent’s, and a command that changes something warns before acting on one of its rows. - Job logs: Reading a Job with
kx logsnow covers all of its Pods, retries included. - A stable download URL: Every release now attaches its archives under version-free names, so
https://github.com/jzills/kx/releases/latest/download/kx_linux_amd64.tar.gzalways fetches the newest build.
v0.6.0
A name you give a resource now outlasts every listing after it, so the Pod you were watching stays one word away however the numbers move.
- Marks: Pinning row 3 with
kx mark api 3keepskx logs @apiworking after later listings, on that cluster only. - Managing marks: Marks are listed with
kx markand removed by name withkx unmark api web db. - Reading an index: A new command,
kx ref, prints what an index means without contacting the cluster. - More forwarded flags: The
kx delete,kx scale,kx rolloutandkx yamlcommands now forward kubectl’s own flags, askx getalways has. - Empty listings count: A listing that finds nothing is saved like any other, so an index can no longer reach a resource from the listing before it.
Breaking: If a script uses kx back, kx forward or kx drop, change it to kx state back, kx state forward or kx state drop. If it uses an index after an empty listing, it now exits non-zero, and kx state drop --empty clears those entries.
v0.5.2
A patch that finishes shell completion and sharpens the documentation around --since windows.
- No more filename guesses: Pressing TAB after
--fail-onnow offers its values instead of filenames, so no flag in kx falls back to listing files anymore. - Install steps per shell: The completion install examples now say which shell each one is for.
After upgrading: If you installed completions before this release, reinstall them: under zsh, the old steps left the bash script shadowing the zsh one.