steppe
A simple Rust library to track and display the progress of multi-step tasks.
Repository Health
Technical Analysis
Steppe is a lightweight Rust crate for tracking the progress of a task as it moves through multiple steps, each composed of multiple states. It aims for a very simple API to describe steps and update progress, an easy way to display progress live on a TTY or return it from an API, and per-step accumulated timing so you can spot bottlenecks.
The core DefaultProgress struct is thread-safe and cheap to clone, so one thread can update progress while another renders it. Helper macros generate the boilerplate Step implementations, and a Progress trait lets libraries accept a caller-supplied progress implementation.
What You Get
- A simple API to declare task steps and update progress as work proceeds
- A thread-safe, cheaply-clonable progress handle you can update and display concurrently
- Accumulated per-step durations to identify bottlenecks, plus helper macros for boilerplate
Common Use Cases
- Reporting live progress of a long-running batch or indexing job
- Exposing task progress through an API response
- Measuring where time is spent across the steps of a pipeline
Under The Hood
Architecture
Steppe represents progress as a stack of steps; each Step reports a current and total state count, and pushing a new step of a given type truncates deeper steps. DefaultProgress wraps a shared, mutex-guarded stack that can be read as a progress view or serialized, while atomic sub-steps update counters without locking. Accumulated durations are recorded as steps complete.
Tech Stack
Rust (edition 2024) with a small dependency set: convert_case and indexmap at the core, plus optional jiff (time), serde/serde_json, colored_json for TTY rendering, and utoipa for OpenAPI schemas, all gated behind Cargo features.
Code Quality
Small and focused (~21 commits, single primary author) with insta snapshot tests under tests/. As an early-stage crate it has limited community adoption but a clear, contained scope.
API Design
The Progress/Step trait split lets libraries accept any progress backend, and the enum/atomic macros remove most boilerplate, giving an ergonomic API for a deliberately narrow problem.