
alive-progress
Have you ever wondered where your lengthy processing was at, and when would it finish? Do you usually hit RETURN several times to make sure it didn't crash, or the SSH connection didn't freeze? Have you ever thought it'd be awesome to be able to pause some processing without hassle, return to the Python prompt to manually fix some items, then seamlessly resume it? I did...
I've started this new progress bar thinking about all that, behold the alive-progress! 😃

Introducing the newest concept in progress bars for Python! alive-progress is in a class of its own, with an array of cool features that set it apart. Here are a few highlights:
- A mesmerizing live spinner that reacts to your actual processing speed, i.e., it dynamically gets faster or slower with your throughput, and clearly shows a lengthy task is in progress, i.e., did not crash even if taking too long (and your SSH connection did not freeze if remote).
- An efficient multithreaded bar that updates itself at a fraction of the actual processing speed to keep CPU usage low and avoid terminal spamming (1,000,000 iterations per second equates to roughly 60 updates per second), and you can also calibrate it to your liking.
- An accurate ETA (Expected Time of Arrival) with an intelligent Exponential Smoothing Algorithm that shows the time to completion, allowing you to plan your time and manage your workload more effectively.
- Automatic print and logging hooks that provide seamless and efortless integration with any code, even enriching these outputs with the current bar position when they occurred.
- It prints a nice final receipt when your processing ends, including the total items, the elapsed time, and the observed throughput.
- It detects under and overflows, enabling you to track hits, misses, or any desired counts, not necessarily the actually performed iterations.
- You can suspend it! That's right, you heard it here first! No other progress bar anywhere in any language has this feature! You can suspend your processing and get back to the Python prompt, adjust or fix some items, and then get back into the same processing as if it had never stopped!
- It is highly customizable, with a smorgasbord of ready-to-use spinner and bar styles, as well as several factories to easily create yours! There's even a super powerful
check()tool that helps you design your own animations! You can see how the generated frames and animation cycles will look like, exploded on your screen, and even see it alive before installing inalive-progress! It's the coolest tool in the world! Unleash your creativity!
Table of contents
This README is always evolving, so do take a more comprehensive look from time to time... You might find great new details in other sections! 😊
- alive-progress
📌 What's new in 3.3 series
The latest alive-progress release is finally here, and it brings some exciting improvements! 🎉
Here's a summary of the most notable changes:
- Now the final receipt is available in the alive_bar handle, even after the bar has finished!
- This allows you to access the final receipt data and use it in your code, such as logging or displaying it in a custom way.
- You can change the bar title and text even after it has finished, so you can update the final receipt with new information or context.
- Included the elapsed time in the alive_bar handle, with full precision, so you can access the exact time it took to complete your processing.
Technical changes:
- Changed the
graphemedependency which was no longer maintained tographemeu, which is a maintained fork of the original one. - Added
py.typedin the distribution to satisfy mypy and other type checking tools. - Included Python 3.14 support (in CI for now).
Previous releases
New in 3.2 series
After about a year of reassuring stability, the new alive-progress has finally landed!
The main features and improvements are:
- The print/logging hooks now support multithreading => a highly requested feature: everything is synchronized now so you can print from different threads without issues! No more queues to send messages to the main thread!
- Rounded ETAs for long tasks => now the ETA automatically decreases its precision the higher it gets, making it smoother and easier to read!
- Support for zero and even negative bar increments => now on par with the manual mode, you can call
bar()with0and even-Nto make it go backwards! Useful when you couldn't make any progress in an iteration or had to roll back something!
And more!
- Custom offset for the enriched print/logging messages => now you can specify a custom
enrich_offsetto use for printed or logged messages, allowing you to start withon 1:or continue where you left from previous computations! - Improved compatibility with PyInstaller => now custom bars, unknown bars, and spinners work when bundled!
- Improved compatibility with Celery => it will just work within Celery tasks!
- drop python 3.7 and 3.8, hello 3.12 and 3.13!
New in 3.1 series
A very cool update here! In addition to polishing things up and improving terminal support, now alive-progress supports resuming computations!
When processing huge datasets or things that take a long time, you might either use batches or cache partial results. Then, in case it stops and is restarted, you end up skipping all those already done items very quickly, which makes the alive_bar think you're processing thousands of items per second, which in turn completely ruins the ETA... But not anymore! Just tell bar() that you've skipped items... 👏
You can use it in two ways:
1. If you do know where you've stopped:

