Radar

MCP serverCloud & infra

Radar lets your AI diagnose and manage Kubernetes clusters. Once it is added, your AI can look into problems, manage resources, handle GitOps, and run operations that respect role-based access controls. That means cluster troubleshooting and upkeep can happen through a simple conversation with your AI.

Unavailable. This server has no hosted endpoint yet, so ahel can't serve it.

After adding radar, ask your AI to check on a cluster or investigate a specific problem to see what it finds. More details are in the repository at github.com/skyhook-io/radar.

What your AI can do with it

  • Diagnose problems in Kubernetes clusters
  • Manage Kubernetes resources
  • Handle GitOps workflows
  • Run operations that stay within role-based access controls

From the project's README

As published by skyhook-io/radar in README.md.

The missing open-source Kubernetes UI. Single binary. No account required. Free forever.

🌐 radarhq.io · Docs · Releases

Topology, resources, Helm, GitOps, traffic, audit, upgrade impact, and MCP context for AI agents β€” from your laptop or in-cluster.

  • Why Radar?
  • Installation
  • Usage
  • Views β€” Topology Β· Resources Β· Image Filesystem Β· Timeline Β· Helm Β· Compare Β· TLS Β· GitOps Β· Traffic Β· Cost Β· Audit Β· Upgrade impact Β· RBAC Β· MCP Β· Auth
  • Supported Resources
  • Keyboard Shortcuts
  • Security
  • Development Β· Contributing

Install and run in 30 seconds:

curl -fsSL https://get.radarhq.io | sh && kubectl radar

More installation options ↓

Why Radar?

  • Zero install on your cluster β€” runs on your laptop, talks to the K8s API directly
  • Single binary β€” no dependencies, no agents, no CRDs
  • Fast on big clusters β€” tested on tens of thousands of pods, with responsive views and live updates under real cluster churn
  • Private by design β€” your cluster data stays on your machine. No account, no agents, no cloud sync, no cluster telemetry
  • Airgapped-friendly β€” runs as a single binary against the Kubernetes API and works in locked-down environments with outbound egress blocked
  • Real-time β€” watches your cluster via informers, pushes updates to the browser via SSE
  • Works everywhere β€” GKE, EKS, AKS, minikube, kind, k3s, or any conformant cluster
  • AI-ready β€” built-in MCP server lets AI agents inspect, investigate, and operate your cluster through Radar
  • In-cluster option β€” deploy with Helm for shared team access with RBAC-scoped permissions

"Have Radar deployed at work. As far as Kubernetes dashboards go, this is one of the best." β€” u/TheRealNetroxen


Installation

Quick Install:

curl -fsSL https://get.radarhq.io | sh

Homebrew:

brew install skyhook-io/tap/radar

Then run: kubectl radar. Quick install, PowerShell, Homebrew, and Scoop also set up the radar shorthand. Krew and direct downloads use kubectl radar unless you add your own radar symlink.

CLI

Krew (kubectl plugin manager):

kubectl krew install radar

Scoop (Windows):

scoop bucket add skyhook https://github.com/skyhook-io/scoop-bucket
scoop install radar

PowerShell (Windows):

irm https://get.radarhq.io/install.ps1 | iex

Direct download β€” GitHub Releases for macOS, Linux, or Windows.

Desktop App

Native desktop app β€” no terminal needed.

Homebrew (macOS):

brew install --cask skyhook-io/tap/radar-desktop

Debian/Ubuntu β€” download the .deb from GitHub Releases, then:

sudo apt install ./radar-desktop_*.deb

Fedora/RHEL β€” download the .rpm from GitHub Releases, then:

sudo rpm -i radar-desktop_*.rpm

Scoop (Windows):

scoop bucket add skyhook https://github.com/skyhook-io/scoop-bucket
scoop install radar-desktop

Windows (direct download) β€” GitHub Releases.

In-Cluster Deployment

Deploy to your cluster for shared team access:

helm repo add skyhook https://skyhook-io.github.io/helm-charts
helm install radar skyhook/radar -n radar --create-namespace

See the In-Cluster Deployment Guide for Gateway API and ingress exposure, authentication, and RBAC configuration.


Usage

# Opens browser automatically
kubectl radar

# Quick install, PowerShell, Homebrew, and Scoop also set up the bare command
radar

To inspect an in-cluster Radar Cloud installation without changing it:

radar cloud status
radar cloud status --context my-cluster
radar cloud status --context my-cluster --namespace radar --release radar

The command reports installation ownership, chart and image, agent readiness, and Cloud configuration without printing the connection token. Passing both --namespace and --release selects an exact installation. Live tunnel status is reported by Radar Cloud using the token in the referenced Kubernetes Secret. If the Secret or Hub is unavailable, local installation diagnostics still run. Interactive terminals use restrained status colors; set NO_COLOR (or pipe the output) for plain text. URLs, tokens, and suggested commands remain unstyled.

