g kubectl get pods -n maple-staging by hand. So I built a browser-based visualizer instead."
---

```bash
kubectl get pods
```

```
No resources found in default namespace.
```

Right. Namespace. Which namespace was it?

```bash
kubectl get pods -n maple-staging
```

Okay, there it is. Now I want to check the same thing in another terminal but I've already forgotten whether it was `maple-staging` or `maple-prod`. I scroll up. I copy. I paste. I add `-n` again.

Then I want to check a rollout.

```bash
kubectl rollout status deploymet/quest-engine -n maple-staging
```

```
error: the server doesn't have a resource type "deploymet"
```

Typo. Fix. Run again. Wait. Is it `deployment` or `deployments`? I always get this wrong.

Twenty minutes in, I have six terminal tabs open, three of them showing the same namespace, and I still don't know if the rollout finished.

I tried k9s. It's genuinely good but I kept thinking: I want to build this myself, and I want it in a browser.

So I did.

![Home page](/images/kubecmds-viz/05-home.png)

## The problem with "just use kubectl"

470 nodes is not a list problem. It's a mental model problem.

You can `kubectl get all -A` and get 800 lines of text. Every resource is there. Nothing is connected. You still don't know why the staging deployment keeps restarting, which secrets istiod actually depends on, or what's sharing a ServiceAccount with something it shouldn't.

The real question isn't "what exists." It's "how does this connect to that."

## The graph

The Universe view renders the entire cluster as a force-directed graph. Every namespace, every deployment, every service, every secret, every binding. Rendered with WebGL.

![K8s Universe, 470 resources across all namespaces](/images/kubecmds-viz/01-universe-overview.png)

Click any node. The sidebar shows that resource's full connection map: which ServiceAccount it uses, which ConfigMap, which Secret, which Service it exposes.

![K8s Universe, deployment detail with connection sidebar](/images/kubecmds-viz/02-universe-target-ns.png)

The edges tell the real story. Each edge traces a dependency: uses-configmap, uses-secret, exposes. At 3.0x zoom in maple-staging, gateway-api's four connections are immediately visible. That's not something you find in a log.

DOM nodes couldn't handle cluster scale. Every pan froze the browser. WebGL replaced it. The entire cluster renders on a single canvas pass now.

## The terminal

The graph shows structure. The terminal shows state.

![K8s Terminal, multiple resource windows side by side](/images/kubecmds-viz/03-terminal.png)

Click any resource. A window opens: Rollout Status, Logs, YAML, Exec Shell, Delete. Open multiple side by side: Deployment rollout history next to a Job's YAML. kubectl can do this but you need 4 terminal panes and 4 commands to get there.

## The fetch problem

Fetching one resource type at a time meant waiting three times: deployments, then pods, then services. `Promise.all` collapsed those waits into one round-trip.

That created a new problem. Switch namespaces mid-fetch and the old requests keep running. Stale data arrives late and overwrites what the new namespace just loaded.

Cancellation sounds simple. Cancel the request, done.

`takeUntil(cancel$)` fired. Angular said: I give up, I'm not listening. Node.js kept running. Nobody told it to stop.

`unsubscribe()` closed the TCP connection. Node.js saw the disconnect, called `AbortController.abort()`, and every kubectl process died.

```diff
- private cancel$ = new Subject<void>();
+ private inflight: Subscription | null = null;

  fetchGraph(): void {
-   this.cancel$.next();
+   this.inflight?.unsubscribe();

-   this.http.get<GraphDataResponse>(`${API_BASE}/graph`)
-     .pipe(takeUntil(this.cancel$), finalize(() => this._loading.set(false)))
-     .subscribe({ next: (data) => { this._data.set(data); } });
+   this.inflight = this.http.get<GraphDataResponse>(`${API_BASE}/graph`)
+     .subscribe({ next: (data) => { this._data.set(data); } });
  }
```

## The part I didn't expect to matter

Every kubectl command authenticates through AWS STS first. That's a round-trip before anything runs. Add sequential fetching on top and loading a namespace on a busy cluster feels like dial-up.

The other problem was the environment itself. Dev clusters shut down at night. Come back the next morning and the state is gone. Configuration half traced, relationships half mapped.

Snapshot mode solves both. One command runs `kubectl get` across all resource types: 23 namespaces, 6 parallel batches each. Everything dumps to YAML.

The app reads those files instead of hitting kubectl live.

![Export in progress, 4 of 23 namespaces, 53 files](/images/kubecmds-viz/04-export.png)

The cluster state freezes at export time. Relationships, dependencies, namespaces. All navigable without a live connection. The dev cluster can sleep. The investigation doesn't have to.

## What it doesn't do

No CPU/memory metrics. No multi-cluster switching. No RBAC management.

These aren't missing features. This tool is for understanding a cluster, not operating one. k9s is better for power users who live in a terminal. kubecmds-viz is for the moment you need to explain what's running to someone who doesn't.

The source is on [GitHub](https://github.com/jialinhuang00/kubevisualizer).
