Gum
A tool for glamorous shell scripts ๐
Install / Use
/learn @charmbracelet/GumREADME
Gum
<p> <a href="https://stuff.charm.sh/gum/nutritional-information.png" target="_blank"><img src="https://stuff.charm.sh/gum/gum.png" alt="Gum Image" width="450" /></a> <br><br> <a href="https://github.com/charmbracelet/gum/releases"><img src="https://img.shields.io/github/release/charmbracelet/gum.svg" alt="Latest Release"></a> <a href="https://pkg.go.dev/github.com/charmbracelet/gum?tab=doc"><img src="https://godoc.org/github.com/golang/gddo?status.svg" alt="Go Docs"></a> <a href="https://github.com/charmbracelet/gum/actions"><img src="https://github.com/charmbracelet/gum/workflows/build/badge.svg" alt="Build Status"></a> </p>A tool for glamorous shell scripts. Leverage the power of Bubbles and Lip Gloss in your scripts and aliases without writing any Go code!
<img alt="Shell running the ./demo.sh script" width="600" src="https://vhs.charm.sh/vhs-1qY57RrQlXCuydsEgDp68G.gif">The above example is running from a single shell script (source).
Tutorial
Gum provides highly configurable, ready-to-use utilities to help you write useful shell scripts and dotfile aliases with just a few lines of code. Let's build a simple script to help you write Conventional Commits for your dotfiles.
Ask for the commit type with gum choose:
gum choose "fix" "feat" "docs" "style" "refactor" "test" "chore" "revert"
[!NOTE] This command itself will print to stdout which is not all that useful. To make use of the command later on you can save the stdout to a
$VARIABLEorfile.txt.
Prompt for the scope of these changes:
gum input --placeholder "scope"
Prompt for the summary and description of changes:
gum input --value "$TYPE$SCOPE: " --placeholder "Summary of this change"
gum write --placeholder "Details of this change"
Confirm before committing:
gum confirm "Commit changes?" && git commit -m "$SUMMARY" -m "$DESCRIPTION"
Check out the complete example for combining these commands in a single script.
<img alt="Running the ./examples/commit.sh script to commit to git" width="600" src="https://vhs.charm.sh/vhs-7rRq3LsEuJVwhwr0xf6Er7.gif">Installation
Use a package manager:
# macOS or Linux
brew install gum
# Arch Linux (btw)
pacman -S gum
# Fedora or EPEL 10
dnf install gum
# Nix
nix-env -iA nixpkgs.gum
# Flox
flox install gum
# Windows (via WinGet or Scoop)
winget install charmbracelet.gum
scoop install charm-gum
<details>
<summary>Debian/Ubuntu</summary>
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update && sudo apt install gum
</details>
<details>
<summary>Fedora/RHEL/OpenSuse</summary>
echo '[charm]
name=Charm
baseurl=https://repo.charm.sh/yum/
enabled=1
gpgcheck=1
gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
sudo rpm --import https://repo.charm.sh/yum/gpg.key
# yum
sudo yum install gum
# zypper
sudo zypper refresh
sudo zypper install gum
</details>
<details>
<summary>FreeBSD</summary>
# packages
sudo pkg install gum
# ports
cd /usr/ports/devel/gum && sudo make install clean
</details>
Or download it:
- Packages are available in Debian, RPM, and Alpine formats
- Binaries are available for Linux, macOS, Windows, FreeBSD, OpenBSD, and NetBSD
Or just install it with go:
go install github.com/charmbracelet/gum@latest
Commands
choose: Choose an option from a list of choicesconfirm: Ask a user to confirm an actionfile: Pick a file from a folderfilter: Filter items from a listformat: Format a string using a templateinput: Prompt for some inputjoin: Join text vertically or horizontallypager: Scroll through a filespin: Display spinner while running a commandstyle: Apply coloring, borders, spacing to texttable: Render a table of datawrite: Prompt for long-form textlog: Log messages to output
Customization
You can customize gum options and styles with --flags and $ENVIRONMENT_VARIABLES.
See gum <command> --help for a full view of each command's customization and configuration options.
Customize with --flags:
gum input --cursor.foreground "#FF0" \
--prompt.foreground "#0FF" \
--placeholder "What's up?" \
--prompt "* " \
--width 80 \
--value "Not much, hby?"
Customize with ENVIRONMENT_VARIABLES:
export GUM_INPUT_CURSOR_FOREGROUND="#FF0"
export GUM_INPUT_PROMPT_FOREGROUND="#0FF"
export GUM_INPUT_PLACEHOLDER="What's up?"
export GUM_INPUT_PROMPT="* "
export GUM_INPUT_WIDTH=80
# --flags can override values set with environment
gum input
<img alt="Gum input displaying most customization options" width="600" src="https://vhs.charm.sh/vhs-5zb9DlQYA70aL9ZpYLTwKv.gif">
Input
Prompt for input with a simple command.
gum input > answer.txt
gum input --password > password.txt
<img src="https://vhs.charm.sh/vhs-1nScrStFI3BMlCp5yrLtyg.gif" width="600" alt="Shell running gum input typing Not much, you?" />
Write
Prompt for some multi-line text (ctrl+d to complete text entry).
gum write > story.txt
<img src="https://vhs.charm.sh/vhs-7abdKKrUEukgx9aJj8O5GX.gif" width="600" alt="Shell running gum write typing a story" />
Filter
Filter a list of values with fuzzy matching:
echo Strawberry >> flavors.txt
echo Banana >> flavors.txt
echo Cherry >> flavors.txt
gum filter < flavors.txt > selection.txt
<img src="https://vhs.charm.sh/vhs-61euOQtKPtQVD7nDpHQhzr.gif" width="600" alt="Shell running gum filter on different bubble gum flavors" />
Select multiple options with the --limit flag or --no-limit flag. Use tab or ctrl+space to select, enter to confirm.
cat flavors.txt | gum filter --limit 2
cat flavors.txt | gum filter --no-limit
Choose
Choose an option from a list of choices.
echo "Pick a card, any card..."
CARD=$(gum choose --height 15 {{A,K,Q,J},{10..2}}" "{โ ,โฅ,โฃ,โฆ})
echo "Was your card the $CARD?"
You can also select multiple items with the --limit or --no-limit flag, which determines
the maximum of items that can be chosen.
cat songs.txt | gum choose --limit 5
cat foods.txt | gum choose --no-limit --header "Grocery Shopping"
<img src="https://vhs.charm.sh/vhs-3zV1LvofA6Cbn5vBu1NHHl.gif" width="600" alt="Shell running gum choose with numbers and gum flavors" />
Confirm
Confirm whether to perform an action. Exits with code 0 (affirmative) or 1
(negative) depending on selection.
gum confirm && rm file.txt || echo "File not removed"
<img src="https://vhs.charm.sh/vhs-3xRFvbeQ4lqGerbHY7y3q2.gif" width="600" alt="Shell running gum confirm" />
File
Prompt the user to select a file from the file tree.
$EDITOR $(gum file $HOME)
<img src="https://vhs.charm.sh/vhs-2RMRqmnOPneneIgVJJ3mI1.gif" width="600" alt="Shell running gum file" />
Pager
Scroll through a long document with line numbers and a fully customizable viewport.
gum pager < README.md
<img src="https://vhs.charm.sh/vhs-3iMDpgOLmbYr0jrYEGbk7p.gif" width="600" alt="Shell running gum pager" />
Spin
Display a spinner while running a script or command. The spinner will automatically stop after the given command exits.
To view or pipe the command's output, use the --show-output flag.
gum spin --spinner dot --title "Buying Bubble Gum..." -- sleep 5
<img src="https://vhs.charm.sh/vhs-3YFswCmoY4o3Q7MyzWl6sS.gif" width="600" alt="Shell running gum spin while sleeping for 5 seconds" />
Available spinner types include: line, dot, minidot, jump, pulse, points, globe, moon, monkey, meter, hamburger.
Table
Select a row from some tabular data.
gum table < flavors.csv | cut -d ',' -f 1
<!-- <img src="https://stuff.charm.sh/gum/table.gif" width="600" alt="Shell running gum table" /> -->
Style
Pretty print any string with any layout with one command.
gum style \
--foreground 212 --border-foreground 212 --border double \
--align center --width 50 --margin "1 2" --padding "2 4" \
'Bubble Gum (1ยข)' 'So sweet and so fresh!'
<img src="https://github.com/charmbracelet/gum/assets/42545625/67468acf-b3e0-4e78-bd89-360739eb44fa" width="600" alt="Bubble Gum, So sweet and so fresh!" />
Join
Combine text vertically or horizontally. Use this command with gum style to
build layouts and pretty output.
Tip: Always wrap the output of gum style in quotes to preserve newlines
(\n) when using it as an argument in the join command.
I=$(gum style --padding "1 5" --border double --border-foreground 212 "I")
LOVE=$(gum style --padding "1 4" --border double --border-foreground 57 "LOVE")
BUBBLE=$(gum style --padding "1 8" --border double --border-foreground 255 "Bubble")
GUM=$(gum style --padding "1 5" --border double --border-foreground 240 "Gum")
I_LOVE=$(gum join "$I" "$LOVE")
BUBBLE_GUM=$(gum join "$BUBBLE" "$GUM")
gum join --align center --vertical "$I_LOVE" "$BUBBLE_GUM"
<img src="https://github.com/charmbracelet/gum/assets/42545625/68f7a25d-b495-48dd-982a-cee0c8ea5786" width="600" alt="I LOVE Bubble Gum written out in four boxes with double borders around them." />
Format
format processes and formats bodies of
Related Skills
node-connect
335.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
82.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
335.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
82.7kCommit, push, and open a PR