CLI Flags

The table below covers common startup flags. See the full CLI reference; radar --help is authoritative for the installed version.

FlagDefaultDescription
--kubeconfig~/.kube/configPath to primary kubeconfig file
--kubeconfig-dirComma-separated directories containing additional kubeconfig files
--namespace(all)Initial namespace filter (supports multi-select in the UI; also used as RBAC fallback for namespace-scoped users)
--namespaces(all)Initial namespace filters as a comma-separated list, e.g. --namespaces ns1,ns2,ns3. Use this when your identity can list resources in specific namespaces but cannot list namespaces cluster-wide.
--namespace-scopefalsePin namespaced informer caches to a single namespace for large clusters (scoping to multiple namespaces is not supported yet). Requires --namespace, a kubeconfig context namespace, or a saved local single-namespace pick. Local mode can rebuild the cache when switching namespaces; auth/cloud mode locks the shared cache to the startup namespace.
--port9280Server port
--listen-address127.0.0.1HTTP listen address. Use 127.0.0.1 or localhost for local-only access; use 0.0.0.0 explicitly for containers, VMs, WSL, or remote/shared access, together with authentication and network controls.
--base-pathServe Radar under a URL prefix such as /radar. Use when an ingress forwards a subpath without stripping it β€” everything, including /api/health, moves under the prefix. Not supported with --cloud-url.
--no-browserfalseDon't auto-open browser
--browserBrowser to use when opening the UI, e.g. firefox, google-chrome, or Google Chrome on macOS
--timeline-storagememoryTimeline storage backend: memory, sqlite, or postgres
--timeline-db~/.radar/timeline.dbPath to SQLite database (when using sqlite storage)
--timeline-max-size1GiMaximum SQLite DB + WAL size before pruning oldest events (e.g. 800Mi, 8Gi; 0 disables)
--history-limit10000Maximum events to retain in timeline (memory only)
--disable-execfalseDisable terminal and debug shell
--disable-helm-writefalseDisable Helm write operations
--disable-local-terminalfalseDisable the host local terminal
--debug-imagebusybox:latestImage for ephemeral debug containers and node debug pods. If built-in restricted PodSecurity rejects the default pod debug container, Radar retries with a restricted-compatible Linux security context using the target/pod non-root UID, or UID 65532 by default; point at a compatible mirror for air-gapped / private-registry clusters.
--list-page-size0 (off)Paginate the initial LIST of high-cardinality kinds (Pods, ReplicaSets) at this size. Helps very large clusters that fail to sync; only used when WatchList streaming is unavailable. Try 2000.
--context-switch-timeout30sMaximum time a kubeconfig context switch may take. Widen on high-latency control planes β€” see Tuning for slow clusters. Env: RADAR_CONTEXT_SWITCH_TIMEOUT.
--first-paint-backstop5mHard upper bound on the initial critical-cache sync wait before Radar falls through to a partial-data render. Env: RADAR_FIRST_PAINT_BACKSTOP.
--namespace-list-timeout5sTimeout for the cluster-wide namespace LIST used to decide if the user is RBAC-namespace-restricted. A timeout on a slow control plane is misreported in the UI as "Limited list β€” RBAC". Env: RADAR_NAMESPACE_LIST_TIMEOUT.
--max-scope-candidates20Cap on the namespace-fallback probe fanout (used by accounts that can list namespaces cluster-wide but not list a specific kind cluster-wide). Raise above 20 for clusters with more than 20 namespaces. Env: RADAR_MAX_SCOPE_CANDIDATES.
--prometheus-url(auto-discover)Manual PromQL-compatible query URL, including Prometheus, VictoriaMetrics, Thanos, or Mimir (skips auto-discovery)
--prometheus-headerHTTP header sent with every Prometheus request, format Key=Value (repeatable). Required for auth-protected backends.
--prometheus-header-from-envHTTP header sent with every Prometheus request, sourced from an environment variable, format Key=ENV_VAR (repeatable).
--opencost-currency(auto-detect, then USD)Override the ISO 4217 currency label for OpenCost values. Radar labels values but does not convert them.
--auth-modenoneAuthentication mode: none, proxy, or oidc (details)
--no-mcpfalseDisable MCP server for AI tool integration
--mcp-catalog-stdiofalseStart only the MCP catalog over stdio for registry introspection
--versionShow version and exit

See Configuration Guide for details on cluster connection precedence, multiple kubeconfig files, and context switching.

Tuning for slow or high-latency clusters

