browse

Find the broken thing without digging.

Every kind — built-in or CRD — arrives through the same table. The default view answers "where is it broken" before you've pressed a key.

Cluster overview

The Lens-style "cluster overview" answered for a TUI: a routing layer, not a dashboard. Every row is selectable and lands on an existing screen — node detail, pod detail, the deployment's row, the timeline. No charts for their own sake.

  • TROUBLE is the cluster-wide version of the unhealthy-first sort every list already does — aggregated, not a separate derivation.
  • Capacity bars use the same terminal glyphs as every table's CPU/MEM columns — no separate charting language to learn.
  • Reached through g like everything else — the pods table stays the resting state; overview is a place you visit, not the front door.
also in Browse
  • Resource tablespods, deployments, nodes, every kind — one shared skeleton, header · body · keybar
  • Jump palette (g)fuzzy search across kinds, resources, namespaces, and contexts in one input; the eight daily kinds get a highlighted first-letter alias
  • All-namespaces triageunhealthy sorts first, healthy namespaces collapse to one line; ↹ expands a group without leaving the screen
  • CRDs + custom resourcesdiscovered at connect time, not configured — columns from the CRD's own printer columns, status from a Ready-style condition when one exists
diagnose

Answer "why" before you're asked.

Detail screens open with the reason, not the metadata. Logs, events, and the incident timeline all read the same way: newest first, causes before noise.

Pod detail & logs

A crashlooping pod opens with its last termination — exit code, reason, how long ago — promoted above the metadata grid, not buried on line 40 of a describe. Logs pick up the same story with restart boundaries drawn inline.

  • The OOM crash and the process coming back up read top to bottom in one stream — no stitching together kubectl logs --previous by hand.
  • l opens logs from anywhere a pod is selected, following by default; / filters the live stream without stopping it.
  • Numbered RELATED links (Deployment, ReplicaSet, Service, ConfigMap) jump straight there — no sidebar to tab through.
also in Diagnose
  • Node detailconditions, allocated/allocatable, and taints up top; the node's own pods sorted by memory below, so the cause of the pressure is visible at a glance
  • Events, dedupedrepeats collapse into one row with a ×count instead of a firehose; warnings sort first, ↵ routes straight to the object
  • Incident timeline (t)events, restarts, and rollouts merged onto one clock; rollouts are the anchors, every row restates its offset from the nearest change
  • RBAC who-cananswers "who can verb resource in namespace" from the watch cache; a 403 card is the entry point, arriving here with your own denial pre-filled
act

Every action shows its command first.

Exec, forward, scale, bulk delete — the exact kubectl equivalent prints before anything runs. Friction scales with how hard an action is to undo.

Secret decode

The YAML view grows secret semantics when the object is a Secret. Masked by default — data values render as dots with a size, never the raw base64 — because base64 on screen reads as decoded-adjacent, so masking has to be honest about what's hidden.

  • x reveals one key at a time in place, with a colored gutter bar so it's never mistaken for the rest of the masked manifest; leaving the view re-masks everything.
  • y copies the decoded value of the cursor key — the only export path. A full-YAML copy keeps every value base64-encoded.
  • Works identically for CRD-stored credentials — driven by the object being a Secret, not a special screen.
also in Act
  • Exec (x) & port-forward (f)a "will run" line shows the exact kubectl command first; exec suspends kute and hands the tty over, like git handing off to your editor
  • YAML view + editsyntax-highlighted, folds managedFields and status noise by default; server-side dry-run before apply, conflicts surfaced inline
  • Scale & rollout restart+/− on a Deployment/StatefulSet row opens an inline prompt pre-filled current±1 — reversible, so no modal
  • Set image (i) & resources (R)tag-first prompt with rollout history pulled from the watch cache; resource limits edited next to their live p95 usage bar
  • Labels & annotations (m)selector and owner joins render before you touch anything; controller-managed keys stay read-only
  • ConfigMap & Secret dataper-key edit with ctrl-r to chain a rollout restart of consumers; Secret's add-key flow stays masked end to end
  • Bulk operationsspace marks a row, * marks everything the current filter matches; verbs act on the whole marked set with the same tiered confirm as a single delete
extend

New kinds are data, not new code.

Helm releases, Ingress, Gateway API, and any CRD kute has never seen all arrive through the same registry — no per-kind screens to hand-build.

Ingress & Gateway API routing tables

Ingress and HTTPRoute are objects that only make sense joined against something else — a Service, a Secret, a parent Gateway. kute resolves every join live from the watch instead of asking you to hold the YAML in your head. Nothing else in the ecosystem renders the Gateway API join.

  • A route with no matching backend shows red inline — "service not found" — not a silent failure discovered later.
  • Gateway API's split ownership (platform owns the Gateway, app team owns the HTTPRoute) is resolved both ways — p on a route jumps to its parent Gateway.
  • Canary weights get their own column — that split percentage is why teams adopt Gateway API in the first place.
  • TLS columns show real certificate expiry pulled from the referenced Secret, not just whether one is configured.

Ingress — one row per host+path → backend, resolved live

HTTPRoute — rules, weights, and the parent Gateway join

also in Extend
  • Helm releasesbrowsed straight from the sh.helm.release.v1 secrets already visible to the watch — no helm binary needed unless you roll back
  • Dark + light themesone semantic token struct drives every screen — every mockup on this page renders from the same tokens as the real terminal app
  • Degrades gracefully256-color and ASCII glyph fallbacks for terminals without truecolor or Unicode block glyphs
  • Update notice (U)an ambient chip after a once-daily check; kute never self-updates — it prints your package manager's exact upgrade command
SINGLE BINARY

Install kute.

Explore the full Kute experience with kute --demo—a built-in fake cluster with no setup or configuration.

$curl -fsSL https://kute.dev/install.sh | sh

Or install with Homebrew

$brew install kute-dev/tap/kute