Skip to content

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 -w numbers each row as it appears, and kx describe 3 in 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 events tool on kx mcp takes a sort, over the same columns as kx 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.13.0 on GitHub

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/api and kx logs pod/web-7d -f work wherever 3 or @api did.
  • Other clusters: The --context flag 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, events and mark from inside k9s (guide).

v0.12.0 on GitHub

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.1 on GitHub

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 --watch draws now take --sort too.
  • Completion for sort keys: Pressing TAB after --sort offers the columns kx last printed for that kind, so --sort status,-re<TAB> completes to status,-restarts.
  • Tainting Nodes: A new command sets a taint, as in kx taint 1 dedicated=gpu:NoSchedule, and asks first before a NoExecute one unless you pass --yes.
  • More for agents: The MCP server gained describe and rollout_history tools, and its listing tools take a sort, all still read-only.
  • Marks in copies: Either side of kx cp can name its Pod by mark, as in kx 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.11.0 on GitHub

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 5 numbers them 1 to 5, and its caption counts the cut, as in 5 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-on beside --limit, a critical result past the cut still fails the run.
  • Latest runs for agents: The list_resources tool on kx mcp takes lastRun, matching kx get jobs --last-run.

v0.10.2 on GitHub

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, so kx logs 1 reads that run.
  • Docs in the binary: The documentation now reads offline with kx docs <topic>, and a docs tool on kx mcp answers an agent from the same pages.
  • Completion for krew in zsh: Tab completion now works for a krew install run as kubectl idx under 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.1 on GitHub

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 scan and a kx diag sweep, and kx top --sort -mem% orders by a column kubectl’s own --sort-by lacks.
  • 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.10.0 on GitHub

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 them from kx label.
  • A config you can repair: An unknown theme or engine in ~/.kx/config.toml no longer stops the two commands that set them, so kx theme dracula fixes the file.
  • Help for every subcommand: The help for --sort-by and --show-swap on kx top, and for --revision on kx rollout, now covers every subcommand that takes them.
  • Security: The binaries are built with Go 1.26.10, for GO-2026-6809.

v0.9.2 on GitHub

v0.9.1

A patch for two defects in output a program reads.

  • No trailing blank line: The output of kx get pods -o json now matches kubectl get pods -o json byte for byte.
  • Valid JSON for several manifests: Piping kx yaml 1 2 -o json to jq reads 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.1 on GitHub

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 2 works where it used to fail.
  • Help for kubectl’s flags: Each command’s --help lists 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, and kx --version names both your kubectl and the table’s.
  • Match in output formats: A narrowed kx get pods -m api -o yaml returns 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.9.0 on GitHub

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 wait command 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 image changes is printed before and after, so you can see what to put back.
  • Narrower sweeps: Health checks, scans and trees now take --match too, as in kx diag -m api.
  • State for scripts: A script can read what each index means from kx state --json instead 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.8.0 on GitHub

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 mcp command 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 with claude 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 logs now 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.gz always fetches the newest build.

v0.7.0 on GitHub

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 3 keeps kx logs @api working after later listings, on that cluster only.
  • Managing marks: Marks are listed with kx mark and removed by name with kx 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 rollout and kx yaml commands now forward kubectl’s own flags, as kx get always 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.6.0 on GitHub

v0.5.2

A patch that finishes shell completion and sharpens the documentation around --since windows.

  • No more filename guesses: Pressing TAB after --fail-on now 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.

v0.5.2 on GitHub