The default deadlines (30 s context switch, 5 m first-paint backstop, 5 s namespace LIST, 20 scope candidates) are tuned for healthy clusters reached over fast, low-latency connections. They are too tight for clusters reached over SSH tunnels, geographically distant control planes, or accounts subject to API-server throttling, where they surface as one of three symptoms:

  • "Context switch timed out" toasts when the cache eventually does sync
  • "Limited list β€” RBAC doesn't allow listing all namespaces" even though the account has cluster-wide list permission (the LIST timed out, not RBAC)
  • Kinds silently marked denied because the namespace they live in fell past the 20-entry candidate cap

Widen the four flags via CLI or via the matching environment variables (RADAR_CONTEXT_SWITCH_TIMEOUT, RADAR_FIRST_PAINT_BACKSTOP, RADAR_NAMESPACE_LIST_TIMEOUT, RADAR_MAX_SCOPE_CANDIDATES) β€” env vars keep secrets out of ps and let in-cluster deployments source the values from a ConfigMap:

# CLI
kubectl radar \
  --context-switch-timeout=120s \
  --first-paint-backstop=10m \
  --namespace-list-timeout=30s \
  --max-scope-candidates=200

# Environment (e.g. in a Deployment manifest)
RADAR_CONTEXT_SWITCH_TIMEOUT=120s \
RADAR_FIRST_PAINT_BACKSTOP=10m \
RADAR_NAMESPACE_LIST_TIMEOUT=30s \
RADAR_MAX_SCOPE_CANDIDATES=200 \
  kubectl radar

Defaults are preserved when neither the flag nor the env var is set, so existing deployments are unaffected.


Views

Topology

Interactive graph showing how your Kubernetes resources are connected in real-time.

  • Two modes: Resources (full hierarchy) and Traffic (network flow path)
  • Group by namespace, app label, or view ungrouped
  • Filter by resource kind β€” click any node for full details
  • Auto-layout powered by ELK.js, live updates via SSE

Resources

Table-based resource browser with smart columns per resource kind.

  • Browse all resource types including CRDs
  • Search by name, filter by status or problems (CrashLoopBackOff, ImagePullBackOff, etc.)
  • Add custom columns from any label or annotation β€” sortable, filterable, and resizable
  • Click any resource for YAML manifest, related resources, logs, and events
  • Set regular or init-container images on Deployments, StatefulSets, DaemonSets, and Argo Rollouts, with live rollout progress in tables, drawers, workload views, and Applications

Image Filesystem Viewer

Inspect container image filesystems directly from the Pod view β€” no need to pull images locally or exec into containers.

  • Click any container image in a Pod to browse its complete filesystem
  • Tree view with file sizes, permissions, and symlink targets
  • Search files by name across the entire image
  • Download individual files for inspection
  • Works with public images (Docker Hub, Quay, GHCR) and private registries (GCR, ECR, ACR) using your cluster's ImagePullSecrets
  • Disk-based layer caching for fast repeated access

Timeline

Unified timeline of Kubernetes events and resource changes.

  • Filter by event type (all or warnings only)
  • Resource change diffs showing what changed (replicas, images, etc.)
  • Real-time updates as new events occur

Helm

Manage Helm releases deployed in your cluster β€” inspect values and rendered manifests, diff revisions, identify failed upgrades and rollback-after-failure patterns, diagnose failed hooks, upgrade, rollback, and uninstall. Radar tracks available chart upgrades (from your configured repos or your own OCI registries) and lets you pick a specific target version. See Helm Support for the detailed behavior and limits.

  • View all releases across namespaces with status, chart version, app version, resource health, storage namespace, and Flux ownership
  • Inspect values, compare revisions across values/manifests/notes/resources, and view release history
  • Surface failed upgrades, stuck pending operations, rollback history, and inferred atomic-style rollbacks
  • Correlate failed/running hooks with remaining Job, Pod, Event, and redacted log evidence
  • Upgrade, rollback, or uninstall releases directly from the UI

Compare Resources

Diff any two Kubernetes resources of the same kind side-by-side β€” like comparing a staging Deployment to its production sibling, or two pods that should be identical but aren't.

  • Two entry points: a Compare button in the resource detail drawer, or compare mode in the resource table (toggle, pick two rows, hit Compare)
  • Side-by-side or unified view, with one-click swap of A ↔ B
  • Diff-only mode collapses unchanged regions so you only see what differs
  • Spec-only mode drops status fields to focus on intent rather than observed state
  • Server-assigned noise (managedFields, resourceVersion, kubectl.kubernetes.io/last-applied-configuration) is stripped automatically so the diff stays signal β€” flip Raw metadata on if you actually want to see it
  • Same-namespace candidates are surfaced first in the picker β€” usually the resource you want to compare against
  • Shareable URLs: /compare?kind=&apiGroup=&a=ns/name&b=ns/name

TLS Certificate Management

