One lineage page across dbt projects that don’t share a manifest.
dbt-multidocs.ymlThere is a rendered example page here: lineage.html — a real build of three independent dbt projects. Open it and everything described in these docs is in front of you.
dbt gives you cross-project lineage only when the projects share a manifest.
Separate repos with separate dbt docs generate runs, linked by a downstream
project’s source() pointing at a table an upstream project builds, come out as
disconnected islands.
dbt-multidocs merges N independent manifests and infers the missing edges by
matching normalized warehouse relations — (database, schema, identifier) —
between one project’s models and another’s sources.
pip install dbt-multidocs
dbt-multidocs build --project /repos/dbt_staging \
--project /repos/dbt_core \
--project /mnt/data/dbt_analytics \
--out docs/lineage.html
Output is one HTML file: no network calls, no JS dependencies, no dbt install, no warehouse connection.
These are deliberate, and PRs are held to them:
| No runtime dependencies | stdlib only, so it installs anywhere including CI and air-gapped hosts |
| Artifacts only | reads target/manifest.json and target/catalog.json; never runs dbt, never opens a connection, never reads profiles.yml |
| One self-contained file | the output opens from file://, survives being emailed, and makes no requests |
| No assumed layout | projects are unrelated repos; nothing is derived from a common parent, from the current directory, or from where the package is installed |
| Inference is visible | an edge the tool guessed is drawn differently from one dbt declared, always |