Semantic diff tool for structured data (JSON/YAML/TOML/XML/INI/CSV). Ignores key ordering and whitespace, shows only meaningful changes.
Traditional diff doesn't understand structure:
$ diff config_v1.json config_v2.json
< {
<"name": "myapp",
<"version": "1.0"< }
> {
>"version": "1.1",
>"name": "myapp"> }A simple key reordering shows every line as changed.
diffx shows only semantic changes:
$ diffx config_v1.json config_v2.json
~ version: "1.0" ->"1.1"# As CLI tool
cargo install diffx
# As library (Cargo.toml)
[dependencies]
diffx-core = "0.6"# Basic
diffx file1.json file2.json
# Output example~ version: "1.0" ->"1.1"
+ features[0]: "new-feature"
- deprecated: "old-value"JSON, YAML, TOML, XML, INI, CSV (auto-detected by extension, use --format to override)
--output json|yaml # Machine-readable output
--quiet # Return only exit code (0: same, 1: diff found)
--ignore-keys-regex RE # Ignore keys matching regex
--array-id-key KEY # Identify array elements by KEY for comparison
--epsilon N # Float comparison tolerance
--ignore-case # Case-insensitive comparison
--ignore-whitespace # Ignore whitespace differences
-r, --recursive # Recursive directory comparison+Added-Removed~Modified!Type changed
# Detect config changesif! diffx config/prod.json config/staging.json --quiet;thenecho"Config has changed"
diffx config/prod.json config/staging.json --output json > changes.json
fi# Compare ignoring timestamps and metadata
diffx api_v1.json api_v2.json --ignore-keys-regex "^(timestamp|updated_at)$"See diffx-cli/tests/cmd/ for executable examples:
MIT