diff --git a/README.md b/README.md
index 67a6204..da7c4ea 100644
--- a/README.md
+++ b/README.md
@@ -5,3 +5,123 @@
+
+## Progress bar
+
+To introduce a progress bar in your application, include `indica/progress_bar.hpp` and create a `ProgressBar` object.
+
+```cpp
+#include
+
+int main() {
+ indica::ProgressBar bar;
+ return 0;
+}
+```
+
+Here's the general structure of a progress bar:
+
+```
+
+ ^^^^^^^^^^^^^^^^^^ Bar Width ^^^^^^^^^^^^^^^^^^ ^^^^^ Show/Hide ^^^^^
+```
+
+Each of these elements can be configured using the ProgressBar API:
+
+```cpp
+#include
+
+int main() {
+ indica::ProgressBar bar;
+
+ // Configure the bar
+ bar.set_bar_width(50);
+ bar.start_bar_with("[");
+ bar.fill_bar_progress_with("=");
+ bar.lead_bar_progress_with(">");
+ bar.fill_bar_remainder_with(" ");
+ bar.end_bar_with("]");
+ bar.set_postfix_text("Getting started");
+ bar.set_foreground_color(indica::Color::GREEN);
+
+ return 0;
+}
+```
+
+Now that the bar is configured, let's update the state of the bar. The amount of progress in ProgressBar is maintained as a float in range `[0, 100]`. When progress reaches 100, the progression is complete.
+
+From application-level code, there are two ways in which you can update this progress:
+
+### Update progress using `tick()`
+
+You can update the progress bar using `bar.tick()` which increments progress by exactly `1%`.
+
+```cpp
+#include
+#include
+#include
+
+int main() {
+ indica::ProgressBar bar;
+
+ // Configure the bar
+ bar.set_bar_width(50);
+ bar.start_bar_with("[");
+ bar.fill_bar_progress_with("=");
+ bar.lead_bar_progress_with(">");
+ bar.fill_bar_remainder_with(" ");
+ bar.end_bar_with("]");
+ bar.set_postfix_text("Getting started");
+ bar.set_foreground_color(indica::Color::GREEN);
+
+ // Update bar state
+ while (true) {
+ bar.tick();
+ if (bar.is_completed())
+ break;
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ }
+
+ return 0;
+}
+```
+
+The above code will print a progress bar that goes from 0 to 100% at the rate of 1% every 100 ms.
+
+### Updating progress using `bar.set_progress(value)`
+
+If you'd rather control progress of the bar in discrete steps, consider using `bar.set_progress(value)`. Example:
+
+```cpp
+#include
+#include
+#include
+
+int main() {
+ indica::ProgressBar bar;
+
+ // Configure the bar
+ bar.set_bar_width(50);
+ bar.start_bar_with("[");
+ bar.fill_bar_progress_with("=");
+ bar.lead_bar_progress_with(">");
+ bar.fill_bar_remainder_with(" ");
+ bar.end_bar_with("]");
+ bar.set_postfix_text("Getting started");
+ bar.set_foreground_color(indica::Color::GREEN);
+
+ // Update bar state
+ size_t i = 0;
+ while (i < 101) {
+ bar.set_progress(i);
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ i += 10;
+ }
+
+ return 0;
+}
+```
+
+The above code will print a progress bar that goes from 0 to 100% at the rate of 10% every 100 ms.
+
+For more examples, checkout the examples in the `samples/` directory.