github console-rs/indicatif 0.17.0

latest releases: 0.17.6, 0.17.5, 0.17.4...
16 months ago

indicatif is one of the most popular terminal progress bar libraries in the Rust ecosystem. More than a year after the 0.16.0 release, we're happy to finally release 0.17. In the past year, the indicatif team has grown to two maintainers, since @chris-laplante joined @djc as a maintainer. We also now have a Discord channel.

Apart from many small API additions and fixes, particular effort has gone into reducing the overhead for reporting progress. To this end, we've removed some of the explicit rate limiting APIs in favor of a single refresh rate in the ProgressDrawTarget. We now set a rate limit by default (50ms) that should drastically reduce overhead for most applications while being more than enough for most terminal applications. Additionally, position updates are now synchronized by using atomic integer APIs instead of a mutex. In a basic test the simplest possible progress bar is about 95x faster on 0.17.0 compared to 0.16.2.

We've made many changes to the way MultiProgress collections work. You no longer need to explicitly join() the MultiProgress, there are more ways to insert new progress bars into the collection, and many correctness improvements have been made, in part to more effort having gone into testing the crate.

Additionally, we've reduced our dependency footprint, removing lazy_static and regex from our required dependencies.


  • Add ability to add custom template keys (#301, thanks to @redzic)
  • Allow custom template keys to maintain state (#420, thanks to @1Dragoon)
  • Add HumanCount and template keys to print more humane position/length (#340, thanks to @dabreegster)
  • Remove extra new line after progress bar (#338 with fixes in #343, #350 and #356, thanks to @sigmaSd)
  • Implement ProgressBar::suspend() (#333, thanks to @ishitatsuyuki)
  • Add ProgressIterator::progress_with_style() (#306, thanks to @LeCyberDucky)
  • Pass through stream_position() in ProgressBarIter (#309, thanks to @rlee287)
  • Add AsyncRead/AsyncWrite support for ProgressBar (#308, thanks to @x0f5c3)
  • Add AsyncBufRead implementation for ProgressBarIterator (#315, thanks to @x0f5c3)
  • Add builder methods for ProgressBarIter (#337, thanks to @chubei-oppen)
  • Allow overriding ProgressBar elapsed time (#325, thanks to @zhaofengli)
  • Add a space between numbers and their units (#345, thanks to @firasuke)
  • Add ProgressBar::style() to enable access to the current style (#396, thanks to @andrewchambers)
  • Account for alignment when truncating (#402)


  • Use atomics to track the current position (#390 with follow up in #404, #406, #414)
  • Faster template expansion (without the regex dependency; #319)
  • Draw progress bars into draw states (#361, with follow up in #371)
  • Remove draw limiting from the progress bar state (#380)
  • Simplify ProgressDrawTarget to reduce in-memory size (#277, thanks to @mibac138)

MultiProgress changes

  • Run MultiProgress drawing on the main thread (#231 and #284, thanks to @marienz and @aj-bagwell)
  • Enable inserting progress bars at the end in MultiProgress (#326, thanks to @omjadas)
  • Add insert_after()/insert_before() methods on MultiProgress (#331, with follow up in #424)
  • MultiProgress: add println() and suspend() methods (#351)
  • MultiProgress: prune zombie progress bars (#438, with follow up in #446)
  • Make is_hidden() work for MultiProgress (#430)
  • Allow vertical alignment in MultiProgress bars (#295, thanks to @nlinker)


  • Expand tabs to spaces to fix formatting (#150)
  • Enable 256 color support in template strings (#283, thanks to @MoSal)
  • Fix potential panic for hidden draw targets (#286, thanks to @matthiasbeyer)
  • ProgressFolder shouldn't finish progress bars on completion (#290, thanks to @mibac138)
  • Improve precision of estimates for high progress rates (#293, thanks to @kayru)
  • Reduce precision in per_sec values to make them more readable (#312)
  • Fix time rounding for HumanDuration values (#296, thanks to @Armavica)
  • Make unicode-width dependency actually optional (#281, thanks to @Shnatsel)
  • Fix progress bar width in the presence of ANSI formatting codes (#316, thanks to @redzic)
  • Fix wide element styling to work with improved unicode feature (#357)
  • WeakProgressBar::new() should not take self (#359, thanks to @ishitatsuyuki)
  • Fix panic when calculating padding spaces (#364, thanks to @sigmaSd)
  • Use final values when showing speed after finishing (#381, thanks to @Yatekii)
  • Fix panic in the estimator (#403, thanks to @arxanas)
  • Resolve potential deadlock when ticker is enabled (#417, #437)
  • Fix issue with spinners when the ticker is enabled (#407)
  • Make sure we use the first style for wide elements (#441)

Non-functional improvements

  • Use once_cell instead of lazy_static (#324, thanks to @sigmaSd)
  • Document interaction between wide_bar and wide_msg (#329, thanks to @sigmaSd)
  • Use doc(cfg) to improve documentation (#399)
  • Add categories in Cargo metadata (#330, thanks to @jqnatividad)
  • Introduce in-memory testing interface (#354, with follow up in #378 and #379)
  • Simplify how drawing is planned internally (#374, #382, #383, #384, #385, #386)
  • Add sleep in iterator example to see progress bars (#314, thanks to @bidoubiwa)
  • Don't conflate ticking with updating estimates (#434)
  • Store length as an Option (#415)

Don't miss a new indicatif release

NewReleases is sending notifications on new releases.