See it as a diagram
Everything below, as a diagram you can edit. Describe yours and see it in seconds.
No account needed · Editable canvas, not a picture
The scheduler holds the only graph that cannot lie
Airflow parses your DAG files continuously and will refuse to run anything that is not in them. Dagster builds its asset graph from the definitions in code and draws it in the UI on every load. Whatever a wiki page claims, the scheduler metadata is the pipeline: task names, dependencies, schedules, retries, all resolved from the code that actually executes.
That makes pipeline documentation an unusual case. The problem is not discovering the truth, which is sitting in the scheduler, but the gap between that truth and the diagram people actually read: the one in the onboarding doc, the architecture page, the incident channel. The keep-in-sync problem is a transcription problem.
What hand-drawn pipeline charts get wrong within weeks
The decay pattern is predictable. First the names go: a task gets renamed in a refactor and the chart keeps the old label, so the on-call engineer greps for a task that no longer exists. Then the structure: a sensor or a backfill branch is added and never drawn, so the chart shows a linear flow where the real DAG fans out. Then whole subgraphs: a new source lands, a deprecated branch keeps its box for a year because deleting from a drawing feels like losing work.
Each error is small. The compound effect is that engineers stop trusting the chart and read the DAG file instead, at which point the documentation has negative value: it costs maintenance and misleads the people who do not know to distrust it.
Render from the scheduler when you need a quick answer
For a fast, guaranteed-accurate picture of a single DAG, ask the scheduler. Airflow renders the parsed graph to an image from the CLI, and the Graph view in the UI shows the same thing per run. Dagster draws the asset graph in its UI, including upstream and downstream assets across jobs.
These renders have a ceiling, and it is worth being clear about it. They are per-DAG, so they cannot show the system around the pipeline: the S3 buckets, the warehouse zones, the CRM at the end of the reverse ETL. They carry no annotations for the reader, and they live in a terminal or an orchestrator UI rather than in the docs your team reads. They are the accurate sketch, not the published diagram.
# Airflow renders the DAG it will actually run (requires graphviz) airflow dags show orders_nightly --save orders_nightly.png # List what the scheduler has actually parsed, refactors included airflow dags list
The keep-current loop: regenerate and embed
The published diagram gets the same treatment as the code: it is regenerated from the source when the source changes. Datadef ships an MCP server, registry name io.datadef/mcp, so an agent like Claude Code or Cursor connected to it can read the dags/ directory after a merge and update the Datadef diagram to match the new structure, keeping the system context and annotations that the scheduler render cannot carry. The first version takes minutes: paste a DAG file or a plain description into the Airflow DAG diagram generator and edit from there. The Airflow-specific version of the loop is detailed in living diagram from Airflow.
Two honest mechanics. Datadef does not watch your repository: nothing detects the merge by itself, the regeneration runs when your CI step or your agent invokes it, which is one command in the pipeline that already runs your tests. And the published copy follows without touching: a project shared public serves its diagram at a permanent image URL that re-renders when the diagram changes, so the copy in your README or wiki is current within minutes of the edit. The agent authenticates with an API key created on a paid plan.
Where the anchor pages are
Scope: the diagram stays current, the prose is your job
A pipeline doc is a diagram plus prose: what the pipeline is for, what to do when it breaks, who owns it. The loop above keeps the diagram matching the DAG. It does nothing for the prose, and Datadef does not sync prose documentation; tools like Swimm target that problem. The practical division that works: generate the graph, write the intent, and review the prose whenever the regeneration diff shows the structure changed, because a structural change is exactly when the runbook paragraph is most likely to be wrong too.
For the wider practice across schemas, lineage and warehouse docs, keeping data documentation in sync covers the full surface.
FAQ
How do I keep data pipeline documentation up to date?
Can pipeline documentation be generated automatically from Airflow?
Why is a hand-drawn pipeline flow chart always wrong?
Does this work for Dagster as well as Airflow?
Does the published diagram update by itself when the DAG changes?