Skip to content
HN On Hacker News ↗

GitHub - p10node/k10s: Kubernetes TUI you can click. Instant search, logs/exec/port-forward, 7 themes, context-aware AI. Single Go binary.

▲ 66 points • 52 comments • by pierreneter • 23h ago • HN discussion ↗

Pangram verdict · v3.3

We believe that this entire text is AI.

99 %

AI likelihood · overall

AI
0% human-written 100% AI-generated
SEGMENTS · HUMAN 0 of 1
SEGMENTS · AI 1 of 1
WORD COUNT 1,528
PEAK AI % 99% · §1
Analyzed
Oct 8
backend: pangram/v3.3
Segments scanned
1 windows
avg 1528 words each
Distribution
0 / 100%
human / AI fraction
Verdict
AI
Pangram v3.3

Article text · 1,528 words · 1 segments analyzed

Human AI-generated
§1 AI · 99%

The Kubernetes terminal UI you can click. k9s taught us to live in the terminal. k10s makes that terminal point-and-click, instantly searchable, themeable - and gives it an AI that already knows your cluster, namespace and selected object. Install · Try it with no cluster · Features · k9s → k10s · Docs · Build log A real terminal capture of k10s demo running - just screenshot, on the offline demo backend. Every frame in these docs comes out of the running binary, never hand-drawn. Why k10s A cluster dashboard is something you open twenty times a day, usually while something is on fire. The two things that matter are how fast it opens and how little you have to remember. Nothing is hidden behind memorised keys. The actions that apply to the thing you selected are listed, right there, in their own pane. Click one, or press the letter next to it. Your mouse works. Click a row, click a pane, click [ zoom ], click ns default ▾, scroll the table. Every border button is real. One search box for the whole cluster. ctrl+p searches resource kinds and objects together. No prefix language to learn. It opens instantly. Startup registers zero watches and waits for nothing - informers start lazily, per kind, the first time you look at one. Opening Pods watches pods, not every Secret and Event you own. (how, and the regression guards) AI that can see the screen. ctrl+a, ask in plain English. The current context, namespace, kind and selected object are injected into the prompt, so "why is this pod unhealthy?" means this pod. It updates itself. /update installs the newest release over the running binary - checksum-verified, atomic, offers to restart into it. Your k9s-style command plugins fit. Put scoped shortcuts in ~/.k10s/plugins.yaml; they appear beside built-in actions and receive the selected object, namespace, context and column values. Try it in 30 seconds (no cluster required) k10s ships an offline demo backend: a realistic cluster to click around in, including a CrashLoopBackOff to poke at. It is opt-in, because sample data should never be mistaken for your machine. git clone https://github.com/p10node/k10s && cd k10s go run . demo # the sample cluster - fake data, clearly labelled go run . # your real cluster, or "No cluster" if there isn't one The demo is a context, not a mode. k10s demo opens on it, /demo switches to it from anywhere, and :ctx always lists it (labelled k10s demo · sample data, with a legend under the list). To leave it, pick any other context - there is no separate exit. While it is up the header carries a DEMO marker, so no frame of it can be mistaken for a real cluster. Plain k10s reads the same kubeconfig kubectl does ($KUBECONFIG, else ~/.kube/config) and shows what that context can reach - and nothing else. With no kubeconfig, or a context whose API server does not answer, the main panel says No cluster and points at the way in: r retries, :ctx picks another context, /setup has the kubectl and kubeconfig links. docs/cluster-setup.md is the same guide, longer. Install curl -fsSL https://p10node.com/k10s/install.sh | sh macOS and Linux, amd64 and arm64. It picks the right prebuilt binary, verifies its sha256 against the release manifest, and installs it into /usr/local/bin (or ~/.local/bin when that needs a password it cannot ask for). --dir, --version and --no-sudo are in docs/install.md, along with how to read it before you run it and the matching uninstall.sh. With Go on the box: go install github.com/p10node/k10s@latest Or from a clone, which also stamps the version into the binary: git clone https://github.com/p10node/k10s && cd k10s just install # → $GOBIN/k10s, version-stamped Prebuilt static binaries for darwin/amd64, darwin/arm64, linux/amd64, linux/arm64 and windows/amd64 are published on every tag — Windows is the one platform the installer script sends to the release page instead. Every later upgrade is just: k10s update Then run it: k10s # your current kubeconfig context k10s demo # the built-in sample cluster, no cluster needed k10s --readonly # look, never touch: nothing that changes the cluster k10s --version # which build is this What you get Every resource, grouped the way you think about them 30 kinds across Workloads · Network · Config · Storage · RBAC · Cluster · Custom Resources, each with a live row count for the current namespace. Your CRDs are discovered automatically - no configuration. Groups fold: space, left or a click on the header, remembered across restarts, with Config/Storage/RBAC folded to begin with. A folded group also asks your cluster for nothing - the sidebar is what decides which kinds get counted, and counting is one limit=1 request per visible kind, six at a time, with refusals remembered. Pods · Deployments · ReplicaSets · StatefulSets · DaemonSets · Jobs · CronJobs · HPAs · Services · Endpoints · Ingresses · NetworkPolicies · ConfigMaps · Secrets · ResourceQuotas · LimitRanges · PDBs · PVCs · PVs · StorageClasses · ServiceAccounts · Roles · RoleBindings · ClusterRoles · ClusterRoleBindings · Nodes · Namespaces · Events · CRDs · Custom Resources The whole day-2 toolkit, on single keys d describe real kubectl describe output, from the API y YAML the live object l logs follows (-f), newest at the bottom, scroll back 500 lines s shell a real interactive exec session - raw TTY, resize-aware, in-panel p port-forward real SPDY forward, start/stop from the pane m top pod/node metrics, per container, with requests vs limits e edit · r restart · c scale rollout restart, scale, $EDITOR o / u cordon-uncordon / drain - offered only when Nodes is selected D delete red confirm modal, because it should be scary Add your own scoped actions with the core k9s plugins.yaml format. They can run foreground or background commands, request confirmation, override a built-in shortcut deliberately, and are clickable in the same pane. See the plugin guide and installable example. Logs that follow, in the pane you were already looking at (z to zoom) ╭─ logs -f billing-worker-6f8d9c5b7-qq91x ────────────────────────────────── [ close ] [ restore ] ╮ │ 8 2026-08-25T08:12:18.331Z INFO http GET /v1/users/me 200 3.1ms │ │ trace=44b1e2f9 │ │ 7 2026-08-25T08:12:21.660Z INFO worker flushed batch size=250 dur=41ms │ │ 6 2026-08-25T08:12:25.019Z INFO http GET /healthz 200 0.3ms │ │ 5 2026-08-25T08:12:31.402Z INFO http DELETE /v1/sessions/9a1 204 5.7ms │ │ trace=7c0d19ba │ │ 4 2026-08-25T08:12:33.881Z WARN gc pause=18ms heap=412Mi │ │ 3 2026-08-25T08:12:40.117Z INFO http GET /v1/orders/88213 200 7.4ms │ │ trace=e21f8b05 │ │ 2 2026-08-25T08:12:44.590Z INFO metrics scrape ok series=1842 │ │ 1 2026-08-25T08:12:51.008Z INFO http GET /healthz 200 0.3ms │ │ ● following newest at bottom 500 loaded · ↑ for older │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ An AI prompt that already has the context ╭─ Prompt · plain text → AI · /commands still work · esc close ─ [ grow ] [ AI · claude-sonnet-5 ] ╮ │ ✦ ask about your cluster… · /settings to change provider/model │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ ● AI mode — plain text goes to claude-sonnet-5 tab panes · enter open · ctrl+p search · f find… ctrl+a toggles it. Bring your own key - OpenAI-compatible (so also Groq, Together, OpenRouter, vLLM, Ollama, LM Studio, any local gateway) or Anthropic. Answers open as a normal text view you can scroll, zoom and close. No cluster data leaves your machine unless you press enter in AI mode. The only other network call k10s makes on its own is the once-a-day update check, which asks GitHub for a version number and nothing else. Eight built-in themes, plus your own — previewed live tokyo-night (default) · catppuccin-mocha · dracula · nord · gruvbox-dark · solarized-dark · solarized-light · matrix T cycles, /theme opens a picker that applies each theme as you move through the list - you judge it on the real UI, not on a name - and esc puts back whatever you had. Drop a YAML palette into ~/.k10s/themes, restart, and it appears in the same picker — no rebuild needed. See the custom-theme guide and installable demo. Details that only show up after a long day Copy mode (ctrl+s) releases the mouse so your terminal can drag-select and copy - the one thing every mouse-capturing TUI breaks. An honest loading state instead of "no resources found" while a watch is still syncing. Namespace and context pickers that never ask you to type a name. No setup screen. First run opens the cluster; every setting has a working default and /settings is one keystroke away when you want it. A grow-able prompt (ctrl+z) - because a long kubectl line or an AI question does not fit in a one-row field that scrolls sideways. A terminal-too-small notice instead of a garbled layout. Coming from k9s k10s exists because of k9s. Credit where it is due: k9s is mature, enormous in scope, plugin-extensible, and it is the reason a whole generation of us stopped typing kubectl get pods all day. k10s is younger and deliberately narrower. The difference is philosophy: k9s k10s Primary input keyboard-first, command-driven mouse and keyboard, equally Discovery you learn the commands the actions for the selected object are listed on screen Search