LFK is a keyboard-focused, yazi-inspired terminal user interface for navigating and managing Kubernetes clusters. It brings a three-column Miller columns layout with an owner-based resource hierarchy to your terminal.
Pick your platform:
# Homebrew (macOS / Linux)
brew install janosmiko/tap/lfk
# Scoop (Windows)
scoop bucket add janosmiko https://github.com/janosmiko/scoop-bucket && scoop install lfk
# Winget (Windows)
winget install janosmiko.lfk
# Chocolatey (Windows)
choco install lfk
# AUR (Arch)
yay -S lfk-bin
# APT (Debian / Ubuntu)
curl -1sLf 'https://dl.cloudsmith.io/public/janosmiko/lfk/setup.deb.sh' | sudo -E bash && sudo apt update && sudo apt install lfk
# DNF (Fedora / RHEL)
curl -1sLf 'https://dl.cloudsmith.io/public/janosmiko/lfk/setup.rpm.sh' | sudo -E bash && sudo dnf install lfk
# Go
go install github.com/janosmiko/lfk@latest
# Nix
nix run github:janosmiko/lfkThen run it:
lfk
lfk --demolfk uses ~/.kube/config and ~/.kube/config.d/*. lfk --demo runs against a built-in fake cluster, so no kubeconfig is needed.
kubectl is required and must be configured. helm and trivy are optional, for Helm management and image vulnerability scanning.
docs/installation.md covers Docker, NixOS and home-manager, binary releases, building from source, and the full list of optional CLI dependencies.
# Start in a specific context / namespace
lfk --context my-cluster -n kube-system
# Use a specific kubeconfig
lfk --kubeconfig /path/to/kubeconfig
KUBECONFIG=/path/to/config1:/path/to/config2 lfk
# Use a custom directory for kubeconfigs (repeat the flag for multiple)
lfk --kubeconfig-dir /path/to/configs/
lfk --kubeconfig-dir /team-a/configs --kubeconfig-dir /team-b/configs
KUBECONFIG_DIR=/path/to/configs/ lfk
KUBECONFIG_DIR=/team-a/configs:/team-b/configs lfkdocs/usage.md has the full CLI reference and the runtime tuning options: mouse capture, no-color mode, read-only mode, watch-mode interval, discovery cache, and Secret lazy loading.
LFK is Apache-2.0 and stays free. I build it in my free time, and the tools it takes to build it are not free.
Do you use LFK at work? Ask your team to sponsor it. A company expenses this without noticing, and an individual feels it. Most clusters LFK gets pointed at are company clusters.
Sponsorship pays for the IDE licenses and AI assistants that go into development. More of it buys more hours for LFK.
Money is not the only way to help. Star the repo, file a good bug report, or tell one colleague who lives in kubectl.
Package repository hosting is graciously provided by Cloudsmith. Cloudsmith is a hosted package management service that stores and serves packages in many formats.
| Feature | |
|---|---|
| Pods | ![]() |
| Pods fullscreen | ![]() |
| Pod action menu | ![]() |
| Cluster Dashboard | ![]() |
| Object Explorer | ![]() |
| API Explorer | ![]() |
| Feature | |
|---|---|
| YAML Viewer | ![]() |
| Log Viewer | ![]() |
| Log Top | ![]() |
| Feature | |
|---|---|
| Helm integration | ![]() |
| ArgoCD integration | ![]() |
| ArgoCD AutoSync config | ![]() |
| Trivy integration | ![]() |
| Feature | |
|---|---|
| Security Dashboard | ![]() |
| Crash Investigator | ![]() |
| Pod Startup Analysis | ![]() |
| Can-I RBAC permissions browser | ![]() |
| Feature | |
|---|---|
| Label and annotation editor | ![]() |
| Quick filters | ![]() |
| Column visibility and reordering | ![]() |
| Bookmarks | ![]() |
| Multi-tab support | ![]() |
| Union view | ![]() |
| Local cluster management | ![]() |
- Three-column Miller columns layout: parent, current, preview
- Owner-based hierarchy: Clusters -> Resource Types -> Resources -> Owned Resources -> Containers
- Jump to a resource's owner with
o, back withBackspace - Teleport between levels with
0/1/2 - Cycle the layout with
F, expand or collapse groups withz - Vim keybindings throughout, remappable, including
Ctrl+Shiftchords: keybindings.md - Mouse click, scroll, and
Ctrl+Option+Yto release capture: usage.md
- Groups: Dashboards, Workloads, Networking, Config, Storage, ArgoCD, Helm, Access Control, Cluster, Custom Resources
- Discovered CRDs grouped by API group, for example
argoproj.io,longhorn.io - Pin a type with
p: keybindings.md - Pin a type's dashboard summary with
x: config-reference.md - Hide or show a single type with
x, reveal hidden ones withH: config-reference.md - Rarely used types (CSI internals, webhooks, APF, leases) hidden until
H: config-reference.md - Status summary band under the hovered type: features.md
- Multi-tab workspace with
t/]/[: keybindings.md - Merged kubeconfig from
~/.kube/config,~/.kube/config.d/*, andKUBECONFIG_DIR: usage.md - Union view merging several clusters into one table: union-context.md
- Cluster Dashboard on entering a context: config-reference.md
- Monitoring dashboard with Prometheus and Alertmanager alerts,
@: config-reference.md - Local kind, k3d, and minikube clusters with
Ctrl+N: keybindings.md - Named sessions with
C: keybindings.md - Context, namespace, filter, and cursor row restored on start: config-reference.md
- Read-only mode via
--read-onlyorCtrl+R: usage.md - Actions your RBAC refuses are dropped from the action menu: usage.md
- Security dashboard and SEC badges from Trivy, Kyverno, Kubescape, Falco, Gatekeeper, and three built-in scanners: security.md
- Delete cascade picker,
Tabcycles Background / Foreground / Orphan / None: keybindings.md - Scope, Availability, and Risk rows on the delete, drain, and scale dialogs: keybindings.md
- RBAC browser with
U, reverse lookup withTab: keybindings.md
- Action menu
x: logs, exec, attach, debug, scale, restart, delete, describe, edit, events, port-forward, vuln scan, PVC resize: keybindings.md - Multi-select with
Space, range withCtrl+Space, then bulk delete, scale, or restart: keybindings.md - Custom shell actions per resource type: config-reference.md
- Port forwarding, with active forwards listed under the Networking group: keybindings.md
- Right-sizing Advisor with
x->z: keybindings.md - Network policy visualizer with
x->N, Cilium aware: keybindings.md - Traffic capture with
con a Pod or Service: usage.md
- Filter with
f, search with/, in substring, regex, fuzzy, or literal mode - Abbreviated jumps such as
pvc,hpa,deploy: config-reference.md - Command bar
:for resource jumps, built-ins, kubectl, and shell: commands.md, autocomplete in features.md - Quick filter presets with
.: config-reference.md - Sorting with
>/</=/-, remembered per kind: keybindings.md - Bookmarks with
m<slot>and'<slot>: keybindings.md - Orphan detection with
Shift+Zacross 11 kinds: usage.md
- YAML preview in the right column, details summary with
Shift+P - Fullscreen YAML Viewer with search, folding, and in-place editing: keybindings.md
- Field-manager blame with
m, writes stampedlfk:<os-user>: config-reference.md - Schema side pane with
Ctrl+K: features.md - Object Explorer with
Ofor the live object: keybindings.md - API Explorer with
Ifor the resource schema: keybindings.md - Describe with
v, relationship map withM, events withVplus warnings-only and grouping toggles: keybindings.md
- Live-log preview pane with
L, fullscreen viewer withCtrl+L: keybindings.md - Text filter
f, severity filteri/o, structured previewP: keybindings.md - Log Top aggregates access logs into a metrics table,
T: keybindings.md - Crash Investigator with
x->I: keybindings.md - Embedded terminal for exec and shell,
Ctrl+Tcycles the mode: features.md - Node shell with
x->s: usage.md
- Resource templates with
a, built-ins plus your own: features.md - Export a live object as a template with
x->T: features.md - Copy name
y, copy-as pickerY, single fieldCtrl+Y: keybindings.md - Apply a manifest from the clipboard with
Ctrl+P: keybindings.md - Save the selected manifest to a file with
W - Decode Secrets with
Ctrl+S, edit them decoded withe: keybindings.md - Finalizer search and removal with
Ctrl+G
- Argo CD: browse Applications, sync, terminate, refresh: features.md
- Argo Workflows: suspend, resume, stop, resubmit, submit from a template: features.md
- Helm: browse releases, values, diff, upgrade, rollback, uninstall: keybindings.md
- HPA scaling overlay with
S: keybindings.md - KEDA: pause and unpause ScaledObjects and ScaledJobs: features.md
- External Secrets: force refresh: features.md
- CRD discovery, grouped by API group
- 460+ built-in color schemes from ghostty themes,
Tswitches live: config-reference.md - Auto dark and light switching with the OS appearance: config-reference.md
- Custom theme colors, Tokyonight by default: config-reference.md
- Icon modes: auto, unicode, nerdfont, simple, emoji, none: config-reference.md
- Status colors on rows and CRD printer columns: features.md
- Row status tint when the Status column is hidden: config-reference.md
- Transparent background: config-reference.md
- Column visibility and order with
,, remembered per kind: keybindings.md - Configurable columns globally, per resource type, and per cluster: config-reference.md
- CPU and memory bars on the Cluster Dashboard: features.md
- Node uptime column: config-reference.md
- Namespace resource quota dashboard with
Q - Watch mode auto-refresh with
w: usage.md - Random startup tips: config-reference.md
Clusters (kubeconfig contexts)
+-- Resource Types (grouped: Workloads, Networking, Config, Storage, ArgoCD, Helm, ...)
+-- Resources (e.g., individual Deployments)
+-- Owned Resources (Pods via ownerReferences, Jobs for CronJobs, etc.)
+-- Containers (for Pods)
Namespaces are not a navigation level. The top-right corner shows the current namespace. Press \ to open the selector, which filters as you type. All-namespaces mode is on by default, and A toggles it.
Inside the namespace selector:
| Key | Action |
|---|---|
Space |
Include a namespace |
Tab |
Exclude a namespace (shows all except the marked ones, each prefixed with !) |
A |
Reset to all-namespaces mode |
R |
Refresh the list from the cluster |
. |
Quick-filter to the namespace of the resource behind the overlay |
- Deployments show their Pods (resolved through ReplicaSets, flattened)
- StatefulSets / DaemonSets / Jobs show their Pods directly
- CronJobs show their Jobs
- Services show Pods matching the service selector
- ArgoCD Applications show managed resources (from status or label discovery)
- Helm Releases show managed resources (via
app.kubernetes.io/instancelabel) - Pods show their Containers
- ConfigMaps / Secrets / Ingresses / PVCs show details preview (no children)
docs/keybindings.md is the complete reference, including the YAML view, Log Viewer, describe, diff, exec mode, and every sub-mode. Press F1 in-app for the help screen, ? for the which-key action panel.
| Key | Action |
|---|---|
h / l |
Parent level / into the selected item |
j / k |
Cursor down / up |
gg / G |
Top / bottom of list |
Ctrl+D / Ctrl+U |
Half-page scroll down / up |
Ctrl+F / Ctrl+B |
Full-page scroll down / up |
J / K |
Scroll the preview pane down / up |
Enter |
Fullscreen YAML view, or navigate into |
| Key | Action |
|---|---|
0 / 1 / 2 |
Clusters / resource types / resources level, both ways |
o |
Owner or controller of the selected resource |
Backspace |
Back through teleport history |
g + key |
Goto resource type (g opens the which-key popup) |
m<slot> / '<slot> |
Set / jump to bookmark (lowercase context-aware, uppercase context-free) |
\ / A |
Namespace selector / toggle all-namespaces |
g\ |
Previous namespace |
| Key | Action |
|---|---|
z |
Expand or collapse all groups (Events view: toggle grouping) |
p |
Pin or unpin the selected type |
x |
Pin, hide, or show the selected type |
H |
Reveal rarely used and hidden types |
| Key | Action |
|---|---|
f |
Filter items in the current view |
/ |
Search and jump to a match |
n / N |
Next / previous match |
. |
Quick filter presets |
, |
Column visibility and order |
> / < / = / - |
Sort by next / previous column, flip direction, reset |
| Key | Action |
|---|---|
F1 / ? |
Help screen / which-key action panel |
P |
Details summary or YAML preview |
M |
Resource relationship map |
F |
Cycle layout: hide sidebar, fullscreen, restore |
I / O |
API Explorer / Object Explorer |
Ctrl+K |
Schema side pane for the field under the cursor |
U |
RBAC permissions browser (can-i) |
| Key | Action |
|---|---|
x |
Action menu (logs, exec, describe, edit, delete, scale, port-forward) |
v / L / Ctrl+L |
Describe / live-log preview / fullscreen Log Viewer |
D / X |
Delete / force delete |
y / Y / Ctrl+Y |
Copy name / copy-as picker / copy a single field |
Ctrl+P / W |
Apply from clipboard / save the manifest to a file |
Space |
Toggle multi-selection (bulk actions via x) |
Ctrl+S / Ctrl+G |
Secret value visibility / finalizer search and remove |
| Key | Action |
|---|---|
: |
Command bar (resource jumps, built-ins, kubectl, shell) |
T |
Theme selector |
@ / Q |
Cluster or monitoring dashboard / namespace quotas |
w |
Watch mode (auto-refresh) |
Ctrl+T |
Cycle terminal mode (pty / exec / mux) |
Ctrl+R |
Read-only mode |
! |
Error log |
t / ] / [ / } / { |
New tab / next / previous / move right / move left |
All views (YAML, logs, describe, diff, exec) use vim-style navigation: j/k, gg/G, Ctrl+D/Ctrl+U, / search, v/V visual selection.
docs/commands.md is the command bar reference: built-in commands, shell and kubectl execution, resource jumps.
- Create
~/.config/lfk/config.yaml. - Add only the keys you want to change. Every other value keeps its default.
- Press
Tin-app to browse themes, then put the name you picked incolorscheme.
# Color scheme. "dark:X,light:Y" switches with the OS appearance.
colorscheme: "dark:catppuccin-mocha,light:catppuccin-latte"
# Use the terminal's own background
transparent_background: true
# auto, unicode, nerdfont, simple, emoji, or none. LFK_ICONS overrides it.
icons: auto
# Disable mouse capture (allows native terminal text selection)
mouse: false
# Keybinding overrides
keybindings:
logs: "ctrl+l"
toggle_preview_logs: "L"
describe: "v"
delete: "D"
# Search abbreviations
abbreviations:
myapp: myapplicationsdocs/config-reference.md is the full reference, docs/config-example.yaml a commented example of every field.
Every search and filter input auto-detects the mode from the query string:
| Mode | Syntax | Example |
|---|---|---|
| Substring | plain text | nginx |
| Regex | auto-detected | err[0-9]+ |
| Fuzzy | ~ prefix |
~deplymnt |
| Literal | \ prefix |
\err.* |
All of them accept pasted text (Cmd+V on macOS, Ctrl+Shift+V on Linux). A multiline paste shows a confirmation dialog.
Up / Down recall previous queries. / and f share one history, the Log Viewer's / and the : command bar keep their own. All three survive restarts under $XDG_STATE_HOME/lfk/: keybindings.md.
- Press
oon a resource to jump to its owner (Pod -> Deployment), thenBackspaceto jump back - Teleport between levels with
0/1/2(clusters / resource types / resources).1and2bring you back to the view you left, per cluster - Jump straight to a resource type from anywhere: type
:pod,:dep,:pvc - Set a bookmark with
m<letter>, jump back with'<letter>, the saved namespace and filter come with it - Pin your daily-driver resource types with
pand hide noisy ones viax, both remembered per cluster - Need everything except a few namespaces? In the
\selector,Tabexcludes namespaces instead of selecting them - See how a resource connects to everything else with
M(relationship map)
- Typos are fine in search:
/~deplymntfuzzy-matchesdeployments - Press
Tabinside/orfto broaden matching to labels, annotations, finalizers, and other column values - Recall earlier queries with
Up/Downinside/,f, and the:command bar - Press
.for quick filter presets, for example only failing Pods - Hunt down unused ConfigMaps, Secrets, PVCs and more with
Shift+Z(orphan detection) - Sort by any column with
>/<, flip direction with=, reset with- - Check firing Prometheus or Alertmanager alerts with
@, and namespace quotas withQ
- Peek at Pod or Deployment logs with
L, open the fullscreen viewer withCtrl+L - Make noisy logs readable with
P: the structured preview parses JSON, logfmt, klog, zap, nginx, envoy, Java, and postgres lines - Save logs to a file with
S(loaded lines) orCtrl+S(full history), the path lands on your clipboard - Switch pods or filter containers without leaving the Log Viewer: press
\ - Investigate a crash-looping Pod with
x->I: restart history, events, previous logs, and describe in one tabbed view
- Walk any resource's live object with
O:rfinds keys recursively,Texpands an ASCII tree,ycopies the field path - Forget
kubectl explain,Iopens the API Explorer andn/Nauto-drill into nested fields - In the YAML Viewer, press
Oon a line to open the Object Explorer at that attribute, orIto see its schema Ctrl+Kopens a side pane with the schema description of the field under the cursor, and keeps it in step as you move- Fold YAML sections with
z(Zfolds all), edit the resource in your$EDITORwithCtrl+E - Replay a resource's event history as a timeline with
V - Every viewer speaks vim: counts (
100j,42G,5n), visual selections (v/V/Ctrl+V), and text objects (viw)
- Multi-select with
Space(range-select withCtrl+Space), then bulk delete, scale, or restart viax - Decode Secret values in the preview with
Ctrl+S, or edit them decoded withe - Copy the resource name with
y, pressYto copy as YAML, JSON, or Table - Apply a manifest straight from your clipboard with
Ctrl+P - Save the selected resource manifest to a file with
W - Resource stuck in Terminating?
Ctrl+Gsearches its finalizers and removes them - Open an Ingress host, or an active port-forward's localhost URL, with
Ctrl+O. On a Service it starts a port forward and opens it - Run kubectl without leaving lfk (
:k get pods -o wide) or any shell command (:! curl ...)
- Lock a session against destructive actions with
Ctrl+R(read-only mode) - Spin up a throwaway kind, k3d, or minikube cluster with
Ctrl+Nat the cluster list - Capture a Pod's network traffic with
c: live decode plus pcap export - Flip the RBAC question: inside the Can-I browser (
U),Tabopens Who-Can, every subject allowed to run a verb on a resource - Get per-container CPU and memory recommendations with
x->z(Right-sizing Advisor, VPA-backed when available) - Watch an ArgoCD Application roll out wave by wave:
x->Wopens the Sync Wave Timeline - Try a new look without restarting:
Tlive-previews 460+ themes - Waiting for a rollout?
:nyanand:kubetrisare real commands
See CONTRIBUTING.md for prerequisites, development setup, build and test commands, project layout, and the PR flow.
Apache License 2.0, see LICENSE.


























