diff --git a/README.md b/README.md
index b7b9808..0eb6213 100644
--- a/README.md
+++ b/README.md
@@ -159,7 +159,25 @@ PS C:\Users\Diego\Devel\myapp> "{0:N2} MB" -f ((Get-Item myapp.exe).Length / 1MB
_In progress_
## How it works
-_In progress_
+Warp is a multi-platform tool written in Rust and is comprised of two programs: `warp-runner` and `warp-packer`.
+
+The final self-contained single binary application consists of two parts: 1) runner and 2) the compressed target application executable and dependencies.
+
+
+
+`warp-runner` is a stub application that knows how to find the compressed payload within its own binary, perform exraction to a local cache and execute the target application.
+
+The extraction process only happens the first time the application is ran, or when the self-contained application binary is updated.
+
+`warp-packer` is a CLI application that's used to create the self-contained application binary by downloading the correct `warp-runner` for the chosen platform, compressing the target application and generating the final application.
+
+### Performance
+The performance characteristics of the generated self-contained application is roughly the same of original application, except for the first time it's ran as the target application and its dependencies have to be decompressed to a local cache.
+
+### Cache location
+- Linux: `$HOME/.local/share/warp`
+- macOS: `$HOME/Library/Application Support/warp`
+- Windows: `%LOCALAPPDATA%\warp`
## Authors
- Diego Giagio ``