{"id":51373965,"url":"https://github.com/nikhilsbhat/helm-diff-summary","last_synced_at":"2026-07-03T10:08:44.672Z","repository":{"id":356506396,"uuid":"1232654684","full_name":"nikhilsbhat/helm-diff-summary","owner":"nikhilsbhat","description":"Terraform-style deployment summaries for Helm diffs with policy checks and notification integrations.","archived":false,"fork":false,"pushed_at":"2026-06-12T11:09:17.000Z","size":99,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-29T11:31:24.543Z","etag":null,"topics":["cli","devops","diff","gitops","helm","helm-diff","helm-diff-summary","helm-plugin","helm-plugins","infrastructure-as-code","kubernetes","platform-engineering","plugin","summary","terraform","terraform-style"],"latest_commit_sha":null,"homepage":"https://medium.com/@nikhilsbhat93/terraform-style-summaries-for-helm-diffs-c8f4d5d93fbc","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nikhilsbhat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-08T06:23:10.000Z","updated_at":"2026-06-12T11:09:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nikhilsbhat/helm-diff-summary","commit_stats":null,"previous_names":["nikhilsbhat/helm-diff-summary"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/nikhilsbhat/helm-diff-summary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-diff-summary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-diff-summary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-diff-summary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-diff-summary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nikhilsbhat","download_url":"https://codeload.github.com/nikhilsbhat/helm-diff-summary/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-diff-summary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35081348,"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-07-03T02:00:05.635Z","response_time":110,"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","diff","gitops","helm","helm-diff","helm-diff-summary","helm-plugin","helm-plugins","infrastructure-as-code","kubernetes","platform-engineering","plugin","summary","terraform","terraform-style"],"created_at":"2026-07-03T10:08:43.996Z","updated_at":"2026-07-03T10:08:44.667Z","avatar_url":"https://github.com/nikhilsbhat.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# helm-diff-summary\n\n[![CI](https://github.com/nikhilsbhat/helm-diff-summary/actions/workflows/ci.yml/badge.svg)](https://github.com/nikhilsbhat/helm-diff-summary/actions/workflows/ci.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/nikhilsbhat/helm-diff-summary)](https://goreportcard.com/report/github.com/nikhilsbhat/helm-diff-summary)\n[![Go Reference](https://pkg.go.dev/badge/github.com/nikhilsbhat/helm-diff-summary.svg)](https://pkg.go.dev/github.com/nikhilsbhat/helm-diff-summary)\n[![License](https://img.shields.io/badge/license-MIT-blue)](https://github.com/nikhilsbhat/helm-diff-summary/blob/main/LICENSE)\n[![Release](https://img.shields.io/github/v/release/nikhilsbhat/helm-diff-summary)](https://github.com/nikhilsbhat/helm-diff-summary/releases)\n[![Downloads](https://img.shields.io/github/downloads/nikhilsbhat/helm-diff-summary/total.svg)](https://github.com/nikhilsbhat/helm-diff-summary/releases)\n\nReview Helm changes like a Terraform plan.\n\n`helm-diff-summary` turns noisy [`helm diff`](https://github.com/databus23/helm-diff) output into a compact deployment summary that is easy to read in terminals, CI logs, pull requests, and chat notifications.\n\n```bash\nhelm diff upgrade app ./chart --allow-unreleased --output diff | helm-diff-summary\n```\n\n```text\n+------------+-------------------+-------------+--------+----------+-----------+---------+\n| KIND       | NAME              | NAMESPACE   | ACTION | SEVERITY | CATEGORY  | CHANGES |\n+------------+-------------------+-------------+--------+----------+-----------+---------+\n| Deployment | sample-api        | production  | UPDATE | HIGH     | WORKLOAD  |      12 |\n| ConfigMap  | sample-config     | production  | UPDATE | MEDIUM   | CONFIG    |       3 |\n| Service    | sample            | production  | CREATE | LOW      | NETWORK   |       4 |\n+------------+-------------------+-------------+--------+----------+-----------+---------+\n\nPlan: 1 to create, 2 to update, 0 to delete.\n```\n\n## Why Use It?\n\nRaw Helm diffs are useful, but they become hard to review when charts grow, generated manifests are large, or deployment changes need approval in a pull request.\n\n`helm-diff-summary` helps platform and application teams answer the questions that matter before a release:\n\n* What Kubernetes resources will change?\n* Are resources being created, updated, or deleted?\n* Are risky resources or namespaces involved?\n* Should CI fail because a delete or high-severity policy violation was detected?\n* Can the same summary be sent to Slack, Microsoft Teams, Google Chat, or a webhook?\n\n## Features\n\n* Summarizes `helm diff upgrade --output diff` into a Terraform-style plan\n* Detects `CREATE`, `UPDATE`, and `DELETE`\n* Adds approximate logical change counts per resource\n* Classifies resources by severity and category\n* Supports custom policy checks from `helm-diff-summary.yaml`\n* Can fail CI on deletes or policy severity thresholds\n* Renders terminal tables, JSON, and YAML\n* Sends summaries to Slack, Microsoft Teams, Google Chat, and generic webhooks\n* Works without Kubernetes cluster access because it reads `helm diff` output from stdin\n* Ships as a single binary, Docker image, and Homebrew formula\n\n## Installation\n\n### Go\n\n```bash\ngo install github.com/nikhilsbhat/helm-diff-summary@latest\n```\n\n### Release Binary\n\nDownload signed release artifacts from the [releases page](https://github.com/nikhilsbhat/helm-diff-summary/releases).\n\n### Homebrew\n\n```bash\nbrew tap nikhilsbhat/stable https://github.com/nikhilsbhat/homebrew-stable.git\nbrew install nikhilsbhat/stable/helm-diff-summary\n```\n\nInstall a specific version:\n\n```bash\nbrew install nikhilsbhat/stable/helm-diff-summary@0.2.5\n```\n\n### Docker\n\n```bash\ndocker pull ghcr.io/nikhilsbhat/helm-diff-summary:latest\ndocker pull ghcr.io/nikhilsbhat/helm-diff-summary:\u003cgithub-release-tag\u003e\n```\n\n### Build From Source\n\n```bash\ngit clone https://github.com/nikhilsbhat/helm-diff-summary.git\ncd helm-diff-summary\nmake local/build\n```\n\n## Prerequisites\n\nInstall Helm and the `helm diff` plugin:\n\n```bash\nhelm plugin install https://github.com/databus23/helm-diff\n```\n\n## Usage\n\n### Basic\n\n```bash\nhelm diff upgrade my-release ./chart \\\n  --output diff | helm-diff-summary\n```\n\n### Fresh Install Preview\n\n```bash\nhelm diff upgrade my-release ./chart \\\n  --allow-unreleased \\\n  --output diff | helm-diff-summary\n```\n\n### JSON or YAML Output\n\n```bash\nhelm diff upgrade my-release ./chart \\\n  --output diff | helm-diff-summary -o json\n\nhelm diff upgrade my-release ./chart \\\n  --output diff | helm-diff-summary -o yaml\n```\n\n### Fail CI on Deletes\n\n```bash\nhelm diff upgrade my-release ./chart \\\n  --output diff | helm-diff-summary --fail-on-delete\n```\n\n### Fail CI on Policy Severity\n\n```bash\nhelm diff upgrade my-release ./chart \\\n  --output diff | helm-diff-summary --fail-on high\n```\n\nSupported thresholds are `low`, `medium`, `high`, and `critical`.\n\n## CI Examples\n\n### GitHub Actions\n\n```yaml\nname: Helm diff summary\n\non:\n  pull_request:\n\njobs:\n  helm-diff-summary:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: azure/setup-helm@v4\n\n      - uses: actions/setup-go@v5\n        with:\n          go-version: stable\n\n      - name: Install helm-diff\n        run: helm plugin install https://github.com/databus23/helm-diff\n\n      - name: Install helm-diff-summary\n        run: go install github.com/nikhilsbhat/helm-diff-summary@latest\n\n      - name: Summarize Helm diff\n        run: |\n          helm diff upgrade my-release ./chart \\\n            --allow-unreleased \\\n            --namespace production \\\n            --output diff | helm-diff-summary --fail-on high\n```\n\n### GitLab CI\n\n```yaml\nhelm-diff-summary:\n  image: golang:1\n  script:\n    - curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash\n    - helm plugin install https://github.com/databus23/helm-diff\n    - go install github.com/nikhilsbhat/helm-diff-summary@latest\n    - helm diff upgrade my-release ./chart --allow-unreleased --output diff | helm-diff-summary --fail-on high\n```\n\n## Policies\n\nCreate `helm-diff-summary.yaml` in the working directory to flag risky changes.\n\n```yaml\npolicies:\n  - name: resource-deletion\n    action: DELETE\n    severity: CRITICAL\n    message: resource deletion detected\n\n  - name: production-namespace\n    namespace: production\n    severity: HIGH\n    message: change detected in production namespace\n\n  - name: crd-update\n    kind: CustomResourceDefinition\n    action: UPDATE\n    severity: CRITICAL\n    message: CRD modification detected\n\n  - name: large-change\n    min_changes: 100\n    severity: MEDIUM\n    message: large resource change detected\n```\n\nSee [`helm-diff-summary.sample.yaml`](helm-diff-summary.sample.yaml) for a fuller example.\n\nSupported policy fields:\n\n| Field | Description |\n| --- | --- |\n| `name` | Unique policy name |\n| `kind` | Kubernetes resource kind |\n| `category` | Resource category |\n| `action` | Change action: `CREATE`, `UPDATE`, or `DELETE` |\n| `namespace` | Kubernetes namespace |\n| `severity` | `LOW`, `MEDIUM`, `HIGH`, or `CRITICAL` |\n| `message` | Violation message |\n| `min_changes` | Minimum changed lines threshold |\n\n## Notifications\n\nSend deployment summaries and policy violations to external systems.\n\n### Slack\n\n```bash\nexport SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx\n\nhelm diff upgrade app ./chart \\\n  --output diff | helm-diff-summary --notify slack\n```\n\n### Microsoft Teams\n\n```bash\nexport TEAMS_WEBHOOK_URL=https://example.webhook.office.com/xxx\n\nhelm diff upgrade app ./chart \\\n  --output diff | helm-diff-summary --notify teams\n```\n\n### Google Chat\n\n```bash\nexport GCHAT_WEBHOOK_URL=https://chat.googleapis.com/xxx\n\nhelm diff upgrade app ./chart \\\n  --output diff | helm-diff-summary --notify gchat\n```\n\n### Generic Webhook\n\n```bash\nexport WEBHOOK_URL=https://example.com/webhook\n\nhelm diff upgrade app ./chart \\\n  --output diff | helm-diff-summary --notify webhook\n```\n\nMultiple targets can be used together:\n\n```bash\nhelm diff upgrade app ./chart \\\n  --output diff | helm-diff-summary --notify slack,teams\n```\n\nWebhook credentials are read from environment variables so they do not appear in shell history, CI logs, or process lists.\n\n## How It Works\n\n`helm-diff-summary` parses resource headers emitted by `helm diff`.\n\n```text\nproduction, sample-api, Deployment (apps) has changed:\n```\n\nFrom each resource block it extracts the namespace, name, kind, action, severity, and logical change count.\n\nLogical change counts are intentionally approximate. For an update like this:\n\n```diff\n- image: app:v1\n+ image: app:v2\n```\n\nthe tool reports one logical update instead of two raw diff lines.\n\n## Current Limitations\n\nThis tool currently parses unified diff output. It does not yet perform semantic YAML diffing, Kubernetes-aware field comparison, or exact field-level mutation analysis. Formatting-only changes may still appear as updates.\n\n## Documentation\n\nGenerated command documentation is available in [`docs/doc/helm-diff-summary.md`](docs/doc/helm-diff-summary.md).\n\n## Development\n\n```bash\ngo test ./...\ngo run . \u003c diff.txt\n```\n\nGenerate command documentation:\n\n```bash\nmake generate/document\n```\n\nBuild a local binary:\n\n```bash\nmake local/build\n```\n\n## Community And Discovery\n\nIf this project helps your Helm or GitOps workflow, a star, issue, or example workflow goes a long way.\n\nRecommended GitHub topics for the repository:\n\n```text\nhelm, helm-diff, kubernetes, gitops, ci-cd, devops, platform-engineering, sre, terraform-plan, pull-request, argocd, fluxcd\n```\n\n## Related Projects\n\n* [`helm-diff`](https://github.com/databus23/helm-diff)\n* [`tf-summarize`](https://github.com/dineshba/tf-summarize)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilsbhat%2Fhelm-diff-summary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnikhilsbhat%2Fhelm-diff-summary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilsbhat%2Fhelm-diff-summary/lists"}