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.