All posts

Why I Love Building CLI Tools

I’ve built web apps, APIs, mobile backends, and data pipelines. But the thing I keep coming back to — the thing that gives me the most creative satisfaction — is building CLI tools.

The Beauty of Constraints

A CLI tool has no CSS to fiddle with. No responsive breakpoints. No “works on my machine but breaks on Safari.” You have text in, text out, and a handful of flags. That’s it.

These constraints are liberating. All your energy goes into the logic and the experience. How does the tool feel to use? Is the output scannable? Are the defaults sensible? Does it compose well with other tools?

Immediate Feedback

There’s a tightness to the feedback loop that web development rarely matches. Write a function. Run the command. See the result. No waiting for builds, no refreshing browsers, no clearing caches.

$ devkit scaffold --template api
 Created project structure
 Initialized git repository
 Installed dependencies
 Ready to go! Run `cd my-api && devkit dev` to start

That instant gratification is addictive.

The Unix Philosophy Still Works

The best CLI tools do one thing well and compose with others. When I built DevKit, the guiding principle was: every command should produce output that’s useful to both humans and machines.

Human-readable by default. Add --json for machine-readable output. Pipe it to jq, grep, awk, whatever you need. Your tool becomes a building block in someone else’s workflow.

Error Messages Are UX

In a web app, you might show a toast notification or a modal. In a CLI, your error message is your entire UX for that failure case. I spend more time crafting error messages than almost anything else:

Error: Config file not found at ./devkit.yml

  Did you mean to run this from your project root?
  Current directory: /Users/you/Documents

  To create a new config: devkit init
  To specify a path:     devkit --config /path/to/devkit.yml

Tell them what went wrong. Tell them why. Tell them how to fix it. That’s the whole formula.

It’s Art in Disguise

People don’t think of CLI tools as a creative medium, but they absolutely are. The colors, the spinners, the progress bars, the way information is laid out — it’s all design. It’s just design expressed through characters instead of pixels.

And honestly? Some of the most beautiful software I’ve ever used lives in the terminal.