When the CLI Felt Like Magic
There are two broad ways to design a CLI.
One approach mirrors the underlying system. The CLI exposes the full object model and API surface area. The other approach structures interaction. It organizes complexity so developers can navigate it with less cognitive effort.
As systems grow in scale, that distinction becomes more important.
Heroku: Structuring the Common Path
I recently heard that Heroku is effectively moving into maintenance mode. That news made me reflect on how much influence it had on developer experience, especially through its CLI.
For many developers, Heroku was the first time infrastructure felt simple.
You ran:
heroku create
git push heroku master
And your application was live.
The effectiveness of this flow was not accidental. Heroku built deployment directly on top of Git. Instead of introducing a new operational model, it aligned infrastructure with an existing developer habit.
You pushed code. The platform handled build, release, routing, and process management.
Heroku did not expose infrastructure primitives like instances, networking rules, or load balancers. Those concerns existed, but they were abstracted behind an opinionated workflow.
The CLI was intentionally limited. It did not expose every possible knob. It constrained the surface area in exchange for cohesion.


Heroku did not mirror infrastructure. It structured access to it around the most common developer workflow.
That design decision reduced both operational and decision complexity.
AWS CLI: Complete System Exposure
The AWS CLI represents a different philosophy.
It exposes more than 300 services and thousands of operations. Nearly every API call is accessible. In some cases, the CLI even provides capabilities not available in the console.
It is comprehensive.
But it does not impose a unified workflow across services. Each service has its own namespace, naming conventions, and flags. Discoverability is limited. Exploration usually requires documentation rather than interaction.
You cannot realistically hold the entire surface area in your head. You must know what you are looking for.
The AWS CLI mirrors the system architecture faithfully. It reflects organizational scale and API breadth.
That fidelity is powerful. But it transfers the burden of structure to the developer.
K9s: Reducing Interaction Cost



Kubernetes is also a large and complex system.
The kubectl CLI exposes the Kubernetes object model directly: pods, deployments, replica sets, stateful sets, services, config maps, ingress objects, and more. Working with it often involves multiple terminals and carefully assembled commands.
At Probo, while running production workloads on Kubernetes, we used K9s extensively.
K9s does not hide Kubernetes complexity. It preserves the object model. What it changes is the interaction cost.
Instead of repeatedly assembling commands, you navigate a live, continuously updating view of cluster state. You can sort by CPU or memory with a keystroke. You can switch namespaces quickly. You can inspect, edit, and drill into objects without constructing new command chains each time.
It uses real-time watch APIs, so state updates are continuous rather than discrete.
For engineers unfamiliar with kubectl, onboarding is faster because the system becomes discoverable. You explore available objects instead of recalling exact syntax.
K9s mirrors Kubernetes. But it organizes access to it in a way that reduces cognitive effort.
Claude CLI: Structuring Interaction With Uncertainty
Claude CLI applies similar structuring principles, but in a different category of system.
Traditional CLIs interact with deterministic systems. You issue a command and receive a predictable result. Even if the system is complex, the behavior is stable.
AI systems are different. They are probabilistic and opaque. Outputs are not guaranteed. Internal reasoning is not directly visible. Without structure, interaction can feel uncertain.
Claude CLI addresses that by structuring the interaction loop.
It provides visible processing feedback instead of blocking silently. It adapts cleanly to terminal resizing. It surfaces contextual shortcuts when relevant rather than requiring memorization. It avoids rigid flows while still offering structured guidance. When proposing code changes, it allows review before acceptance.
These choices reduce uncertainty. They introduce checkpoints where trust matters. They help developers reason inside a probabilistic system rather than treating it like a deterministic one.
Claude CLI does not simplify the model. It structures how developers engage with it.
The Real Shift
The evolution of the CLI is not from commands to interactivity.
It is from exposing complexity to structuring it.
As systems expand in capability — whether cloud infrastructure, container orchestration, or AI models — faithfully mirroring internal APIs becomes insufficient. The surface area grows beyond what can be navigated through recall alone.
The more complex the system, the more responsibility shifts to the interface.
Modern platform teams are no longer just exposing capability. They are shaping how engineers think inside complex systems.



