{"id":51222437,"url":"https://github.com/vlad-ds/cfgdrift","last_synced_at":"2026-06-28T08:30:26.658Z","repository":{"id":361579454,"uuid":"1255004029","full_name":"vlad-ds/cfgdrift","owner":"vlad-ds","description":"Fast CI-friendly config drift detection for JSON, YAML, TOML, and .env","archived":false,"fork":false,"pushed_at":"2026-05-31T10:28:12.000Z","size":21,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T11:11:40.033Z","etag":null,"topics":["ci","cli","config","devops","diff","rust"],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/vlad-ds.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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-31T09:21:16.000Z","updated_at":"2026-05-31T10:30:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/vlad-ds/cfgdrift","commit_stats":null,"previous_names":["vlad-ds/cfgdrift"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/vlad-ds/cfgdrift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vlad-ds%2Fcfgdrift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vlad-ds%2Fcfgdrift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vlad-ds%2Fcfgdrift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vlad-ds%2Fcfgdrift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vlad-ds","download_url":"https://codeload.github.com/vlad-ds/cfgdrift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vlad-ds%2Fcfgdrift/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34882751,"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-28T02:00:05.809Z","response_time":54,"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":["ci","cli","config","devops","diff","rust"],"created_at":"2026-06-28T08:30:23.856Z","updated_at":"2026-06-28T08:30:26.653Z","avatar_url":"https://github.com/vlad-ds.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cfgdrift\n\n[![CI](https://github.com/vlad-ds/cfgdrift/actions/workflows/ci.yml/badge.svg)](https://github.com/vlad-ds/cfgdrift/actions/workflows/ci.yml)\n\n`cfgdrift` is a fast Rust CLI for finding semantic drift between config files or config directories. It understands JSON, YAML, TOML, and `.env`, redacts secret-looking values by default, and emits human, JSON, or Markdown output for local review and CI.\n\nPlain `diff` is noisy for config review because it sees formatting, key order, and quote changes. Format-specific tools help, but teams usually keep mixed config trees. `cfgdrift` compares the parsed settings and reports the field paths that actually changed.\n\n## Install\n\n```sh\ncargo install --git https://github.com/vlad-ds/cfgdrift\n```\n\nOr run from a checkout:\n\n```sh\ncargo run -- diff examples/baseline examples/candidate\n```\n\n## Quick Start\n\n```sh\ncfgdrift diff config/prod config/staging\n```\n\nExample output:\n\n```text\ncfgdrift found 5 drifts between examples/baseline and examples/candidate\n\n~ app.toml:database.password\n  baseline:  \u003credacted\u003e\n  candidate: \u003credacted\u003e\n\n~ app.toml:database.pool\n  baseline:  8\n  candidate: 16\n\n~ app.toml:features.checkout_v2\n  baseline:  false\n  candidate: true\n\n~ settings.env:PUBLIC_URL\n  baseline:  \"https://example.com\"\n  candidate: \"https://staging.example.com\"\n\n~ settings.env:STRIPE_SECRET_KEY\n  baseline:  \u003credacted\u003e\n  candidate: \u003credacted\u003e\n```\n\nUse `--format markdown` for PR comments:\n\n```sh\ncfgdrift diff config/prod config/staging --format markdown\n```\n\nUse `--format json` for automation:\n\n```sh\ncfgdrift diff config/prod config/staging --format json --exit-zero\n```\n\n## Why This Exists\n\nConfig drift is easy to miss and hard to review cleanly. Production, staging, CI, and local config often live in different files and formats, while normal text diffs mix real setting changes with formatting, ordering, and quoting noise.\n\n`cfgdrift` focuses on the parsed configuration values and reports stable field-level changes that are useful in terminals, pull requests, and automation.\n\n## Supported Inputs\n\n- JSON: `.json`\n- YAML: `.yaml`, `.yml`\n- TOML: `.toml`\n- dotenv: `.env`, `.env.*`, `.env` extension\n\nWhen comparing directories, unsupported files are ignored. `cfgdrift` skips `.git`, `target`, and `node_modules`.\n\n## Ignore Rules\n\nIgnore a path directly:\n\n```sh\ncfgdrift diff prod staging --ignore database.pool\n```\n\nUse an ignore file:\n\n```sh\ncfgdrift diff prod staging --ignore-file .cfgdriftignore\n```\n\n`.cfgdriftignore` supports blank lines, `#` comments, direct suffix matches, and glob patterns:\n\n```gitignore\n# noisy deploy metadata\nbuild.generated_at\n*.yaml:metadata.revision\nsecrets.*\n```\n\n## Exit Codes\n\n- `0`: no drift, or drift was found with `--exit-zero`\n- `1`: drift found\n- `2`: input, parse, or runtime error\n\n## Commands\n\n```sh\ncfgdrift diff \u003cbaseline\u003e \u003ccandidate\u003e [OPTIONS]\ncfgdrift formats\n```\n\nUseful flags:\n\n- `--format human|json|markdown`\n- `--ignore \u003cPATTERN\u003e`\n- `--ignore-file \u003cPATH\u003e`\n- `--summary-only`\n- `--no-redact`\n- `--exit-zero`\n\n## Development\n\n```sh\ncargo fmt --check\ncargo clippy --all-targets -- -D warnings\ncargo test\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvlad-ds%2Fcfgdrift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvlad-ds%2Fcfgdrift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvlad-ds%2Fcfgdrift/lists"}