
Gum’s choose component as a drop-in replacement for read and select — arrow-key fuzzy menu, no Go required.
A toolkit from Charm that turns bash and zsh scripts into things you’d actually want to share — fuzzy choosers, password prompts, spinners, multi-line confirmations — composable with pipes.
The shell’s built-in interaction primitives stop at read and select. They’ve been there since the 1970s and they look it. Anything fancier traditionally meant rewriting your fifty-line script in Go, Python, or Node — and watching it grow into a thousand-line project nobody else on the team can reach into. Gum is the alternative: a small statically-linked binary, called like any other shell command, that gives you a Charm-quality TUI inside whatever script you’ve already written.
The components are the whole product: gum choose for menus, gum input for text fields (with a --password flag), gum spin for progress, gum confirm for yes/no, gum filter for fuzzy pickers, gum write for multi-line text, gum format for styled output. Each writes its result to stdout, so they pipe naturally — gum choose option1 option2 | xargs -I {} gum confirm "Do {}?" reads like a sentence rather than a Bash maze. The styling matches Glow, Lazygit, and the rest of the Charm catalog — rounded borders, subtle colors, restrained motion — with config cascading from CLI flags to environment variables to a .gum.toml.
Install via brew install gum, apt-get install gum, go install, or grab the static binary; no runtime dependency. Open source, MIT-licensed.
Honest limitation: it’s a hard dependency in your script. Anyone running your function or installer needs gum on $PATH, which means either a bootstrap step at the top of the script or a Homebrew/apt declaration. For internal tools that’s fine; for a “curl | bash” public installer it’s friction worth weighing against the readability win.