DataverseDrift 1.2.2

dotnet tool install --global DataverseDrift --version 1.2.2
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local DataverseDrift --version 1.2.2
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=DataverseDrift&version=1.2.2
                    
nuke :add-package DataverseDrift --version 1.2.2
                    

DataverseDrift

Several people are editing the same Dataverse environment, and nobody can say what moved. Forms, views, entities and flows all change in place, in a shared DEV or TEST box, with no commit, no author, and no record.

dvdrift answers it. Point it at two snapshots and it reports what changed, who changed it, and what got left running - like the cloud flow somebody activated to try something and never switched off. No AI: identical inputs always produce byte-identical output.

Raw XML diffs can't do this. Dataverse re-serializes solution XML on every export, drowning real changes in thousands of lines of noise - and a diff only sees what changed, so the flow quietly running in TEST since March never appears in one. dvdrift canonicalizes the noise away, classifies what's left, and joins attribution and flow state from the Dataverse Web API.

Install

dotnet tool install --global DataverseDrift

Runs on .NET 8 or .NET 10. The diff works fully offline; only the attribution join needs API access.

Usage

# Two snapshots in, one report out
dvdrift baseline.zip current.zip

# JSON to a file, gate the pipeline on any change
dvdrift snapshots/monday snapshots/tuesday --format json --out report.json --fail-on-change

# Join attribution and flow state from Dataverse
dvdrift baseline current --url https://org-test.crm4.dynamics.com   --tenant-id $TENANT --client-id $APP --client-secret $SECRET

Snapshots can be a solution .zip, a container zip/folder of several, a raw extract, or a pac-unpacked folder. Output is Markdown (default) or JSON.

CI/CD

You produce the two snapshots, dvdrift compares them - storage- and CI-agnostic. Both integrations below keep credentials out of command lines and leave gating to you (off by default).

GitHub Actions (reference):

- uses: jakobhoeg/dvdrift@v1
  id: diff
  with:
    baseline: baseline/
    current: current.zip
    url: ${{ vars.DEV_URL }}
    client-id: ${{ secrets.DATAVERSE_APP_ID }}
    client-secret: ${{ secrets.DATAVERSE_CLIENT_SECRET }}
    tenant-id: ${{ secrets.TENANT_ID }}
# report lands in the job summary; steps.diff.outputs.changed is 'true' / 'false'

Azure Pipelines (reference):

- template: pipelines/templates/dvdrift-steps.yml@dvdrift
  parameters:
    baseline: $(Pipeline.Workspace)/baseline
    current: $(Build.ArtifactStagingDirectory)/current.zip
    url: $(DataverseUrl)
# report goes to the build summary and an artifact; $(dvdrift.changed) is set

End-to-end recipes: bring your own export · GitHub Actions + pac · Azure Pipelines + Build Tools · scheduled drift check

Roadmap

  • v1.x - field-level structural form/entity diffing; plugin step enabled/disabled flags; entity/attribute metadata attribution

License

MIT · Changelog

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
1.2.2 112 8/30/2026
1.2.1 101 8/29/2026
1.2.0 123 8/25/2026
1.1.1 103 8/25/2026
1.1.0 116 8/23/2026
1.0.0 107 8/23/2026
0.0.0-alpha.0.4 63 8/23/2026