TGM icon Terraform Graphical Manager
Open Source · MIT License 100% Free

Enterprise Level Web UI for Terraform Workflows,
on your own machine.

Manage all your Terraform workspaces from a beautiful dashboard. Real-time logs, plan diffs, state browser, Git branch/tag selector, variable groups, variable origin tracing, workspace metrics, run notifications, REST API, and Sentinel policy enforcement — no cloud account, no SaaS fees.

No cloud account required No subscription, no limits Python 3.9+ · pip install AWS · GCP · Azure storage backends Git branch · tag · release selector Variable groups & origin tracing Team-ready · share key via password manager Prometheus · InfluxDB metrics PagerDuty · Slack · email alerts REST API for automations
localhost:5005
TGM Dashboard overview
Capabilities

Everything Terraform offers,
running locally.

From workspace discovery to policy enforcement — all the tools your infrastructure team needs, without a monthly bill.

Dashboard & Workspace Tree

Recursive workspace discovery from a root folder. Group folders rendered as a collapsible tree in the sidebar with search filter.

Real-time Execution Logs

Run plan and apply with live log streaming over Socket.IO. Concurrent queue with up to N parallel workers.

Color-coded Plan Diff

Every resource change categorized as create / update / delete / no-op and displayed in a structured diff view with attribute-level detail.

State Browser

Pull and parse Terraform state. Browse resources and their attributes with sensitive values automatically masked in the UI.

Drift Detection

Run plan -refresh-only on demand. Drift indicator shown prominently on workspace cards when infrastructure has drifted from state.

Dependency Graph

Interactive D3.js force-directed graph of your Terraform resource dependencies. Zoom, pan, and click nodes to inspect details.

Sentinel Policy Enforcement

Evaluate HashiCorp Sentinel policies against every plan. Per-workspace policy sets, selectable policy checkboxes, and persistent last-run history.

Credential Isolation

Each execution gets its own clean environment — credentials are never inherited from the host shell or persisted to disk.

Multi-version Terraform

Manage multiple local Terraform binaries. Pin a version per workspace or override per run. Supports both dot and underscore directory naming.

Deep Git Integration

Branch, tag, and release selector with search. Choose the exact Git ref per Run and see it recorded in the run history — something TFE/Terraform Cloud makes surprisingly hard.

Workspace Variables

Key-value Terraform and env variables scoped to a single workspace. Stored in workspace_config.json, encrypted at rest, and injected automatically on every run.

Variable Groups

Named sets of Terraform/env variables applied to one or more workspaces — global or workspace-scoped. Sidebar panel with create/edit/delete and a "Used in workspaces" viewer.

Run Variable Tracing EXCLUSIVE

Every Run shows exactly which variables were applied and where they came from: workspace var, variable group, .tfvars, auto.tfvars, or module default — no guesswork.

Workspace Metrics EXCLUSIVE

Per-workspace run counters, success/failure rates, plan duration, and resource change trends. Export to Prometheus, InfluxDB, or any compatible scraper via a built-in metrics endpoint.

Run Notifications EXCLUSIVE

Send run status alerts to email, Slack, PagerDuty, Alertmanager, or any webhook. Configurable per workspace — trigger on success, failure, or drift detection.

API Manager EXCLUSIVE

Built-in REST API to trigger plans, applies, and workspace queries programmatically. Evaluate automations, integrate with CI/CD pipelines, or build your own tooling on top of TGM.

Remote State & Config EXCLUSIVE

Persist TerraGUI's own workspace registry, run history, and configuration in a remote store — AWS S3, Azure Blob, GCS, or any S3-compatible backend. Your Terraform .tfstate is untouched; this is about TerraGUI's data — encrypted at rest, auditable, and shareable across your whole team without extra infrastructure.

Portal Security

Optional password lock with Fernet-based encryption for sensitive variable values. Auto re-encryption when password changes. Safe "remove lock" modal with option to decrypt to plaintext.

Great for teams: share the portal password via your company password manager (1Password, Bitwarden, etc.) and every teammate runs with identical, encrypted variable config — zero drift, zero extra cost.

Screenshots

See it in action

Explore every area of the interface — from the execution console to the Sentinel policy results.

Dashboard overview

Dashboard overview

Stats, workspace cards, error spotlight — everything at a glance.

