Keybindings Reference

July 20, 2026 · View on GitHub

Complete list of all keybindings in lfk. All keybindings can be overridden in ~/.config/lfk/config.yaml under the keybindings section. Only esc, ctrl+c, and q (quit) are hardcoded.

KeyAction
h / LeftNavigate to parent level
l / RightNavigate into selected item
j / DownMove cursor down
k / UpMove cursor up
gg / HomeJump to top of list
G / EndJump to bottom of list
EnterOpen full-screen YAML view / navigate into
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
zToggle expand/collapse all resource groups / toggle event grouping in the Events list
pPin/unpin resource type (at resource types level)
xAt resource types level: pin/unpin or hide/show the selected resource type, or pin/unpin its dashboard summary, via the action menu (saved per cluster context / union set)
HToggle rarely used + hidden resource types (CSI internals, webhooks, APF, leases, advanced core); revealed types shown dimmed (rare toggle resets each launch; per-type hides persist)
0 / 1 / 2Jump to clusters / types / resources level
J / KScroll preview pane down/up
o / Oo jumps to the owner/controller of the selected resource; O opens the Object Explorer for it
BackspaceJump back through teleport history (owner, port-forward, orphan, finding, and mark jumps push history; hierarchical h/l navigation does not)

Goto Navigation

Vim-style g-prefix chords that switch the active resource type while keeping the current context and namespace filter. Press g to open the which-key popup (configurable via which_key_enabled and which_key_delay_ms); esc or any unmapped key closes it.

KeyResource
gpPods
gdDeployments
gsServices
gnNodes
gNNamespaces
giIngresses
gjJobs
gcCronJobs
grReplicaSets
gDDaemonSets
gtStatefulSets
gCConfigMaps
gSSecrets
ghHorizontalPodAutoscalers
gvPersistentVolumeClaims
gVPersistentVolumes
gbPodDisruptionBudgets

Add custom chords (including CRDs) via goto_targets in ~/.config/lfk/config.yaml. For example, to jump to ArgoCD Applications with ga:

goto_targets:
  ga: { kind: Application, group: argoproj.io, name: ArgoCD Applications }

The g popup also lists g\, which jumps to the previous namespace (swaps the scope back and forth).

All built-in chords are rebindable under keybindings.

Views and Tools

