MCPcopy
hub / github.com/skyhook-io/radar

github.com/skyhook-io/radar @v1.8.0 sqlite

repository ↗ · DeepWiki ↗ · release v1.8.0 ↗
10,057 symbols 32,887 edges 1,269 files 3,294 documented · 33%
README

Radar

Radar - The missing open-source Kubernetes UI | Product Hunt

Modern Kubernetes visibility.

Local-first. No account. No cloud dependency. Blazing Fast.

🌐 radarhq.io · Docs · Releases

Topology, event timeline, and service traffic — plus resource browsing, Helm management, and GitOps support for FluxCD and ArgoCD.

CI Release Go Report Card Downloads License Go

Visualize your cluster topology, browse resources, stream logs, exec into pods, inspect container image filesystems, manage Helm releases, monitor GitOps workflows (FluxCD & ArgoCD), and forward ports - all from a single binary with zero cluster-side installation.

Radar Screenshot

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
  • Blazing fast - smart caching, progressive loading, parallelization and other optimizations
  • Airgapped-ready — no external network calls, works in isolated environments
  • 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 assistants query your cluster through Radar
  • In-cluster option — deploy with Helm for shared team access with RBAC-scoped permissions

Installation

Quick Install:

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

Homebrew:

brew install skyhook-io/tap/radar

Then run: kubectl radar (or simply radar)

More install options — Desktop App (macOS/Linux/Windows), Krew, Scoop, In-Cluster Helm

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 downloadGitHub 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:

sudo apt install ./radar-desktop_*.deb

Fedora/RHEL:

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 ingress, authentication, and RBAC configuration.


Usage

# Opens browser automatically
kubectl radar

# Or simply
radar

CLI Flags

Flag Default Description
--kubeconfig ~/.kube/config Path to kubeconfig file
--kubeconfig-dir Comma-separated directories containing kubeconfig files
--namespace (all) Initial namespace filter (supports multi-select in the UI; also used as RBAC fallback for namespace-scoped users)
--namespace-scope false Pin 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.
--port 9280 Server port
--no-browser false Don't auto-open browser
--browser Browser to use when opening the UI, e.g. firefox, google-chrome, or Google Chrome on macOS
--timeline-storage memory Timeline storage backend: memory or sqlite
--timeline-db ~/.radar/timeline.db Path to SQLite database (when using sqlite storage)
--timeline-max-size 1Gi Maximum SQLite DB + WAL size before pruning oldest events (e.g. 800Mi, 8Gi; 0 disables)
--history-limit 10000 Maximum events to retain in timeline
--disable-exec false Disable terminal and debug shell
--disable-helm-write false Disable Helm write operations
--disable-local-terminal false Disable local terminal feature
--debug-image busybox:latest Image 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-size 0 (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-timeout 30s Maximum 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-backstop 5m Hard 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-timeout 5s Timeout 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-candidates 20 Cap 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 Prometheus/VictoriaMetrics URL (skips auto-discovery)
--prometheus-header HTTP header sent with every Prometheus request, format Key=Value (repeatable). Required for auth-protected backends.
--prometheus-header-from-env HTTP header sent with every Prometheus request, sourced from an environment variable, format Key=ENV_VAR (repeatable).
--auth-mode none Authentication mode: none, proxy, or oidc (details)
--no-mcp false Disable MCP server for AI tool integration
--mcp-catalog-stdio false Start only the MCP catalog over stdio for registry introspection
--version Show 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.

Topology View

Topology View — Visualize resource relationships

  • 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.

Resources View

Resources View — Browse and filter all cluster resources

  • 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

Image Filesystem Viewer

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

Image Filesystem Viewer

Image Filesystem Viewer — Browse container image contents

  • 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.

Timeline View

Timeline View — Track cluster activity in real-time

  • 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.

Helm View

Helm View — Manage your Helm deployments

  • 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.

Compare View

Compare View — Side-by-side YAML diff with field-level highlighting

  • 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 d

Extension points exported contracts — how you extend this code

RefAccessChecker (Interface)
RefAccessChecker abstracts the RBAC check so this package doesn't import any internal/* package. REST and MCP handlers e [4 …
pkg/resourcecontext/build.go
ResourceProvider (Interface)
ResourceProvider is the data source for the topology builder. internal/k8s.ResourceCache implements this via topologyAda [4 …
pkg/topology/types.go
TrafficSource (Interface)
TrafficSource interface - each traffic monitoring tool implements this. [3 implementers]
pkg/traffic/source.go
Transport (Interface)
Transport is the HTTP transport used by RESTClient to reach OpenCost's REST API. Same shape as pkg/prom.Transport (path [2 …
pkg/opencost/transport.go
Resolver (Interface)
Resolver supplies the cluster-state lookups insights needs beyond what's already on the GitOps root CR. Both methods ret [2 …
pkg/gitops/insights/insights.go
EventStore (Interface)
EventStore is the interface for timeline event storage backends. Implementations must be safe for concurrent use. [2 implementers]
pkg/timeline/store.go
Transport (Interface)
Transport is the pluggable HTTP transport used by Client to issue requests to a Prometheus HTTP API. Implementations dec [2 …
pkg/prom/transport.go
OwnerResolver (Interface)
OwnerResolver walks Tier-1 identity to the topmost controller WITHOUT pkg/subject importing pkg/topology. CONTRACT — Ku [1 …
pkg/subject/subject.go

Core symbols most depended-on inside this repo

Get
called by 639
pkg/topology/types.go
Error
called by 469
internal/server/packages.go
Add
called by 456
pkg/k8score/metrics_history.go
writeError
called by 385
internal/server/server.go
List
called by 382
internal/audit/runner.go
Error
called by 271
pkg/prom/transport.go
find
called by 219
internal/server/applications.go
Close
called by 217
pkg/timeline/store.go

Shape

Function 7,249
Method 1,084
Interface 827
Struct 789
TypeAlias 77
FuncType 25
Class 6

Languages

Go64%
TypeScript36%

Modules by API surface

web/src/api/client.ts217 symbols
internal/helm/client.go143 symbols
packages/k8s-ui/src/components/resources/resource-utils.ts110 symbols
internal/k8s/history.go107 symbols
packages/k8s-ui/src/types/core.ts96 symbols
internal/server/server.go94 symbols
packages/k8s-ui/src/components/resources/ResourcesView.tsx82 symbols
internal/issues/issues_test.go71 symbols
pkg/gitops/insights/insights.go70 symbols
internal/mcp/tools.go69 symbols
internal/k8s/detect_scheduling.go66 symbols
pkg/resourcecontext/build.go64 symbols

Dependencies from manifests, versioned

cel.dev/exprv0.25.1 · 1×
cloud.google.com/go/compute/metadatav0.9.0 · 1×
dario.cat/mergov1.0.2 · 1×
github.com/Azure/go-ansitermv0.0.0-2025010203350 · 1×
github.com/MakeNowJust/heredocv1.0.0 · 1×
github.com/Masterminds/goutilsv1.1.1 · 1×
github.com/Masterminds/semver/v3v3.5.0 · 1×
github.com/antlr4-go/antlr/v4v4.13.1 · 1×
github.com/asaskevich/govalidatorv0.0.0-2023030114320 · 1×

For agents

$ claude mcp add radar \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact