Two orchestrators · one honest decision · no product pitch until the end

Editorial comparison

Dagster vs Airflow: when a team chooses each, and where Prefect sits

Both are open-source, Python-first orchestrators under the Apache-2.0 licence, and both will run a nightly job that moves data from A to B. The difference is what each asks you to describe: Airflow asks for the work — a graph of tasks and when to run it — and Dagster asks for the data — the tables and files your code produces, and what each depends on. That one difference decides most of the rest. Prefect asks for neither: it takes the Python functions you already have and makes them observable.

In their own words

What each one is for

Apache Airflow — a scheduler for task graphs

Airflow calls itself "an open-source platform for developing, scheduling, and monitoring workflows", batch-oriented data pipelines and ML training included. A DAG carries the schedule, the tasks, their dependencies and callbacks; workflows are "defined entirely in Python"; backfills and re-running failed tasks are built in. Running it means a scheduler, a DAG processor, an API server, a metadata database and, usually, workers.

Dagster — an orchestrator built around data assets

Dagster calls itself "a data orchestrator built for data engineers, with integrated lineage, observability, a declarative programming model, and best-in-class testability". Its unit is the asset — "an object in persistent storage, such as a table, file, or persisted machine learning model" — and materializing one means running its function and saving the result. Asset definitions know their own dependencies, so lineage comes free; schedules, sensors and automation conditions decide when they run.

Prefect — Python functions, made into flows

Prefect calls itself "an open-source orchestration engine that turns your Python functions into production-grade data pipelines with minimal friction". Flows "are defined as decorated Python functions" and can use native control flow — conditionals, loops, tasks created at runtime — rather than a graph declared up front. The server is self-hosted or Prefect Cloud.

The fork

Airflow vs Dagster: the decision, plainly

Ask one question first: when something breaks at 3 a.m., do you want to be told which task failed, or which table is now stale and who reads it? Teams that answer "task" are describing Airflow; teams that answer "table" are describing Dagster. Everything below is that question, applied.

Choose Airflow when…

  • The platform already runs on it. Airflow is the standard; the hiring pool, the operators, the managed offerings and the tribal knowledge are all there. Migrating an orchestrator that works is rarely the best use of a quarter.
  • The work is heterogeneous. File transfers, container jobs, ML training, API calls, SQL — anything a Python operator can wrap. Airflow orchestrates work; it does not need the work to produce a table.
  • Scheduling semantics are the hard part. Cron and interval schedules, backfills over history, rerunning failed tasks, and assets whose updates schedule the DAGs that consume them. This is the machinery Airflow exists to provide.
  • Your team writes Python and wants to. Airflow's own docs say it: if you prefer clicking over coding, it is not the best fit. Everything is code.

Choose Dagster when…

  • You are starting fresh, and the output is data. If the thing you run produces tables, files and models, describing those assets directly — with their dependencies — is a closer fit than describing the tasks that happen to produce them.
  • Lineage and freshness are questions people actually ask. Because asset definitions know what they depend on, "what is stale and why" is a first-class view rather than something you reconstruct from task logs.
  • Local development and tests matter to you. Dagster leads with testability and a declarative model; an asset is a function you can call in a unit test.
  • You want a managed offering beside the open-source core. Dagster's own quickstarts split three ways — Dagster+ Hybrid, Dagster+ Serverless and OSS — for the same asset model.

The third name in the search box

Prefect vs Airflow: where Prefect sits

Prefect is the answer for a team whose pipelines are already Python functions and who want them scheduled, retried and observed without rewriting them as a graph. Where Airflow wants the DAG declared up front, a Prefect flow is ordinary Python — an if, a loop, tasks created from the data at hand — with the orchestration added by a decorator. That makes it the lightest of the three to adopt and the least opinionated about what your data looks like afterwards.

  • Pick Prefect over Airflow when the workflows are dynamic, the team is small, and "wrap what we have" beats "re-model what we have".
  • Pick Airflow over Prefect when you need the ecosystem — the operators, the managed services, the people who already know it — or a control plane the whole company will standardise on.
  • Pick Dagster over both when lineage between data assets is the thing you will look at every day.

A search phrase, answered

Looking for a Dagster alternative?

The honest candidates are the two above. Airflow if you want the standard and its ecosystem; Prefect if you want the least ceremony around Python you already have. There are other orchestrators, and each has a case, but a team leaving Dagster is almost always choosing between "more platform" (Airflow) and "less model" (Prefect). What no orchestrator is an alternative for is the SQL itself — the joins and the reviewed datasets the tasks produce — which is the one place this site's own product enters, below.

Where datapipelines fits, said once

Whichever you choose, it will orchestrate work. When the work is SQL across several operational databases, authored by an agent and run under governed, read-only-by-default credentials, that part can live here: a versioned pipeline the orchestrator triggers through one endpoint and follows to completion. datapipelines has no scheduler and wants none — it composes with Dagster, Airflow or Prefect rather than competing with any of them. The Airflow comparison spells out the boundary; the dbt comparison covers the modelling side of the same question.

datapipelines vs Airflow → · datapipelines vs dbt → · REST API specification →

Asked before

Dagster, Airflow and Prefect, in questions

Do I need Dagster or Airflow to run pipelines here?

No. Pipelines execute on demand — by an agent over MCP, by a REST call, or by a person in the editor — and there is no scheduler inside this server: no cron triggers, no backfills, no sensors. If the work needs those, that is the orchestrator's job, and the page says which one fits which team. The execution lifecycle is docs/dag-executor.md §5.

Can Dagster, Airflow or Prefect trigger a pipeline here?

Yes, and that is the composition the page recommends: a task in any of the three POSTs to the execution endpoint and follows the per-milestone SSE stream until the run reaches a terminal state, so the orchestrator keeps the platform view while the SQL that spans your operational databases stays here, versioned and governed. The endpoint is docs/rest-api.md §6.

Is datapipelines a Dagster alternative or an Airflow alternative?

Not in the sense a searcher means. Those two orchestrate whole platforms of Python work; this server runs SQL pipelines across several operational databases, authored by an agent and executed under governed, read-only-by-default credentials — a narrower thing that composes with either rather than replacing it. What it does run is docs/dag-executor.md §5; what an agent can author is docs/mcp-server.md §6.1.

Where do the facts about Dagster, Airflow and Prefect on this page come from?

From each project's own current documentation, cited by URL in the page source next to every claim — nothing about them here is written from memory, and the version each site showed on the day it was read is named in the citation. The claims about this server rest on its own specs the same way: the execution model is docs/dag-executor.md §5.

Keep your orchestrator. See what it would trigger.

The demo stack runs the cross-database pipeline any of the three would call — read the SQL, the run and the result before you wire anything together.