Bridge the gap between conceptual models and your lakehouse
Project description
Conceptual modeling without the ceremony. Shared vocabulary for data teams who don't have time for meetings.
If you've ever taken a photo of the whiteboard after a meeting to capture the model — this is for you.
The Problem
What Died
The data architect would sit down with business stakeholders and SMEs, sketch boxes and lines on a whiteboard until everyone nodded. That whiteboard became a conceptual model in Erwin or PowerDesigner. From there, a logical model — normalized, pristine. From the logical, a physical model. Then down to the engineers: "We're building this."
Business would come back: "We need more." Back to the whiteboard. Back to the ivory tower. Update the conceptual, refresh the logical, derive an updated physical. Back to the engineers: "We're changing this, adding that."
Repeat ad infinitum. Or at least, repeat quarterly — because that's how fast this process could move.
It worked when releases shipped quarterly. It worked when teams were co-located. It worked when the data architect owned the timeline. Then it stopped working.
What Replaced It
Engineer autonomy. dbt democratized transformation. Teams ship daily. The architect who says "wait for the model" gets routed around. No gatekeepers, no handoffs, no time for the ivory tower round-trip.
What That Created
The whiteboard session on day one is now the last moment of shared understanding. After that:
- Models proliferate without coherence
- Naming conventions drift
- Concepts duplicate across teams
- Tribal knowledge calcifies
- Nobody knows what "customer" means anymore
The conceptual→logical→physical cascade is gone. But nothing replaced the thinking it forced. We kept the speed, lost the shared vocabulary.
The Solution
The boxes on the whiteboard were never the problem. They still work. They still create shared understanding in five minutes.
The problem was everything after the boxes — the cascade into logical models, physical models, DDL generation, change management. That couldn't keep pace.
dbt-conceptual stops at the boxes. But connects them to reality.
- Define concepts and relationships in YAML
- Tag dbt models with
meta.concept - See which concepts are implemented, which are missing
- Surface new concepts in CI/CD: "This PR introduces
Refund— no definition yet"
No logical model. No physical derivation. Just shared vocabulary that lives with the code.
"Just enough architecture to stay sane."
"The Stoic's choice for conceptual modeling in the modern world."
"Architecture that ships with the code."
Who This Is For
For architects who write code and engineers who think in systems.
- The player-coach who advises without blocking
- The senior engineer everyone asks "what does this table mean?"
- The data lead who notices drift before it compounds
If you've ever drawn boxes on a whiteboard and wished they stayed current — this is for you.
What This Isn't
- Not an enterprise data catalog — feeds Collibra/Purview/Alation, doesn't replace them
- Not a deployment gate — surfaces information, doesn't block PRs
- Not Erwin-in-git — no logical models, no DDL generation, no attribute-level detail
- Not self-sustaining — requires someone to care about shared vocabulary
If nobody owns the conceptual model, this tool won't fix that. That's an org problem, not a tooling problem.
⚠️ Opinionated by Design
This tool assumes:
- dbt as your transformation layer
- Medallion architecture — Silver → Gold (Bronze inferred from lineage)
- Dimensional modeling in Gold — dims, facts, bridges
If that's your stack, this fits naturally. If not, no judgment — just not the target use case.
What's flexible:
- Folder paths are configurable (
models/staging→ silver,models/marts→ gold) - Single or shared
schema.ymlfiles - Your existing dbt organizational patterns (groups, tags, etc.)
Installation
# No signup. No telemetry. No "please star this repo" popups.
pip install dbt-conceptual
Quick Start
# Initialize conceptual model
dbt-conceptual init
# Creates models/conceptual/conceptual.yml
# Define your business concepts (edit the file)
# View coverage
dbt-conceptual status
# Launch interactive UI
dbt-conceptual serve
# Validate in CI
dbt-conceptual validate
# Export diagram
dbt-conceptual export --format png -o diagram.png
How It Works
1. Define Concepts
Create models/conceptual/conceptual.yml:
version: 1
domains:
party:
name: "Party"
transaction:
name: "Transaction"
catalog:
name: "Catalog"
concepts:
customer:
name: "Customer"
domain: party
owner: customer_team
definition: "A person or company that purchases products"
order:
name: "Order"
domain: transaction
owner: orders_team
definition: "A confirmed purchase by a customer"
product:
name: "Product"
domain: catalog
owner: catalog_team
definition: "An item available for purchase"
relationships:
- name: places
from: customer
to: order
cardinality: "1:N"
- name: contains
from: order
to: product
cardinality: "N:M"
2. Tag dbt Models
Add meta.concept to dimensions:
# models/gold/dim_customer.yml
models:
- name: dim_customer
meta:
concept: customer
Add meta.realizes to facts and bridges:
# models/gold/fact_order_lines.yml
models:
- name: fact_order_lines
meta:
realizes:
- customer:places:order
- order:contains:product
3. Validate & Visualize
# Check everything links up
dbt-conceptual validate
# See coverage
dbt-conceptual status
# Open visual editor
dbt-conceptual serve
Features
📊 Coverage Tracking
See which concepts are implemented at each layer:
Status logic:
| Status | Meaning |
|---|---|
complete |
Has domain AND has implementing models |
draft |
Missing domain OR zero implementing models |
stub |
Created from sync — needs enrichment |
🎨 Interactive Web UI
pip install dbt-conceptual[serve]
dbt-conceptual serve
- Visual canvas editor — drag concepts, draw relationships
- Property panel — edit definitions, owners, domains
- Real-time sync — changes save directly to
conceptual.yml - Coverage and Bus Matrix views built in
✅ CI Validation
Catch drift before it ships:
CI/CD integration:
# .github/workflows/ci.yml
- name: Validate conceptual model
run: |
dbt-conceptual validate --no-drafts --format markdown >> $GITHUB_STEP_SUMMARY
The --no-drafts flag fails if any concepts or relationships are incomplete — useful for enforcing coverage standards. Use --format markdown to show validation results as a formatted job summary.
🔀 Pull Request Integration
See what changed in your conceptual model:
Surface conceptual changes in PR reviews. Know when someone adds a new business concept or modifies an existing definition.
GitHub Actions job summaries:
Use --format markdown to create rich visual summaries in GitHub Actions:
# .github/workflows/conceptual-diff.yml
- name: Show conceptual changes
run: |
dbt-conceptual diff --base main --format markdown >> $GITHUB_STEP_SUMMARY
The output renders as formatted tables with emoji indicators in the Actions UI.
🔍 Validation & Messages
Click sync to reveal drift between your conceptual model and reality:
| Type | Meaning |
|---|---|
| Error ⊘ | Broken references, duplicate concept names |
| Warning ⚠ | Missing models in project, stubs created |
| Info ℹ | Successful mappings, sync summary |
Ghost concepts appear when relationships reference undefined concepts. They're visual placeholders — edit and save to make them real, or fix the underlying reference.
See Validation Guide for resolution steps.
🔄 Bi-Directional Sync
Top-down: Define concepts in YAML, associate them with models via the UI.
Bottom-up: Already have a dbt project with meta.concept tags? Generate stubs:
dbt-conceptual sync --create-stubs
# Output:
# Created 12 concept stubs
# Created 8 relationship stubs
# Run 'dbt-conceptual status' to see what needs enrichment
📤 Export Formats
# PNG — visual canvas diagram
dbt-conceptual export --format png -o diagram.png
# Coverage report — HTML dashboard
dbt-conceptual export --format coverage -o coverage.html
# Bus matrix — dimensions vs facts
dbt-conceptual export --format bus-matrix -o bus-matrix.html
Layer Model
| Layer | Tagged How | Editable |
|---|---|---|
| Gold | meta.concept in model.yml within gold_paths |
Yes |
| Silver | meta.concept in model.yml within silver_paths |
Yes |
| Bronze | Inferred from manifest.json lineage | No (read-only) |
Bronze requires no tagging. It surfaces automatically — showing which sources feed your concepts.
Configuration
Works out of the box. Override in dbt_project.yml if needed:
vars:
dbt_conceptual:
conceptual_path: models/conceptual # default
silver_paths:
- models/silver
- models/staging
gold_paths:
- models/gold
- models/marts
CLI Reference
| Command | Description |
|---|---|
dbt-conceptual init |
Initialize conceptual.yml |
dbt-conceptual status |
Show coverage by domain |
dbt-conceptual orphans |
List untagged models (no meta.concept or meta.realizes) |
dbt-conceptual validate |
Validate model integrity |
dbt-conceptual validate --no-drafts |
Fail CI if drafts/stubs exist |
dbt-conceptual sync |
Sync from dbt project |
dbt-conceptual sync --create-stubs |
Create stubs for undefined concepts |
dbt-conceptual serve |
Launch web UI |
dbt-conceptual export --format <fmt> |
Export diagram |
dbt-conceptual diff |
Show changes vs HEAD |
dbt-conceptual diff --base main |
Show changes vs specified base |
Documentation
- Validation & Messages Guide — resolving errors, warnings, ghost concepts
- Configuration Reference
- Export Formats
- CLI Reference
Contributing
Contributions welcome. See CONTRIBUTING.md.
PRs that work > PRs with extensive documentation about why they might work.
git clone https://github.com/feriksen-personal/dbt-conceptual.git
cd dbt-conceptual
pip install -e ".[dev]"
pytest
License
MIT License. See LICENSE.
Acknowledgments
Built from lived experience. Decades watching the old paradigm fail — beautiful models nobody used. Then watching the new paradigm fail differently — fast delivery, mounting chaos.
This tool encodes what survives: embedded architectural thinking, lightweight enough to survive contact with reality, opinionated enough to provide value.
"The minimum viable conceptual model."
"Lightweight structure for teams who actually deliver."
Works on my machine. Might work on yours.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dbt_conceptual-0.5.2.tar.gz.
File metadata
- Download URL: dbt_conceptual-0.5.2.tar.gz
- Upload date:
- Size: 750.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c9c0aae53f2edd9c41f8f50b807762ef084ed57f30c5a3de1bb9ee433235645
|
|
| MD5 |
5c245515a614d74a5872b4f109b78676
|
|
| BLAKE2b-256 |
18cff0a88b677a718838447eaa47bff54df4a9c500cda3e23d6e29b8b04e7482
|
Provenance
The following attestation bundles were made for dbt_conceptual-0.5.2.tar.gz:
Publisher:
publish.yml on feriksen-personal/dbt-conceptual
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dbt_conceptual-0.5.2.tar.gz -
Subject digest:
4c9c0aae53f2edd9c41f8f50b807762ef084ed57f30c5a3de1bb9ee433235645 - Sigstore transparency entry: 842279010
- Sigstore integration time:
-
Permalink:
feriksen-personal/dbt-conceptual@b2a7a7e6e6cd0624b39bca21f4826bd7892b7dab -
Branch / Tag:
refs/tags/v0.5.2 - Owner: https://github.com/feriksen-personal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b2a7a7e6e6cd0624b39bca21f4826bd7892b7dab -
Trigger Event:
release
-
Statement type:
File details
Details for the file dbt_conceptual-0.5.2-py3-none-any.whl.
File metadata
- Download URL: dbt_conceptual-0.5.2-py3-none-any.whl
- Upload date:
- Size: 125.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4934fac113476c31100d34e7885a9572e1cbe39029a7f3a48083e15663aca9c2
|
|
| MD5 |
190903ded920bf33e82fd15aabee6098
|
|
| BLAKE2b-256 |
e4ea523b6bbdc3cdb981a932237cef6d93506b1c89d5dc379abf37c0d0b021d3
|