charmbracelet/gum
64.2
Adequate · 6 August 2026
5k
lines of production code
Go
primary language
4
measurements over time
What this system is
Gum is a command-line interface toolkit designed to enhance shell scripts with interactive terminal components. It provides a suite of utilities for gathering user input, formatting text, and managing terminal output, including features for selection, filtering, and styling. The system supports a wide range of interactive elements such as spinners, pagers, and tables, enabling developers to build more dynamic and user-friendly CLI applications.
How it got here
2022 — Gum CLI expansion and rebranding
21 changes.
The project was rebranded from 'Soda Pop' to 'Gum' and significantly expanded its command set to include interactive UI components like file pickers, text editors, and table renderers. This period focused on building a comprehensive suite of shell scripting tools using the Bubbletea framework, supported by updated dependencies and internal infrastructure for input handling and shell completion.
2023–2024 — CLI feature expansion and tooling
4 changes.
This period focused on expanding the command-line interface with new subcommands for logging, version checking, and cursor configuration. It also introduced internal utilities for handling terminal output and structured logging, enhancing both user-facing features and developer tooling.
Features
Add \`gum input\` command for text input
Users can now use the \gum input\ command to prompt for text input, with support for initial values, password masking, header text, placeholder text, cursor mode, and configurable width. The command reads from stdin if no value is provided, and outputs the entered text to stdout.
input · high confidence
Add \`gum join\` command for horizontal and vertical text joining
A new \gum join\ command has been added, allowing users to join multi-line text strings horizontally or vertically using the lipgloss library. The command supports alignment options (left, center, right, bottom, middle, top) and provides a shell script interface for building different text layouts.
join · high confidence
Add \`gum style\` command for text styling
Users can now use the new \gum style\ command to apply formatting such as bold, italic, underline, and color to text. The command accepts text via arguments or stdin, supports trimming whitespace, and allows configuration of background/foreground colors, borders, alignment, and spacing through a comprehensive set of flags.
style · high confidence
Add alignment mapping for lipgloss positions
The internal/decode package now includes a new align.go file that maps string identifiers (center, left, top, bottom, right) to corresponding lipgloss.Position values, enabling the decode functionality to translate position strings into lipgloss alignment options.
internal/decode · high confidence
Add comprehensive examples and test suites for all gum commands
The \examples/\ directory is populated with a wide range of shell scripts and configuration files demonstrating \gum\ usage, including interactive workflows for git commits, branch management, and system fetching, alongside \.tape\ files that serve as automated test suites for commands like \choose\, \confirm\, \filter\, \input\, \write\, and \pager\.
examples · high confidence
Add files package to list all files in the current directory
A new \files\ package has been introduced in \internal/files/files.go\ to provide a \List\ function that returns all files in the current directory. The implementation explicitly ignores the \.git\ directory and, by default, also excludes \node\_modules\ and the current directory \.\ from the results.
internal/files · high confidence
Add gum table command for interactive CSV rendering
A new 'table' command has been added to Gum, allowing users to render tabular CSV data in the terminal. The command supports interactive row selection with customizable styles, borders, and padding, and can output the selected row or a specific column as CSV. It also offers a static 'print' mode for non-interactive use cases.
table · high confidence
Add man page generation capability
A new 'man' sub-command has been added to the tool, allowing users to generate manual pages for the application. This feature includes a corrected binary description ('A tool for glamorous shell scripts') and an updated copyright notice covering the years 2022–2024.
man · high confidence
Add shell autocompletion for Bash, Zsh, and Fish
Users can now generate shell completion scripts for Bash, Zsh, and Fish, enabling command-line auto-completion for the application's commands and flags in those shells.
completion · high confidence
Add stdin input handling with configurable ANSI stripping
A new internal package for processing stdin input has been introduced, providing a flexible way to read from standard input. Users can now optionally strip ANSI escape sequences from the input via a new \StripANSI\ option, or read a single line using the \SingleLine\ option. The package also includes a helper to detect if stdin is empty.
internal/stdin · high confidence
Add the 'gum log' command for structured and formatted logging
A new 'log' command has been introduced, allowing users to output structured or formatted log messages to the console or a file. The command supports multiple log levels (debug, info, warn, error, fatal), various output formatters (text, JSON, logfmt), and extensive styling options for timestamps, prefixes, and message components. Users can also configure the minimum log level via the GUM\_LOG\_LEVEL environment variable.
log · high confidence
Add version command to check semantic version constraints
A new 'version' command has been added to the application, allowing users to verify if the current software version satisfies a specified semantic version constraint. This feature enables users to validate version compatibility directly from the command line.
version · high confidence
Added tty-aware printing utility
A new tty package was added to internal/tty, providing a Println function that automatically strips ANSI escape sequences when outputting to non-TTY destinations, ensuring clean output in pipelines and logs.
internal/tty · high confidence
Introduce \`gum choose\` command for selecting options
A new \gum choose\ command has been added, allowing users to select one or multiple options from a list. The command supports multi-select with a configurable limit, maintains the order of selected items, and handles input from both arguments and stdin. It includes features like pre-selecting options, using label delimiters for key/value pairs, and navigating the list with various keybindings.
choose · high confidence
Introduce \`gum confirm\` command for interactive confirmation prompts
Adds a new \gum confirm\ command that presents an interactive Yes/No prompt, allowing users to confirm or deny an action via keyboard shortcuts (y/n, arrow keys, etc.). The command supports customizing the affirmative and negative labels, setting a default selection, displaying the chosen output, and handling timeouts or interrupts. This provides a programmatic way to gather boolean user input in shell scripts.
confirm · high confidence
Introduce \`gum format\` command for text formatting
Users can now use the new \gum format\ command to render text into human-readable output across four distinct formats: Markdown, Code, Template, and Emoji. Each format supports input via command-line arguments or standard input. Markdown rendering leverages the Glamour library, allowing for theme customization via the \--theme\ flag or \GUM\_FORMAT\_THEME\ environment variable. Code formatting provides syntax highlighting using Glamour and Chroma, with the ability to specify the programming language via the \--language\ flag or \GUM\_FORMAT\_LANGUAGE\ environment variable. The Template format utilizes Termenv for styling, while the Emoji format parses and renders emoji codes. The command also includes an \--no-strip-ansi\ option to preserve ANSI sequences when reading from stdin.
format · high confidence
Introduce exit and timeout handling packages
Users can now rely on explicit exit codes for timed-out commands (124) and aborted commands (130), accessed via the new internal/exit package. Additionally, the internal/timeout package provides a helper to create contexts that automatically expire after a specified duration, simplifying timeout management across the application.
internal/exit · medium confidence
Introduce the \`gum file\` command for interactive file selection
Users can now use \gum file\ to interactively select a file or directory from the filesystem. The command supports navigating directories, selecting files or directories, and customizing the appearance of the file picker (cursor, symlink, directory, file, and selected item styles). It also allows showing file permissions and sizes, displaying a header, and setting a timeout for the selection.
file · high confidence
Introduce the \`gum pager\` command for terminal scrolling and search
A new \pager\ command has been added to Gum, providing a terminal-based document viewer with scrolling, soft-wrapping, and regex-based search functionality. Users can pipe text into \gum pager\ to view content with line numbers, navigate using standard keys (q/esc to quit, / to search, n/N for matches), and customize styling for matches and line numbers. The command supports a timeout option to automatically exit after a specified duration.
pager · high confidence
Introduce the \`gum spin\` command for background task indicators
Adds a new \spin\ command that wraps a shell command in a spinner animation. Users can now run a command in the background while seeing a spinner and optional title. The command supports showing live stdout/stderr output, handling timeouts, and preserving color output. It also allows configuring the spinner type, title, alignment, and padding, and respects environment variables for configuration.
spin · high confidence
Introduce the \`gum write\` command for multi-line text input
A new \write\ command has been added, providing a shell-scriptable interface to the \textarea\ component. Users can now capture multi-line text input, with support for configuring width, height, character limits, and styling. The command reads from stdin, supports an initial value, and allows customization of the header, placeholder, and various style elements like cursor mode and line numbers.
write · high confidence
Introduce the new 'gum filter' command
The 'gum filter' command is now available, providing a text input interface for filtering through a list of options. It supports fuzzy and exact matching, multi-select with a configurable limit, and allows pre-selecting or pre-populating the input. The command reads options from arguments, stdin, or the current directory, and outputs selected items separated by a configurable delimiter.
filter · high confidence
Behavioural changes
Cursor mode configuration
The application now supports configuring the cursor's visual behavior through the \--cursor.mode\ flag, which accepts \hide\, \blink\, or \static\ values. This is implemented via a new \cursor\ package that maps these string options to the underlying library's cursor modes.
cursor · high confidence
Rebrand from 'Soda Pop' to 'Gum' and expand command set
The tool has been rebranded from 'Soda Pop' to 'Gum', with the binary and package name changed accordingly. The application now includes a significantly expanded set of commands including choose, confirm, file, filter, format, input, join, log, man, pager, spin, style, table, and write, replacing the previous limited set of input, search, spin, and style commands. The main entry point has been refactored to use the Kong CLI framework for command registration and argument parsing, and the codebase now includes configuration files for Go linting, GoReleaser, Docker, and Nix packaging.
(repo-wide) · high confidence
Dependencies
Updated project dependencies and Go version
The project's Go module file (go.mod) has been updated to use Go version 1.25.8 and includes significant version bumps for core dependencies such as alecthomas/kong (up to v1.15.0), charmbracelet/bubbletea (up to v1.3.10), and charmbracelet/bubbles (up to v1.0.0). The module path was also changed from github.com/charmbracelet/sodapop to github.com/charmbracelet/gum, and several indirect dependencies were updated or replaced.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 65 → 64 (-0.3)
- Rubric changed (rubric-2026.08.18 → rubric-2026.08.19) — scores are not directly comparable.
Lenses
- Code Health 82 → 82 (+0.0)
- Architecture 100 → 94 (-5.8)
- Maturity 55 → 55 (+0.0)
- Readiness 66 → 66 (+0.0)
- Security 74 → 74 (-0.2)
New (3)
- Change coupling: confirm.go ↔ options.go (confirm/confirm.go)
- Change coupling: options.go ↔ spin.go (spin/options.go)
- Medium IaC: CKV_DOCKER_7 (Dockerfile)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
charmbracelet/gum was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 6 August 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 716d8b5d0221558f944b5a078dbbcca8572534fb — the exact code this score is about.
- Scored under rubric-2026.08.19 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer latest.