Thanks to visit codestin.com
Credit goes to sofka.rs

A Kubernetes TUI in Rust · kube-rs · ratatui

The cluster tells you it’s broken. sofka tells you why.

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 →
admin@home-kubernetes · sofka v0.20.0
 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

Captured live from a real cluster, rendered by sofka itself. Every frame here is text - go ahead, select it.

:play

Or watch a real session

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

A faster start in this test

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.

1.51 s
startup to the tested pod view
k9s: 3.72 s
66.56 ms
apply a pod-name filter
k9s: 627.76 ms
110 ms
first open of StatefulSets
k9s: 397 ms
317 MiB
process memory (RSS)
k9s: 734 MiB
  • Startup to a visible view - timing stops at 95% of the initial pod count and at least 20 visible status rows. It does not mean all data has loaded.
  • Complete filter input - timing includes the filter key, text, and Enter, then waits for one matching row.
  • Memory across fresh processes - five RSS samples per process, starting five seconds after the pod threshold. This does not measure long sessions.
  • Test limits - results include terminal observation delay and API response time. The programs use different columns, filter rules, and refresh schedules. k9s timing includes its installed launcher.

Measured on one Apple M3 Max running macOS. Results depend on the workload and test conditions. Read the benchmark report and test method.

:features

Keyboard-first, evidence-based

Everything is a keypress away. The full feature list is long; these are the ones you’ll reach for during an incident.

X

Explain why

A deterministic incident view: rollout state, degraded conditions, blocking pods, container failure reasons, recent Warning events. No AI, no external service.

t

Flux CD built in

Suspend, resume, reconcile-now through native API patches - Kustomizations, HelmReleases, sources, image automation. No flux binary.

:helm

Native Helm inspector

Decodes release Secrets itself - history, values, rendered manifests, NOTES, rollbacks. helm list without helm.

T

State timeline

Every change the watch saw for an object - replicas, phases, restarts, condition flips - timestamped, in memory only.

space

Bulk actions

Mark rows, then delete, kill, or run Flux actions across many resources in one confirmed step.

f

Background port-forwards

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.

/

Typed filters

Fuzzy text, !inverse, label and field selectors, and comparisons like cpu>500m, restarts>=5, age<2h.

enter

Every CRD, day one

One generic pipeline renders any kind - curated columns for common ones, printer columns for CRDs, and drill-down into custom resources.

:can-i

Check permissions

Inspect the Kubernetes actions your current identity can perform. Check access before you change a resource.

u

Connected resources

Follow owners, children, and references from the selected object. Find the pods using a volume or the Secrets a pod uses.

x on a PVC

Browse volume contents

Inspect files on a persistent volume and copy them to or from your machine. Follow transfer progress inside sofka.

space + l

Combined pod logs

Mark the pods you need and read their logs together. Inspect related workloads without switching between separate log views.

enter on a pod

Container resource trends

See recent CPU and memory history alongside current values. Inspect container state and configuration in the same view.

:pods @context

Move between contexts

Select a context, resource, and namespace in one command, with completion. Use number keys for your favourite namespaces.

:journal

Controls and action history

Set read-only mode and guardrails for each context. Review the action journal and save it to a file.

skins catppuccin gruvbox solarized nord dracula tokyo-night one-dark rose-pine monokai flexoki

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

External tools, inside sofka

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 →

:popeye

Popeye

Scan the active context and namespace for cluster issues. Read the summary and findings by linter inside sofka.

Requires popeye on your PATH.

Package and setup →
:trivy

Trivy

Scan the active context for vulnerabilities, configuration errors, and secrets. Inspect the scan results inside sofka.

Requires trivy on your PATH.

Package and setup →

With sofka 0.26.0 or later

searchsofka plugin search
inspectsofka plugin describe popeye
installsofka plugin install popeye

Install 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

Why “sofka”

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.

Sophie, a Russian Blue cat, watching the screen with visible suspicion
the reference implementation

:install

Install

Prebuilt binaries for macOS and Linux, aarch64 and x86_64, on every release.

homebrew$ brew install nklmilojevic/sofka/sofka
nix$ nix run github:nklmilojevic/sofka
cargo$ cargo install sofka

macOS 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.