Keyboard-first terminal UI for Argo CD. Browse apps, scope by clusters/namespaces/projects, stream live resource status, trigger syncs, inspect diffs, and roll back safely — all without leaving your terminal.
447
stars
620
commits
Go
primary language
Sep 8, 2026
updated
Argonaut is a keyboard-first terminal UI for Argo CD, built with Bubbletea. Browse apps, scope by clusters/namespaces/projects, stream live resource status, trigger syncs, inspect diffs in your favorite pager, and roll back safely — all without leaving your terminal.
❤️ 🐶 Inspired by the great UX of k9s — but for Argo CD.
git)curl -sSL https://raw.githubusercontent.com/darksworm/argonaut/main/install.sh | sh
The install script automatically detects your system (including musl vs glibc on Linux) and downloads the appropriate binary from the latest release.
You can also install a specific version:
curl -sSL https://raw.githubusercontent.com/darksworm/argonaut/main/install.sh | sh -s -- v1.13.0
brew tap darksworm/homebrew-tap
brew install darksworm/tap/argonaut
⚠️ AUR uploads are currently disabled on aur.archlinux.org, so these packages may lag behind the latest release. In the meantime, run :upgrade inside argonaut to update to the latest version.
yay -S argonaut-bin
Or, to track the latest commit on main (rebuilt from source on install):
yay -S argonaut-git
Argonaut is currently available on the unstable channel of nixpkgs. So you can install it using
nix-env -iA nixos.argonaut
On other systems (macOS, non-NixOS Linux):
nix-env -iA nixpkgs.argonaut
or by adding it to your systemPackages.
environment.systemPackages = with pkgs; [ argonaut ];
To run Argonaut without permanently installing it, use the nix run command:
nix run github:darksworm/argonaut
To enter a development shell with Argonaut and its dependencies (like Go, Delta, and Argocd) available for development, use the nix develop command:
nix develop github:darksworm/argonaut
If you are using Flakes to manage your systems add this to your Flake:
inputs = {
argonaut = {
url = "github:darksworm/argonaut";
inputs.nixpkgs.follows = "nixpkgs";
};
# ...
}
Pull the image:
docker pull ghcr.io/darksworm/argonaut:latest
Run with mounted Argo CD config (as your host user to preserve permissions):
docker run -it --rm \
-u $(id -u):$(id -g) \
-v ~/.config/argocd:/home/appuser/.config/argocd:ro \
ghcr.io/darksworm/argonaut:latest
The container needs access to your Argo CD configuration for authentication. The :ro flag mounts it as read-only for security.
You can download binaries and packages in from the latest release.
# Log in to your Argo CD server
argocd login
# Start Argonaut
argonaut
:) for actions: sync, diff, rollback, resources, etc.delta, falls back to git --no-index diff | less
Argonaut supports client certificate authentication. You just need to pass a couple arguments to the argonaut command:
argonaut --client-cert=/path/to/cert --client-cert-key=/path/to/key
If your Argo CD server uses a self-signed certificate, you can provide a custom CA certificate to trust:
argonaut --ca-cert=/path/to/ca.crt
If your Argo CD server isn't directly accessible (e.g., running in a private cluster), Argonaut can connect via kubectl port-forward:
# Configure ArgoCD CLI for port-forward mode
argocd login --port-forward --port-forward-namespace argocd
# Start Argonaut (automatically detects port-forward mode)
argonaut
Requirements:
kubectl configured with access to the clusterCustom namespace: If ArgoCD is installed in a different namespace, add to your config:
# ~/.config/argonaut/config.toml
[port_forward]
namespace = "my-argocd-namespace"
Argonaut stores its configuration in a TOML file at ~/.config/argonaut/config.toml (or $XDG_CONFIG_HOME/argonaut/config.toml).
You can override the config path with the ARGONAUT_CONFIG environment variable.
[appearance]
theme = "tokyo-night"
[appearance.overrides]
# Override individual theme colors (hex format)
# accent = "#ff79c6"
# success = "#50fa7b"
[sort]
field = "name" # name, sync, health
direction = "asc" # asc, desc
[k9s]
command = "k9s" # Path to k9s executable
context = "" # Override Kubernetes context for k9s
[diff]
viewer = "" # Interactive diff viewer (e.g., "code --diff {left} {right}", "meld {left} {right}")
formatter = "" # Diff formatter command (e.g., "delta --side-by-side")
[events]
refresh_interval = "10s" # How often the events/status pane refetches ("0" disables)
auto_open = true # Open the pane automatically in the resource tree view
[http_timeouts]
request_timeout = "10s" # Timeout for HTTP requests (increase for large deployments)
[updates]
check_enabled = true # Set to false to disable the GitHub release-check on startup
# Start in clusters view instead of apps (supports :command syntax)
default_view = "clusters"
[appearance]| Option | Description | Default |
|---|---|---|
theme | Color theme name (see available themes below) | tokyo-night |
Available themes:
catppuccin-mocha, dracula, gruvbox-dark, monokai, nord, one-dark, oxocarbon, solarized-dark, tokyo-night, tokyo-stormcatppuccin-latte, gruvbox-light, one-light, onehalf-light, solarized-lightcolorblind-safe, grayscale-lowchroma, high-contrastinherit-terminal (uses your terminal's ANSI color palette)You can also change the theme at runtime using the :theme <name> command.
[appearance.overrides]Override individual theme colors with hex values. Available color keys:
accent, warning, dim, success, danger, progress, unknown, info, text, grayselected_bg, cursor_selected_bg, cursor_bg, border, muted_bg, shade_bg, dark_bg[sort]| Option | Description | Default |
|---|---|---|
field | Sort field (name, sync, health) | name |
direction | Sort direction (asc, desc) | asc |
You can also change sorting at runtime using the :sort <field> <direction> command.
[k9s]Integration settings for k9s, the Kubernetes TUI.
| Option | Description | Default |
|---|---|---|
command | Path to k9s executable | k9s |
context | Override Kubernetes context when launching k9s | (none) |
Press K on a resource in the tree view to open it in k9s.
[diff]Settings for diff viewing and formatting.
| Option | Description | Default |
|---|---|---|
viewer | Interactive diff viewer command. Use {left} and {right} as placeholders for file paths. | (none) |
formatter | Non-interactive diff formatter piped through before display | (none, falls back to delta if installed) |
Examples:
[diff]
# Use VS Code as diff viewer
viewer = "code --diff {left} {right} --wait"
# Use meld as diff viewer
viewer = "meld {left} {right}"
# Use delta with custom options
formatter = "delta --side-by-side --line-numbers"
If no viewer is set, diffs are shown in an internal pager. If no formatter is set but delta is installed, it will be used automatically.
[events]Settings for the events/status pane shown next to the resource tree.
| Option | Description | Default |
|---|---|---|
refresh_interval | How often the pane refetches events and sync status. Use Go duration format (e.g., "30s", "1m"); "0" disables auto-refresh. | "10s" |
auto_open | Open the pane automatically when the resource tree view opens. Set to false to open it on demand with e. | true |
At runtime, :events on|off changes this for the current session; add always (e.g. :events off always) to persist the choice here.
[http_timeouts]Settings for HTTP request timeouts. Useful for large deployments with thousands of applications where API responses take longer.
| Option | Description | Default |
|---|---|---|
request_timeout | Timeout for all HTTP requests to ArgoCD API. Use Go duration format (e.g., "30s", "1m", "90s") | "10s" |
Examples:
[http_timeouts]
# For large deployments with thousands of applications
request_timeout = "60s"
# For very large deployments
request_timeout = "2m"
Note: If you're experiencing timeout errors when listing applications or resources, increase this value. The timeout applies to all API operations including listing applications, getting resources, and sync operations.
[updates]Settings for the automatic update check. On startup (and once per hour after that), Argonaut hits the GitHub Releases API to see whether a newer version exists; when one does, it shows a New version available, run :upgrade hint in the status bar.
| Option | Description | Default |
|---|---|---|
check_enabled | Enable the periodic GitHub release check. Set to false to disable in air-gapped environments, behind restrictive firewalls, or anywhere outbound traffic to api.github.com is unwanted. | true |
[updates]
check_enabled = false
default_viewConfigure which view Argonaut starts in. Uses the same syntax as :commands, with an optional scope argument to drill down into a specific cluster, namespace, project, or application set.
| Value | Startup view |
|---|---|
"apps" | Applications list (default) |
"clusters" | Clusters list |
"ns" | Namespaces list |
"proj" | Projects list |
"appsets" | ApplicationSets list |
"cluster production" | Namespaces scoped to cluster "production" |
"ns my-namespace" | Projects scoped to namespace "my-namespace" |
"project myproj" | Apps scoped to project "myproj" |
"appset myset" | Apps scoped to ApplicationSet "myset" |
All view aliases from :commands are supported (e.g., app/apps/applications, cls/cluster/clusters, ns/namespace/namespaces, etc.).
Examples:
# Start in apps view
default_view = "apps"
# Start scoped to a cluster (shows its namespaces)
default_view = "cluster production"
# Start scoped to a namespace (shows its projects)
default_view = "ns my-namespace"
[port_forward]Settings for port-forward mode (when ArgoCD CLI is configured with server: port-forward).
| Option | Description | Default |
|---|---|---|
namespace | Kubernetes namespace where ArgoCD is installed | argocd |
See CONTRIBUTING.md for guidelines on how to contribute to this project.
Go
98.3%
Keyboard-first terminal UI for Argo CD. Browse apps, scope by clusters/namespaces/projects, stream live resource status, trigger syncs, inspect diffs, and roll back safely — all without leaving your terminal.
447
stars
620
commits
Go
primary language
Sep 8, 2026
updated
Argonaut is a keyboard-first terminal UI for Argo CD, built with Bubbletea. Browse apps, scope by clusters/namespaces/projects, stream live resource status, trigger syncs, inspect diffs in your favorite pager, and roll back safely — all without leaving your terminal.
❤️ 🐶 Inspired by the great UX of k9s — but for Argo CD.
git)curl -sSL https://raw.githubusercontent.com/darksworm/argonaut/main/install.sh | sh
The install script automatically detects your system (including musl vs glibc on Linux) and downloads the appropriate binary from the latest release.
You can also install a specific version:
curl -sSL https://raw.githubusercontent.com/darksworm/argonaut/main/install.sh | sh -s -- v1.13.0
brew tap darksworm/homebrew-tap
brew install darksworm/tap/argonaut
⚠️ AUR uploads are currently disabled on aur.archlinux.org, so these packages may lag behind the latest release. In the meantime, run :upgrade inside argonaut to update to the latest version.
yay -S argonaut-bin
Or, to track the latest commit on main (rebuilt from source on install):
yay -S argonaut-git
Argonaut is currently available on the unstable channel of nixpkgs. So you can install it using
nix-env -iA nixos.argonaut
On other systems (macOS, non-NixOS Linux):
nix-env -iA nixpkgs.argonaut
or by adding it to your systemPackages.
environment.systemPackages = with pkgs; [ argonaut ];
To run Argonaut without permanently installing it, use the nix run command:
nix run github:darksworm/argonaut
To enter a development shell with Argonaut and its dependencies (like Go, Delta, and Argocd) available for development, use the nix develop command:
nix develop github:darksworm/argonaut
If you are using Flakes to manage your systems add this to your Flake:
inputs = {
argonaut = {
url = "github:darksworm/argonaut";
inputs.nixpkgs.follows = "nixpkgs";
};
# ...
}
Pull the image:
docker pull ghcr.io/darksworm/argonaut:latest
Run with mounted Argo CD config (as your host user to preserve permissions):
docker run -it --rm \
-u $(id -u):$(id -g) \
-v ~/.config/argocd:/home/appuser/.config/argocd:ro \
ghcr.io/darksworm/argonaut:latest
The container needs access to your Argo CD configuration for authentication. The :ro flag mounts it as read-only for security.
You can download binaries and packages in from the latest release.
# Log in to your Argo CD server
argocd login
# Start Argonaut
argonaut
:) for actions: sync, diff, rollback, resources, etc.delta, falls back to git --no-index diff | less
Argonaut supports client certificate authentication. You just need to pass a couple arguments to the argonaut command:
argonaut --client-cert=/path/to/cert --client-cert-key=/path/to/key
If your Argo CD server uses a self-signed certificate, you can provide a custom CA certificate to trust:
argonaut --ca-cert=/path/to/ca.crt
If your Argo CD server isn't directly accessible (e.g., running in a private cluster), Argonaut can connect via kubectl port-forward:
# Configure ArgoCD CLI for port-forward mode
argocd login --port-forward --port-forward-namespace argocd
# Start Argonaut (automatically detects port-forward mode)
argonaut
Requirements:
kubectl configured with access to the clusterCustom namespace: If ArgoCD is installed in a different namespace, add to your config:
# ~/.config/argonaut/config.toml
[port_forward]
namespace = "my-argocd-namespace"
Argonaut stores its configuration in a TOML file at ~/.config/argonaut/config.toml (or $XDG_CONFIG_HOME/argonaut/config.toml).
You can override the config path with the ARGONAUT_CONFIG environment variable.
[appearance]
theme = "tokyo-night"
[appearance.overrides]
# Override individual theme colors (hex format)
# accent = "#ff79c6"
# success = "#50fa7b"
[sort]
field = "name" # name, sync, health
direction = "asc" # asc, desc
[k9s]
command = "k9s" # Path to k9s executable
context = "" # Override Kubernetes context for k9s
[diff]
viewer = "" # Interactive diff viewer (e.g., "code --diff {left} {right}", "meld {left} {right}")
formatter = "" # Diff formatter command (e.g., "delta --side-by-side")
[events]
refresh_interval = "10s" # How often the events/status pane refetches ("0" disables)
auto_open = true # Open the pane automatically in the resource tree view
[http_timeouts]
request_timeout = "10s" # Timeout for HTTP requests (increase for large deployments)
[updates]
check_enabled = true # Set to false to disable the GitHub release-check on startup
# Start in clusters view instead of apps (supports :command syntax)
default_view = "clusters"
[appearance]| Option | Description | Default |
|---|---|---|
theme | Color theme name (see available themes below) | tokyo-night |
Available themes:
catppuccin-mocha, dracula, gruvbox-dark, monokai, nord, one-dark, oxocarbon, solarized-dark, tokyo-night, tokyo-stormcatppuccin-latte, gruvbox-light, one-light, onehalf-light, solarized-lightcolorblind-safe, grayscale-lowchroma, high-contrastinherit-terminal (uses your terminal's ANSI color palette)You can also change the theme at runtime using the :theme <name> command.
[appearance.overrides]Override individual theme colors with hex values. Available color keys:
accent, warning, dim, success, danger, progress, unknown, info, text, grayselected_bg, cursor_selected_bg, cursor_bg, border, muted_bg, shade_bg, dark_bg[sort]| Option | Description | Default |
|---|---|---|
field | Sort field (name, sync, health) | name |
direction | Sort direction (asc, desc) | asc |
You can also change sorting at runtime using the :sort <field> <direction> command.
[k9s]Integration settings for k9s, the Kubernetes TUI.
| Option | Description | Default |
|---|---|---|
command | Path to k9s executable | k9s |
context | Override Kubernetes context when launching k9s | (none) |
Press K on a resource in the tree view to open it in k9s.
[diff]Settings for diff viewing and formatting.
| Option | Description | Default |
|---|---|---|
viewer | Interactive diff viewer command. Use {left} and {right} as placeholders for file paths. | (none) |
formatter | Non-interactive diff formatter piped through before display | (none, falls back to delta if installed) |
Examples:
[diff]
# Use VS Code as diff viewer
viewer = "code --diff {left} {right} --wait"
# Use meld as diff viewer
viewer = "meld {left} {right}"
# Use delta with custom options
formatter = "delta --side-by-side --line-numbers"
If no viewer is set, diffs are shown in an internal pager. If no formatter is set but delta is installed, it will be used automatically.
[events]Settings for the events/status pane shown next to the resource tree.
| Option | Description | Default |
|---|---|---|
refresh_interval | How often the pane refetches events and sync status. Use Go duration format (e.g., "30s", "1m"); "0" disables auto-refresh. | "10s" |
auto_open | Open the pane automatically when the resource tree view opens. Set to false to open it on demand with e. | true |
At runtime, :events on|off changes this for the current session; add always (e.g. :events off always) to persist the choice here.
[http_timeouts]Settings for HTTP request timeouts. Useful for large deployments with thousands of applications where API responses take longer.
| Option | Description | Default |
|---|---|---|
request_timeout | Timeout for all HTTP requests to ArgoCD API. Use Go duration format (e.g., "30s", "1m", "90s") | "10s" |
Examples:
[http_timeouts]
# For large deployments with thousands of applications
request_timeout = "60s"
# For very large deployments
request_timeout = "2m"
Note: If you're experiencing timeout errors when listing applications or resources, increase this value. The timeout applies to all API operations including listing applications, getting resources, and sync operations.
[updates]Settings for the automatic update check. On startup (and once per hour after that), Argonaut hits the GitHub Releases API to see whether a newer version exists; when one does, it shows a New version available, run :upgrade hint in the status bar.
| Option | Description | Default |
|---|---|---|
check_enabled | Enable the periodic GitHub release check. Set to false to disable in air-gapped environments, behind restrictive firewalls, or anywhere outbound traffic to api.github.com is unwanted. | true |
[updates]
check_enabled = false
default_viewConfigure which view Argonaut starts in. Uses the same syntax as :commands, with an optional scope argument to drill down into a specific cluster, namespace, project, or application set.
| Value | Startup view |
|---|---|
"apps" | Applications list (default) |
"clusters" | Clusters list |
"ns" | Namespaces list |
"proj" | Projects list |
"appsets" | ApplicationSets list |
"cluster production" | Namespaces scoped to cluster "production" |
"ns my-namespace" | Projects scoped to namespace "my-namespace" |
"project myproj" | Apps scoped to project "myproj" |
"appset myset" | Apps scoped to ApplicationSet "myset" |
All view aliases from :commands are supported (e.g., app/apps/applications, cls/cluster/clusters, ns/namespace/namespaces, etc.).
Examples:
# Start in apps view
default_view = "apps"
# Start scoped to a cluster (shows its namespaces)
default_view = "cluster production"
# Start scoped to a namespace (shows its projects)
default_view = "ns my-namespace"
[port_forward]Settings for port-forward mode (when ArgoCD CLI is configured with server: port-forward).
| Option | Description | Default |
|---|---|---|
namespace | Kubernetes namespace where ArgoCD is installed | argocd |
See CONTRIBUTING.md for guidelines on how to contribute to this project.
Go
98.3%