{"id":36465443,"url":"https://github.com/nikhilsbhat/helm-drift","last_synced_at":"2026-01-12T00:02:24.429Z","repository":{"id":147724895,"uuid":"539022511","full_name":"nikhilsbhat/helm-drift","owner":"nikhilsbhat","description":"Helm plugin that identifies the configuration that has drifted from the Helm chart","archived":false,"fork":false,"pushed_at":"2025-09-03T05:48:11.000Z","size":431,"stargazers_count":77,"open_issues_count":4,"forks_count":13,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-25T17:53:58.268Z","etag":null,"topics":["diff","difference","drift","drift-detection","golang","helm","helm-diff","helm-dirft-plugin","helm-drift","helm-extensions","helm-plugin","helm-plugins","kubectl-diff","kubernetes"],"latest_commit_sha":null,"homepage":"https://artifacthub.io/packages/helm-plugin/helm-drift/drift","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":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"nikhilsbhat"}},"created_at":"2022-09-20T14:09:00.000Z","updated_at":"2025-09-03T05:47:15.000Z","dependencies_parsed_at":"2024-03-09T10:24:41.111Z","dependency_job_id":"d631980a-510d-4715-9f2d-39a1cbfdb6cd","html_url":"https://github.com/nikhilsbhat/helm-drift","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/nikhilsbhat/helm-drift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-drift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-drift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-drift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-drift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nikhilsbhat","download_url":"https://codeload.github.com/nikhilsbhat/helm-drift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilsbhat%2Fhelm-drift/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28328693,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T22:11:01.104Z","status":"ssl_error","status_checked_at":"2026-01-11T22:10:58.990Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["diff","difference","drift","drift-detection","golang","helm","helm-diff","helm-dirft-plugin","helm-drift","helm-extensions","helm-plugin","helm-plugins","kubectl-diff","kubernetes"],"created_at":"2026-01-12T00:02:24.246Z","updated_at":"2026-01-12T00:02:24.399Z","avatar_url":"https://github.com/nikhilsbhat.png","language":"Go","funding_links":["https://github.com/sponsors/nikhilsbhat"],"categories":[],"sub_categories":[],"readme":"# Helm Drift\n\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/nikhilsbhat/helm-drift)](https://goreportcard.com/report/github.com/nikhilsbhat/helm-drift) \n[![shields](https://img.shields.io/badge/license-MIT-blue)](https://github.com/nikhilsbhat/helm-drift/blob/master/LICENSE) \n[![shields](https://godoc.org/github.com/nikhilsbhat/helm-drift?status.svg)](https://godoc.org/github.com/nikhilsbhat/helm-drift)\n[![shields](https://img.shields.io/github/v/tag/nikhilsbhat/helm-drift.svg)](https://github.com/nikhilsbhat/helm-drift/tags)\n[![shields](https://img.shields.io/github/downloads/nikhilsbhat/helm-drift/total.svg)](https://github.com/nikhilsbhat/helm-drift/releases)\n[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/helm-drift)](https://artifacthub.io/packages/search?repo=helm-drift)\n\nThe Helm plugin that comes in handy while identifying configuration drifts (mostly due to in-place edits) from the deployed Helm charts.\n\n## Introduction\n\nDeploying resources on Kubernetes through the Helm package manager offers simplicity, but maintaining them can be challenging.\n\nWhile Helm ideally manages all resources, manual interventions are sometimes necessary, leading to configuration discrepancies from the deployed Helm charts. \u003c/br\u003eThese changes risk being overwritten by subsequent Helm releases, potentially resulting in lost configurations.\n\nThe Helm Drift plugin aims to address this issue by validating resources associated with a specific chart or release against Kubernetes. Leveraging kubectl [diff](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#diff) functionality, it identifies any discrepancies or drifts in configurations.\n\nFor further insights into the motivation behind creating this plugin, check out the accompanying blog post [blog](https://medium.com/@nikhilsbhat93/helm-plugin-to-identify-the-configuration-that-has-drifted-away-from-the-deployed-helm-release-72f05d26d8cf).\n\n### Example\n```shell\n# rendering summary to table would render drifts in below format.\nhelm drift run prometheus-standalone example/chart/sample/ -f ~/path/to/example/chart/sample/override-config.yaml --skip-cleaning\n       KIND      |         NAME          | DRIFT\n-----------------|-----------------------|---------\n  ServiceAccount | sample                | NO\n  Service        | sample                | NO\n  DaemonSet      | fluentd-elasticsearch | NO\n  Pod            | nginx                 | NO\n  Pod            | nginx-2               | NO\n  ReplicaSet     | frontend              | NO\n  Deployment     | sample                | NO\n  StatefulSet    | web                   | YES\n  Job            | pi                    | NO\n  CronJob        | hello                 | NO\n-----------------|-----------------------|---------\n                          STATUS         | FAILED\n                 ------------------------|---------\nNamespace: 'sample' Release: 'sample'\n\n# Invoking command without any output format would render detailed drifts as below.\nhelm drift run prometheus-standalone example/chart/sample/ -f ~/path/to/example/chart/sample/override-config.yaml --skip-cleaning\n# executing above command would yield results something like below:\n--------------------------------------------------------------------------------------------------\nRelease                                : sample\n------------------------------------------------------------------------------------\nIdentified drifts in: 'StatefulSet' 'web'\n\n-----------\ndiff -u -N /var/folders/dm/40_kbx_56psgqt29q0wh2cxh0000gq/T/LIVE-1098999488/apps.v1.StatefulSet.sample.web /var/folders/dm/40_kbx_56psgqt29q0wh2cxh0000gq/T/MERGED-836230905/apps.v1.StatefulSet.sample.web\n--- /var/folders/dm/40_kbx_56psgqt29q0wh2cxh0000gq/T/LIVE-1098999488/apps.v1.StatefulSet.sample.web\t2024-07-07 18:39:33\n+++ /var/folders/dm/40_kbx_56psgqt29q0wh2cxh0000gq/T/MERGED-836230905/apps.v1.StatefulSet.sample.web\t2024-07-07 18:39:33\n@@ -5,7 +5,7 @@\n     meta.helm.sh/release-name: sample\n     meta.helm.sh/release-namespace: sample\n   creationTimestamp: \"2024-07-07T11:32:21Z\"\n-  generation: 3\n+  generation: 4\n   labels:\n     app.kubernetes.io/managed-by: Helm\n   name: web\n@@ -15,7 +15,7 @@\n spec:\n   minReadySeconds: 10\n   podManagementPolicy: OrderedReady\n-  replicas: 2\n+  replicas: 3\n   revisionHistoryLimit: 10\n   selector:\n     matchLabels:\n@@ -28,7 +28,7 @@\n         app: nginx\n     spec:\n       containers:\n-      - image: k8s.gcr.io/nginx-slim:0.9\n+      - image: k8s.gcr.io/nginx-slim:0.8\n         imagePullPolicy: IfNotPresent\n         name: nginx\n         ports:\n-----------\n\n------------------------------------------------------------------------------------\nOOPS...! DRIFTS FOUND\n------------------------------------------------------------------------------------\nTotal time spent on identifying drifts : 0.383524375\nTotal number of drifts found           : YES\nStatus                                 : FAILED\n------------------------------------------------------------------------------------\n```\n\n## Suggestion\n\nTry using the drift plugin with a custom diff tool instead for better results. **Ex**: diff tool, [dyff](https://github.com/homeport/dyff), This can be used by setting the flag `--custom-diff`\n\n```shell\nhelm drift run prometheus-standalone -n monitoring --from-release --custom-diff \"dyff between --omit-header --set-exit-code\"\n```\n\n## Installation\n\n```shell\nhelm plugin install https://github.com/nikhilsbhat/helm-drift\n```\nUse the executable just like any other go-cli application.\n\n## Usage\n\n```bash\nhelm drift [command] [flags]\n```\nMake sure the appropriate command is used for the actions. To check the available commands and flags, use `helm drift --help`\n\n```bash\nIdentifies configuration drifts (mostly due to in-place edits) in the Kubernetes workloads provisioned via Helm charts.\n\nUsage:\n  drift [command] [flags]\n\nAvailable Commands:\n  all         Identifies drifts from all releases from the cluster.\n  completion  Generate the autocompletion script for the specified shell\n  help        Help about any command\n  run         Identifies drifts from a selected chart or release.\n  version     Command to fetch the version of helm-drift installed\n\nFlags:\n      --concurrency int          the value to be set for flag --concurrency of 'kubectl diff' (default 1)\n  -h, --help                     help for drift\n  -l, --log-level string         log level for the plugin helm drift (defaults to info) (default \"info\")\n      --no-color                 enabling this would render output with no color\n      --revision int             revision of your release from which the drifts to be detected\n      --set stringArray          set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)\n      --set-file stringArray     set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2)\n      --set-string stringArray   set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)\n      --skip-crds                setting this would set '--skip-crds' for helm template command while generating templates\n      --skip-tests               setting this would set '--skip-tests' for helm template command while generating templates\n      --validate                 setting this would set '--validate' for helm template command while generating templates\n  -f, --values ValueFiles        specify values in a YAML file (can specify multiple) (default [])\n      --version string           specify a version constraint for the chart version to use, the value passed here would be used to set --version for helm template command while generating templates\n\n\nUse \"drift [command] --help\" for more information about a command.\n```\n\n## Commands\n### `run`\n\n```shell\nIt lists all configuration drifts that are part of the specified chart or release, if one exists.\n\nUsage:\n  drift run [RELEASE] [CHART] [flags]\n\nExamples:\nhelm drift run prometheus-standalone path/to/chart/prometheus-standalone -f ~/path/to/override-config.yaml\nhelm drift run prometheus-standalone --from-release\n\nFlags:\n      --consider-hooks                      when this is enabled, the flag 'ignore-hooks' holds no value\n      --custom-diff KUBECTL_EXTERNAL_DIFF   custom diff command to use instead of default, the command passed here would be set under KUBECTL_EXTERNAL_DIFF.More information can be found here https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#diff\n  -d, --disable-error-on-drift              enabling this would disable exiting with error if drifts were identified\n      --from-release                        enable the flag to identify drifts from a release instead (disabled by default, works with command 'run' not with 'all')\n  -h, --help                                help for run\n      --ignore-hooks strings                list of hooks to ignore while identifying the drifts (default [hook-succeeded,hook-failed])\n      --ignore-hpa-changes                  when enabled, the drifts caused on workload due to hpa scaling would be ignored\n      --kind strings                        kubernetes resource names to limit the drift identification (--kind takes higher precedence over --name)\n      --name string                         name of the kubernetes resource to limit the drift identification\n  -o, --output string                       the format to which the output should be rendered to, it should be one of yaml|json|table, if nothing specified it sets to default\n      --regex string                        regex used to split helm template rendered (default \"---\\\\n# Source:\\\\s.*.\")\n      --skip strings                        kubernetes resource names to skip the drift identification (ex: --skip Deployments)\n      --skip-cleaning                       enable the flag to skip cleaning the manifests rendered on to disk\n      --skip-validation                     enable the flag if prerequisite validation needs to be skipped\n      --temp-path string                    path on disk where the helm templates would be rendered on to (the same would be used be used by 'kubectl diff') (default \"/Users/nikhil.bhat/.helm-drift/templates\")\n\nGlobal Flags:\n      --concurrency int          the value to be set for flag --concurrency of 'kubectl diff' (default 1)\n  -l, --log-level string         log level for the plugin helm drift (defaults to info) (default \"info\")\n      --no-color                 enabling this would render output with no color\n      --revision int             revision of your release from which the drifts to be detected\n      --set stringArray          set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)\n      --set-file stringArray     set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2)\n      --set-string stringArray   set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)\n      --skip-crds                setting this would set '--skip-crds' for helm template command while generating templates\n      --skip-tests               setting this would set '--skip-tests' for helm template command while generating templates\n      --validate                 setting this would set '--validate' for helm template command while generating templates\n  -f, --values ValueFiles        specify values in a YAML file (can specify multiple) (default [])\n      --version string           specify a version constraint for the chart version to use, the value passed here would be used to set --version for helm template command while generating templates\n```\n\n### `all`\n\n```shell\nIt lists all configuration drifts that are part of various releases present in the cluster.\nDo note that this is expensive operation since multiple kubectl command would be executed in parallel.\n\nUsage:\n  drift all [flags]\n\nExamples:\nhelm drift all --kube-context k3d-sample\nhelm drift all --kube-context k3d-sample -n sample\n\nFlags:\n      --consider-hooks                      when this is enabled, the flag 'ignore-hooks' holds no value\n      --custom-diff KUBECTL_EXTERNAL_DIFF   custom diff command to use instead of default, the command passed here would be set under KUBECTL_EXTERNAL_DIFF.More information can be found here https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#diff\n  -d, --disable-error-on-drift              enabling this would disable exiting with error if drifts were identified\n  -h, --help                                help for all\n      --ignore-hooks strings                list of hooks to ignore while identifying the drifts (default [hook-succeeded,hook-failed])\n      --ignore-hpa-changes                  when enabled, the drifts caused on workload due to hpa scaling would be ignored\n      --is-default-namespace                set this flag if drifts have to be checked specifically in 'default' namespace\n      --kind strings                        kubernetes resource names to limit the drift identification (--kind takes higher precedence over --name)\n      --name string                         name of the kubernetes resource to limit the drift identification\n  -o, --output string                       the format to which the output should be rendered to, it should be one of yaml|json|table, if nothing specified it sets to default\n      --regex string                        regex used to split helm template rendered (default \"---\\\\n# Source:\\\\s.*.\")\n      --skip strings                        kubernetes resource names to skip the drift identification (ex: --skip Deployments)\n      --skip-cleaning                       enable the flag to skip cleaning the manifests rendered on to disk\n      --skip-release stringArray            list of helm releases to be skipped for identifying helm drifts, ex: ReleaseName=Namespace | ReleaseName=Namespace\n      --skip-validation                     enable the flag if prerequisite validation needs to be skipped\n      --temp-path string                    path on disk where the helm templates would be rendered on to (the same would be used be used by 'kubectl diff') (default \"/Users/nikhil.bhat/.helm-drift/templates\")\n\nGlobal Flags:\n      --concurrency int          the value to be set for flag --concurrency of 'kubectl diff' (default 1)\n  -l, --log-level string         log level for the plugin helm drift (defaults to info) (default \"info\")\n      --no-color                 enabling this would render output with no color\n      --revision int             revision of your release from which the drifts to be detected\n      --set stringArray          set values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)\n      --set-file stringArray     set values from respective files specified via the command line (can specify multiple or separate values with commas: key1=path1,key2=path2)\n      --set-string stringArray   set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2)\n      --skip-crds                setting this would set '--skip-crds' for helm template command while generating templates\n      --skip-tests               setting this would set '--skip-tests' for helm template command while generating templates\n      --validate                 setting this would set '--validate' for helm template command while generating templates\n  -f, --values ValueFiles        specify values in a YAML file (can specify multiple) (default [])\n      --version string           specify a version constraint for the chart version to use, the value passed here would be used to set --version for helm template command while generating templates\n```\n\n## Documentation\n\nUpdated documentation on all available commands and flags can be found [here](https://github.com/nikhilsbhat/helm-drift/blob/master/docs/doc/drift.md).\n\n## Caveats\n\nIdentifying drifts on `CRDs` would be tricky, and the plugin might not respond with the correct data.\n\nIf helm hooks are defined in the chart with `hook-succeeded` or `hook-failed`, one might always find drifts when identifying drifts from charts.\u003c/br\u003e\nThings would work perfectly when identifying drifts from the installed release.\n\nSupport for adding a `flag` to skip helm `hooks` if required, is under development.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilsbhat%2Fhelm-drift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnikhilsbhat%2Fhelm-drift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilsbhat%2Fhelm-drift/lists"}