diff --git a/README.md b/README.md index 3f63e5e..729edd7 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A CLI tool for navigating AWS ECS clusters interactively. -![lazy-ecs demo](images/lazy-ecs-demo.jpg) +![lazy-ecs demo](demo/lazy-ecs-demo.gif) ## Why I Built This diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 0000000..d4bf54e --- /dev/null +++ b/demo/README.md @@ -0,0 +1,40 @@ +# Demo Generation + +Generate animated GIF demos of lazy-ecs using asciinema recordings. + +## Generate GIF + +```bash +# Download and extract Noto Emoji fonts (full font directory needed for emoji support) +curl -L https://github.com/googlefonts/noto-emoji/archive/refs/tags/v2.047.tar.gz -o /tmp/noto-emoji.tar.gz +tar -xzf /tmp/noto-emoji.tar.gz -C /tmp + +# Generate GIF with Docker (mount /tmp which contains the extracted fonts) +docker run --rm -v $PWD:/data -v /tmp:/fonts \ + ghcr.io/asciinema/agg:latest \ + --font-dir /fonts \ + --font-size 13 \ + --theme dracula \ + /data/demo/lazy-ecs-demo.cast /data/demo/lazy-ecs-demo.gif +``` + +## Record New Demo + +```bash +# Install asciinema +brew install asciinema + +# Record session +asciinema rec demo.cast + +# Run lazy-ecs and navigate +# When done, Ctrl+D to stop + +# Preview +asciinema play demo.cast +``` + +## Files + +- `lazy-ecs-demo.cast` - Asciinema recording (anonymized) +- `lazy-ecs-demo.gif` - Generated animated demo diff --git a/demo/lazy-ecs-demo.cast b/demo/lazy-ecs-demo.cast new file mode 100644 index 0000000..9e1739d --- /dev/null +++ b/demo/lazy-ecs-demo.cast @@ -0,0 +1,93 @@ +{"version":3,"term":{"cols":120,"rows":35,"type":"xterm-256color","version":"iTerm2 3.6.2","theme":{"fg":"#c7c7c7","bg":"#000000","palette":"#000000:#b93019:#52c037:#c7c53e:#0c24c0:#ba3ec1:#53c3c6:#c7c7c7:#686868:#f0776d:#8df77a:#fffc7f:#6a71f7:#f17ff9:#8efafe:#ffffff"}},"timestamp":1759852367,"env":{"SHELL":"/bin/zsh"}} +[0.384133, "o", "\u001b[1;36m๐Ÿš€ Welcome to lazy-ecs!\u001b[0m\r\n"] +[0.00011, "o", "\u001b[2mInteractive AWS ECS cluster navigator\u001b[0m\r\n\r\n"] +[0.07731, "o", "\u001b[?25l"] +[0.085545, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ ฆ\u001b[0m"] +[0.085389, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ง\u001b[0m"] +[0.084801, "o", "\r\u001b[2K\u001b[32mโ น\u001b[0m \u001b[36mโ ‡\u001b[0m"] +[0.002736, "o", "\r\u001b[2K\u001b[32mโ น\u001b[0m \u001b[36mโ ‡\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.006031, "o", "\u001b[?12l\u001b[?25h"] +[0.006858, "o", "\u001b[6n"] +[0.00237, "o", "\u001b[?2004h\u001b[?1l\u001b[?25l\u001b[0m\u001b[?7l\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select an ECS cluster: \u001b[0m(Use shortcuts or arrow keys)\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m1) production-web-main-ecs-cluster\u001b[0m\r\r\n\u001b[0m 2) staging-web-main-ecs-cluster\u001b[0m\r\r\n\u001b[0m q) โŒ Exit (q)\u001b[17D\u001b[3A\u001b[54C\u001b[?7h\u001b[0m"] +[0.023964, "o", "\u001b[?7l\u001b[?7h\u001b[0m"] +[2.000957, "o", "\u001b[?7l\u001b[54D\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select an ECS cluster: \u001b[0;38;5;51;1mproduction-web-main-ecs-cluster\u001b[63D\u001b[0m\r\r\n\u001b[J\u001b[?7h\u001b[0m\u001b[?2004l\u001b[?12l\u001b[?25h"] +[0.000852, "o", "\r\n\u001b[32mโœ… Selected cluster: production-web-main-ecs-cluster\u001b[0m\r\n"] +[0.000068, "o", "\u001b[?25l"] +[0.083203, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ ผ\u001b[0m"] +[0.085378, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ด\u001b[0m"] +[0.068973, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ฆ\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.010399, "o", "\u001b[6n"] +[0.002037, "o", "\u001b[?2004h\u001b[?1l\u001b[?25l\u001b[0m\u001b[?7l\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select a service: \u001b[0m(Use shortcuts or arrow keys)\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m1) โœ… production-web-lab-service (1/1)\u001b[0m\r\r\n\u001b[0m 2) โœ… production-web-admin-service (1/1)\u001b[0m\r\r\n\u001b[0m b) โฌ…๏ธ Back to cluster selection (b)\u001b[0m\r\r\n\u001b[0m q) โŒ Exit (q)\u001b[17D\u001b[4A\u001b[49C\u001b[?7h\u001b[0m"] +[0.020947, "o", "\u001b[?7l\u001b[?7h\u001b[0m"] +[2.773708, "o", "\u001b[?7l\u001b[49D\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select a service: \u001b[0;38;5;51;1mโœ… production-web-lab-service (1/1)\u001b[62D\u001b[0m\r\r\n\u001b[J\u001b[?7h\u001b[0m\u001b[?2004l\u001b[?12l\u001b[?25h"] +[0.000878, "o", "\r\n\u001b[32mโœ… Selected service: production-web-lab-service\u001b[0m\r\n"] +[0.000049, "o", "\u001b[?25l"] +[0.085537, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ น\u001b[0m"] +[0.085355, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ธ\u001b[0m"] +[0.073082, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ผ\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.008246, "o", "\u001b[6n"] +[0.002234, "o", "\u001b[?2004h\u001b[?1l\u001b[?25l\u001b[0m\u001b[?7l\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select action for service 'production-web-lab-service': \u001b[0m(Use shortcuts or arrow keys)\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m1) โœ… v2258 production-web-lab (a34d59d7) - main-6b4a93a - 16:51:37\u001b[0m\r\r\n\u001b[0m 2) ๐Ÿ“‹ Show service events\u001b[0m\r\r\n\u001b[0m 3) ๐Ÿ“Š Show metrics\u001b[0m\r\r\n\u001b[0m 4) ๐ŸŒ Open in AWS console\u001b[0m\r\r\n\u001b[0m 5) ๐Ÿš€ Force new deployment\u001b[0m\r\r\n\u001b[0m b) โฌ…๏ธ Back to cluster selection (b)\u001b[0m\r\r\n\u001b[0m q) โŒ Exit (q)\u001b[17D\u001b[7A\u001b[94C\u001b[?7h\u001b[0m"] +[0.023867, "o", "\u001b[?7l\u001b[?7h\u001b[0m"] +[3.563184, "o", "\u001b[?7l\u001b[0m\r\r\n\u001b[0m 1) โœ… v2258 production-web-lab (a34d59d7) - main-6b4a93a - 16:51:37\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m2) ๐Ÿ“‹ Show service events\u001b[2A\u001b[66C\u001b[?7h\u001b[0m"] +[0.555314, "o", "\u001b[?7l\u001b[0m\r\r\n\r\r\n\u001b[0m 2) ๐Ÿ“‹ Show service events\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m3) ๐Ÿ“Š Show metrics\u001b[3A\u001b[73C\u001b[?7h\u001b[0m"] +[0.747826, "o", "\u001b[?7l\u001b[94D\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select action for service 'production-web-lab-service': \u001b[0;38;5;51;1m๐Ÿ“Š Show metrics\u001b[80D\u001b[0m\r\r\n\u001b[J\u001b[?7h\u001b[0m\u001b[?2004l\u001b[?12l\u001b[?25h"] +[0.000612, "o", "\u001b[?25l"] +[0.08557, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ ง\u001b[0m"] +[0.085328, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ‡\u001b[0m"] +[0.053898, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ‡\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.000344, "o", "\r\n\u001b[1;36mMetrics for service \u001b[0m\u001b[1;36m'production-web-lab-service'\u001b[0m\u001b[1;36m \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36mlast hour\u001b[0m\u001b[1;36m)\u001b[0m\u001b[1;36m:\u001b[0m\r\n"] +[0.000174, "o", "CPU: Current: \u001b[1;36m0.4\u001b[0m% | Avg: \u001b[1;36m0.8\u001b[0m% | Peak: \u001b[1;36m11.8\u001b[0m% | Low: \u001b[1;36m0.1\u001b[0m%\r\n"] +[0.000168, "o", "Memory: Current: \u001b[1;36m14.1\u001b[0m% | Avg: \u001b[1;36m14.0\u001b[0m% | Peak: \u001b[1;36m14.1\u001b[0m% | Low: \u001b[1;36m14.0\u001b[0m%\r\n"] +[0.000045, "o", "\u001b[?25l"] +[0.085533, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ \u001b[0m"] +[0.085453, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ™\u001b[0m"] +[0.062036, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ™\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.007999, "o", "\u001b[6n"] +[0.002117, "o", "\u001b[?2004h\u001b[?1l\u001b[?25l\u001b[0m\u001b[?7l\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select action for service 'production-web-lab-service': \u001b[0m(Use shortcuts or arrow keys)\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m1) โœ… v2258 production-web-lab (a34d59d7) - main-6b4a93a - 16:51:37\u001b[0m\r\r\n\u001b[0m 2) ๐Ÿ“‹ Show service events\u001b[0m\r\r\n\u001b[0m 3) ๐Ÿ“Š Show metrics\u001b[0m\r\r\n\u001b[0m 4) ๐ŸŒ Open in AWS console\u001b[0m\r\r\n\u001b[0m 5) ๐Ÿš€ Force new deployment\u001b[0m\r\r\n\u001b[0m b) โฌ…๏ธ Back to cluster selection (b)\u001b[0m\r\r\n\u001b[0m q) โŒ Exit (q)\u001b[17D\u001b[7A\u001b[94C\u001b[?7h\u001b[0m"] +[0.019872, "o", "\u001b[?7l\u001b[?7h\u001b[0m"] +[2.389296, "o", "\u001b[?7l\u001b[94D\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select action for service 'production-web-lab-service': \u001b[0;38;5;51;1mโœ… v2258 production-web-lab (a34d59d7) - main-6b4a93a - 16:51:37\u001b[136D\u001b[0m\r\r\n\u001b[J\u001b[?7h\u001b[0m\u001b[?2004l\u001b[?12l\u001b[?25h"] +[0.000674, "o", "\u001b[?25l"] +[0.085558, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ ธ\u001b[0m"] +[0.085414, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ผ\u001b[0m"] +[0.064913, "o", "\r\u001b[2K\u001b[32mโ ™\u001b[0m \u001b[36mโ ด\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.000231, "o", "\r\n\u001b[1;36mTask Details: production-web-lab\u001b[0m\r\n"] +[0.000186, "o", "\u001b[2m================================================================================\u001b[0m\r\n"] +[0.000222, "o", "\u001b[37mTask ARN: arn:aws:ecs:eu-central-\u001b[0m\u001b[1;92m1:3544\u001b[0m\u001b[37m69016206:task/production-web-main-ecs-cluster/a34d59d7e3a141c6b30f9d1b5882e0c8\u001b[0m\r\n"] +[0.000094, "o", "\u001b[37mTask Definition: production-web-l\u001b[0m\u001b[1;92mab:2258\u001b[0m\r\n"] +[0.000077, "o", "\u001b[37mStatus: RUNNING\u001b[0m\r\n"] +[0.000124, "o", "\u001b[32mVersion: โœ… Desired version\u001b[0m\r\n"] +[0.000147, "o", "\u001b[37mCreated: \u001b[0m\u001b[1;36m2025\u001b[0m\u001b[37m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[37m-\u001b[0m\u001b[1;36m07\u001b[0m\u001b[37m \u001b[0m\u001b[1;92m16:51:37\u001b[0m\u001b[37m UTC\u001b[0m\r\n"] +[0.000128, "o", "\u001b[37mStarted: \u001b[0m\u001b[1;36m2025\u001b[0m\u001b[37m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[37m-\u001b[0m\u001b[1;36m07\u001b[0m\u001b[37m \u001b[0m\u001b[1;92m16:52:49\u001b[0m\u001b[37m UTC\u001b[0m\r\n"] +[0.000129, "o", "\r\n\u001b[1;36mContainers \u001b[0m\u001b[1;36m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;36m)\u001b[0m\u001b[1;36m:\u001b[0m\r\n"] +[0.000523, "o", "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”“\r\nโ”ƒ\u001b[1;35m \u001b[0m\u001b[1;35mName \u001b[0m\u001b[1;35m \u001b[0mโ”ƒ\u001b[1;35m \u001b[0m\u001b[1;35mImage \u001b[0m\u001b[1;35m \u001b[0mโ”ƒ\u001b[1;35m \u001b[0m\u001b[1;35mCPU\u001b[0m\u001b[1;35m \u001b[0mโ”ƒ\u001b[1;35m \u001b[0m\u001b[1;35mMemory\u001b[0m\u001b[1;35m \u001b[0mโ”ƒ\r\nโ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ\r\nโ”‚\u001b[36m \u001b[0m\u001b[36mhedera-lab\u001b[0m\u001b[36m \u001b[0mโ”‚\u001b[33m \u001b[0m\u001b[33m123456789012.dkr.ecr.us-east-1.amazonaws.com/hedera-lab:main-6b4a93a\u001b[0m\u001b[33m \u001b[0mโ”‚\u001b[32m \u001b"] +[0.00001, "o", "[0m\u001b[32m512\u001b[0m\u001b[32m \u001b[0mโ”‚\u001b[34m \u001b[0m\u001b[34m2048 \u001b[0m\u001b[34m \u001b[0mโ”‚\r\nโ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜\r\n"] +[0.000186, "o", "\u001b[2m================================================================================\u001b[0m\r\n"] +[0.008367, "o", "\u001b[6n"] +[0.004882, "o", "\u001b[?2004h\u001b[?1l\u001b[?25l\u001b[0m\u001b[?7l\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select a feature for this task: \u001b[0m(Use shortcuts or arrow keys)\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m1) Show task details\u001b[0m\r\r\n\u001b[0m 2) Show task history and failures\u001b[0m\r\r\n\u001b[0m 3) Compare task definitions\u001b[0m\r\r\n\u001b[0m 4) ๐ŸŒ Open in AWS console\u001b[0m\r\r\n\u001b[0m 5) Show logs (tail) for container 'hedera-lab'\u001b[0m\r\r\n\u001b[0m 6) Show environment variables for 'hedera-lab'\u001b[0m\r\r\n\u001b[0m 7) Show secrets for 'hedera-lab'\u001b[0m\r\r\n\u001b[0m 8) Show port mappings for 'hedera-lab'\u001b[0m\r\r\n\u001b[0m 9) Show volume mounts for 'hedera-lab'\u001b[0m\r\r\n\u001b[0m b) โฌ…๏ธ Back to service selection (b)\u001b[0m\r\r\n\u001b[0m q) โŒ Exit (q)\u001b[17D\u001b[11A\u001b[63C\u001b[?7h\u001b[0m"] +[0.023151, "o", "\u001b[?7l\u001b[?7h\u001b[0m"] +[1.82853, "o", "\u001b[?7l\u001b[0m\r\r\n\u001b[0m 1) Show task details\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m2) Show task history and failures\u001b[2A\u001b[27C\u001b[?7h\u001b[0m"] +[0.361336, "o", "\u001b[?7l\u001b[0m\r\r\n\r\r\n\u001b[0m 2) Show task history and failures\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m3) Compare task definitions\u001b[3A\u001b[33C\u001b[?7h\u001b[0m"] +[1.089755, "o", "\u001b[?7l\u001b[63D\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select a feature for this task: \u001b[0;38;5;51;1mCompare task definitions\u001b[58D\u001b[0m\r\r\n\u001b[J\u001b[?7h\u001b[0m\u001b[?2004l\u001b[?12l\u001b[?25h"] +[0.000751, "o", "\r\n\u001b[1;36mComparing task definition: production-web-l\u001b[0m\u001b[1;92mab:2258\u001b[0m\r\n"] +[0.000114, "o", "\u001b[2m================================================================================\u001b[0m\r\n"] +[0.00011, "o", "\u001b[?25l"] +[0.045075, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ ง\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.008764, "o", "\u001b[6n"] +[0.002499, "o", "\u001b[?2004h\u001b[?1l\u001b[?25l\u001b[0m\u001b[?7l\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select revision to compare with v2258: \u001b[0m(Use shortcuts or arrow keys)\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m1) Revision 2258 (current)\u001b[0m\r\r\n\u001b[0m 2) Revision 2257\u001b[0m\r\r\n\u001b[0m 3) Revision 2256\u001b[0m\r\r\n\u001b[0m 4) Revision 2255\u001b[0m\r\r\n\u001b[0m 5) Revision 2254\u001b[0m\r\r\n\u001b[0m 6) Revision 2253\u001b[0m\r\r\n\u001b[0m 7) Revision 2252\u001b[0m\r\r\n\u001b[0m 8) Revision 2251\u001b[0m\r\r\n\u001b[0m 9) Revision 2250\u001b[0m\r\r\n\u001b[0m 0) Revision 2249\u001b[0m\r\r\n\u001b[0m b) โฌ…๏ธ Back (b)\u001b[0m\r\r\n\u001b[0m q) โŒ Exit (q)\u001b[17D\u001b[12A\u001b[70C\u001b[?7h\u001b[0m"] +[0.018445, "o", "\u001b[?7l\u001b[?7h\u001b[0m"] +[0.860123, "o", "\u001b[?7l\u001b[0m\r\r\n\u001b[0m 1) Revision 2258 (current)\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m2) Revision 2257\u001b[2A\u001b[51C\u001b[?7h\u001b[0m"] +[0.237424, "o", "\u001b[?7l\u001b[0m\r\r\n\r\r\n\u001b[0m 2) Revision 2257\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m3) Revision 2256\u001b[3A\u001b[51C\u001b[?7h\u001b[0m"] +[0.228482, "o", "\u001b[?7l\u001b[0m\r\r\n\r\r\n\r\r\n\u001b[0m 3) Revision 2256\u001b[0m\r\r\n\u001b[0;38;5;51;1m ยป \u001b[0;38;5;51m4) Revision 2255\u001b[4A\u001b[51C\u001b[?7h\u001b[0m"] +[0.322958, "o", "\u001b[?7l\u001b[70D\u001b[0m\u001b[J\u001b[0;38;5;51;1m?\u001b[0;1m Select revision to compare with v2258: \u001b[0;38;5;51;1mRevision 2255\u001b[54D\u001b[0m\r\r\n\u001b[J\u001b[?7h\u001b[0m\u001b[?2004l\u001b[?12l\u001b[?25h"] +[0.000571, "o", "\u001b[?25l"] +[0.085466, "o", "\u001b[32mโ ‹\u001b[0m \u001b[36mโ \u001b[0m"] +[0.024712, "o", "\r\u001b[2K\u001b[32mโ ‹\u001b[0m \u001b[36mโ \u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"] +[0.000224, "o", "\r\n\u001b[1;36m๐Ÿ“Š Comparing: production-web-lab:v2258 โ†’ v2255\u001b[0m\r\n"] +[0.000115, "o", "\u001b[2m================================================================================\u001b[0m\r\n"] +[0.000131, "o", "\u001b[33mFound \u001b[0m\u001b[1;36m1\u001b[0m\u001b[33m changes:\u001b[0m\r\n\r\n"] +[0.000243, "o", "\u001b[1;33m๐Ÿณ Image changed for \u001b[0m\u001b[32m'hedera-lab'\u001b[0m\u001b[1;33m:\u001b[0m\r\n"] +[0.000174, "o", "\u001b[31m - \u001b[0m\u001b[1;36m123456789012.\u001b[0m\u001b[31mdkr.ecr.eu-central-\u001b[0m\u001b[1;36m1.\u001b[0m\u001b[31mamazonaws.com/hedera-lab:main-6b4a93a\u001b[0m\r\n"] +[0.000132, "o", "\u001b[32m + \u001b[0m\u001b[1;36m123456789012.\u001b[0m\u001b[32mdkr.ecr.eu-central-\u001b[0m\u001b[1;36m1.\u001b[0m\u001b[32mamazonaws.com/hedera-lab:main-4316cb3\u001b[0m\r\n"] +[0.00015, "o", "\r\n\u001b[2m================================================================================\u001b[0m\r\n"] +[0.009813, "o", "\u001b[6n"] +[2.0, "o", ""] diff --git a/demo/lazy-ecs-demo.gif b/demo/lazy-ecs-demo.gif new file mode 100644 index 0000000..6af652e Binary files /dev/null and b/demo/lazy-ecs-demo.gif differ