11 stable releases (4 major)

4.2.0 Mar 4, 2026
4.1.1 Nov 21, 2023
4.1.0 Jun 17, 2022
3.1.0 Mar 11, 2022
0.0.2 Dec 18, 2017

#72 in Command-line interface

Download history 20437/week @ 2025-12-28 44530/week @ 2026-01-04 42211/week @ 2026-01-11 49276/week @ 2026-01-18 42369/week @ 2026-01-25 54032/week @ 2026-02-01 42683/week @ 2026-02-08 41302/week @ 2026-02-15 46712/week @ 2026-02-22 56423/week @ 2026-03-01 58063/week @ 2026-03-08 54110/week @ 2026-03-15 55100/week @ 2026-03-22 66669/week @ 2026-03-29 71882/week @ 2026-04-05 64391/week @ 2026-04-12

260,917 downloads per month
Used in 161 crates (127 directly)

MIT license

50KB
1.5K SLoC

Spinners - 🛎 60+ Elegant terminal spinners for Rust

Cargo version Crates.io docs.rs Crates.io Slack

❤️ Shameless plug

200083093-cf48fcab-d95c-4a59-ac66-6e167dd33e7e

Install

See Cargo page

Usage

use spinners::{Spinner, Spinners};
use std::thread::sleep;
use std::time::Duration;

fn main() {
    let mut sp = Spinner::new(Spinners::Dots9, "Waiting for 3 seconds".into());
    sleep(Duration::from_secs(3));
    sp.stop();
}

Example

cargo run --example cycle
cargo run --example simple

Feature flags

osc-progress

Enables native terminal progress bar support via the ConEmu OSC 9;4 protocol. Terminals like Ghostty, Windows Terminal, iTerm2, Kitty, and WezTerm render these as GUI progress bars in the title/tab bar. Unsupported terminals silently ignore the sequences.

[dependencies]
spinners = { version = "4.1.0", features = ["osc-progress"] }

The progress bar is emitted as an indeterminate/pulsing indicator while the spinner is active, and cleared when the spinner is stopped or dropped. Sequences are only emitted when the output stream is a terminal, so piped output is unaffected.

Signal handling caveat: If the process is killed abruptly (e.g. SIGINT via Ctrl+C, SIGKILL), the Drop implementation may not run and the progress bar won't be cleared. Terminals like Ghostty mitigate this with a ~15-second auto-clear timeout, but for immediate cleanup, applications should install their own signal handler that stops the spinner (e.g. by dropping it or calling .stop()) before exiting.

License

MIT © François-Guillaume Ribreau, James Cordor

Dependencies

~1.5MB
~41K SLoC