Sidebar workspace tree

Collapsible workspace tree

Group folders collapse/expand. Leaves link directly to their workspace.

Sidebar search

Instant sidebar search

Filter workspaces by name across the entire tree in real time.

Workspace overview tab

Workspace overview

Providers, backend type, Git branch, last commit, version pin, and one-click Plan / Apply.

Run modal

Credential & version modal

Inject credentials per run without ever storing them on disk.

Plan running

Live plan log

Terraform output streamed line-by-line via Socket.IO as it runs.

Apply running

Live apply log

Full apply output in real time with cancel button available.

Runs history tab

Run history

All past executions with status, duration, and persisted logs accessible at any time.

Branch / Tag selector

Branch & tag selector with search

Pick any local or remote branch, tag, or release for each Run. Remote refs are fetched on demand. One-click checkout — no terminal needed.

Run labels

Git ref recorded on every Run

Run labels show the exact branch/tag/commit used and whether a git pull was performed — the traceability TFE never gave you.

git fetch & pull

Git fetch & optional auto-pull

Manual git fetch button refreshes remote refs. Optional git pull before each plan or apply keeps the workspace in sync automatically.

Variable origin inspector

Variable origin tracing per Run

Every Run shows every variable that was injected and its source: workspace group .tfvars auto.tfvars default — no guesswork about what ran.

Variable groups panel

Variable Groups

Named sets of Terraform/env variables. Apply a group to any workspace, globally or scoped. Create, edit, delete, and see which workspaces consume each group.

Encrypted sensitive values

Fernet encryption & portal lock

Sensitive variable values encrypted at rest with Fernet. Optional portal password lock with auto re-encryption when the password changes.

Metrics dashboard

Per-workspace metrics dashboard

Run counters, success/failure rates, plan duration trends, and resource change history — all at a glance per workspace.

Prometheus / InfluxDB export

Prometheus & InfluxDB export

Built-in /metrics endpoint compatible with Prometheus scraping. Push to InfluxDB or any compatible time-series backend.

Run trend charts

Run trend charts

Visual sparklines showing plan vs apply counts, error spikes, and average execution time over rolling windows — per workspace and globally.

Notification channels

Multi-channel notification config

Configure delivery channels (email, Slack, PagerDuty, Alertmanager, generic webhook) per workspace with trigger conditions: success, failure, drift, or all events.

PagerDuty & Alertmanager

PagerDuty & Alertmanager

Send on-call alerts directly to PagerDuty incidents or Alertmanager receivers. Include run log snippet, workspace name, and Git ref in every alert payload.

Notification history

Notification history log

Every alert dispatched is recorded — channel, timestamp, trigger, delivery status. Full audit trail of who was notified and when.

REST API explorer

REST API — trigger runs programmatically

Trigger plans, applies, and workspace queries via a documented REST API. Integrate TGM into CI/CD pipelines, scripts, or custom dashboards — no clicking required.

Token auth

API token authentication

Generate scoped API tokens per team or integration. Tokens support read-only or full access. Revoke at any time from the Settings panel.

Webhook events

Outbound webhooks & event bus

Subscribe to run lifecycle events (queued, running, completed, failed) via webhooks. Build automation workflows in n8n, Zapier, or custom services.

State resource list

State resource list

All resources in state with type, name, and module path.

State resource detail

Attribute inspector

Expand any resource to browse its attributes. Sensitive values are masked automatically.

Terraform outputs

Output values

All terraform output values surfaced in the UI. Sensitive outputs shown as ***sensitive***.

Settings page

Visual settings panel

Edit all tfg.conf options through the UI — saved to disk automatically.

Repos root setting

Repos root

Configure the root path TGM scans for Terraform workspaces.

Version management settings

Version management

Detected local Terraform binaries listed with their version numbers.

Sentinel settings section

Sentinel policy sets

Discovered policy sets with per-set checkboxes to enable or disable globally.

Settings saved toast

Save confirmation

Toast notification confirms settings have been written to disk.

Git Integration

Branch, tag, release — your call,
per every Run.

Terraform Cloud keeps Git info buried. TGM surfaces it front and center — choose the exact ref before you run and see it stamped on every execution record forever.

Branch / tag / release selector

Searchable dropdown listing all local branches, remote tracking branches, annotated tags, and GitHub-style releases. One click to switch the working ref.

