The state of dbt documentation in 2026: why nobody reads your docs
Six years, 43 comments, still open. A look at what analytics engineers have been asking dbt-docs for, and what an alternative looks like.
Your dbt docs are out of date. You know it. Your team knows it.
Someone pinged you in Slack last week asking where the revenue field on fct_orders comes from. You opened the docs site, searched, scrolled past 400 models on a single page, and gave up. You traced the model yourself. It took ten minutes. You promised yourself you’d update the description. You didn’t.
This is the quiet pain of every analytics engineering team I’ve worked with. Documentation is an agreed-upon good that nobody uses. The reason isn’t laziness or a culture problem. The tool everyone reaches for, dbt docs serve, was never built to be the thing.
I wanted to know if my experience was specific to my last few teams or something broader. So I spent an afternoon last week reading every open issue on the dbt-labs/dbt-docs GitHub repo. The pattern was striking.
What analytics engineers have been asking for, going back six years
The single most-commented open issue in dbt-labs/dbt-docs is #84, Create ERD from relationships in schema.yml files. Forty-three comments. Opened in April 2020. Still open in May 2026. A schema diagram showing how your models relate to each other, which most people would call table stakes.
Then there’s #50, White-labeling dbt docs. Fifteen comments. Opened September 2019. Teams want to put their company’s branding on the docs they share with internal stakeholders. Still open.
Two from this January, both about visibility into model state:
- #575, Offline metadata for docs. Eight comments. Practitioners want to view documentation when CI hasn’t regenerated the static site yet.
- #576, Freshness report in the docs. Teams want to know which models are stale, right next to the model itself, without leaving the docs.
None of these are exotic. A schema diagram. Branding. A freshness signal. Offline metadata. These are the basics of what data documentation should have, and every one of them has been a thoughtful request from a real analytics engineer with a real use case. The dbt docs serve experience has barely moved against any of them.
This isn’t a critique of the dbt-labs team. They’re shipping the rest of the platform at a pace most data tooling can’t match. dbt docs serve does what it was built to do: render a reference view of your project. It was never meant to be the documentation tool for a 50-person data org. That’s on us, the users, to build or buy.
Why your team doesn’t open the docs
The default dbt docs serve experience is a single-page static site that lists every model on one page. You get documentation in the dbt sense: every model named, every column listed, descriptions if someone wrote them. What you don’t get is a documentation experience.
Search that finds things. The built-in search is keyword-based and shallow. On a 500-model project, finding a specific column takes more time than asking a teammate.
Column-level lineage. You can see which models feed into which models. You can’t answer the question that matters: “what happens upstream if I change the order_status enum on dim_orders?” The graph stops at the model boundary.
Model health signals. Every model in the docs looks the same. You can’t tell which models have tests, which are documented, or which haven’t been edited in eighteen months. The docs site treats a freshly-shipped model and a stale 2022 prototype identically.
A way to share with non-technical teammates. dbt docs serve runs a local server on localhost:8080. To share with a stakeholder you’re either screen-sharing your laptop, hosting the static files yourself, or, somehow, asking them to install dbt and run a CLI command.
Integration with where your team already works. Your analysts live in Slack. Your stakeholders live in email. Your docs live at localhost:8080.
The result is what you’d expect: nobody opens the docs. The tool the team uses is the senior analytics engineer who’s been there longest and remembers the lineage in their head.
The senior engineer becomes the documentation
When the documentation tool doesn’t work, somebody fills the gap. That somebody is usually one specific person on your team. The one who built the warehouse. The one who remembers why stg_payments has a deduplication step. The one who can trace revenue back to its source in fifteen seconds.
Slack pings them. Stakeholder questions route to them. New hires shadow them. They spend ten minutes tracing models other people wrote because it’s faster than searching the docs. They promise themselves every Monday they’ll update the descriptions this sprint. They don’t.
This is a failure mode that compounds. The more people ping that person, the less time they have to improve the docs. The less the docs improve, the more people ping. Your team’s collective understanding of the data model is bottlenecked on one person’s memory and availability.
Most analytics engineering teams I’ve worked with have at least one person in this position. Some have two. Most have one and a half: a primary holder of institutional knowledge, and a junior partner trying to absorb it.
What I’ve been building
For the past few months, I’ve been building an alternative to dbt docs serve. It’s called Docglow, it’s open source, and it takes the same manifest.json and catalog.json your project already produces and turns them into a documentation site I’d want to open.
Three things it does:
pip install docglow
docglow generate --project-dir ./my_dbt_project
docglow serve
- Real search. Full-text powered by MiniSearch, indexing model names, column names, descriptions, tests, and tags. Finding a column in a 500-model project takes one keystroke.
- Column-level lineage. Built on sqlglot, so it traces lineage through the SQL itself. You can answer “if I change
order_statusondim_orders, what breaks downstream?” without opening another tool. - Health scoring. Every model gets a score based on test coverage, description completeness, and freshness. The defaults are opinionated. If your team disagrees with them, the thresholds are configurable.
- ERD. Enable the ERD view to visualize your model relationships with crow’s-foot notation, derived from your
relationshipstests,dbt_constraints, andmeta.docglow.relationshipsblocks.
Almost 3,000 data practitioners installed Docglow over the last month from PyPI. I’ve never run an ad. The word gets around because people find dbt docs serve insufficient and go looking for an alternative.
It’s not perfect. The gaps:
- Column-lineage parsing is still slow on very large projects (3,000+ models). I’ve been shipping performance improvements but it’s an ongoing project.
- Complex Jinja macros, especially custom dispatch patterns, can confuse the SQL parser. The fallback is graceful (the model still appears in docs without column-level lineage) but I know it’s a gap.
- The health-score defaults are opinionated. Some teams disagree with them. Configurable, but the defaults will not be everyone’s preference out of the box.
- Several issues are open on the repo as of this writing, and I work through them in public.
What’s coming
In a few weeks I’m launching Docglow Cloud, the hosted version. It’ll add three things the OSS tool doesn’t:
- Hosted documentation sites so you stop sharing localhost.
- AI Q&A so a non-technical teammate can ask “what does
revenuemean onfct_orders?” and get a real answer with lineage. - A Slack bot so the docs meet your team where they already work, instead of asking your team to come to the docs.
If your team has these problems
If any of this matches your team (stale docs, senior engineer as documentation oracle, 500-model single-page-static-site experience), try the open-source tool. It’s a single pip install away, and the OSS will stay free.
If it fills the gap, great. If it doesn’t, open an issue and tell me what’s missing. I read every one of them.
The dbt-docs issues I linked above suggest that whatever’s frustrating you about dbt docs serve is probably frustrating a lot of other teams too. After six years and 43 comments on the most-requested issue, it’s reasonable to stop waiting.