Popeye
Scan the active context and namespace for cluster issues. Read the summary and findings by linter inside sofka.
Requires popeye on your PATH.
A Kubernetes TUI in Rust · kube-rs · ratatui
A Kubernetes terminal interface inspired by k9s. Browse built-in and custom resources, run Flux CD actions, and inspect the evidence behind resource failures.
brew install nklmilojevic/sofka/sofka
or grab a binary →
╭ sofka ─────────────────────────────────────────────────────────────────────────────────────╮ /\ /\ │Context: admin@home-kubernetes [read-only] ⏎ containers l logs p prev logs │ / \______/ \ │Cluster: https://10.40.0.3:6443/ s shell t transfer f port-fwd │ ( - - ) │Namespace: <all> y yaml d describe E events │ \ ᴥ / │Resource: pods e edit o node J owner │ \ \__/ / │Count: 186 X explain T timeline ^d delete │ '--------' ╰────────────────────────────────────────────────────────────────────────────────────────────╯ sofka v0.20.0 ╭ pods [186] ──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ NAMESPACE NAME READY STATUS RESTARTS AGE ↑ CPU MEM │ │▌ kopiur-system snapdel-local-87e21528-43f16d9f-68e9-4ab3-9ac0 0/1 Succeeded 0 46s - - │ │ renovate renovate-operator-7d7b78dc99-wqdft 1/1 Running 0 29m 1m 23Mi │ │ kopiur-system r2-q-1788258114-v44jl 0/1 Succeeded 0 31m - - │ │ kopiur-system local-q-1788257659-4l82p 0/1 Succeeded 0 38m - - │ │ renovate github-nklmilojevic-nklmilojevic-home-dffad341 0/1 Succeeded 0 52m - - │ │ renovate github-nklmilojevic-discovery-dba1c185g7hjp-dp 0/1 Succeeded 0 53m - - │ │ home homebridge-7867658848-lqsg8 1/1 Running 0 1h50m 49m 370Mi │ │ security atuin-667ddb57c8-pd6v9 1/1 Running 0 2h8m - 17Mi │ │ media prowlarr-66f76654bb-zsfl2 1/1 Running 0 2h8m 1m 129Mi │ │ media radarr-7d47f44bb6-lzzm2 1/1 Running 0 2h9m 3m 202Mi │ │ misc n8n-5758d6c6f4-s5dsr 1/1 Running 0 2h9m 3m 368Mi │ │ kopiur-system kopiur-controller-78f4c8d89c-plnwd 1/1 Running 0 2h9m 4m 152Mi │ │ kopiur-system kopiur-webhook-5b86fcc5b6-nscwq 1/1 Running 0 2h9m 17m 42Mi │ │ kube-system kube-apiserver-icarus003 1/1 Running 0 3h48m 67m 1.6Gi │ │ kube-system kube-controller-manager-icarus003 1/1 Running 0 3h48m 3m 86Mi │ │ kube-system kube-scheduler-icarus003 1/1 Running 0 3h48m 9m 93Mi │ │ network multus-7cqx6 1/1 Running 0 3h48m 1m 8Mi │ │ kube-system generic-device-plugin-cmw7h 1/1 Running 0 3h48m 3m 21Mi │ │ kube-system intel-gpu-resource-driver-kubelet-plugin-27r49 1/1 Running 0 3h48m - 48Mi │ │ kube-system node-feature-discovery-worker-qmmf7 1/1 Running 0 3h48m - 51Mi │ │ o11y vector-agent-27xlr 1/1 Running 0 3h48m 6m 112Mi │ │ kube-system spegel-vs4j9 1/1 Running 0 3h49m 6m 32Mi │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ :resource /filter S:sort I:invert w:wide space:mark [ ]:history 0:all-ns ?:help Viewing pods ● live
╭ sofka ─────────────────────────────────────────────────────────────────────────────────────╮ /\ /\ │Context: admin@home-kubernetes [read-only] ⏎ containers l logs p prev logs │ / \______/ \ │Cluster: https://10.40.0.3:6443/ s shell t transfer f port-fwd │ ( - - ) │Namespace: <all> y yaml d describe E events │ \ ᴥ / │Resource: pods e edit o node J owner │ \ \__/ / │Count: 186 X explain T timeline ^d delete │ '--------' ╰────────────────────────────────────────────────────────────────────────────────────────────╯ sofka v0.20.0 ╭ pods [186] ──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ NAMESPACE NAME READY STATUS RESTARTS AGE ↑ CPU MEM │ │▌ kopiur-system snapdel-local-87e21528-43f16d9f-68e9-4ab3-9ac0 0/1 Succeeded 0 49s - - │ │ renovate renovate-operator-7d7b78dc99-wqdft 1/1 Running 0 29m 1m 23Mi │ │ kopiur-system r2-q-1788258114-v44jl 0/1 Succeeded 0 31m - - │ │ kopiur-system local-q-1788257659-4l82p 0/1 Succeeded 0 38m - - │ │ renovate github-nklmilojevic-nklmilojevic-home-dffad341 0/1 Succeeded 0 52m - - │ │ renovate github-nklmilojevic-discovery-dba1c185g7hjp-dp 0/1 Succeeded 0 53m - - │ │ home homebridge-7867658848-lqsg8 1/1 Running 0 1h50m 49m 370Mi │ │ security atuin-667ddb57c8-pd6v9 1/1 Running 0 2h8m - 17Mi │ │╭ commands & resources (tab/↑↓ · ⏎) ─────────╮ 1/1 Running 0 2h9m 1m 129Mi │ ││▌ :fleet cmd │ 1/1 Running 0 2h9m 2m 200Mi │ ││ :gitops cmd │ 1/1 Running 0 2h9m 4m 369Mi │ ││ flowschemas │plnwd 1/1 Running 0 2h9m 4m 161Mi │ ││ fluxreports │wq 1/1 Running 0 2h9m 20m 43Mi │ ││ fluxinstances │ 1/1 Running 0 3h48m 72m 1.6Gi │ ││ failoverquorums │s003 1/1 Running 0 3h48m 4m 86Mi │ ││ buckets.source.toolkit.fluxcd.io │ 1/1 Running 0 3h48m 5m 93Mi │ ││ helmcharts.source.toolkit.fluxcd.io │ 1/1 Running 0 3h48m 1m 8Mi │ ││ helmreleases.helm.toolkit.fluxcd.io │ 1/1 Running 0 3h49m 2m 21Mi │ ││ resourcesets.fluxcd.controlplane.io │elet-plugin-27r49 1/1 Running 0 3h49m - 48Mi │ ││ alerts.notification.toolkit.fluxcd.io │-qmmf7 1/1 Running 0 3h49m 1m 51Mi │ ││ imagepolicies.image.toolkit.fluxcd.io │ 1/1 Running 0 3h49m 3m 112Mi │ │╰────────────────────────────────────────────╯ 1/1 Running 0 3h49m 6m 33Mi │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ :fl█ Viewing pods ● live
╭ sofka ─────────────────────────────────────────────────────────────────────────────────────╮ /\ /\ │Context: admin@home-kubernetes ⏎ yaml d describe E events │ / \______/ \ │Cluster: https://10.40.0.3:6443/ e edit c copy name Y copy cell │ ( - - ) │Namespace: ai ^d delete │ \ ᴥ / │Resource: kustomizations.kustomize.toolkit.flu t flux menu │ \ \__/ / │Count: 8 │ '--------' ╰────────────────────────────────────────────────────────────────────────────────────────────╯ sofka v0.20.0 ╭ kustomizations [8] ──────────────────────────────────────────────────────────────────────────────────────────────────╮ │ NAME READY MESSAGE REVISION SUSPENDED AGE│ │▌ atuin-ai True Applied revision: refs/heads/main@sha1:33e7 refs/heads/main@sha1:3 false 48d│ │ grafana-mcp True Applied revision: refs/heads/main@sha1:33e7 refs/heads/main@sha1:3 false 42d│ │ ha-mcp True Applied revision: refs/heads/main@sha1:33e7 refs/heads/main@sha1:3 false 71d│ │ hermes True Applied revision: refs/heads/main@sha1:33e7 refs/heads/main@sha1:3 false 57d│ │ kubesearch-mcp True Applied revision: refs/heads/main@sha1:33e7 refs/heads/main@sha1:3 false 4d │ │ toolhive-operator True Applied revision: refs/heads/main@sha1:33e7 refs/heads/main@sha1:3 false 71d│ │ toolhive-operator-config True Ap╭ Flux: current selection ────────────────╮refs/heads/main@sha1:3 false 71d│ │ toolhive-operator-crds True Ap│▌ Suspend │refs/heads/main@sha1:3 false 71d│ │ │ Resume │ │ │ │ Reconcile now │ │ │ │ Cancel │ │ │ │ │ │ │ │ │ │ │ ╰─────────────────────────────────────────╯ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ j/k: move enter: confirm esc: cancel Viewing kustomizations.kustomize.toolkit.fluxcd.io ● live
╭ sofka ─────────────────────────────────────────────────────────────────────────────────────╮ /\ /\ │Context: admin@home-kubernetes [read-only] ⏎ history │ / \______/ \ │Cluster: https://10.40.0.3:6443/ y yaml d describe │ ( - - ) │Namespace: <all> ^d uninstall │ \ ᴥ / │Resource: helm │ \ \__/ / │Count: 479 │ '--------' ╰────────────────────────────────────────────────────────────────────────────────────────────╯ sofka v0.20.0 ╭ helm [107] ──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ NAMESPACE NAME REVISION STATUS CHART APP VERSION UPDATED│ │▌ ai atuin-ai 10 deployed app-template-5.1.0+0d039f7760db 15d │ │ ai hermes 49 deployed app-template-5.1.0+0d039f7760db 14h24m │ │ ai toolhive-operator-crds 20 deployed toolhive-operator-crds-0.46.0+9a1f96 0.46.0 4d16h │ │ ai toolhive-operator 21 deployed toolhive-operator-0.46.0+7db42856f7e 0.46.0 4d16h │ │ cert-manager cert-manager 22 deployed cert-manager-1.21.1+15c0b46d9006 v1.21.1 33d │ │ database barman-cloud 1 deployed plugin-barman-cloud-0.7.1+fc5683ec65 v0.14.0 8d │ │ database cloudnative-pg 2 deployed cloudnative-pg-0.29.0+209c588b9029 1.30.0 8d │ │ database ot-operator 90 deployed redis-operator-0.26.1+52979c0e960c 0.26.0 9d │ │ database redis-forgejo 41 deployed redis-0.16.10+02bd2668c98c 0.16.10 3d22h │ │ database redis-immich 3 deployed redis-0.16.10+02bd2668c98c 0.16.10 3d22h │ │ database redis-paperless 61 deployed redis-0.16.10+02bd2668c98c 0.16.10 3d22h │ │ database redis-searxng 10 deployed redis-0.16.10+02bd2668c98c 0.16.10 3d22h │ │ flux-system flux-instance 11 deployed flux-instance-0.59.0+c7078e69a189 v0.59.0 15h47m │ │ flux-system flux-operator 12 deployed flux-operator-0.59.0+ae962f87e043 v0.59.0 15h48m │ │ flux-system konflate 13 deployed konflate-0.6.2+3d4c86add593 0.6.2 5d3h │ │ home appdaemon 18 deployed app-template-5.1.0+0d039f7760db 3d23h │ │ home asterisk 29 deployed app-template-5.1.0+0d039f7760db 11d │ │ home esphome 266 deployed app-template-5.1.0+0d039f7760db 15h47m │ │ home go2rtc 32 deployed app-template-5.1.0+0d039f7760db 11d │ │ home govee2mqtt 22 deployed app-template-5.1.0+0d039f7760db 3d22h │ │ home hms-cpap 14 deployed app-template-5.1.0+0d039f7760db 1d22h │ │ home home-assistant 167 deployed app-template-5.1.0+0d039f7760db 3d22h │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ :resource /filter S:sort I:invert w:wide space:mark [ ]:history 0:all-ns ?:help Viewing Helm releases ● live
Captured live from a real cluster, rendered by sofka itself. Every frame here is text - go ahead, select it.
:play
A one-minute tour recorded from real sofka watching a kwok cluster full of Sophie’s microservices - keypresses appear bottom-right as they happen. It filters to the crashloop, asks X why it’s broken, follows l into the logs, and pokes the native Helm inspector on the way out.
recorded from a real session, byte for byte · asciinema playback, no backend
:speed
sofka reached the tested pod view in 59% less time than k9s. These medians compare sofka 0.24.9 with k9s 0.51.0 on 8 September 2026: ten fresh processes per program, read-only mode, the same terminal, and alternating run order.
Measured on one Apple M3 Max running macOS. Results depend on the workload and test conditions. Read the benchmark report and test method.
:features
Everything is a keypress away. The full feature list is long; these are the ones you’ll reach for during an incident.
A deterministic incident view: rollout state, degraded conditions, blocking pods, container failure reasons, recent Warning events. No AI, no external service.
Suspend, resume, reconcile-now through native API patches - Kustomizations, HelmReleases, sources, image automation. No flux binary.
Decodes release Secrets itself - history, values, rendered manifests, NOTES, rollbacks. helm list without helm.
Every change the watch saw for an object - replicas, phases, restarts, condition flips - timestamped, in memory only.
Mark rows, then delete, kill, or run Flux actions across many resources in one confirmed step.
Select a port and keep working while forwarding runs in the background. Use :pf to manage forwards or change a local port after a conflict.
Fuzzy text, !inverse, label and field selectors, and comparisons like cpu>500m, restarts>=5, age<2h.
One generic pipeline renders any kind - curated columns for common ones, printer columns for CRDs, and drill-down into custom resources.
Inspect the Kubernetes actions your current identity can perform. Check access before you change a resource.
Follow owners, children, and references from the selected object. Find the pods using a volume or the Secrets a pod uses.
Inspect files on a persistent volume and copy them to or from your machine. Follow transfer progress inside sofka.
Mark the pods you need and read their logs together. Inspect related workloads without switching between separate log views.
See recent CPU and memory history alongside current values. Inspect container state and configuration in the same view.
Select a context, resource, and namespace in one command, with completion. Use number keys for your favourite namespaces.
Set read-only mode and guardrails for each context. Review the action journal and save it to a file.
keysConfigure built-in keys per mode in TOML or YAML, with conflict checking. ? shows the bindings that are in effect. Configure key bindings →
Use YAML or TOML, split configuration across conf.d/ files, and set namespace-specific view layouts. Nix users can configure sofka with Home Manager. Configuration guide →
:plugins
The official registry contains reviewed plugin packages. Search, inspect, install, update, and remove packages from the command line. Run their commands inside sofka and read the results in searchable reports.
Available in sofka 0.26.0 and later. Install the latest release to use the official plugin registry. Get the latest release →
Scan the active context and namespace for cluster issues. Read the summary and findings by linter inside sofka.
Requires popeye on your PATH.
Scan the active context for vulnerabilities, configuration errors, and secrets. Inspect the scan results inside sofka.
Requires trivy on your PATH.
sofka plugin searchsofka plugin describe popeyesofka plugin install popeyeInstall the required external tool separately. After package installation, enter :reload in an open sofka session, then run :popeye or :trivy. Package downloads have checksum and compatibility checks. Plugins run with your permissions; review does not provide a process sandbox.
Local plugin packages are supported from sofka 0.24.0. Write plugins in your preferred language; sofka supplies resource data, input checks, timeouts, cancellation, and guardrails.
:sophie
That’s Sophie, a Russian Blue. She sits behind the monitor and watches the screen. Constantly, not sometimes. She has the narrow-eyed look of someone who has seen a pod in CrashLoopBackOff. She catches every state change and doesn’t get distracted. She is, in effect, a cluster watchman that is a cat.
sofka is the Serbian short form of Sophia, which means “wisdom”. A good cluster TUI and a good cat both watch things closely, and both know when something is wrong.
:install
Prebuilt binaries for macOS and Linux, aarch64 and x86_64, on every release.
$ brew install nklmilojevic/sofka/sofka$ nix run github:nklmilojevic/sofka$ cargo install sofkamacOS Gatekeeper blocks unsigned tarballs downloaded in a browser - clear it once with xattr -d com.apple.quarantine sofka, or install via Homebrew/Nix and never think about it. Details in the README.