Introducing Streaming UI: Real-Time Progress for Terraform Commands
Say goodbye to overwhelming Terraform output. The new streaming UI mode transforms verbose terraform output into a clean, Docker-build-style progress display with interactive confirmations, resource dependency tree visualization, and attribute-level change details.
What Changed
We've added an optional streaming UI mode for Terraform commands (plan, apply, deploy, init, destroy) that displays real-time resource status with visual indicators, progress tracking, interactive confirmations, and condensed completion summaries.
Real-Time Progress Display
During execution:
⠋ apply plat-ue2-dev/vpc Creating aws_security_group.default (5.2s) ████████░░░░ 2/5
✓ Created aws_vpc.main (2.1s)
✓ Created aws_subnet.public[0] (1.3s)
The inline progress bar shows the current activity, elapsed time, and completion status on a single line.
On completion:
✓ Apply plat-ue2-dev/vpc completed (15.2s)
On error:
✗ Apply plat-ue2-dev/vpc failed: 1 error (12.1s)
Error: aws_instance.web[0]: InvalidAMIID.NotFound
Dependency Tree with Attribute Changes
The streaming UI shows a visual dependency tree of resources being changed, with color-coded indicators:
plat-ue2-dev/myapp
● ├── aws_s3_object.file
│ content_type "text/html" → "text/plain"
│ source "hello.html" → "hello.txt"
● └── aws_instance.new
ami (none) → "ami-12345"
instance_type (none) → "t3.micro"
Resources are marked with colored dots (●): green for create, yellow for update, red for delete. Attribute changes show old → new values in a two-column layout.
For multi-line values (like file content), each line is shown with add/remove indicators:
● └── aws_s3_object.weather
content
- Current weather: Sunny, 72°F
- Humidity: 45%
+ Current weather: Cloudy, 65°F
+ Humidity: 80%
+ Wind: 15 mph NW
Interactive Confirmation
Before applying changes, the UI displays a confirmation prompt:
Do you want to apply these changes?
> Yes No
The confirmation is styled with the Atmos theme and includes proper margins for visual clarity.
Why This Matters
Terraform's default output is overwhelming, especially for new users. A simple infrastructure change can produce hundreds of lines containing:
- Verbose state refresh messages for every resource
- Provider initialization logs
- JSON-like attribute diffs that obscure actual changes
- Technical identifiers and ARNs
This creates several problems:
- Information overload - Important changes are buried in noise
- Progress blindness - No clear indication of completion percentage during long operations
- Error obscurity - Errors get buried in the output stream
- Context switching - Mental overhead parsing Terraform syntax
The streaming UI solves these by showing only what matters: which resources are changing, what attributes are affected, and their current status.
How to Use It
Enable via Flag
# Enable for a single command
atmos terraform plan vpc -s dev --ui
# Disable explicitly when enabled by config
atmos terraform apply vpc -s prod --ui=false
Enable via Configuration
Add to your atmos.yaml:
components:
terraform:
ui:
enabled: true
Or set it directly from the CLI without hand-editing YAML:
atmos config set components.terraform.ui.enabled true
With this on, the UI turns on automatically whenever a real terminal is detected — no --ui flag needed — and still auto-disables in the same piped/CI cases described below. Use --ui=false per-command to override it off.
Enable via Environment Variable
export ATMOS_TERRAFORM_UI=true
atmos terraform plan vpc -s dev
Smart Auto-Disable
The streaming UI automatically falls back to standard output when:
- No TTY attached - Output is piped or redirected
- CI environment detected -
CI=trueenvironment variable is set - Unsupported commands - Commands that don't support JSON streaming
This means your existing scripts and CI pipelines continue to work without modification.
Supported Commands
| Command | Streaming UI |
|---|---|
plan | ✓ |
apply | ✓ |
deploy | ✓ |
init | ✓ |
destroy | ✓ |
refresh | ✗ (no -json streaming support in Terraform's refresh) |
Technical Details
The implementation uses Terraform's machine-readable JSON output format (-json flag):
- Atmos automatically adds
-jsonto terraform commands when UI mode is enabled - Parses plan files to build a dependency tree with attribute-level changes
- Renders a Bubbletea-based TUI with spinners, progress bars, and status indicators
- Displays interactive confirmation prompts using the
huhlibrary - Preserves exit codes (critical for
plan -detailed-exitcode)
This is a pure Go implementation using charmbracelet/bubbletea and huh, requiring no external binaries or CGO.
Learn More
Get Involved
We'd love your feedback on the streaming UI. Try it out and let us know how it works for your workflow. Open an issue on GitHub or join us in Slack.
