Spinners - 🛎 60+ Elegant terminal spinners for Rust
May 2, 2026 · View on GitHub

Sponsors
|
France-Nuage Sovereign French cloud for the CLIs you ship. Re-internalisable infra. |
![]() Hook0 Add webhook delivery to your CLI's backend. Self-hosted, retries done. |
Natalia Spinning while users wait? Natalia answers their calls 24/7 meanwhile. |
Netir Hire vetted French freelance CLI authors or join the marketplace. |
|
NoBullshitConseil Tech advisory without the bullshit. Straight talk for founders. |
Qualneo Qualiopi LMS for French trainers — friendly nod from a CLI builder. |
![]() Recapro Sovereign AI for meeting notes. Less spinner, more shipped reports. |
Interested in sponsoring? Get in touch
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

