I like my shell. I spend a lot of my life in here and I’d say the user experience for it is pretty important. Recently I have noticed an alarming trend whereby apps that are built to be run in the shell presume to clutter my screen with crap that I did not ask for. Running simple commands that should do predictable basic things litters my screen with emojis and loading animations and flashy colors.
This in my experience is the sign of bored developers (or sometimes developers trying to justify their continued employment). Having built something that works and finding themselves with a bunch of time on their hands they add many bells and whistles to existing software so as to have something to do. UI redesign is a perfect time sink because unless you’re actually doing user research there’s nothing even approximating a right answer, so a bored dev can fiddle and rearrange and add more color palettes to their hearts content.
I find this behaviour to be incredibly presumptuous though. The shell
is such a useful interface not just cause it makes you look like a
hacker, but because text as a medium is very flexible and composable. I
might be rerouting the output of your tool to a file or piping it to
another separate tool. I might be running it in the background or on a
quirky terminal emulator that doesn’t have the emoji you want. I might
be using your tool from a shell that is itself running inside some
larger program context (like emacs’ M-x shell for example).
I might just be tired and uninterested in your pages of color coded
output, no matter how pretty it is!
This isn’t to say that there is no place for maximalist UI in CLI/TUI
tools, but only when the user asks for it. Give me
--progress and --verbose by all means, but
don’t assume that just because some heuristic said that STDOUT is a
probably a TTY that my screen is just blank canvas for your whimsy.
Consent is an important part of the user experience. As much as possible, especially in the world of the shell, programs should output only what is needed to accomplish their task. Frequently this is nothing at all. If there’s other information that the user might want, give them some way to request it from you (flags, env vars, configuration files, etc.). If you truly must ship a maximalist UI as the default, don’t make your users go hunting through your docs (or source code) to figure out how to fall back to simpler interfaces (respecting conventions like NO_COLOR helps a lot).
Above all else, consider whether your user wants the UI detail that you are presenting them and how they can communicate that desire (or lack thereof) when using your tool. Building a flashy color-coded progress indicator widget can be a fun way to spend a slow afternoon, but if you foist it on your users without their consent then you’re abusing them to satisfy your curiosity. If you have a captive audience they may have no choice but to tolerate your tool, but they’re certainly not going to love it.