Skip to main content

Diff visualizer for Databricks bundle plans — resources and job DAGs

Project description

Dagshund

Colored diff summaries and interactive DAG visualizations for Databricks Asset Bundles. Requires a plan file from the direct deployment engine (databricks bundle plan -o json). See what changed, what's new, and what's being deleted, in your terminal or in the browser.

Dagshund resource graph

Install

Requires Python 3.12+.

# Run without installing (ephemeral)
uvx dagshund plan.json

# Persistent install
uv tool install dagshund

# Traditional pip
pip install dagshund

Usage

By default, dagshund prints a colored text diff to the terminal:

dagshund plan.json

Terminal output

Export an interactive HTML visualization with -o:

dagshund plan.json -o report.html

Open it in the browser automatically with -b:

dagshund plan.json -o report.html -b

Reads from stdin, so you can pipe directly from the Databricks CLI:

databricks bundle plan -o json | dagshund
databricks bundle plan -o json | dagshund -o report.html

Dagshund works anywhere, it just needs a plan JSON file. You don't need to run it from inside your bundle directory.

Use -e for CI-friendly exit codes (see CI Exit Codes).

Interactive Visualization

The HTML report shows your resources as an interactive graph with diff highlighting. Resources are organized into visual groups:

  • Workspace, jobs, alerts, experiments, pipelines, and other bundle resources
  • Unity Catalog, catalogs, schemas, volumes, and registered models in their hierarchy
  • Lakebase, database instances and synced tables (when present, flat resources move into an "Other Resources" group)

Click any node to open a detail panel with per-field structural diffs, old values in red, new values in green, unchanged fields for context.

Structural diff detail panel

Jobs with task dependencies get their own DAG view. Switch between the Resources and Jobs tabs to navigate between them.

Job task DAG

Phantom Nodes

If your schema references a parent catalog that isn't in your bundle, dagshund infers it and adds it to the graph as a phantom node (shown with a dashed border). Hierarchy phantoms like these always display because they hold the tree together. Inferred leaf nodes (like a warehouse referenced by an alert) can be toggled on or off with the Inferred leaf nodes button in the toolbar.

Phantom nodes

Lateral Dependencies

Many resources reference each other across hierarchies, an alert might target a SQL warehouse, or a serving endpoint might bind to a registered model. These relationships are hidden by default to keep the graph clean. Toggle Lateral dependencies in the toolbar to see how your resources connect across group boundaries.

Lateral dependencies

Search

The search bar filters nodes by name or type. Non-matching nodes dim so matches stand out.

  • Type a name to filter: warehouse, analytics
  • Wrap in quotes for exact match: "analytics" finds only that node, not analytics_pipeline
  • Prefix with type: to filter by badge: type:wheel highlights all wheel tasks
  • Prefix with status: to filter by diff status: status:added, status:modified, status:removed
  • Press Escape to clear

The diff filter buttons (Added, Modified, Removed) compose with search, when both are active, only nodes matching both criteria stay highlighted. When exactly one node matches, the viewport auto-centers on it.

CI Exit Codes

Use --detailed-exitcode (or -e) for machine-readable exit codes in CI pipelines:

dagshund plan.json -e
Exit Code Meaning
0 Plan parsed, no changes detected
1 Error (bad input, missing file, etc.)
2 Plan parsed, changes detected
# Check for drift
dagshund plan.json -e
if [ $? -eq 2 ]; then echo "Drift detected"; fi

# Generate report AND get exit code
dagshund plan.json -o report.html -e

Without -e, dagshund always exits 0 on success.

Contributing

Dagshund is a solo project and I'm not accepting pull requests at this time. If you run into a bug or have a feature request, please open an issue, I'm happy to hear what you need.

Development

Requires Bun 1.3+, uv, and just.

just install        # Install dependencies
just dev            # Dev server with hot reload (http://localhost:3000)
just build          # JS template + Python wheel
just check          # Lint + typecheck + all tests

For Claude Code LSP support (go-to-definition, type hover, find-references), install the language server binaries:

bun install -g pyright typescript-language-server typescript

The plugins are already configured in .claude/settings.json.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dagshund-0.2.0.tar.gz (1.6 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dagshund-0.2.0-py3-none-any.whl (761.8 kB view details)

Uploaded Python 3

File details

Details for the file dagshund-0.2.0.tar.gz.

File metadata

  • Download URL: dagshund-0.2.0.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for dagshund-0.2.0.tar.gz
Algorithm Hash digest
SHA256 389188d8ab0311b82c8b8f7fbdd55bfd061fbe95bf6bc16f7e14bab990025dd6
MD5 150df3f47571fea2d659f5348c01f01a
BLAKE2b-256 acf9bef94ea14c98f824d699932c402059f38ce2f80cad614407f2453711d404

See more details on using hashes here.

File details

Details for the file dagshund-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: dagshund-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 761.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for dagshund-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8c6e31554c47a4d9ef75a41054ee20cc94a37ce5515148f33a407f57d3b38474
MD5 7589c37df4262fb63a598a9cfc096cab
BLAKE2b-256 ee40d9c331ebb6bfff278b99b3f06827ea5c46e1326324f396c88356889d7d42

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page