KeyAction
?Toggle help screen
PToggle between details summary and YAML preview
Details pane shows labels, finalizers, annotation count, and resource metadata
Details view shows deletion timestamp (with warning highlight) for resources being deleted
FCycle layout: hide sidebar -> fullscreen -> restore (dashboards toggle fullscreen)
MToggle resource relationship map view
,Column visibility toggle (show/hide and reorder columns — see Column Toggle Overlay below)
Ctrl+SToggle secret value visibility in details pane (YAML preview always shows actual base64 values)
IAPI Explorer (browse resource structure interactively)
OObject Explorer (browse the selected resource's live object as a drill-in tree)
URBAC permissions browser (can-i)
Shift+ZOpen the cluster-wide Orphan overview
CSession manager (save/switch/delete named workspace sessions)
Ctrl+GFinalizer search and remove
!Error log
@Cycle Cluster / Monitoring dashboard
Ctrl+NOpen the Local Clusters Manager overlay (only at LevelClusters)
QNamespace resource quota dashboard
`Scheduler / task queue overlay (Tab toggles running / completed history; a toggles show-all entries in completed view)
:Command bar: resource jumps (:pod, :dep), built-ins (:ns, :ctx, :set, :sort, :export, :scheduler), kubectl (:k get pod), shell (:! cmd)

Sorting

KeyAction
> / <Sort by next / previous column
=Toggle sort direction (ascending/descending)
-Reset sort to default (Name ascending)

Your chosen sort is remembered per resource kind and per cluster context, and persists across restarts (stored in ~/.local/state/lfk/sort_memory.yaml), so leaving a list and returning — or quitting and reopening lfk — keeps your sort instead of resetting. Use - (reset) to drop a remembered sort.

Modes & Settings

KeyAction
wToggle watch mode (auto-refresh every 2s)
Ctrl+RToggle read-only mode (cluster picker: highlighted row's [RO] marker; inside a context: current tab)
TSwitch color scheme (live preview, not persisted)
Ctrl+TCycle terminal mode (pty / exec / mux — mux skipped without tmux/zellij)
BShow/hide the per-resource SEC severity badge on explorer rows
iShow/hide ignored security findings (security view only — shadows the Label Editor there, which is a no-op on synthetic finding rows)

Orphan filter presets

Cluster-wide overview

Press Shift+O anywhere in the explorer (or type :orphans with no arguments in the command bar) to open the cluster-wide orphan overview overlay. Inside the overlay:

KeyAction
Tab / Shift+TabCycle kind filter chips (All / Pods / Secrets / CMs / Svcs / PVCs / HPAs / PDBs / NetPols / Roles / RBs)
sToggle strict / lenient — strict (default) hides items referenced by workload templates; lenient surfaces them
/Filter by namespace + name
EnterJump to the highlighted resource (namespace switches automatically)
RRe-scan the cluster
Esc / q / Shift+OClose the overlay

Per-kind presets

The . filter-preset overlay surfaces these orphan-detection presets when the active resource list is one of the supported kinds. Every orphan preset binds to the same hotkey O so there is one mnemonic to remember; the per-kind preset name still distinguishes the underlying check.

Resource listPreset nameMatch
PodsOrphansNo owner reference (excludes static / mirror pods)
SecretsUnmountedNo Pod / template / Ingress / SA refers to it
ConfigMapsUnmountedNo Pod or workload template refers to it
ServicesNo EndpointsZero ready+notReady endpoints
PersistentVolumeClaimsUnusedNot mounted by any Pod or template
HorizontalPodAutoscalersDanglingscaleTargetRef points to a missing workload
PodDisruptionBudgetsDanglingSelector matches no live / templated pods
NetworkPoliciesDanglingpodSelector matches no live / templated pods
RolesUnboundNo RoleBinding refers to it (ClusterRoleBinding can't reference a Role)
ClusterRolesUnboundNo RoleBinding / ClusterRoleBinding refers to it
RoleBindings / ClusterRoleBindingsDanglingMissing role or empty subjects

:orphans <kind> (e.g. :orphans pods, :orphans pvcs, :orphans rolebindings) is a shortcut that jumps to the kind's list with the matching preset already applied.

Auto-excluded from "Unmounted" results:

  • Helm release Secrets (type=helm.sh/release.v1)
  • ServiceAccount tokens (type=kubernetes.io/service-account-token)
  • kube-root-ca.crt ConfigMap
  • Anything with an ownerReference (cert-manager Certificates, etc.)

Auto-excluded from Pod "Orphans":

  • Static / mirror pods (kubelet-managed via kubernetes.io/config.mirror annotation)

Terminal pods (Succeeded/Failed) older than 1h are still flagged but the reason is "no owner (terminal)" to distinguish them from live workloads.

Search and Filter

KeyAction
fStart filter mode (filter items in current view)
/Start search mode (search and jump to match)
.Quick filter presets
TabInside / or f: toggle broad mode — also matches against column values (annotations, labels, finalizers, CRD printer columns, custom user columns). Prompt shows filter (all): / search (all): while on. Resets on Enter/Esc.
Up / DownInside / or f: cycle through previous queries (shared persistent history).
nJump to next search match
NJump to previous search match
EscClear filter / cancel search

Each list remembers its f filter per tab: drilling into a resource (logs, containers, owned objects) and navigating back keeps the filter applied. A different list starts unfiltered; press Esc to clear a list's filter.

Search supports abbreviated resource type names (e.g., pvc, hpa, deploy).

/ and f share one persistent history at $XDG_STATE_HOME/lfk/query-history (default ~/.local/state/lfk/query-history) — both inputs accept the same query syntax and match against the same fields, so a query confirmed in one mode is recallable from the other. The : command bar keeps its own history file because its inputs are kubectl-shaped commands rather than resource-name queries.

Actions

KeyActionConfig key
xOpen action menu (bulk actions when items selected)action_menu
\Open namespace selector (then . to filter to current item's namespace)namespace_selector
AToggle all-namespaces mode (also works inside the namespace selector — clears individual selections and enables all-ns)all_namespaces
g\Jump to previous namespace (swaps the scope back and forth)previous_namespace
LToggle live-log preview pane for selected pod or container (streaming tail in right pane; deeper levels only)toggle_preview_logs
Ctrl+LOpen fullscreen log viewer for selected resourcelogs
eSecret/ConfigMap editor (inline key-value editing)secret_editor
EEdit selected resource in KUBEEDITORorKUBE_EDITOR or EDITORedit
RRefresh current view (also works inside the namespace selector — re-fetches the namespace list from the cluster)refresh
vDescribe selected resourcedescribe
DDelete resource (force delete Pod/Job if already deleting, force finalize others)delete
XForce delete (Pod/Job only)force_delete
SScale resource (Deployment / StatefulSet / ReplicaSet / HPA)scale
WSave resource to file / toggle warnings-only filter (Events view)save_resource
Ctrl+OOpen in browser: ingress host, port-forward localhost URL, or (on a Service) start a port forward and open itopen_browser
iEdit labels/annotationslabel_editor
aCreate new resource from template (/ to search)create_template
dDiff two selected resourcesdiff

Events list also groups duplicate events (same Type/Reason/Message/Object) by default; press z to toggle grouping.

Port forwarding is available via the action menu (x) on Pod, Service, Deployment, StatefulSet, and DaemonSet resources. In the port-forward dialog, select an exposed port with j/k, or type a local:remote mapping (e.g. 8080:80) to choose a specific local port — omit the local port (e.g. :80) for a random one. After creating a port forward, the view automatically navigates to the Port Forwards list and displays the resolved local port in the status bar. Active port forwards can be managed via the "Port Forwards" virtual resource in the Networking group; press D there to remove the selected forward. On a Service, Ctrl+O (or the "Port Forward & Open" action) starts a port forward and opens the resolved http://localhost:<port> in the browser once it is ready.

Resource-specific actions (exec, scale, restart, secret editor, etc.) are available through the action menu (x).

Clipboard

KeyAction
yCopy resource name to clipboard (with multi-selection: newline-joined names of all selected items)
YOpen copy-as picker (YAML / JSON / Table). YAML/JSON support multi-selection (multi-doc YAML joined with ---, JSON array). Table is a kubectl-style aligned plain-text view of the displayed columns. At LevelClusters and LevelResourceTypes only Table is offered. At LevelContainers, YAML and JSON extract the container spec block from the Pod manifest.
Ctrl+YCopy a single field. Opens instantly on the visible table columns (Name, Status, extras...) — Enter copies the cell value. Tab switches to the full manifest field list, where array elements are labeled semantically (status.addresses[ExternalIP].address for a node's external IP) so filtering ExternalIP finds the address row. With multi-selection the chosen column/field is extracted from every selected item, one value per line; labeled array elements resolve per manifest (not by index), and items missing the field are skipped. Remembers the last-copied entry per resource kind for the session and preselects it next time.
Ctrl+PApply resource from clipboard (kubectl apply)

When items are multi-selected (Space / Ctrl+Space / Ctrl+A), y, Y, and Ctrl+Y operate on the selection rather than the cursor row — mirroring the precedence used by D (delete) and other bulk actions. Y and Ctrl+Y are capped at 50 manifests per copy (client-go's default rate limiter serializes the per-item fetches).

Multi-Selection

KeyAction
SpaceToggle selection on current item (sets anchor)
Ctrl+SpaceSelect range from anchor to cursor
Ctrl+ASelect / deselect all visible items
EscClear selection

When items are selected, press x to open the bulk action menu (delete, force delete, scale, restart, diff).

Bookmarks

Vim-style named marks for quick navigation. A bookmark stores a resource path (context + namespace + resource type + optional resource name) under a single-character slot. Any list filter active when the mark is set is saved with it and reapplied on jump; filtered slots show a > /<filter> suffix in their name.

  • Context-aware (a-z / 0-9): remembers the kube context; jumping switches clusters.
  • Context-free (A-Z): uses the tab's current cluster; for cluster-agnostic shortcuts.
KeyContextAction
m<key>ExplorerSet mark at current location (a-z, 0-9)
'ExplorerOpen bookmarks list
a-z / 0-9Bookmark overlayJump directly to named mark
j / kBookmark overlayNavigate bookmarks
/Bookmark overlayFilter bookmarks by name
EnterBookmark overlayJump to selected bookmark
TabBookmark overlayToggle [KEEP CURRENT NS] — opt out of loading the bookmark's saved namespace on the next jump
Ctrl+XBookmark overlayDelete selected bookmark (with confirmation)
Alt+XBookmark overlayDelete all bookmarks (with confirmation)

Namespace on jump: each bookmark shows its saved namespace scope, and by default the jump applies it. Press Tab to opt out ([KEEP CURRENT NS]) and keep the tab's current scope instead; the flag resets on close.

Help View

KeyAction
/Search — highlights matches inline without removing non-matching lines
Ctrl+N / Ctrl+PNext / previous match while typing the search input
EnterApply search (closes input, keeps highlights, arms n/N)
n / NJump to next / previous search match (after Enter)
fFilter — narrows the visible list to lines matching the query
EscCascades: clear active search → clear active filter → close help
j / kScroll down/up
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half-page scroll down/up
Ctrl+F / Ctrl+B / PgDown / PgUpFull-page scroll
g / GJump to top / bottom
q / ? / F1Close help

YAML View

Search (/), help (?), match navigation (n/N), and the display toggles (wrap, fold, line numbers, timestamps, prefixes, unified, preview, follow) shown across the viewers below are rebindable — see Keybindings. Core cursor navigation (hjkl, g/G, page motions, word-motions) is fixed.

KeyAction
j / kScroll up/down
123j / 123kMove cursor down/up N visible lines (count-prefixed motion; folds skipped)
h / lMove cursor column left/right
123h / 123lMove cursor column left/right by N runes
0 / $Move cursor to line start/end
^Move cursor to first non-whitespace character
w / bMove cursor to next/previous word start
W / BMove cursor to next/previous WORD start (whitespace-delimited)
eMove cursor to end of word
EMove cursor to end of WORD (whitespace-delimited)
123w / 123b / 123e (and capitals)Apply word/WORD motion N times
gg / HomeJump to top
G / EndJump to bottom
123GJump to line number
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
123 Ctrl+D / 123 Ctrl+UScroll N lines (vim 'scroll' semantics: sets the sticky step shared between Ctrl+D and Ctrl+U; clamped to viewport)
123 Ctrl+F / 123 Ctrl+BPage motion scaled by N
/Search in YAML
n / NNext / previous search match
123n / 123NJump to Nth next / previous search match
vCharacter visual selection (from cursor column)
VVisual line selection
Ctrl+VBlock (column) visual selection (from cursor column)
h / lMove selection column left/right (in visual mode)
viw / vaw / viW / vaWSelect inner/around word (or WORD) under cursor
yCopy line under cursor (or selection in visual mode)
123yCopy number of lines from cursor (count-prefixed yank; folds skipped)
zToggle fold on section under cursor
ZToggle all folds (collapse/expand all)
>Toggle line wrapping (configurable via toggle_wrap)
RRe-fetch the resource and refresh the view, keeping cursor/scroll (configurable via refresh)
Ctrl+EEdit resource in $KUBE_EDITOR or $EDITOR
OSwitch to the Object Explorer at the attribute under the cursor (keeps position)
IOpen the API Explorer at the schema of the attribute under the cursor
q / EscBack to explorer

The top breadcrumb shows the resource name and the attribute path under the cursor (e.g. lfk > ctx > Pods > my-pod > spec.containers[0].image), like the Object Explorer location.

Object Explorer

Drill-in tree over the selected resource's live object, opened with O. Under watch mode the browsed object live-refreshes as the resource changes; pause it to read a stable snapshot.

KeyAction
j / kNavigate fields
l / Enter / Drill into object/array field
h / Backspace / Go back one level
J / KScroll the YAML preview pane
/Filter the current level by key (in tree view: keys anywhere in the subtree)
rRecursive find overlay (search keys across the whole object)
TToggle tree view — expand the whole subtree with ASCII-art guides (configurable via tree_view)
Space / zFold/unfold the subtree under the cursor (tree view; z configurable via toggle_fold)
RManually refresh the browsed object now (configurable via refresh)
wToggle live refresh on/off — title shows [PAUSED] when off (configurable via watch_mode)
y / YYank the selected node's path / full YAML
POpen the whole resource in the full YAML viewer
IOpen the API Explorer at the selected item's schema
q / EscBack one level / close at root

Live refresh defaults to on; set object_explorer.live: false to start paused. Set object_explorer.tree: true to open in the tree view (api_explorer.tree for the API Explorer). See Viewer Defaults.

Describe View

KeyAction
j / kMove cursor up/down
123j / 123kMove cursor down/up N lines (count-prefixed motion)
h / lMove cursor column left/right
123h / 123lMove cursor column left/right by N runes
0 / $ / ^Move cursor to line start / end / first non-whitespace
w / b / e / W / B / EWord / WORD motions
123w / 123b / 123e (and capitals)Apply word/WORD motion N times
gg / G / Home / EndJump to top / bottom
123GJump to line number
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
123 Ctrl+D / 123 Ctrl+UScroll N lines (vim 'scroll' semantics: sets the sticky step shared between Ctrl+D and Ctrl+U; clamped to viewport)
123 Ctrl+F / 123 Ctrl+BPage motion scaled by N
/Search in content
n / NNext / previous search match
123n / 123NJump to Nth next / previous search match
vCharacter visual selection
VVisual line selection
Ctrl+VBlock (column) visual selection
viw / vaw / viW / vaWSelect inner/around word (or WORD) under cursor
yCopy line under cursor (or selection in visual mode)
123yCopy number of lines from cursor (count-prefixed yank)
>Toggle line wrapping (configurable via toggle_wrap)
q / EscBack to explorer

Log Viewer

KeyAction
j / kMove cursor up/down
123j / 123kMove cursor down/up N lines (count-prefixed motion)
h / l / Left / RightMove cursor column left/right
123h / 123lMove cursor column left/right by N runes
0 / $Move cursor to line start/end
^Move cursor to first non-whitespace character
w / bMove cursor to next/previous word start
W / BMove cursor to next/previous WORD start (whitespace-delimited)
eMove cursor to end of word
EMove cursor to end of WORD (whitespace-delimited)
123w / 123b / 123e (and capitals)Apply word/WORD motion N times
gg / HomeJump to top
G / EndJump to bottom
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half page down / up
Ctrl+F / Ctrl+B / PgDn / PgUpFull page down / up
123 Ctrl+D / 123 Ctrl+UScroll N lines (vim 'scroll' semantics: sets the sticky step shared between Ctrl+D and Ctrl+U; clamped to viewport)
123 Ctrl+F / 123 Ctrl+BPage motion scaled by N
FToggle follow mode (auto-scroll to new logs)
fFilter log lines live (~fuzzy, regex auto-detected, \literal); narrows the view to matching lines
i / oLower / raise the minimum log severity shown — cycles off → INFO+ → WARN+ → ERROR+ (all source levels merge into these three). Structured logs use the parsed level; plain-text logs are classified by keyword (error/warn/debug), defaulting to INFO. So INFO+ hides debug/trace, WARN+ shows only warn/error lines, ERROR+ only error/failure lines
>Toggle line wrapping (configurable via toggle_wrap)
#Toggle line numbers
sToggle timestamps
pToggle pod/container prefixes
PToggle structured preview side panel (JSON / logfmt / klog / zap / nginx / envoy / java / postgres / plain text)
J / KScroll the preview side panel down / up (one row, no-op when panel is hidden)
cToggle previous container logs
/Search in logs
Up / DownInside /: cycle through previous log search queries (persistent history).
n / NNext / previous search match
123n / 123NJump to Nth next / previous search match
123GJump to specific line number
SSave loaded logs to file (path copied to clipboard)
Ctrl+SSave all logs to file, full kubectl logs (path copied to clipboard)
vCharacter visual selection (from cursor column)
VVisual line selection
Ctrl+VBlock (column) visual selection (from cursor column)
h / lMove selection column left/right (in visual mode)
viw / vaw / viW / vaWSelect inner/around word (or WORD) under cursor
yCopy line under cursor (or selection in visual mode)
123yCopy number of lines from cursor (count-prefixed yank)
\Switch pod / filter containers (space: select, enter: apply, / to filter)
q / EscClose log viewer

The log viewer's / keeps its own persistent history at $XDG_STATE_HOME/lfk/log-search-history (default ~/.local/state/lfk/log-search-history), separate from the explorer's query-history. Log search matches raw log lines (substring/regex over arbitrary text) rather than resource names, so pooling the two would surface irrelevant entries on Up/Down in either context.

Tail-first loading: Full Logs (Ctrl+L key or action menu L) load the last 100 lines initially (configurable via log_viewer.tail_lines). Tail Logs (action menu l) load only the last 10 lines (configurable via log_viewer.tail_lines_short). Scrolling to the top loads older history.

Auto-reconnect across init containers: when viewing logs for a single Pod in all-containers mode (no specific container selected via \), the stream automatically reconnects each time kubectl exits — e.g. as init containers transition. The reconnect is silent. After several consecutive empty reconnects the viewer stops retrying.

Log Top

Log Top aggregates a resource's logs into a table grouped by parsed attributes (e.g. method + path for HTTP, or any JSON/logfmt keys). Columns auto-fit the terminal width - wider terminals show more (up to all of REQ, REQ/s, ERR%, %, ERR, 4XX, 5XX, AVG, P50/P95/P99, MAX); narrower ones show the highest-priority columns. , toggles/reorders columns explicitly. Launch from the resource action menu ("Log Top", quick-key T) or press T in the open log viewer. Auto-detects Traefik JSON, ingress-nginx, Envoy, NCSA common/combined (nginx, Apache, Traefik default access logs), JSON, and logfmt. Config: log_top_default_profile (auto | traefik-json | ingress-nginx | nginx-combined | envoy | json | logfmt).

KeyAction
j / k / / Move cursor down / up
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half-page down / up
Ctrl+F / Ctrl+B / PgDn / PgUpFull-page down / up
g / home / G / endJump to top / bottom
5j / 10GCount-prefixed motion (repeat / go to row N)
> / <Cycle sort column (dimensions + REQ / REQ/s / ERR% / 4XX / 5XX / AVG / p50 / p95 / p99 / MAX)
=Toggle sort direction (the active column shows ↑/↓)
-Reset sort to REQ descending
.Open group-by field picker (multi-select)
pOpen profile picker (traefik-json / ingress-nginx / nginx-combined / envoy / json / logfmt / auto)
,Open column picker: show/hide and reorder dimension columns, show/hide metric columns
fFilter rows (matches dimension values)
/Search and jump to matching row
n / NNext / previous search match
EnterDrill into selected group (descends to the next unused dimension, marked in its column header)
Esc / qPop drill level, or return to log viewer

Exec Mode (embedded terminal)

Ctrl+] is a prefix key (like tmux's Ctrl+b). Press it once to activate, then press a follow-up key:

KeyAction
Ctrl+] Ctrl+]Exit terminal and return to explorer
Ctrl+] ]Next tab (PTY keeps running in background)
Ctrl+] [Previous tab (PTY keeps running in background)
Ctrl+] tNew tab (clone current context)
Ctrl+] Ctrl+U / Ctrl+DScroll back / forward by half a viewport
Ctrl+] Ctrl+B / Ctrl+FScroll back / forward by a full viewport
Ctrl+] g / GJump to oldest captured line / back to live
Mouse wheelScroll the PTY scrollback (1 line per tick)

All other keys are forwarded to the PTY process. The PTY session continues running when you switch tabs, so you can return to it later. Typing any character snaps the view back to the live shell so you don't accidentally type into history.

Scrollback

Each PTY tab keeps a ring of up to 5000 ANSI-stripped lines captured from the byte stream. Use Ctrl+] then Ctrl+U / Ctrl+D / Ctrl+B / Ctrl+F to navigate it; Ctrl+] g / G jump to the oldest captured line / back to live. The hint bar shows scrolled N while you're not at the live tail. Full-screen curses programs (vim, less, htop) write absolute-position output that the line-stream capture can't reconstruct cleanly — their scrollback view will look messy while they're running, but normal output cleans up afterward. If you need precise scrollback, switch to exec or mux mode (Ctrl+T) so the host terminal's own scrollback handles it.

Selecting and copying text

Inside the embedded PTY view the host terminal handles selection. Use Shift+Drag for a normal selection; on macOS, Shift+Option+Drag (or Alt+Drag on Linux/Windows) selects a rectangular block.

If you need full host-terminal capabilities (scrollback, native search, unrestricted copy), cycle to exec or mux mode with Ctrl+T, or set the desired default in the config (terminal: exec or terminal: mux).

Terminal modes

ModeWhat happens when an interactive shell runs
pty (default)Shell embeds inside lfk via an internal vt10x terminal. Selection works via Shift+Drag.
execlfk hands the host terminal to the shell via tea.ExecProcess and resumes once it exits.
muxShell opens in a new window (tmux) or floating pane (zellij) of the surrounding multiplexer. lfk stays foregrounded alongside. Errors out if no multiplexer is detected.

Ctrl+T cycles pty -> exec -> mux -> pty. Mux is skipped automatically when no tmux/zellij is detected, so the cycle becomes pty -> exec -> pty in that case. The mode is process-local — restart-persistence comes from terminal: in the config.

Diff View

KeyAction
j / kMove cursor up/down
123j / 123kMove cursor down/up N lines (count-prefixed motion)
h / lMove cursor column left/right
123h / 123lMove cursor column left/right by N runes
0 / $Move cursor to line start/end
^Move cursor to first non-whitespace
w / bMove cursor to next/previous word start
W / BMove cursor to next/previous WORD start (whitespace-delimited)
eMove cursor to end of word
EMove cursor to end of WORD (whitespace-delimited)
123w / 123b / 123e (and capitals)Apply word/WORD motion N times
TabSwitch cursor side (side-by-side mode)
gg / G / Home / EndJump to top / bottom
123GJump to line number
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
123 Ctrl+D / 123 Ctrl+UScroll N lines (vim 'scroll' semantics: sets the sticky step shared between Ctrl+D and Ctrl+U; clamped to viewport)
123 Ctrl+F / 123 Ctrl+BPage motion scaled by N
/Search in diff
n / NNext / previous search match
123n / 123NJump to Nth next / previous search match
vCharacter visual selection
VVisual line selection
Ctrl+VBlock (column) visual selection
h / lMove selection column left/right (in visual mode)
viw / vaw / viW / vaWSelect inner/around word (or WORD) under cursor
yCopy line under cursor (or selection in visual mode)
123yCopy number of lines from cursor (count-prefixed yank; empty-side lines skipped)
zToggle fold unchanged section at cursor
ZToggle all folds
#Toggle line numbers
>Toggle line wrapping (configurable via toggle_wrap)
uToggle unified/side-by-side view
q / EscBack to explorer

Event Timeline

Press V on a resource (or open the Events list and press Enter on an event) to open the Event Timeline overlay. Press Shift+F to toggle between the overlay and a fullscreen viewer that takes over the whole window.

KeyAction
j / kMove cursor down/up
123j / 123kMove cursor down/up N lines (count-prefixed motion)
h / l / Left / RightMove cursor column left/right
123h / 123lMove cursor column left/right by N runes
0 / $Move cursor to line start/end
^Move cursor to first non-whitespace
w / bMove cursor to next/previous word start
W / BMove cursor to next/previous WORD start (whitespace-delimited)
eMove cursor to end of word
EMove cursor to end of WORD (whitespace-delimited)
123w / 123b / 123e (and capitals)Apply word/WORD motion N times
gg / HomeJump to top
G / EndJump to bottom
123GJump to specific line number
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half page down / up
Ctrl+F / Ctrl+B / PgDn / PgUpFull page down / up
123 Ctrl+D / 123 Ctrl+UScroll N lines (vim 'scroll' semantics: sets the sticky step shared between Ctrl+D and Ctrl+U; clamped to viewport)
123 Ctrl+F / 123 Ctrl+BPage motion scaled by N
Shift+FToggle fullscreen event viewer (also minimizes back)
>Toggle line wrapping (configurable via toggle_wrap)
/Search in events
n / NNext / previous search match
123n / 123NJump to Nth next / previous search match
vCharacter visual selection (from cursor column)
VVisual line selection
Ctrl+VBlock (column) visual selection (from cursor column)
viw / vaw / viW / vaWSelect inner/around word (or WORD) under cursor
yCopy line under cursor (or selection in visual mode)
123yCopy N lines from cursor (count-prefixed yank)
? / F1Open this help, scrolled to the Event Timeline section
q / EscClose overlay (or exit fullscreen back to overlay)

Events are pulled from the cluster, correlated to the selected resource (or shown cluster-wide on the timeline overlay), and grouped when their Type/Reason/Message/Object match. The line buffer (1-9 then a motion key) is consumed after each motion, so 5j 3k jumps down 5 then up 3 without any digit leaking into the next command.

Column Toggle Overlay

Press , in the resource list to open the column toggle overlay. It lists every toggleable column for the current kind — built-ins (Name, Namespace, Ready, Restarts, Status, Age) and extras from the resource's additionalPrinterColumns.

KeyAction
j / kNavigate up/down
SpaceToggle the current entry
J / KReorder the current entry down/up
/Filter entries by name
cClear selection (uncheck every entry)
RReset to defaults for the current kind
EnterApply the selection
Esc / qClose without saving

Built-in and extra columns can be freely interleaved — J/K moves either kind, so you can put Age before Namespace or drop an extra like IP between Ready and Status. Name is listed too: it renders first by default but can be reordered (e.g. after a Catalog/Task extra) or hidden like any other column. When visible, Name still absorbs the row's leftover width and compresses (truncates) when the other columns leave it little room.

The selection you apply is explicit: the table renders exactly the columns you check, in the exact order they appear in the overlay, and will not auto-fill the remaining space with unchecked columns. The chosen visibility and order are remembered per resource kind and per cluster context, and persist across restarts (stored in ~/.local/state/lfk/column_prefs.yaml) — committed on Enter, cleared by R; Esc discards uncommitted edits. To start from a clean slate, press c to uncheck every entry at once, then space-select only the columns you want.

If you apply a completely empty selection (no built-ins, no extras), the overlay interprets it as "reset to defaults for this kind" rather than leaving the table empty. To render only built-ins with zero extras, keep at least one built-in column checked when you press Enter.

Inline Editors (Secret / ConfigMap / Labels & Annotations)

The Secret, ConfigMap, and Labels/Annotations editors use a shared key-value overlay. The list view supports vim-like navigation; pressing e or a enters edit mode for the selected (or new) entry.

List view

KeyAction
j / kMove cursor up/down
eEdit selected key/value
aAdd a new key/value entry
yCopy: cursor row's value when nothing is selected, opens the format picker automatically when 1+ rows are selected (so you don't silently copy a single value while ignoring the marked bundle)
SpaceToggle selection on the current row (cursor auto-advances; works across non-adjacent rows)
YAlways open the format picker; copies selected rows (or the cursor row) as YAML / JSON / dotenv / key=value / values-only
/Filter the list by key (typing extends the query, Enter applies, Esc clears)
DDelete selected entry
EnterSave changes and close (no-op if nothing changed)
EscClose without saving

The Labels/Annotations editor additionally has a Tab binding in the list view to switch between the labels pane and the annotations pane. Switching tabs clears the multi-row selection (label and annotation namespaces are disjoint).

Format picker (Shift+Y)

When the format picker is open, the bottom hint bar swaps to picker controls:

KeyAction
h / l (or / )Move the format cursor
EnterCopy selected rows in the chosen format and close the picker
EscCancel without copying

Selection wins over the cursor: if s was used to mark rows, those rows are the apply target; otherwise the cursor row is copied alone.

Edit mode

The editor picks one of two modes based on the value being edited:

  • Inline edit (single-line values) — the cursor moves into the table cell of the row being edited. Surrounding rows stay visible for context. Used for short values like passwords / tokens / labels.
  • Pane edit (multi-line values) — the table is replaced with a bordered Key + Value pane that handles newlines, scrolling, and page navigation. Used for values containing \n (TLS certs, dotenv blocks, multi-line config files). The editor switches modes automatically when you insert a newline with Enter.
KeyAction
TabSwitch between key and value fields (in-progress edits in both fields are preserved)
Cmd+V (macOS) / Ctrl+Shift+V (Linux)Paste from clipboard
Ctrl+SCommit the in-progress edit back to the list
EscCancel the in-progress edit
/ Move cursor left / right
/ Move cursor up / down (preserves byte column on the prev/next \n-delimited line; pane mode only)
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Scroll cursor down / up by half a page (pane mode only)
Ctrl+F / Ctrl+BScroll cursor down / up by a full page (pane mode only)
Ctrl+A / Ctrl+EMove cursor to start / end of the current line (vim-like 0 / $)
BackspaceDelete the character before the cursor
Ctrl+WDelete the word before the cursor
EnterInsert a newline (switches to pane mode if value was previously single-line)

Pressing Enter from the list view saves all pending changes via kubectl apply/patch and refreshes the resource. If no fields were modified, the overlay closes silently. The previous s save shortcut has been removed — use Enter instead.

API Explorer

KeyAction
j / kNavigate fields
l / EnterDrill into field (Object/array types)
h / BackspaceGo back one level
/Search fields
n / NNext / previous search match (recursive: auto-drills into children / searches parent)
rRecursive field browser (browse all nested fields with filter)
TToggle tree view — show the whole field subtree with ASCII-art guides; stays on while drilling/going back until toggled off (configurable via tree_view)
Space / zFold/unfold the field subtree under the cursor (tree view; z configurable via toggle_fold)
gg / G / Home / EndJump to top / bottom
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
qClose API explorer
EscGo back one level / close at root

Can-I Browser

KeyAction
j / kNavigate groups
J / KScroll resource list down / up
/Search/filter groups by name
aToggle all/allowed-only permissions
sSwitch subject (User/Group/SA)
gg / G / Home / EndJump to top / bottom
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
TabToggle to Who-Can (reverse RBAC: verb + resource → subjects)
q / EscClear search / close

The title bar shows the namespace scope (ns:...) used for the permission check, so you can see whether permissions are cluster-wide or namespaced. When checking a service account, its own namespace is used automatically. Users and groups are discovered from ClusterRoleBindings and RoleBindings.

Who-Can (Reverse RBAC)

Reachable from the Can-I browser via Tab. Inverts the question: instead of "what can this subject do", asks "who can do this verb on this resource". Pure RBAC scan — walks every ClusterRoleBinding plus the RoleBindings in the active namespace scope, resolves their roles, and lists subjects whose bound rules match.

Layout is two columns: a scrollable Resources picker on the left (deduped union of every resource the Can-I view knows about) and the Subjects result table on the right. Moving the cursor on the picker fires a fresh query so the right pane updates as you browse.

KeyAction
j / k (or / )Move the resource cursor (re-queries for the new resource)
J / KScroll the subjects column (right pane) without moving the resource cursor
g / G (or Home / End)Jump to top / bottom of the resource list
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half page down / up in the resource list
Ctrl+F / Ctrl+B (or PgDn / PgUp)Full page down / up in the resource list
/ (or h / l)Cycle the verb chip (get list watch create update patch delete *)
/Filter the resource list by substring (Enter to accept, Esc to clear)
AToggle namespace scope (all-namespaces ⇄ active namespace)
TabBack to forward Can-I view
q / EscClose overlay

The result table shows SUBJECT | KIND | NAMESPACE | VIA. The VIA column records the binding chain (ClusterRoleBinding/foo → ClusterRole/bar or RoleBinding/ns/foo → Role/bar) so a user can audit why a subject has access.

ClusterRoleBindings always count regardless of namespace scope (cluster-wide grants apply everywhere); RoleBindings outside the active scope are excluded.

Can-I Subject Selector

KeyAction
j / kNavigate subjects
/Filter subjects by name
gg / G / Home / EndJump to top / bottom
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
EnterSelect subject
EscClear filter / close

Network Policy Visualizer

Opens via the action menu (x → "Visualize", default key N) on a NetworkPolicy, CiliumNetworkPolicy, or CiliumClusterwideNetworkPolicy, or via x → "Network Policies" (N) on a Pod or Service to see every policy whose pod selector matches the pod (or the service's backing pods) — Cilium policies included when the CRDs are installed. When no policy selects the resource, the view says so explicitly — no policy restrictions apply.

KeyAction
j / k / Mouse wheelScroll up/down
gg / G / Home / EndJump to top / bottom
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
/Search (matches highlighted; Enter jumps to the first hit)
n / NNext / previous match
q / EscClose visualizer (Esc clears an active search first)

Right-sizing Advisor

Opens via the action menu (x → "Right-sizing", default key z) on Pod, Deployment, StatefulSet, DaemonSet, Job, CronJob. Shows per-container CPU + memory recommendations from one of several strategies. The header chips (Strategy: <label> [N/M] and Headroom: <H>x [N/M]) show the active strategy and headroom along with their position in the available cycles.

Available strategies (priority order; unavailable ones are skipped):

  1. VPA — VerticalPodAutoscaler recommender (history-based). Available when a VPA targets the workload. The recommender's target is multiplied by the active headroom (raw target at headroom = 1.0).
  2. 1d-max — Prometheus max_over_time peak over the last 1 day × headroom. Available when a Prometheus endpoint is configured for the cluster.
  3. 1d-avg — Prometheus avg_over_time over the last 1 day × headroom.
  4. 7d-p95 — Prometheus quantile_over_time(0.95, ...) over the last 7 days × headroom.
  5. snapshot — current metrics-server usage × headroom (always available as the fallback).

The headroom multiplier is the safety-margin factor applied on top of the strategy's raw output. Cycle through 1.0, 1.1, 1.25, 1.5, 1.75, 2.0 with < and >. Default is 1.25 (the closest preset to lfk's previous hardcoded 1.2 factor — existing recommendations stay visually similar after the upgrade).

KeyAction
yCopy recommendations as a strategic-merge containers[] YAML block (pasteable into kubectl patch)
rForce-refresh (invalidate the cached entry for the active strategy + headroom and re-fetch)
]Cycle to the next available strategy (wraps around)
[Cycle to the previous available strategy (wraps around)
>Cycle to the next headroom multiplier (wraps around; snaps to nearest preset on first press if the active value isn't in the list)
<Cycle to the previous headroom multiplier (wraps around; same snap behavior as >)
j / kScroll up / down
g / G (or Home / End)Jump to top / bottom
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B (or PgDn / PgUp)Page down / up (full page)
esc / qClose

The Usage column always reflects live metrics-server usage regardless of strategy — only the SUGGESTION column changes based on the algorithm and headroom. Each (strategy, headroom) pair's payload is cached for the user session via Model.rightsizingCache; reopening the overlay reuses the cache so revisits are instant. Cleared on r refresh or when the kube context / namespace changes.

Defaults & stickiness

Strategy and headroom selections are sticky for the session. The first-open seed comes from two optional config keys:

rightsizing_defaults:
  strategy: vpa       # vpa | prom_max_1d | prom_avg_1d | prom_p95_7d | snapshot
  headroom: 1.25      # 1.0 | 1.1 | 1.25 | 1.5 | 1.75 | 2.0

Fallback chain (highest priority first): sticky session value → config default → built-in default (first available strategy + 1.25 headroom). Invalid config values are dropped at startup with a warning in the error log.

Error Log (!)

KeyAction
j / kMove cursor up/down
gg / G / Home / EndJump to top / bottom
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Page down / up (half page)
Ctrl+F / Ctrl+B / PgDn / PgUpPage down / up (full page)
VLine visual selection
vCharacter visual selection (from cursor column)
h / l / Left / RightMove cursor column left/right
0 / $ / ^Move cursor to line start / end / first non-whitespace
w / b / e / W / B / EWord / WORD motions
yCopy selected lines (visual mode) or all entries (normal mode)
Shift+FToggle fullscreen / overlay mode
dToggle debug log visibility
EscCancel visual selection, or close overlay
qClose overlay

Fullscreen mode: Press Shift+F to expand the error log to full terminal size. This removes the overlay border, so mouse text selection works cleanly without picking up background characters. Press Shift+F again to return to overlay mode.

Line wrapping: Long entries wrap onto continuation lines indented under the message column, so the full text stays readable instead of being truncated.

Tabs

KeyAction
tNew tab (clone current view)
]Next tab
[Previous tab
}Move current tab right (shift+])
{Move current tab left (shift+[)

Read-Only Mode

KeyAction
Ctrl+R (inside a context)Toggle read-only mode for the current tab. Recorded as a session override for that context, so it survives re-entry and stays in sync with the picker's [RO] marker; does not write to config and never leaks across contexts. Blocked when --read-only is set.
Ctrl+R (at the cluster picker)Toggle the [RO] marker on the highlighted context row. Stored as a session override that wins over per-context config and is honored on context entry. Blocked when --read-only is set (the CLI flag forces every context RO).

The [RO] badge appears in the title bar only when you're inside a context that's locked. At the cluster picker each row shows a [RO] suffix for contexts configured read-only (per-context config, global config, or the --read-only CLI flag). Mutating actions (delete, edit, scale, restart, exec, port-forward, drain, cordon, etc.) are filtered out of the action menu and gated at the dispatcher with a "Read-only mode: X disabled" toast. See Read-Only Mode for the full precedence rules across the CLI flag, per-context config, and global config.

Cluster Color Coding

KeyAction
L (Shift+L) (at the cluster picker)Open color picker for the highlighted cluster (saved to $XDG_STATE_HOME/lfk/cluster-colors.yaml). Also reachable via x → "Set color…".

When a context has a color assigned, the cluster picker row shows a small background-tinted suffix swatch on the right edge in that color, and entering the context applies the same color as a background tint to the entire title bar so it's impossible to miss which environment you're acting on. Contexts without a color render a neutral placeholder in the swatch column so all rows stay aligned.

Four colors (red, yellow, green, blue) follow lfk's active theme tokens (theme.Error, theme.Warning, theme.Secondary, theme.Primary) so a colorscheme switch re-skins them. The remaining four (magenta, cyan, white, gray) stay on ANSI bright codes (8, 13–15) and look the same regardless of theme.

Local Clusters Manager

The manager overlay (Ctrl+N at LevelClusters) is the single home for creating, switching, and lifecycle-managing kind / k3d / minikube clusters from inside lfk.

List view

KeyAction
j / k / Up / DownMove cursor
nNew local cluster (opens 5-step wizard)
sStart the highlighted cluster (greyed for kind)
Shift+SStop the highlighted cluster (greyed for kind)
Shift+DDelete the highlighted cluster (asks for DELETE typed confirmation)
Shift+RRefresh the list
EnterSwitch to the highlighted cluster's context and close the overlay
q / Esc / Ctrl+NClose the overlay

Wizard

KeyAction
j / k (provider step)Pick provider
TypeFill the active text field (name / version / nodes)
EnterAdvance to the next step (blocks on validation errors)
EscBack up one step (or close from step 1)

Delete confirmation

Type the literal word DELETE (uppercase) and press Enter to confirm, or Esc to cancel.

Mouse

InputAction
Click left paneDrill out one level (same as h / Left)
Click middle pane (different row)Select row and preview it in the right pane
Click middle pane (already-cursored row)Drill into it (same as Enter / Right)
Click right paneDrill into the selected item
Click table headerSort by that column; click again toggles direction
Right-click middle paneMove cursor to clicked row and open action menu
Right-click right paneOpen action menu for the currently selected item
Right-click left paneNo-op
Click action menu rowRun that action (same as Enter)
Click namespace badge in title barOpen the namespace selector
Click row in namespace selectorApply that namespace and close
Click outside a centered overlayDismiss it (same as Esc) — fullscreen / custom overlays are keyboard-only
Wheel up/down inside a centered overlayScroll the list cursor (same as j / k / arrow keys)
Scroll wheel over middle paneMove the row selection up/down
Scroll wheel over right paneScroll the preview under the pointer
Scroll wheel in the Object Explorer / log viewerSame per-pane routing — over the preview pane it scrolls the preview, over the list it moves the cursor
Ctrl+Option+YToggle mouse capture — release it to select text where Shift+Drag doesn't work, press again to re-enable
Shift+DragSelect text (host terminal)
Shift+Option+Drag (macOS) / Alt+Drag (Linux, Windows)Block-select text inside the embedded PTY

The status bar shows a [MOUSE OFF] chip while capture is suspended. Mouse capture (Ctrl+Option+Y) is rebindable via the mouse_toggle config key.

Command Bar

Press : to open the command bar. It supports four types of input:

TypeSyntaxExamples
Resource jump:<type> [namespace...]:pod, :dep kube-system, :ns prod staging
Built-in:<command> [args]:ns (navigate), :ns prod (filter), :ctx my-cluster, :set wrap, :sort Age, :export yaml
Kubectl:k <cmd> or :kubectl <cmd>:k get pod, :kubectl describe svc nginx
Shell:! <command>:! grep error /var/log

Navigation:

KeyAction
TabCycle suggestions forward (auto-fills when exactly 1 match)
Shift+TabCycle suggestions backward
Ctrl+N / DownCycle suggestions forward
Ctrl+P / UpCycle suggestions backward
Ctrl+D / Ctrl+UScroll suggestions (half page down/up)
Ctrl+F / Ctrl+BScroll suggestions (full page down/up)
Ctrl+SpaceOpen/refresh suggestions
Space / RightAccept ghost text preview
EnterAccept selected suggestion, or execute command when no suggestions
EscClose suggestions first, then close command bar
Up / DownBrowse command history (when no suggestions visible)
Ctrl+WDelete word backwards
Ctrl+A / Ctrl+EHome / End

Notes:

  • Resource types use singular form (:pod, not :pods)
  • :ns without arguments navigates to Namespaces; with arguments filters to those namespaces
  • Kubectl commands inject --context and -n from current selection automatically
  • Ctrl+U scrolls suggestions when visible, deletes line before cursor when closed

Named Sessions

A session is the whole multi-tab workspace (each tab's context, namespace scope, resource type, filter, and cursor). lfk always has one active session that it auto-saves to on quit and restores on start.

  • Default session: the built-in workspace stored in session.yaml. It shows as default in the picker and is what you get with no named session active.
  • Named sessions live in sessions/<name>.yaml and are separate — working in one never overwrites another (or the default).
Key / CommandAction
C (or :sessions)Open the session manager
:session save <name>Save the current workspace as a named session
:session delete <name>Delete a named session

Inside the manager: enter switch (auto-saves the one you're leaving), s save current workspace under a new name (becomes active), d delete the highlighted session (not default), / filter, esc close. A checkmark marks the active session.

Startup: lfk --session <name> (or the LFK_SESSION env var) opens that session, creating it on first save if new. The active session is remembered across restarts; --session is mutually exclusive with --context.

General

KeyAction
TSwitch color scheme
qQuit application (with confirmation)
EscGo back one level / close overlay / quit
Ctrl+CClose current tab (quit if last tab)

Action Menu Items

The action menu (x key) shows context-specific actions based on the resource type:

Pod Actions

l Tail Logs (last N lines + follow), L Logs (full), s Exec, A Attach, B Debug, b Debug Pod, p Port Forward, c Capture Traffic, N Network Policies (policies whose pod selector matches this pod), S Startup Analysis, I Crash Investigator, v Describe, E Edit, z Right-sizing, D Delete, X Force Delete, V Events

Deployment Actions

l Tail Logs (last N lines + follow), L Logs (full), s Exec, A Attach, S Scale, r Restart, R Rollback, p Port Forward, v Describe, E Edit, z Right-sizing, D Delete, b Debug Pod, V Events

StatefulSet Actions

l Tail Logs (last N lines + follow), L Logs (full), s Exec, A Attach, S Scale, r Restart, p Port Forward, v Describe, E Edit, z Right-sizing, D Delete, b Debug Pod, V Events

DaemonSet Actions

l Tail Logs (last N lines + follow), L Logs (full), s Exec, A Attach, r Restart, p Port Forward, v Describe, E Edit, z Right-sizing, D Delete, b Debug Pod, V Events

HorizontalPodAutoscaler Actions

S Scale (edit min/max bounds & target replicas), E Edit, D Delete, v Describe, b Debug Pod, V Events

The Scale overlay edits the HPA's spec.minReplicas / spec.maxReplicas (the HPA keeps autoscaling within the new range) and, optionally, scales the target workload directly. Fields prefill from the HPA's current values. j/k (or /) move between the three fields; h/- and l/+ decrement/increment the active field; / move the cursor within the field; digits type a value directly. Target replica changes may be reverted by the HPA on its next reconcile. The same h/-/l/+ steppers work in the workload Scale overlay.

Service Actions

l Tail Logs (last N lines + follow), L Logs (full), s Exec (into pod behind service), A Attach (to pod behind service), p Port Forward, O Port Forward & Open (forward a port and open it in the browser), c Capture Traffic, N Network Policies (policies affecting the service's backing pods), v Describe, E Edit, D Delete, b Debug Pod, V Events

Secret Actions

e Secret Editor, v Describe, E Edit, D Delete, l Labels / Annotations, P Permissions, b Debug Pod, V Events

ConfigMap Actions

e ConfigMap Editor, v Describe, E Edit, D Delete, l Labels / Annotations, P Permissions, b Debug Pod, V Events

Node Actions

c Cordon/Uncordon (toggle schedulability), n Drain, t Taints (editor: mark taints for removal with space, add with a, apply with enter), s Shell, v Describe, E Edit, b Debug Pod, V Events

Drain streams the eviction progress live: in PTY terminal mode (default on macOS/Linux) the kubectl drain output renders in lfk's embedded scrollable terminal; in Exec mode the host terminal is handed over. The same applies to Drain Node on a Karpenter NodeClaim.

Longhorn Node Actions

e Evict Replicas, C Cancel Eviction, v Describe, E Edit, D Delete, X Force Delete, V Events, P Permissions

The Longhorn Nodes list shows a REPLICAS column with the count of replicas scheduled on each node. Force Delete disables scheduling, then deletes (the validator.longhorn.io webhook rejects deleting a still-schedulable node). Evict Replicas disables scheduling and sets spec.evictionRequested, so Longhorn rebuilds each replica on another node before removing it.

Job Actions

l Tail Logs (last N lines + follow), L Logs (full), s Exec, A Attach, v Describe, E Edit, z Right-sizing, D Delete, X Force Delete, b Debug Pod, V Events

CronJob Actions

l Tail Logs (last N lines + follow), L Logs (full), s Exec, A Attach, t Trigger (create Job), S Suspend/Resume (pause/resume schedule), v Describe, E Edit, z Right-sizing, D Delete, b Debug Pod, V Events

ArgoCD Application Actions

s Sync, a Sync (Apply Only), f Diff, R Refresh, v Describe, E Edit, D Delete, b Debug Pod, V Events

Helm Release Actions

u Values, A All Values, E Edit Values, d Diff, U Upgrade, R Rollback, h History, v Describe, D Delete, b Debug Pod, V Events

Ingress Actions

o Open in Browser, v Describe, E Edit, D Delete, b Debug Pod, V Events

PVC Actions

g Go to Pod, b Debug Mount, B Debug Pod, v Describe, E Edit, D Delete, V Events

Default Actions (all other resources)

v Describe, E Edit, D Delete, l Labels / Annotations, P Permissions, b Debug Pod, V Events

Bulk Actions (when items multi-selected)

D Delete, X Force Delete, S Scale, r Restart

ArgoCD Application bulk actions (when Application resources are multi-selected): s Sync, a Sync (Apply Only), R Refresh

Custom actions defined in the config file appear after the built-in actions.

Configuring Keybindings

All keybindings can be overridden in ~/.config/lfk/config.yaml. Only specify the keys you want to change — defaults apply for everything else.

For example, to swap the live-log preview and the fullscreen log viewer (fullscreen on plain L, preview on Ctrl+L):

keybindings:
  logs: "L"                      # fullscreen log viewer
  toggle_preview_logs: "ctrl+l"  # live-log preview pane
keybindings:
  # Navigation
  left: "h"              # Navigate to parent
  right: "l"             # Navigate into item
  down: "j"              # Move cursor down
  up: "k"                # Move cursor up
  jump_top: "g"          # Jump to top (gg)
  jump_bottom: "G"       # Jump to bottom
  page_down: "ctrl+d"    # Half-page down
  page_up: "ctrl+u"      # Half-page up
  page_forward: "ctrl+f" # Full-page down
  page_back: "ctrl+b"    # Full-page up
  preview_down: "J"      # Scroll preview down
  preview_up: "K"        # Scroll preview up
  jump_owner: "o"        # Jump to owner
  jump_back: "backspace"     # Jump back through teleport history
  toggle_rare: "H"       # Toggle rarely used resource types in the sidebar

  # Views and Modes
  help: "?"              # Toggle help
  filter: "f"            # Filter items
  search: "/"            # Search and jump
  toggle_preview: "P"    # Toggle YAML preview
  resource_map: "M"      # Resource map
  fullscreen: "F"        # Cycle layout: hide sidebar / fullscreen / restore
  watch_mode: "w"        # Watch mode
  command_bar: ":"        # Command bar
  theme_selector: "T"    # Theme selector
  finalizer_search: "ctrl+g"  # Finalizer search
  api_explorer: "I"      # API Explorer
  object_explorer: "O"   # Object Explorer (browse live object)
  rbac_browser: "U"      # RBAC browser
  secret_toggle: "ctrl+s" # Secret visibility
  error_log: "!"         # Error log
  column_toggle: ","     # Column visibility toggle
  sort_next: ">"         # Sort by next column
  sort_prev: "<"         # Sort by previous column
  sort_flip: "="         # Toggle sort direction
  sort_reset: "-"        # Reset sort to default
  filter_presets: "."    # Quick filter presets
  monitoring: "@"        # Monitoring dashboard
  quota_dashboard: "Q"   # Quota dashboard
  terminal_toggle: "ctrl+t"  # Cycle terminal mode (pty/exec/mux)

  # Actions
  action_menu: "x"       # Action menu
  namespace_selector: "\\" # Namespace selector
  all_namespaces: "A"    # Toggle all-namespaces
  toggle_preview_logs: "L"  # Toggle live-log preview pane (deeper levels only)
  logs: "ctrl+l"         # Open fullscreen log viewer
  refresh: "R"           # Refresh view
  restart: "r"           # Restart resource (action menu only)
  exec: "s"              # Exec into container (action menu only)
  edit: "E"              # Edit in $KUBE_EDITOR or $EDITOR
  describe: "v"          # Describe resource
  delete: "D"            # Delete resource
  force_delete: "X"      # Force delete
  scale: "S"             # Scale resource
  label_editor: "i"      # Labels/annotations
  secret_editor: "e"     # Secret/configmap editor
  create_template: "a"   # Create from template
  copy_name: "y"         # Copy name
  copy_yaml: "Y"         # Open copy-as picker (YAML / JSON / Table)
  copy_field: "ctrl+y"   # Copy a single manifest field (filterable picker)
  paste_apply: "ctrl+p"  # Apply from clipboard
  open_browser: "ctrl+o" # Open in browser
  diff: "d"              # Diff resources

  # Multi-selection
  toggle_select: " "     # Toggle selection (space)
  select_range: "ctrl+@" # Select range (Ctrl+Space)
  select_all: "ctrl+a"   # Select all

  # Tabs
  new_tab: "t"           # New tab
  next_tab: "]"          # Next tab
  prev_tab: "["          # Previous tab
  move_tab_left: "{"     # Move current tab left
  move_tab_right: "}"    # Move current tab right

  # Bookmarks
  set_mark: "m"          # Set mark
  open_marks: "'"        # Open bookmarks

  # Read-only mode
  readonly_toggle: "ctrl+r"  # At cluster picker: toggle highlighted row's [RO] marker. Inside a context: toggle the current tab.

  # Cluster color picker (cluster picker only)
  cluster_color_picker: "L"

  # Local Clusters Manager overlay (cluster picker only)
  local_cluster_manager: "ctrl+n"

Crash Investigator overlay

Opened from the Pod action menu (xI). Combines events, restart history, last logs, and describe for the failing container in one tabbed panel.

KeyAction
Tab / S-TabCycle tabs forward / backward
1 / 2 / 3 / 4Jump to Summary / Events / Logs / Describe
cCycle active container (init + app)
pToggle previous / current logs (Logs tab only)
j / kScroll within tab body
g / GJump to top / bottom of tab body
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half-page down / up
Ctrl+F / Ctrl+BFull-page down / up (also PgDn / PgUp)
Shift+RRefresh — re-fetch all sections, preserves cursor state
Esc / qClose overlay

Sync Wave Timeline (Applications)

Open from an Application row: press x for the action menu, then W. Two-pane layout: phases on the left sidebar, the selected phase's content on the right. Tab toggles which pane has focus.

When sidebar has focus:

KeyAction
j / Move sidebar cursor down (wraps); resets body cursor + scroll
k / Move sidebar cursor up (wraps)
Enter / SpaceToggle phase collapse (sidebar marker /; body shows placeholder when collapsed)
Tab / Shift+TabSwitch focus to body
g / GFirst / last phase

When body has focus:

KeyAction
j / Move body cursor down (wave headers + visible resources)
k / Move body cursor up
Enter / SpaceIf on wave header: toggle wave collapse. If on placeholder: toggle phase collapse. If on resource: no-op
Tab / Shift+TabSwitch focus to sidebar
g / GFirst / last visible body row
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half-page scroll
Ctrl+F / Ctrl+B (or PgDn / PgUp)Full-page scroll

Shared:

KeyAction
RRefresh
q / EscClose overlay

While Application.status.operationState.phase == "Running", the overlay auto-refreshes every 3 seconds. A spinner animates in the header during the wave-annotation fetch phase.

Below 50 cols of terminal width, the overlay falls back to single-pane mode (sidebar hidden, body uses full width). Tab becomes a no-op in this mode.

Traffic Capture overlay

Open: Pod or Service action menu (x) → Capture Traffic (c).

Configuration phase

KeyAction
Tab / Shift+TabCycle focus between fields (Backend → Interface → Filter → Preset)
j / k / / Next / previous field (when focus is not on Filter input)
h / l / / Cycle the value of the focused field (backend, interface, preset)
(text)Type BPF filter (when filter input has focus)
BackspaceEdit filter
EnterStart capture (or launch kubeshark hand-off)
EscClose overlay

For Service targets, an endpoint picker appears first:

KeyAction
j / kNavigate endpoints
EnterPick endpoint and proceed to config
Esc / qClose overlay

Live phase

KeyAction
sStop capture; transitions to stopped phase, overlay stays
Esc / qStop capture and stay in the overlay; second Esc dismisses
tToggle live table vs status-only view
YCopy pcap path to system clipboard; marks capture saved
/Search within live table
j / kScroll older / newer (tail-anchored: 0 = latest at bottom)
Ctrl+D / Ctrl+U / Shift+↓ / Shift+↑Half-page scroll older / newer
Ctrl+F / Ctrl+B / PgDn / PgUpFull-page scroll older / newer
g / GJump to oldest / return to live (latest)

Stopped phase

KeyAction
EnterRestart capture with the same params
eEdit filter — re-opens config phase, previous filter is preserved
YCopy pcap path to clipboard (mark saved so dismiss won't delete)
j / k / Ctrl+D/U / Ctrl+F/B / g / GScroll (same semantics as live)
Esc / qDismiss; deletes the pcap unless Y was pressed