git fetch & auto-pull

Dedicated Fetch button syncs remote refs. Optional pull before run setting ensures the workspace is always on the latest commit before plan or apply.

Git ref stamped on every Run record

Branch name, tag, and short commit SHA are persisted with each run. The run history shows main@a1b2c3d — not just a timestamp.

PAT token resolution

Personal access tokens for private repos resolved in order: environment variable → workspace variable → variable group. No hardcoding, no credential leakage.

Git ref — Workspace: prod/networking
branch main a1b2c3d
branch feature/add-vpc f9e8d7c
tag v2.4.1 annotated
tag v2.4.0 annotated
Run history
✓ apply main@a1b2c3d pulled 2 min ago
~ plan v2.4.1 no pull 1 hr ago
✗ apply feature/add-vpc@f9e8d7c pulled 3 hr ago
Variables

Know exactly what ran —
and where every variable came from.

TFE shows you that a Run used variables. TGM shows you which variables, what values (masked if sensitive), and which source provided each one.

workspace
Workspace variable

Scoped to a single workspace. Stored in workspace_config.json, optionally encrypted.

group
Variable Group

Named set applied to one or many workspaces. Global or workspace-scoped. Edit once, apply everywhere.

.tfvars
tfvars file

Explicitly passed -var-file. Filename shown in the run record.

auto.tfvars
auto.tfvars

Automatically loaded by Terraform. Detected and surfaced in the run summary.

default
Module default

Variable not overridden anywhere — falls back to the default value declared in the module.

Run #47 — prod/networking — apply — main@a1b2c3d
VariableValueSourceType
region us-east-1 workspace terraform
environment production group: global-prod terraform
vpc_cidr 10.0.0.0/16 prod.tfvars terraform
enable_flow_logs true networking.auto.tfvars terraform
AWS_ACCESS_KEY_ID *** group: aws-creds env
max_azs 3 default terraform
Variable Groups
global-prod
4 variables · global
Used in prod/networking prod/compute prod/iam +5
aws-creds
2 variables · scoped
Used in prod/networking staging/vpc
Observability

Metrics for every workspace,
straight into your stack.

Know exactly how your infrastructure runs — plan durations, error rates, drift frequency — and send it all to the monitoring stack you already use.

Prometheus

Expose a /metrics endpoint ready for Prometheus scraping. Add TGM as a target in your prometheus.yml in seconds.

InfluxDB

Push run metrics directly to an InfluxDB bucket. Visualize in Grafana with the included dashboard template.

Generic / StatsD

Forward metrics via StatsD UDP or HTTP push to any compatible backend — Datadog, New Relic, CloudWatch, and more.

Workspace metrics — last 30 days
prod/networking
47 runs
prod/compute
31 runs
staging/vpc
18 runs
avg plan: 42s
avg apply: 3m 12s
error rate: 7.4%
drift detected: 3×
GET /api/metrics Prometheus text format
Notifications

Never miss a failed apply
or a drift event again.

Route run status alerts to the right channel and the right person — automatically, per workspace, with full context in every message.

Email

SMTP-based delivery. Configurable from/to addresses per workspace. HTML template with run summary and log excerpt.

#

Slack

Post to any channel or DM via incoming webhook or Bot token. Rich message block with workspace, Git ref, status, and duration.

PD

PagerDuty

Trigger, resolve, or acknowledge incidents via Events v2 API. Severity mapped from run status. Auto-resolve on retry success.

AM

Alertmanager

Push alerts directly to an Alertmanager instance. Labels include workspace, run type, and Git ref for fine-grained routing rules.

</>

Generic Webhook

POST a JSON payload to any URL. Configurable headers, auth token, and payload template. Works with n8n, Zapier, Teams, and more.

Notification config — prod/networking
on: failure
PagerDuty severity: critical · auto-resolve: on
on: all
Slack #infra-deploys · include log snippet
on: drift
infra-team@company.com
Recent dispatches
✓ delivered Slack apply completed · main@a1b2c3d 2 min ago
✓ delivered PagerDuty apply failed · feature/add-vpc 1 hr ago
API Manager EXCLUSIVE

Automate everything.
If you can click it, you can script it.

Every action available in the UI is also exposed over a REST API. Build pipelines, write scripts, or integrate TGM into your existing tooling.