View TLS certificate details and expiry dates across all namespaces β€” catch expiring certificates before they cause outages.

  • Parses TLS secrets to show certificate subject, issuer, and validity period
  • Dashboard-level certificate expiry overview
  • Available from the resource detail view for any TLS-type Secret

GitOps

Monitor, diagnose, and manage FluxCD and ArgoCD resources from a dedicated GitOps workspace.

  • Fleet view + per-app detail page (Topology / Changes / Activity tabs) for ArgoCD (Application, ApplicationSet, AppProject) and FluxCD (GitRepository, OCIRepository, HelmRepository, Bucket, Kustomization, HelmRelease, Alert)
  • Diagnosis pipeline β€” field-level drift, recent events per resource, stuck-drift-loop detection, parsed operation-failures, structured one-click remediation
  • Lifecycle awareness β€” Terminating chip replaces stale Sync/Health badges; severity ramps with deletion age; mutating ops refuse on zombies
  • Cross-linked from the rest of Radar β€” Managed by chip in resource drawers, GitOps routing from Topology + Timeline + Helm view, Consumed by panel on Flux source CRs
  • MCP integration β€” manage_gitops exposes sync / suspend / resume / reconcile / rollback with lifecycle-aware refusal

See the GitOps guide for the full feature matrix, RBAC requirements, demo cluster, and single-cluster scope notes.

Traffic

Visualize live network traffic between services using Hubble, Caretta, Istio, or Beyla.

  • Auto-detects Hubble (Cilium), Istio, Caretta, or Grafana Beyla as traffic data sources
  • Beyla (standalone or via Grafana Alloy) provides eBPF L4 + HTTP visibility with no service mesh, read from Prometheus
  • Beyla needs its network feature enabled, and per-port edges additionally need dst.port and transport named in attributes.select β€” both are off by default, and Radar says so in the Traffic view rather than showing partial edges silently
  • Animated flow graph showing requests per second between services
  • Filter by namespace, protocol, or status code
  • Setup wizard to install a traffic source if none is detected

Capacity (Karpenter)

Read-only diagnosis for Karpenter-managed fleets β€” why is my pod pending, which NodePool could take it, why aren't my nodes joining, what is disruption doing to my fleet? Appears automatically when Karpenter NodePools are detected (RBAC-gated).

  • Overview β€” fleet KPIs with claim lifecycle detail, a cluster scheduling-capacity bar (requests vs allocatable, in-flight beyond the edge, pending demand as an honest not-to-scale count), prioritized operational signals, and the NodePool inventory
  • NodePool detail β€” the capacity ledger (configured limit, provisioned, headroom, allocatable, scheduled requests, unallocated, actual usage), claim lifecycle, fleet composition, and workload attribution
  • Demand β€” pending pods grouped by scheduling signature, each group evaluated against every NodePool's declared constraints with per-predicate evidence; filterable by state, pool, and workload
  • Activity β€” provisioning / disruption / interruption episodes classified from Karpenter's exact event vocabulary, with per-evidence confidence
  • Every quantity carries per-value certainty (= β‰₯ ≀ ?) β€” unavailable is never rendered as zero, partial is never rendered as exact
  • Issues, Pending-pod drawers, and the Home posture card deep-link into the right diagnosis

See docs/capacity.md for the full reference.

Cost Insights

Track Kubernetes spending from OpenCost metrics in a PromQL-compatible backend or a Kubecost 3 Aggregator. Auto mode keeps working Prometheus cost metrics, then discovers a local Kubecost Aggregator; a federated agent-only cluster can use its central Aggregator URL in Settings, config, or Helm. Radar reads the configured currency from a running OpenCost or Kubecost workload when available and otherwise uses USD. Source changes are tested and applied separately from the display-currency preference, which can be saved even when a source is unavailable. Radar labels values but does not convert them.

  • Allocated workload cost with namespace scope called out separately from cluster-wide node capacity cost
  • Cost trend charts with 6h/24h/7d range selector when Prometheus history is available
  • Namespace and workload-level cost breakdowns with efficiency scoring
  • Node costs with instance type and region pricing
  • Appears automatically when compatible Prometheus metrics or Kubecost current allocation data is detected

Cluster Audit

Proactive best-practices scanner with 31 checks across security, reliability, and efficiency β€” inspired by Polaris, Kubescape, Trivy, and NSA/CISA guidelines. Runs instantly against cached data with zero cluster-side installation.

Shortened here. Read the whole README on GitHub.

Signals

GitHub stars
3k
Forks
204
Last commit
Sep 2026
Advanced
Delivery
radar MCP server β†’ your ahel gateway (mcp.ahel.ai) β†’ every connected AI client.
Catalog kind
mcp-server
Gateway key
io-github-skyhook-io-radar
Source
github.com/skyhook-io/radar