indicatif
Terminal progress bar and spinner library for Rust CLI applications. Provides progress bars, spinners, and multi-progress displays with rich customization. Supports templates with dynamic content (ETA, rate, bytes), styled output, and concurrent multi-bar updates. Powers CLI tools like ripgrep's progress display.
Score Breakdown
⚙ Agent Friendliness
🔒 Security
Terminal UI library — no network access, no security concerns.
⚡ Reliability
Best When
Building Rust CLI tools that process files, download data, or run multi-step operations and need progress feedback.
Avoid When
Output will be piped or in CI — check tty and disable progress bars in non-interactive mode.
Use Cases
- • Show download progress in Rust CLI tools with bytes transferred, rate, and ETA display
- • Display multi-step build or processing progress with concurrent multi-bar for parallel operations
- • Indicate indeterminate operations with spinners while waiting for network calls or computations
- • Create rich progress templates showing custom fields (item names, percentages, rates)
- • Log messages above active progress bars without disrupting the progress display using println!
Not For
- • Web or GUI applications — indicatif is terminal-only
- • Non-interactive output (CI logs) — disable with ProgressBar::set_draw_target(ProgressDrawTarget::hidden())
- • Python or Node.js projects — use tqdm (Python) or cli-progress (Node) for equivalent functionality
Interface
Authentication
Library — no auth needed.
Pricing
MIT licensed open source library.
Agent Metadata
Known Gotchas
- ⚠ ProgressBar must be finished (.finish(), .finish_with_message(), or .abandon()) — unfinshed bars may leave terminal in broken state on exit
- ⚠ Using println! or eprintln! while a progress bar is active corrupts terminal output — use bar.println() or MultiProgress::println() instead
- ⚠ Progress bars are terminal-specific — check ProgressBar::is_hidden() in CI environments; use set_draw_target(hidden()) for non-tty output
- ⚠ MultiProgress requires holding the MultiProgress handle alive — dropping it before all bars finish causes rendering issues
- ⚠ Progress bar templates have a specific syntax for custom fields: {spinner} {bar:40.cyan/blue} {pos}/{len} {msg} — incorrect template tokens cause panics in debug mode
- ⚠ Concurrent updates require spawning bars before using them in threads — MultiProgress::add() must be called before sharing the ProgressBar across threads
Alternatives
Full Evaluation Report
Detailed scoring breakdown, competitive positioning, security analysis, and improvement recommendations for indicatif.
Scores are editorial opinions as of 2026-03-06.