terraform · hcl · indent · live

Format Terraform + HCL files

Tracks block braces in HCL and indents resource, variable, and module bodies. For canonical output use `terraform fmt`. Runs locally.

Terraform / HCL Formatter
Input
155 B
5 lines
Output
166 B
6 lines
Status
ready
live
Ratio
1.07×
out/in
input · terraform
output · indented hcl
resource "aws_instance" "web"{ami="ami-123"
  instance_type="t3.micro"
  tags={Name="web"
    Environment="production"}
  vpc_security_group_ids=["sg-abc","sg-def"]}
Quick Start

How to format Terraform / HCL

HCL nests via { brace } pairs — resource, variable, locals, module blocks all use the same shape. The formatter tracks depth and indents each level.

  1. 01

    Paste a .tf file

    Resource declarations, variables, modules, providers — any HCL.

    Parsing runs through Prettier’s standalone bundle (or the language-specific equivalent) loaded lazily — no parser ships until the tool is opened.

    hclPrettierASTstandalonelazy
    input · sourceraw · AST
    resource "x" "y"{}
    loaded · parsedAST · ready
  2. 02

    Pick indent

    Terraform's canonical style is 2 spaces — match it for consistency with terraform fmt.

    Indent width, tab style, and print-width re-format through a memoised pass — switching 2 → 4 spaces never re-parses, only re-prints.

    optsindentprint-widthmemoisedlive
    opts · optionsindent · live
    indent=2
    options applied · livelive
  3. 03

    Blocks indent

    Each { opens a level, } closes one. Nested maps and lists get their own depth.

    The formatter is deterministic and idempotent: running it twice produces byte-identical output, which keeps diffs and git noise to a minimum.

    liveidempotentdeterministicdiff-cleanstable
    out · formatteddepth · ready
    resource "x" "y" {
      ami = "..."
    }
    formatted · liveidempotent
  4. 04

    Copy or save

    Drop into your module or run terraform fmt -recursive afterwards for canonical output.

    Download writes a Blob with the language-appropriate extension; copy uses navigator.clipboard.writeText so the output preserves all whitespace exactly.

    exportclipboardbloblanguage MIMEclient-side
    ok · copiedready · done
    ✓ Copied
    shipped · ready to shipsuccess
Pro tips

Formatting tips that keep diffs sane

Pick one config and pin it

Inconsistent formatting causes diff churn. Commit .prettierrc / .editorconfig and enforce in CI.

Format on save

Editor integration is faster feedback than a pre-commit hook. Use both for belt-and-braces.

Idempotency matters

Running the formatter twice should produce identical output. Test this on a representative file.

Match the language community

Default to community conventions: 2 spaces for JS/CSS, 4 for Python, tabs for Go. Fights over indent are a productivity tax.

Print-width drives wrapping

80, 100, and 120 are the common targets. Wider lines parse fast but review slower side-by-side.

Don’t mix formatters and linters

Prettier handles whitespace; ESLint handles correctness. Disable overlapping rules to avoid fight-club configs.

Use Cases

When to format Terraform

Module review, infra audits, runbooks.

Module review

Tidy a contributed module before merging into the registry. Idempotent: running the formatter twice produces byte-identical output, which is the foundation of a clean CI gate. Pair with a pre-commit hook so PRs arrive already formatted, focusing review on logic.

idempotent

Onboarding

Make a legacy module readable for a new engineer. Pairs with EditorConfig + .prettierrc for end-to-end consistency. Whitespace-only changes vanish so reviewers see real diffs, and git blame stays honest about who wrote what.

CI-ready

Runbook examples

Embed indented HCL snippets in infra docs. Output respects your indent width, tab style, and print-width — settings carry over for repeat runs. Switching 2-space to 4-space costs nothing in CPU but standardises an entire codebase.

diff-clean

Diff cleanup

Indent before diffing two state files for clarity. Format-on-save is the fastest feedback loop; CI is the safety net. Together they make inconsistent indentation a thing of the past and free up review cycles for genuine concerns.

PR-friendly

Quick edit

Reformat a Terraform snippet from a Slack message. Whitespace-only changes don't trigger downstream content-hash invalidations, so CDN cache keys and CI cache layers stay warm. Real changes get all the rebuild budget.

review-ready

Cross-cloud

Standardise AWS/GCP/Azure modules with the same indent. Pairs with linters (ESLint, Stylelint, pylint) that catch what formatting alone can't — bugs, unused imports, dead code. Each tool stays in its lane, and the codebase stays clean.

deterministic
FAQ

Frequently asked questions

No — terraform fmt is a real HCL parser. This is a brace-tracking heuristic. Run terraform fmt on the result for canonical output.
Yes — any HCL (Vault config, Nomad jobs, Consul ACLs) formats the same as Terraform.
<<EOF ... EOF bodies may indent oddly. The formatter doesn't track heredoc boundaries — review the output.
# and // comments stay on their own lines at the current depth; in-line comments are untouched.
No — formatting runs locally in your browser tab.
Suggest a tool

Something missing?

Tell us what you need. We ship the top requests every two weeks.

Sent straight to the maintainers · no account needed
47 in queue·8 shipped this month
Request queued. Thanks!