{"id":50147684,"url":"https://github.com/winebarrel/tfquiet","last_synced_at":"2026-06-16T04:00:59.834Z","repository":{"id":359910077,"uuid":"1247954594","full_name":"winebarrel/tfquiet","owner":"winebarrel","description":"Terraform plan output formatter to reduce noise","archived":false,"fork":false,"pushed_at":"2026-06-16T02:16:19.000Z","size":90,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T03:21:01.547Z","etag":null,"topics":["cli","devops","formatter","go","terraform"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/winebarrel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-24T02:07:54.000Z","updated_at":"2026-06-16T02:09:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/winebarrel/tfquiet","commit_stats":null,"previous_names":["winebarrel/tfquiet"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/winebarrel/tfquiet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winebarrel%2Ftfquiet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winebarrel%2Ftfquiet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winebarrel%2Ftfquiet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winebarrel%2Ftfquiet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/winebarrel","download_url":"https://codeload.github.com/winebarrel/tfquiet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/winebarrel%2Ftfquiet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34390052,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","devops","formatter","go","terraform"],"created_at":"2026-05-24T06:01:39.776Z","updated_at":"2026-06-16T04:00:59.826Z","avatar_url":"https://github.com/winebarrel.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tfquiet\n\n[![CI](https://github.com/winebarrel/tfquiet/actions/workflows/ci.yml/badge.svg)](https://github.com/winebarrel/tfquiet/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/winebarrel/tfquiet/graph/badge.svg)](https://codecov.io/gh/winebarrel/tfquiet)\n[![AI Generated](https://img.shields.io/badge/AI%20Generated-Claude-orange?logo=anthropic)](https://claude.ai/claude-code)\n\ntfquiet trims noise out of `terraform plan` output so the diff that matters stays in focus.\n\nBy default it removes:\n\n| What | Why it's noise |\n| ---- | -------------- |\n| Pure `moved {}` blocks (rename only, no diff) | No infrastructure change — just a state address rename |\n| Pure `import {}` blocks (imported state already matches config) | No diff to act on; the import itself was already requested |\n| `removed {}` with `lifecycle { destroy = false }` (state-only forget) | Block + the trailing `Warning: Some objects will no longer be managed` paragraph |\n| `Note: Objects have changed outside of Terraform` drift section | Refresh-detected drift, not a configuration change |\n| `Refreshing state...` / `Preparing import...` / `Acquiring state lock` lines | Per-resource status chatter, not diff |\n| `Still reading...` / `Still refreshing...` / `Still opening...` progress lines | 10-second progress ticks for slow plan-time operations |\n| Trailing `Note: You didn't use the -out option...` footer | Boilerplate |\n\n**Anything that represents a real resource change is always shown.** If a moved or imported block also carries an in-place update (`~`), a replacement (`-/+` / `+/-`), or a create/destroy marker, the block stays in the output. Destroy blocks are likewise always shown — this includes both resources removed from configuration and `removed {}` blocks with `destroy = true` (Terraform renders them identically in plan output).\n\n**The `Plan: …` summary line is never rewritten.** Counts always match what `terraform apply` will do.\n\n## Installation\n\n```\nbrew install winebarrel/tfquiet/tfquiet\n```\n\n## Usage\n\n```\nUsage: tfquiet [\u003cfile\u003e] [flags]\n\nArguments:\n  [\u003cfile\u003e]    Terraform plan output file. If not specified, read from stdin.\n\nFlags:\n  -h, --help            Show help.\n      --show-moved      Show moved blocks.\n      --show-import     Show import blocks.\n      --show-removed    Show removed{} lifecycle.destroy=false (state-only forget) blocks.\n      --show-drift      Show the \"Objects have changed outside of Terraform\" drift section.\n      --show-noise      Show refresh/lock lines and the trailing Note footer.\n      --no-progress     Disable the progress meter on stderr.\n      --version\n```\n\nPipe `terraform plan` straight through:\n\n```sh\nterraform plan | tfquiet\n```\n\nRecent Terraform releases keep ANSI color on even when stdout is a pipe; tfquiet preserves those sequences in the output. Pass `terraform plan -no-color` if you want plain text.\n\nWhile the refresh phase is running, the lines that would normally be filtered are summarized on stderr as a spinner + counter (`⠹ Refreshing state... (42)`). The meter auto-enables when stderr is a TTY and disappears as soon as real plan output starts streaming. Pass `--no-progress` to suppress it.\n\n### Example\n\nGiven this `terraform plan` output:\n\n```tf\nterraform_data.to_be_destroyed: Refreshing state... [id=183c0646-...]\nterraform_data.imported_pure: Preparing import... [id=pure-import-stub-id]\nterraform_data.imported_pure: Refreshing state... [id=pure-import-stub-id]\nterraform_data.imported: Preparing import... [id=import-stub-id]\nterraform_data.imported: Refreshing state... [id=import-stub-id]\nterraform_data.to_be_moved_new_name: Refreshing state... [id=ea60c4f5-...]\nterraform_data.keep_one: Refreshing state... [id=98f88f5f-...]\n\nTerraform used the selected providers to generate the following execution\nplan. Resource actions are indicated with the following symbols:\n  ~ update in-place\n  - destroy\n\nTerraform will perform the following actions:\n\n  # terraform_data.imported will be updated in-place\n  # (imported from \"import-stub-id\")\n  ~ resource \"terraform_data\" \"imported\" {\n        id     = \"import-stub-id\"\n      + input  = \"imported\"\n      + output = (known after apply)\n    }\n\n  # terraform_data.imported_pure will be imported\n    resource \"terraform_data\" \"imported_pure\" {\n        id = \"pure-import-stub-id\"\n    }\n\n  # terraform_data.keep_one will be updated in-place\n  ~ resource \"terraform_data\" \"keep_one\" {\n        id     = \"98f88f5f-...\"\n      ~ input  = \"keep-one\" -\u003e \"keep-one-updated\"\n      ~ output = \"keep-one\" -\u003e (known after apply)\n    }\n\n  # terraform_data.to_be_destroyed will be destroyed\n  # (because terraform_data.to_be_destroyed is not in configuration)\n  - resource \"terraform_data\" \"to_be_destroyed\" {\n      - id     = \"183c0646-...\" -\u003e null\n      - input  = \"destroy-me\" -\u003e null\n      - output = \"destroy-me\" -\u003e null\n    }\n\n  # terraform_data.to_be_moved_old_name has moved to terraform_data.to_be_moved_new_name\n    resource \"terraform_data\" \"to_be_moved_new_name\" {\n        id = \"ea60c4f5-...\"\n    }\n\nPlan: 2 to import, 0 to add, 2 to change, 1 to destroy.\n\n─────────────────────────────────────────────────────────────────────────────\n\nNote: You didn't use the -out option to save this plan...\n```\n\n`tfquiet` produces:\n\n```tf\nTerraform used the selected providers to generate the following execution\nplan. Resource actions are indicated with the following symbols:\n  ~ update in-place\n  - destroy\n\nTerraform will perform the following actions:\n\n  # terraform_data.imported will be updated in-place\n  # (imported from \"import-stub-id\")\n  ~ resource \"terraform_data\" \"imported\" {\n        id     = \"import-stub-id\"\n      + input  = \"imported\"\n      + output = (known after apply)\n    }\n\n  # terraform_data.keep_one will be updated in-place\n  ~ resource \"terraform_data\" \"keep_one\" {\n        id     = \"98f88f5f-...\"\n      ~ input  = \"keep-one\" -\u003e \"keep-one-updated\"\n      ~ output = \"keep-one\" -\u003e (known after apply)\n    }\n\n  # terraform_data.to_be_destroyed will be destroyed\n  # (because terraform_data.to_be_destroyed is not in configuration)\n  - resource \"terraform_data\" \"to_be_destroyed\" {\n      - id     = \"183c0646-...\" -\u003e null\n      - input  = \"destroy-me\" -\u003e null\n      - output = \"destroy-me\" -\u003e null\n    }\n\nPlan: 2 to import, 0 to add, 2 to change, 1 to destroy.\n```\n\n`imported_pure` and the `to_be_moved_*` rename both disappear: the former has no diff to apply beyond the import itself, the latter is just a state-address rename. `imported` survives because it carries an in-place update — dropping it would hide a real change — even though it was added via `import {}`. Destroy stays; refresh/preparation/note chatter is gone.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinebarrel%2Ftfquiet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwinebarrel%2Ftfquiet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwinebarrel%2Ftfquiet/lists"}