Spinners - π 60+ Elegant terminal spinners for Rust
β€οΈ Shameless plug
- Open-Source Webhook as a Service
- Charts, simple as a URL. 1 url = 1 chart - Charts API
- Keycloak Identity and Access Management (IAM) as a Service
- Recapro.ai - AI meeting recorder, offline-first, 100% private, no data sent to third parties
- Natalia - AI-powered phone assistant, auto-answers, qualifies & routes calls 24/7
- Bunker - Sovereign cloud hosting, deploy on EU infrastructure, 60% cheaper than AWS
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 cyclecargo run --example simpleFeature 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

