A K9s-inspired terminal UI for monitoring Flux GitOps resources in real-time.
flux9s provides a terminal-based interface for monitoring and managing Flux CD resources, inspired by the excellent K9s project. It offers real-time monitoring of Flux Custom Resources (CRDs) including Kustomizations, GitRepositories, HelmReleases, and more.
flux9s is listed as a community UI in the Flux ecosystem. Read the flux9s GA announcement on the Flux blog.
- Real-time monitoring - Watch Flux resources as they change using Kubernetes Watch API
- K9s-inspired interface - Familiar navigation and keybindings for K9s users
- Unified and type-specific views - View all resources together or filter by type
- Resource operations - Suspend, resume, reconcile, and delete Flux resources
- YAML viewing - Inspect full resource manifests
- Kubernetes Events - Per-resource events in the describe view, plus a live
:eventsfeed for the current namespace or cluster - Controller logs - Stream any Flux controller pod's logs live with
:logs(follow, search, bounded buffer) - Workload drill-down - Open a graph workload group to walk Deployments/StatefulSets/DaemonSets: live rollout status, containers, pods, events, pod logs, and restart/delete-pod actions
- Browse any kind (preview, opt-in) -
:<kind>opens a live list of any native resource or CRD (:deploy,:po,:httproutes) with health, a MANAGED-BY column, CRD printer columns, and the workload actions;Escwalks back,:fluxreturns home. Off by default: try it with:native, orflux9s config set nativeResources true - Pod usage - Live CPU/memory against limits, with no setup: auto-detects kubelet metrics (
nodes/proxy), then metrics-server, then falls back to requests/limits - App view -
aon a Kustomization / HelmRelease (or:app ks/frontend hr/data/redis, or a view'sapps) shows what it deploys, read from Flux: its sources, everything in its inventory with nested Kustomizations and HelmReleases expanded, and its workloads' pods, across namespaces and live - Unmanaged and orphaned objects (preview, with
:native) -:unmanagedlists what Flux doesn't manage in a namespace (and who created it),:orphanedwhat Flux left behind — objects whose Kustomization or HelmRelease is gone or no longer lists them in its inventory — andOon a Kustomization / HelmRelease shows what that one left behind - Pulse dashboard -
:pulseshows cluster health at a glance: per-kind counts, recent failures, and Flux distribution info - CRD discovery (opt-in) -
discoverFluxResources: truedynamically shows any CRD labeledapp.kubernetes.io/part-of=flux(Flagger, tofu-controller, ExternalArtifact-SDK controllers), view-only with generic columns - Graph visualization - Visualize resource relationships and dependencies (Kustomization, HelmRelease, etc.)
- Reconciliation history - View reconciliation history for resources that track it
- Favorites - Mark frequently accessed resources for quick access
- Namespace switching - Monitor resources across namespaces or cluster-wide
- RBAC-aware - When access is denied (HTTP 403), the list shows a clear "restricted" note instead of a silently empty view; missing CRDs stay quiet (toggle with
ui.rbacWarnings) - Status indicators - Visual indicators for resource health and suspension state
The easiest way to install on macOS and Linux:
brew install dgunzy/tap/flux9sOr tap the repository first:
brew tap dgunzy/tap
brew install flux9sIf you have cargo-binstall installed:
cargo binstall flux9sThis downloads and installs pre-built binaries without compiling from source.
Download pre-built binaries from the Releases page:
- Linux (x86_64):
flux9s-linux-x86_64.tar.gz - macOS (Intel):
flux9s-macos-x86_64.tar.gz - macOS (Apple Silicon):
flux9s-macos-aarch64.tar.gz - Windows (x86_64):
flux9s-windows-x86_64.zip
Extract and move the binary to a directory in your PATH.
cargo install flux9sgit clone https://github.com/dgunzy/flux9s.git
cd flux9s
cargo build --releaseThe binary will be available at target/release/flux9s.
- Ensure you have a Kubernetes cluster with Flux installed
- Configure your
kubeconfigto point to your cluster - Run
flux9s
flux9sBy default, flux9s watches the flux-system namespace. Use :ns all to view all namespaces or :ns <namespace> to switch to a specific namespace.
Note:
flux9slaunches in readonly mode by default.
You can change this withflux9s config set readOnly falseor toggle it in a session using:readonly.
j/k- Navigate up/down:- Command mode (e.g.,:kustomization,:gitrepository)Enter- View resource details/- Filter resources by name (list views) or search text (YAML/describe/trace views)n/N- Next/previous search match (in text views)Shift+N/Shift+A/Shift+T/Shift+S- Sort by name/age/type/status (press again to reverse)s- Suspend resourcer- Resume resourceR- Reconcile resourcey- View resource YAMLe- Edit resource in system editor (opens YAML, applies changes via Server Side Apply on save). With:native, also any patchable non-Flux kind except Secrets — with a warning first when Flux, Helm, Argo CD, or a controller manages itf- Toggle favoriteg- View resource graph (Kustomization, HelmRelease, etc.)h- View reconciliation historyt- Trace ownership chain — for Flux resources, and (with:native) any object Flux manages;g/mfrom such an object open its Flux manager's graph / the manager itselfO- What a Kustomization, HelmRelease, ResourceSet, or FluxInstance left behind (with:native)W- Reconcile with source (Kustomization, HelmRelease)d- Describe resourceCtrl+d- Delete resource (with confirmation)?- Show/hide helpq/Esc- Go back; shows a quit prompt when at the root viewQ- Quit immediately (no prompt)Ctrl+C/:q- Quit (also skips the prompt)
:ctx <name>- Switch to a different Kubernetes context:ctx- Open interactive context selection menu:ns <namespace>- Switch namespace:ns all- View all namespaces:favoritesor:fav- View favorite resources:ks,hr- Several Flux kinds in one list; name a set you use often in your config (views: {apps: {kinds: [ks, hr]}}) and open it with:apps(views can also set anamespaceandsort;defaultSort: typegroups the list by kind at startup). With:native, Kubernetes kinds mix in too (:ks,deploy), each row keeping its own keys:eventsor:ev- Live Kubernetes events feed (current namespace scope):app <kind>/<name>…- What Flux objects deploy, as a live tree (-n <ns>, or<kind>/<ns>/<name>);aopens it on the selected one:unmanaged/:orphaned [<kind>/<name>]- What Flux doesn't manage, or left behind (-n <ns>,-A; with:native); in the listo/u/aswitch between orphans only, unmanaged only, and everything:trace <kind>/<name> [-n <namespace>]- Trace what manages an object; watching all namespaces, it finds the object without-n:logs [pod]- Stream a Flux controller pod's logs (submenu without argument):skin {skin-name}- set skin directly:skin- open interactive theme selection menu with live preview (17 built-in themes + custom):discover- Toggle discovery of Flux-labeled CRDs for this session (runtimediscoverFluxResources):qor:q!- Quit:help- Show help
- Graph View (
g) - Visualize resource relationships and dependencies. Shows upstream sources and downstream managed resources. Move the highlighted focus between nodes withj/k(the view scrolls to keep it visible), pressEnterto open the focused resource's detail view (or, on a workload/resource group node, drill into its members — the resource group breaks down into the kind, namespace, and name of everything it aggregates), andEscto return to the graph. Supported for Kustomization, HelmRelease, ArtifactGenerator, FluxInstance, and ResourceSet. - History View (
h) - View reconciliation history for FluxInstance, ResourceSet, Kustomization, and HelmRelease resources. - Events View (
:events) - Live Kubernetes events feed for the current namespace (or cluster-wide with:ns all), newest first with Warnings highlighted.Enterjumps to the involved resource; the describe view (d) also shows a per-resource Events section. - Favorites (
f) - Mark resources as favorites for quick access. Use:favoritescommand to view all favorites.
flux9s config --help- Show the config optionsflux9s config set {KEY} {VALUE}- set a yaml option with the cli.config set ui.skinReadOnly rose-pine- set a skin that is in your systems flux9s/skins dir when readonly enabled.flux9s config set connectTimeoutSeconds 15- set the startup Kubernetes API health-check timeout.flux9s config set editor vim- set the preferred editor for resource editing (overridden byFLUX9S_EDITORenv var).flux9s config skins set navy.yaml- import a skin, validate, set in config.flux9s completions zsh- generate shell completions (bash, zsh, fish, elvish, powershell); e.g.flux9s completions zsh > "${fpath[1]}/_flux9s".flux9s --version/flux9s version- show the installed version (versionalso checks for updates).
Note: Not all K9s skins are compatible with flux9s. flux9s skins follow a similar format but may require adjustments to work properly.
This project is inspired by and built with the following excellent tools:
- K9s - The terminal UI for Kubernetes that inspired this project
- Flux - The open and extensible continuous delivery solution for Kubernetes. Powered by GitOps Toolkit.
- kube-rs - The Rust Kubernetes client library powering the Kubernetes API interactions
- kopium - The tool used to generate Rust types from Kubernetes CRDs
AI was used to get the scaffold of this project together, if there are mistakes or issues please open an issue, or a PR!
Pods and nodes: :pods shows live usage, readiness, restarts and placement;
:nodes shows usage against allocatable capacity and opens a node's pods with
Enter. Both use the native resource browser (:native when disabled). Without
metrics, resource cells show explicitly labelled requests/limits.
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the Apache License, Version 2.0 - see the LICENSE file for details.