Speed-first CLI/TUI for Kubernetes navigation and operations.
Primary goals:
- Fast launch, including warm starts from a background daemon
- Fast navigation across resources and namespaces
- Non-blocking UI (no network calls on the UI thread)
- Clear stale/live state indicators
- Session restore so users continue where they left off
- Architecture
- Performance Budgets
- RPC Contract
- Failure And Degraded Mode Policy
- Roadmap
- Phase 0 Tickets
- Build
k11sclient andk11sddaemon skeleton. - Implement daemon handshake + snapshot/session restore path.
- Add first resources (
pods,services,deployments) via watch-backed cache. - Ship stale-state UX in status bar with age and sync metadata.
k11sandk11sdbinaries exist.k11sperforms warm connect first, then auto-spawnsk11sdon cold start.- Daemon handshake enforces RPC version compatibility.
- If daemon version differs from client version,
k11srequests graceful daemon shutdown and starts a matching daemon. - Session state is persisted by daemon and restored on launch.
- Daemon serves
pods,services, anddeploymentsfrom a watch-backed cache with relist recovery, including detail lookups from the same cache. - Namespace autocomplete is loaded via daemon RPC and refreshed per selected kube context.
- CRD-name autocomplete is loaded via daemon RPC and refreshed per selected kube context.
crdsandcrsviews are backed by daemon cache; most other resources still use placeholder responses with freshness metadata.- Status bar renders freshness badge, age, snapshot time, source, and watch health.
k11sruns an interactive Bubble Tea TUI by default, with periodic background list refresh.
go build -o ./bin/k11s ./cmd/k11s
go build -o ./bin/k11sd ./cmd/k11sd
K11SD_PATH="$PWD/bin/k11sd" ./bin/k11sOptional overrides:
K11S_SOCKET: explicit Unix socket path.K11SD_PATH: explicit daemon binary path used for auto-spawn.K11S_SESSION: explicit session state file path.
Session override flags (persisted through daemon):
--context--namespace--resource--filter--selection--simulate-stale(for stale-state visual validation)
Perf measurement:
k11s debug perfprints startup output, span timings, and JSON report.k11s debug perf --json-onlyprints machine-readable JSON only.
TUI keybindings:
j/kor arrow keys: move selectionctrl+d/ctrl+u(or PgDn/PgUp): jump selection by 10 rowsctrl+o/ctrl+y(or Alt+Left/Alt+Right): back / forward navigation history/: search items;n/Njumps between matchesenter(normal mode): load detail for selected row from daemon cacheq: quit (current selection is persisted into session):: open command line- Contextual row shortcuts (shown in footer when available):
s: open selected row namespacev: open selected row nodeo: open selected row owner resource
- Mouse left-click in pod rows:
NAMESPACEswitches namespaceNODEopensnodesviewOWNERopens owner resource when supported
- Rows that change between refreshes temporarily flash to highlight updates.
- In command mode autocomplete:
tabexpands/cycles suggestions,enter/->accepts current suggestion,escclears suggestion. - In command mode without autocomplete:
enterapplies the typed command.
TUI layout:
- Top untitled input field (command line,
:to activate) - Middle large bordered pane titled with
context > namespace > resource - Bottom single row:
- Left: status box + age box
- Right: contextual keyboard legend for current mode/row
- For cluster-scoped resources (
nodes,namespaces,crds), the middle segment renders as<cluster>.
Command line examples:
:ns paymentsor:namespace payments:ns all(all namespaces view):ctx dev-clusteror:context dev-cluster:pods,:services,:deployments,:nodes,:namespaces(switch resource view):crds(list custom resource definitions):crs widgets.example.comor:crd widgets.example.com(list CRs for a selected CRD):delete(delete selected row),:delete <name>, or:delete <namespace>/<name>when inallnamespace:scale <replicas>(scale selected item), or:scale <replicas> <name>:restart(rollout restart selected item), or:rollout restart [name]:logs(tail selected pod logs), or:logs <pod-name> [tail-lines]
Autocomplete notes:
:ctx/:contextsuggestions are loaded from kubeconfig (KUBECONFIGor~/.kube/config).:ns/:namespacesuggestions are loaded via daemon RPC and refreshed per selected kube context.:crd/:crs/:filtersuggestions are loaded from cachedcrdsvia daemon RPC and refreshed per selected kube context.- Mutating commands require a
LIVEview; stale or recovering views fail withSTALE_DATAguardrail feedback.
CI checks:
.github/workflows/ci.ymlruns format, vet, tests, startup smoke test, and advisory perf sanity.
Homebrew install:
brew install daulet/tap/k11s- The formula installs both
k11sandk11sd, but only exposesk11sinPATH. k11sis wrapped withK11SD_PATHpointing at the formula-managed daemon inlibexec, so users do not need to install or managek11sdseparately.
Homebrew release flow:
- Tag and push a release tag:
git tag -a v0.1.0 -m "k11s v0.1.0" && git push origin v0.1.0 .github/workflows/release.ymlbuilds both binaries for macOS (x86_64andaarch64), packages them intok11s-<target>.tar.gz, publishes GitHub release assets, and updatesdaulet/homebrew-tapFormula/k11s.rb.- Required secret in this repo:
HOMEBREW_TAP_TOKEN(token with push access todaulet/homebrew-tap).
Manual local formula update (optional):
./scripts/release_bundles.sh v0.1.0./scripts/update_homebrew_formula.sh v0.1.0 ../homebrew-tap