tgdash: A Real-Time Terminal Dashboard for Terragrunt

If you’ve ever run terragrunt run --all plan on a large repo, you know the feeling.
Dozens of units running in parallel. Each one prefixing its output with [path/to/unit]. All of it interleaved into one endless stream. You’re scrolling, squinting, trying to figure out which units failed, what changed, and how far along the run is.
It’s chaos. And it’s the default experience.
The Problem
Terragrunt’s parallel execution is powerful. Running plan or apply across your entire infrastructure at once saves real time. But the output model assumes you’ll pipe it to a log file and search through it later. When you’re watching it live, you get something like this:
[vpc/prod] Initializing the backend...
[iam/shared] Initializing the backend...
[rds/staging] Initializing provider plugins...
[ecs/prod] Initializing the backend...
[s3/logs] Initializing the backend...
[cloudfront/prod] Initializing the backend...
[vpc/prod] Initializing provider plugins...
[rds/staging] - Finding hashicorp/aws versions matching "~> 5.0"...
[iam/shared] Initializing provider plugins...
[lambda/api-prod] Initializing the backend...
[ecs/prod] Initializing provider plugins...
[rds/staging] Plan: 2 to add, 0 to change, 0 to destroy
[vpc/prod] - Finding hashicorp/aws versions matching "~> 5.0"...
[s3/logs] Initializing provider plugins...
[cloudfront/prod] Initializing provider plugins...
[ecs/prod] Error: Invalid reference
[ecs/prod]
[ecs/prod] on main.tf line 42, in resource "aws_ecs_service" "app":
[ecs/prod] 42: container_name = var.container_nam
[ecs/prod]
[vpc/staging] Initializing the backend...
[lambda/api-prod] Initializing provider plugins...
[iam/shared] Plan: 0 to add, 1 to change, 0 to destroy
[vpc/prod] Plan: 0 to add, 1 to change, 0 to destroy
[rds/prod] Initializing the backend...
[s3/logs] No changes. Infrastructure is up-to-date.
[cloudfront/prod] - Finding hashicorp/aws versions matching "~> 5.0"...
[route53/prod] Initializing the backend...
[elasticache/prod] Initializing the backend...
[vpc/staging] Initializing provider plugins...
[rds/prod] Initializing provider plugins...
[ecs/staging] No changes. Infrastructure is up-to-date.
[lambda/api-prod] Plan: 1 to add, 0 to change, 0 to destroy
[cloudfront/prod] Plan: 0 to add, 2 to change, 0 to destroy
[route53/prod] Initializing provider plugins...
[elasticache/prod] Initializing provider plugins...
[rds/prod] Plan: 0 to add, 0 to change, 1 to destroy
[sqs/notifications] Initializing the backend...
[vpc/staging] Plan: 0 to add, 1 to change, 0 to destroy
[elasticache/prod] Error: creating ElastiCache Replication Group
[elasticache/prod]
[elasticache/prod] with aws_elasticache_replication_group.main,
[elasticache/prod] on main.tf line 18:
[elasticache/prod] 18: resource "aws_elasticache_replication_group"
[elasticache/prod]
[route53/prod] Plan: 3 to add, 0 to change, 0 to destroy
That’s a real-looking Terragrunt run with ~15 units. Two errors are buried somewhere in there. Can you spot both without re-reading? Now imagine fifty units and a few hundred more lines. Good luck.
tgdash
tgdash is a terminal dashboard that takes this mess and turns it into something pleasant to use.
Run it with one command:
tgdash -- terragrunt run --all plan
That’s it. tgdash spawns the command, captures the output, and renders a real-time dashboard in your terminal.
What You Get
Per-unit status tracking. Every unit gets its own row. You can see at a glance which units are waiting, running, done, errored, or skipped. No more scrolling through interleaved output to figure out what’s happening.
Plan summaries at a glance. For each unit, tgdash extracts the plan summary - resources to add, change, and destroy - and displays it in dedicated columns. Instead of hunting for “Plan: 3 to add” somewhere in a wall of text, you see +3 ~0 -0 right in the table.
Error detection and filtering. When a unit fails, tgdash catches it and marks the unit red. Press e to filter the view to only failed units. On a run with 50 units where 2 failed, you go from scrolling through 50 entries to seeing exactly the 2 that need attention.
Time estimates. tgdash remembers how long each unit took in previous runs. When a unit starts, you see something like 8s / ~15s est. - the elapsed time and the estimated total based on history. You know whether to grab coffee or keep watching.
Scrollable output per unit. Select a unit and see its full output in the lower half of the screen. Scroll through it with PgUp/PgDn. The output is isolated - no other unit’s noise mixed in.
Two views. Dashboard view shows a table in the upper half with the selected unit’s output below. List view shows a collapsible list where you can expand individual units inline. Switch between them with Tab.
Vim-style navigation. j/k to move between units. gg and G to jump to top and bottom. / to search. Enter to expand or collapse. If you use vim, you already know how to use tgdash.
Works With Any Terragrunt Command
tgdash isn’t limited to plan. Anything that produces Terragrunt’s unit-prefixed output works:
# Plan
tgdash -- terragrunt run --all plan
# Apply
tgdash -- terragrunt run --all apply
# Validate
tgdash -- terragrunt run --all validate
You can also pipe output directly if you prefer:
terragrunt run --all plan 2>&1 | tgdash
Both Terragrunt’s classic format ([unit/path]) and the newer v0.97+ timestamp format are supported. OpenTofu works too.
Install
From source:
go install github.com/garbas/tgdash@latest
With Nix:
nix run github:garbas/tgdash
Or download a binary from the releases page - Linux and macOS, both amd64 and arm64.
See It in Action
Here’s a full demo of tgdash running a Terragrunt plan:

Try It
If you run Terragrunt across more than a handful of units, give tgdash a try. It turns the worst part of Terragrunt’s parallel execution - the unreadable output - into something you can actually navigate.
The project is MIT licensed and on GitHub. Issues and contributions welcome.
I’ve been managing infrastructure with Terraform and Terragrunt for years. tgdash scratches an itch I’ve had every time I run a large plan. Let’s connect if you’re working with Terragrunt too.