Runs
POST /api/workspaces/{id}/plan Trigger a plan run
POST /api/workspaces/{id}/apply Trigger an apply
DEL /api/runs/{run_id}/cancel Cancel a running job
Workspaces & Variables
GET /api/workspaces List all workspaces
GET /api/workspaces/{id}/variables Get variable config
POST /api/variable-groups Create a variable group
Observability
GET /api/metrics Prometheus text format
GET /api/runs/{run_id}/log Fetch full run log
bash Trigger a plan from CI
# Trigger plan on merge to main
curl -X POST \
  https://tgm.internal:5005/api/workspaces/prod-networking/plan \
  -H "Authorization: Bearer $TGM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "git_ref": "main",
    "pull_before_run": true,
    "var_overrides": {
      "environment": "production"
    }
  }'

# Response
{
  "run_id": "run-a1b2c3",
  "status": "queued",
  "workspace": "prod/networking",
  "git_ref": "main",
  "queued_at": "2026-04-03T10:22:01Z"
}

Built for teams, not just individuals

Store the portal password in your company password manager (1Password, Bitwarden, HashiCorp Vault…). Every engineer on the team opens TGM with the exact same encrypted variable configuration — workspaces, variable groups, sensitive values — all in sync. No manual handovers, no configuration drift between teammates, and no extra SaaS bill. One shared key, consistent and auditable workflows across the whole infrastructure team.

$0per seat 1 keyshared securely 100%config parity
Policy as Code

Sentinel enforcement,
built right in.

Attach HashiCorp Sentinel policy sets to every workspace. Policies written for Terraform run without modification.

  • Global policy sets applied to every workspace, with per-workspace overrides
  • Selectable policy checkboxes — run only the sets you need
  • Three enforcement levels: hard-mandatory, soft-mandatory, advisory
  • Precise result banner: total checked · passed · failed (blocking) · advisory warnings
  • Last run result persisted — survives browser refreshes
  • 18 ready-to-use example policies: security, cost, tagging, networking
Sentinel all passed Sentinel policy failed Sentinel configuration checkboxes
Quick start

Up and running in 60 seconds

Python 3.9+ and Terraform CLI installed? That's all you need.

1

Clone & install

Clone the repository and install the tgm command with pip.

2

Create your config

Copy the example config and set repos_root to your Terraform directories.

3

Start the server

Run tgm start and open localhost:5005 in your browser.

4

Explore your workspaces

TGM discovers all .tf files automatically — no manual registration needed.

# Clone
git clone https://github.com/eandresr/terraform-graphical-manager
cd terraform-graphical-manager

# Create and activate venv
python3 -m venv venv
source venv/bin/activate

# Install
pip install .

# Configure
cp config/tfg.conf.example tfg.conf
# edit tfg.conf → set repos_root

# Start
tgm start

# Open http://localhost:5005
pip install output tgm start output
Storage

Your history, wherever you want it

Execution logs, plan artefacts, and run metadata are always persisted — locally or in cloud storage.

🗂️

Local filesystem

Default. Zero config. Data stored in ./TERRAFORM_GRAPHICAL_BACKEND/.

🟠

AWS S3

Set TERRAFORM_GRAPHICAL_BACKEND=aws and point to any S3 bucket.

🔵

GCP Cloud Storage

Set TERRAFORM_GRAPHICAL_BACKEND=gcp with a service account credential.

🟦

Azure Blob Storage

Set TERRAFORM_GRAPHICAL_BACKEND=azure with a connection string.

Open Source

Built in the open.
Improved together.

TGM is MIT licensed and community-driven. Every contribution — code, bug report, or donation — makes it better for everyone.

Contribute code

Fork the repository, create a feature branch from main, and open a Pull Request. Check the Contributing Guide for the full workflow — including branch naming, PEP 8 style, and the PR checklist.

Found a bug? Open an Issue first so we can discuss the fix together.

View on GitHub

Support the project

TGM is free and will always remain free. If it saves you time or helps your team, consider buying the maintainer a coffee.

Donations fund ongoing development, bug fixes, new features, and keeping the project alive for the community.

Donate via Stripe

Ready to take control
of your Terraform workflows?

Free, open-source, and running on your machine in under a minute.

Get Started Free Support via Stripe