dbt-vitals
Its a static analysis and health scoring for dbt projects — the "cargo clippy for dbt."
Unlike a SQL linter (indentation, keyword casing), dbt-vitals looks at your
project's structure: dead models, missing tests, duplicated business logic,
documentation coverage, and (given warehouse stats) incremental-model
candidates. It parses manifest.json / catalog.json — the artifacts dbt
already generates — so it needs no warehouse credentials of its own.
Overall Health
76/100
Warnings: 8 Critical: 0 Info: 4
What it checks
| Module | What it flags | Needs catalog.json? |
|---|---|---|
| Lineage | Dead/unused models, circular dependencies | No |
| Testing | Models missing unique/not_null on their likely primary key |
No |
| Duplicate Logic | Repeated CASE WHEN blocks across models (candidates for a macro) |
No |
| Documentation | Model/column description coverage % | No |
| Incremental Candidates | Large table-materialized models that could be incremental |
Yes |
Local setup
Requires Python 3.9+.
git clone https://github.com/shivah12/dbt-vitals.git
cd dbt-vitals
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
Run the test suite against the bundled synthetic example project:
pytest
Try the CLI against the bundled example (no real dbt project needed):
dbt-vitals analyze . --manifest examples/sample_manifest.json --catalog examples/sample_catalog.json
Run it against a real dbt project:
cd /path/to/your/dbt/project
dbt compile # or `dbt docs generate` to also get catalog.json
dbt-vitals analyze .
CLI options
dbt-vitals analyze <target_dir> # target_dir defaults to "."
--manifest PATH # override manifest.json location
--catalog PATH # override catalog.json location
--json # machine-readable output
--ci-comment # markdown summary for a PR comment
--fail-under N # exit 1 if health score < N (CI gating)
CI integration
.github/workflows/dbt-vitals.yml is included — it runs dbt-vitals on every
PR, posts the health score as a comment, and fails the build if the score
drops below a threshold. Adjust the dbt compile step for your adapter/profile.
Known limitations (by design, for v0.1)
- Duplicate detection only looks at
CASE WHENexpressions, not arbitrary repeated subqueries or joins. - Incremental candidates use a fixed row-count threshold, not a real cost/runtime estimate — that would require warehouse-specific query plans.
- Primary key inference for the testing module is a naming heuristic
(
id,<model>_id, or any*_idcolumn) since dbt's manifest has no first-class primary key concept. - No plugin system yet (warehouse-specific checks) — deliberately deferred, see the original scoping notes for why.
License
MIT — see LICENSE.
Release files for dbt-vitals 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dbt_vitals-0.1.3.tar.gz | 16.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dbt_vitals-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.8 kB
Release files / dbt_vitals-0.1.3.tar.gz
| Download URL | dbt_vitals-0.1.3.tar.gz |
|---|---|
| Size | 16.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
496d6ddef540309c7bfcfde057cee3108817b4303da08b626df12a08987c1d05
|
|
BLAKE2b-256 checksum How to use checksums |
e00e6283689ea74b07341002b9063066a40caa126ae96b1dd4f2c9c843151163
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.1
|
Release files / dbt_vitals-0.1.3-py3-none-any.whl
| Download URL | dbt_vitals-0.1.3-py3-none-any.whl |
|---|---|
| Size | 17.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
232e3bf98c7618f08c6c807a60e0d8746f76c231cd6a9240b9c1088b9f955e8e
|
|
BLAKE2b-256 checksum How to use checksums |
cfd434aac09bf89b1ed027a298a7a5ebd8704632de98ebd1c48a3b9f469d9473
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.1
|