Editor’s note: This Metaflow review is based on my hands-on test of open-source Metaflow 2.19.39 on a Mac in October 2026, in local mode: a parallel sweep, forced failures, resume and the Client API. I evaluated the managed Outerbounds platform and cloud deployments on their published plans and documented behavior, without running them. I weigh cost to run, setup effort, workflow ergonomics, path to production, openness and momentum.
Quick verdict: I recommend Metaflow for Python ML teams of roughly 2 to 30 people who want versioned, resumable pipelines from laptop to cloud and have an AWS or Kubernetes engineer or budget for a managed tier. The trade-off: open-source production means running your own cloud stack, or paying $2,499 a month for Outerbounds Starter.
Key Takeaways
- Free under Apache 2.0: one pip install ran my four-way parallel sweep with zero config.
- Every self. attribute is versioned automatically, and my resume re-ran only 2 of 7 tasks.
- No UI or scheduler locally; production needs an Argo, Step Functions or Kubernetes stack you operate.
- Outerbounds Starter costs $2,499 a month billed annually for 3 compute nodes; since April 2026, Anaconda sells it.
- macOS and Linux only (Windows needs WSL), and event triggering works only on Argo Workflows.
Netflix built Metaflow, runs it across more than 3,000 AI and ML projects, and its repository has about 10,300 GitHub stars. Among MLOps pipeline frameworks, it treats a plain Python class as the pipeline: steps are methods, state is attributes.
In this review, I’ll take a closer look at Metaflow’s pricing, features, and production path, so you can see exactly whether it beats Flyte, Prefect or Apache Airflow.

Metaflow Pros and Cons
Pros
- Apache 2.0; pip install ran my flow with no server, account or config.
- Every self. attribute becomes a versioned artifact, with zero save code.
- Resume cloned 5 of 7 tasks; my fixed rerun took 4.2 seconds.
- foreach ran 4 parallel local training tasks in about 12 seconds.
- Same code targets AWS Batch, Kubernetes, Step Functions, Argo, Airflow, Kubeflow.
- Client API returned my fitted model as a live object in 1.45 seconds.
Cons
- No UI or scheduler locally; the Metaflow UI is a separate service.
- Outerbounds Starter is $2,499 a month, billed annually, for 3 nodes.
- @catch leaves missing artifacts that crash an unguarded join.
- Resume cannot change parameters and does not work on Argo.
- No built-in datastore cleanup and no native Windows support.
How Much Does Metaflow Cost?

Metaflow itself costs nothing: the library is Apache 2.0, and you pay only for the compute and storage it runs on, or for a managed platform on top.
- Community (free): for teams that will set up and run the infrastructure and security themselves, with community Slack support.
- Starter ($2,499 a month, paid annually): for small ML teams that want Metaflow fully managed inside their own cloud account, with up to 3 managed compute nodes (GPU nodes included), up to 3 cloud workstations, unlimited seats, SSO via Google, GitHub or GitLab, SOC 2, cost reporting, dedicated support and a 30-day free trial.
- Enterprise (contact sales): for larger organizations that need unlimited CPU and GPU nodes and workstations, Okta or Azure AD SSO, advanced role-based access control, admin activity logs and multi-region deployment.
| Plan | Platform fee | Compute nodes | Cloud workstations | SSO | Compliance | Support |
|---|---|---|---|---|---|---|
| Community | $0 (Apache 2.0) | Whatever you run | None | None built in | Your responsibility | Community Slack |
| Starter | $2,499/month, billed annually (about $29,988/year) | Up to 3 managed, GPU included | Up to 3 | Google, GitHub, GitLab | SOC 2 | Dedicated, plus training |
| Enterprise | Contact sales | Unlimited, GPU included | Unlimited | Okta, Azure AD | SOC 2 | Dedicated, plus training |
Starter is a flat platform fee with no margin on compute: your AWS, Azure or Google Cloud bill for the nodes arrives separately. Since Anaconda bought Outerbounds on April 29, 2026, outerbounds.com forwards to Anaconda’s AI Orchestration page and Outerbounds pricing redirects to Anaconda, which lists a single contact-sales Anaconda Platform plan and no mapping from Starter. Treat $2,499 as the last published Outerbounds rate and get a written quote.
Union, the managed tier of Flyte, is cheaper to enter, with a Team plan from $950 a month, but it adds metered usage on top. Prefect Cloud has a free Hobby tier (2 users, 5 deployments), and Dagster sells Dagster+ Solo from $10 a month plus credits, though both are schedulers first, with no ML compute layer or artifact store.
Is Metaflow Good Value for Money?
- Good fit: a Python ML team that wants versioned, resumable pipelines and already pays for AWS or Kubernetes; the open-source core costs nothing beyond the cloud bill.
- Less convincing fit: a team with no platform engineer and more than 3 nodes of steady load, because Starter’s cap pushes you to a quote-only Enterprise plan.
- Budget priority: self-host on AWS Batch and Step Functions, or on Kubernetes with Argo, if one engineer can own the stack. At about $30,000 a year, Starter costs less than a dedicated platform engineer, but only while 3 nodes cover your workload.
Reviewer’s Notes: I recommend starting on the free Community version locally, the way I did, and porting one real notebook into a flow before spending anything. Pilot Starter’s 30-day trial only once a second engineer needs shared cloud runs, and get Anaconda’s renewal price for it in writing before you sign.
My Experience With Metaflow

I installed Metaflow with one command, pip install metaflow, into a fresh Python 3.9.6 environment on my Mac, and it pulled 2.19.39 with no server, no account and no config file to fill in.
Installing It and the First Run
My first run printed “Creating local datastore in current directory (.metaflow)”, validated the graph (“The graph looks good!”) and started executing. The only warning was an optional one about Pylint not being installed.
That first run took 51.6 seconds, but about 35 of those went to the cold first import of scikit-learn in the new environment. A repeat run of the same flow took 5.6 seconds.
A Four-Way Hyperparameter Sweep
My test flow loaded the 569-row breast cancer dataset from scikit-learn, fanned out over four max_depth values with foreach, trained a 50-tree RandomForest per branch with 5-fold cross-validation, and joined the results into a card:
@catch(var="train_error")
@retry(times=1)
@step
def train(self):
clf = RandomForestClassifier(n_estimators=self.n_estimators, max_depth=self.input)
self.depth = self.input
self.score = cross_val_score(clf, self.X, self.y, cv=5).mean()
self.model = clf.fit(self.X, self.y)
self.next(self.join)
The four train tasks launched as four parallel local processes, within 22 milliseconds of each other, and finished in about 12 seconds. Accuracy came back at 0.9508 for depth 2, 0.9596 for depth 4, and 0.9631 for both depth 8 and unlimited depth.
I wrote no save or load code at all. Every self. attribute became a versioned artifact, and Metaflow tagged the run with the Metaflow version, Python version, runtime and my user name on its own.
Where It Pushed Back
I then forced the depth-8 task to fail. Metaflow logged “Task is starting (retry)”, retried once in a fresh process, failed again, and @catch stored the exception in train_error so the run carried on.
The join step then crashed with AttributeError: Flow TrainFlow has no attribute 'depth', because the caught task never set its artifacts. That was my bug, but graph validation gave me no warning about it. A smaller annoyance: my own print() lines carried a timestamp one hour behind Metaflow’s log lines.
Resume Saved the Rerun
After fixing the join, I ran resume --origin-run-id on the failed run. Metaflow cloned the start step and all four train tasks and executed only join and end, in 4.2 seconds.
Resume refused my flow’s parameter (Error: no such option: --fail_once) and reused the original run’s values. On a second flow with a 3-second start step, resume finished in 0.79 seconds against 3.9 seconds for the original run.
Reviewer’s Notes: If you use @catch inside a foreach, guard every artifact in the join with
getattr(i, "depth", "failed")or similar. Metaflow keeps the run alive after a caught failure, but it will not stop your join from reading attributes that the failed branch never wrote.
What a Laptop Will Not Show You
Local mode gave me no web UI and no scheduler, so I read results from the terminal and the Client API. Production scheduling on Argo or Step Functions, the @kubernetes and @batch decorators, the separate Metaflow UI service and @pypi or @conda environments were outside my test; the production section below covers them.
Artifacts, Versioning and the Client API

Metaflow pickles every self. attribute to its datastore at the end of each task, so the model, the data and the scores from any past run stay retrievable by run ID without a single line of storage code.
In my test, the fitted best_model artifact weighed 183,573 bytes and the results list 197 bytes. After five small runs, my local .metaflow folder had grown to 7.8 MB, and nothing ever cleaned it up. There is no built-in cleanup command, and users have had an open GitHub request for one since May 2021, so plan for datastore growth on S3 or Azure Blob Storage too.
From a separate script, the Client API pulled the run and its objects back for me in three lines:
Flow("TrainFlow").latest_successful_runreturned the last good run.r.data.best_modelgave back the fitted RandomForest in 1.45 seconds, ready to predict immediately.r["start"].task.data.Xpulled the training matrix from an upstream step.
The Client API is scoped to the current user’s namespace by default, so I had to call namespace(None) to see runs across users. It also picked my OS user name even after I exported a different USERNAME, which matters when a team shares one metadata service.
The Runner API goes the other direction: Runner("trainflow.py").run(n_estimators=20) launched a full run from Python and returned status “successful” plus the run object, in 7.8 seconds. The Deployer API does the same for Argo Workflows deployments, which I did not run.
Cards and Tags
The @card decorator turned my join step’s table into a self-contained 1.1 MB HTML report, which I exported with card get. Viewing cards in a browser otherwise needs card view, card server or the Metaflow UI. I added a baseline tag from the CLI with tag add, and show printed the DAG with each step’s decorators.
MLflow covers experiment tracking and a model registry but does not orchestrate steps, so it pairs with Metaflow rather than replacing it: you can log to MLflow from inside a Metaflow step. If you only need a registry, MLflow alone is the lighter choice.
From Laptop to Production: Compute, Orchestrators and Events

The flow I ran locally scales out by decorator, but only after you deploy a Metaflow stack: @batch and @kubernetes need cloud infrastructure, a datastore and a metadata service that you stand up yourself, and Metaflow publishes CloudFormation and Terraform templates for that.
- Compute: @batch sends a step to AWS Batch, @kubernetes to a cluster, and @resources requests CPU, GPU and memory per step, with support for spot instances and gang-scheduled distributed training.
- Dependencies: @pypi and @conda pin packages per step; uv-based dependency management arrived in 2.15.8.
- Datastores: S3, Azure Blob Storage and Google Cloud Storage.
- Services: the metadata service and the Metaflow UI are separate deployments.
- Configuration: Config objects, added in 2.13, set decorators such as @resources and @schedule before a run starts.
- Programmatic deploys: the Deployer API creates and triggers Argo Workflows deployments from Python.
- Iteration: the
spincommand, new in 2.19, reruns a single step quickly;metaflow-devstands up a local Minikube stack with the UI, @kubernetes and Argo.
| Target | Scheduling | Event triggers | Notes |
|---|---|---|---|
| Local | None built in | No | What I tested; no UI |
| AWS Step Functions | @schedule | No | Easier AWS-native option, fewer features |
| Argo Workflows | @schedule | Yes (@trigger, @trigger_on_finish) | Recommended on Kubernetes; Deployer API |
| Apache Airflow | Via your Airflow | No | Export for teams already on Airflow, more limits |
| Kubeflow Pipelines | Via Kubeflow | No | For teams already on Kubeflow |
Resume does not work on Argo Workflows, the one target with event triggers: users have had an open request to support it since August 2023. Other long-open requests ask for pdb inside a step, for @kubernetes to be ignored on local runs, and for fully on-prem setup docs.
Community forum users report two Argo pitfalls: stale config from a failed install pointing at a MinIO instance that no longer existed, and deployed flows landing in a production namespace that confused user tokens. Neither is a blocker, but both land on whoever operates the stack, which is the job Outerbounds charges $2,499 a month to take off your hands.
Metaflow’s package lists macOS and Linux only, so Windows developers need WSL.
Flyte runs on Kubernetes in production, so it removes the orchestrator choice that Metaflow leaves to you, at the price of operating a cluster. Apache Airflow is a scheduler first and leaves ML compute, artifacts and resume to you; Metaflow treats it as one more export target.
Outerbounds and the Anaconda Deal

Outerbounds, the company founded by Metaflow’s creators, sells the managed version of the stack I just described, and since April 29, 2026 it belongs to Anaconda. Over the open-source version, it adds:
- Deployment in your own account: single-tenant on AWS, Azure or Google Cloud, in the regions you choose; Outerbounds quotes about 15 minutes to deploy.
- Managed operations: SLAs, autoscaling compute including GPUs, and orchestration with an event bus.
- Team features: cloud workstations, SSO, SOC 2 (Outerbounds also claims HIPAA support) and cost reporting.
- Support: dedicated support, training and managed onboarding on both paid plans.
Anaconda did not disclose the deal terms. It says Metaflow stays open source (“That will not change”) and that its engineers will keep contributing, and the GitHub repository still sits under the Netflix organization with no license change. Anaconda’s pricing now lists one contact-sales Anaconda Platform plan, which includes an AI Orchestration product and deploys as managed cloud, self-hosted or on-premises, with no published mapping from the old Outerbounds tiers.
Twelve patch releases shipped between 2.19.28 on May 7 and 2.19.39 on September 2, 2026, and the repository saw a push on October 9, though there is no 2.20 yet and the releases are mostly fixes rather than new features. Named adopters include Amazon, DoorDash, Dyson, Goldman Sachs and Ramp, plus Realtor.com, GE HealthCare and Warner Bros.
Before you commit to the managed tier, ask Anaconda in writing which plan replaces Starter, whether the $2,499 rate holds at renewal, and what the Metaflow roadmap looks like for 2027.
How Does Metaflow Compare to Competitors?
Metaflow wins for Python-first ML teams who value artifact versioning and resume over scheduler breadth.
| Tool | Best for | License and pricing | Where it beats Metaflow | Where Metaflow wins |
|---|---|---|---|---|
| Metaflow | Python ML teams, laptop to cloud | Apache 2.0; Outerbounds Starter $2,499/month annual | Baseline | Automatic artifacts, resume, Client API |
| Flyte / Union | Typed, Kubernetes-native ML pipelines | Apache 2.0; Union Team from $950/month plus usage | Kubernetes-native, strong typing | Zero-service local start, flat managed fee |
| Kubeflow Pipelines | Teams already on Kubernetes | Apache 2.0; infrastructure only | Full Kubernetes ML platform | Runs without a cluster; can deploy onto Kubeflow |
| ZenML | Stack-agnostic MLOps | Apache 2.0; hosted Scale plan $999/month | Plugs many orchestrators and tools | Flat managed fee, no execution metering |
| Apache Airflow | Data-engineering scheduling | Apache 2.0; free | Scheduler breadth, about 47k GitHub stars | ML compute, artifact versioning |
| Prefect | Dynamic Python workflows with a hosted UI | Free Hobby tier; Starter $100/month | Hosted UI out of the box | Built-in artifact store and resume |
| Dagster | Asset-centric data pipelines | Dagster+ Solo $10/month plus credits | Asset lineage, data quality | ML compute and parallel training |
Kubeflow Pipelines needs a Kubernetes cluster before the first run, while Metaflow ran my whole sweep on a laptop and only asks for a cluster when you add @kubernetes or deploy to Argo. If you already operate Kubeflow, Metaflow can schedule onto it, so the choice is about authoring style rather than infrastructure.
- Flyte (and Union): wins for platform teams already on Kubernetes who want strongly typed tasks; its open-source repository has about 7,700 GitHub stars to Metaflow’s 10,300. Union is the managed route, with metered usage on top of the $950 Team minimum, while Outerbounds charges a flat fee with no margin on compute.
- Kubeflow Pipelines: wins if your company already runs Kubeflow and wants pipelines inside the same Kubernetes platform.
- ZenML: wins for teams that want one framework sitting over several orchestrators and tool stacks; its hosted Scale plan costs $999 a month with execution limits.
- Apache Airflow: wins for data-engineering scheduling breadth and the largest community, at about 47,000 GitHub stars, but it ships no ML compute layer or artifact store.
- Prefect: wins for dynamic Python workflows that need a hosted UI on day one, which Metaflow’s local mode lacks; paid tiers start at $100 a month for Starter, and Team costs $100 per user a month.
- Dagster: wins for asset-centric data pipelines with lineage, with Dagster+ Starter at $100 a month plus credits; it has no ML compute layer of its own.
- Kedro: wins on project structure for pipeline code, but it is an authoring framework that still needs a separate deployment target.
- MLflow: complementary rather than a rival, covering experiment tracking and a model registry next to Metaflow.
- SageMaker Pipelines and Vertex AI Pipelines: win for single-cloud shops that accept AWS-only or GCP-only lock-in in exchange for a fully managed service billed on cloud rates.
How I Reviewed Metaflow
I installed Metaflow 2.19.39 in a fresh Python 3.9 environment on macOS, built two flows, ran a four-way parallel sweep, forced failures to test @retry and @catch, resumed a failed run, queried artifacts with the Client and Runner APIs, and generated a card. I evaluated the Outerbounds and Anaconda plans, the production deployment targets and long-open user requests on their published plans and documented behavior, since I did not run a cloud deployment. Every timing and accuracy figure in this review comes from my own runs on one iMac, so expect different numbers on your hardware.
I weighed cost to run, setup effort, day-to-day workflow ergonomics, path to production, openness and lock-in, and development momentum, and compared Metaflow against Flyte, Kubeflow Pipelines, ZenML, Airflow, Prefect and Dagster.
Prices current as of October 2026.
Should You Build Your ML Pipelines on Metaflow?
Metaflow turned my scikit-learn script into a versioned, parallel, resumable pipeline with one pip install and no services. Its weak spots are everything past the laptop: no UI or scheduler in local mode, an orchestrator you must operate, and a managed tier whose pricing is in flux under Anaconda.
Recommended if:
- You run a Python ML team on AWS or Kubernetes and have an engineer to own the Metaflow stack.
- You have budget for a managed tier and fit within Starter’s 3 compute nodes.
- Your pain is losing track of which model came from which data and code.
Not recommended if:
- You need a scheduler-first data orchestrator; Airflow or Dagster fits better.
- Your team develops natively on Windows without WSL.
- You want a free hosted UI on day one, which Prefect’s Hobby tier offers.
My next step for you: pip install metaflow and port one notebook into a foreach flow this week. If it sticks and a second engineer needs shared cloud runs, request an Anaconda quote before you commit to the managed tier, or start from metaflow.org to deploy the open-source stack yourself.
FAQ
Is Metaflow free?
Yes. Metaflow is open source under Apache 2.0, and you can run it locally or on your own AWS, Azure, Google Cloud or Kubernetes setup at no license cost. You pay only your cloud bill. The managed Outerbounds Starter plan was last listed at $2,499 a month billed annually, and Enterprise is quote-only.
Does Metaflow require AWS?
No. I ran it entirely on my Mac with a local datastore. For cloud scale, @batch targets AWS Batch, @kubernetes targets any Kubernetes cluster, and datastores can live on S3, Azure Blob Storage or Google Cloud Storage. Outerbounds deploys on AWS, Azure and Google Cloud.
Metaflow vs MLflow: what’s the difference?
Metaflow authors and runs ML workflows and versions every artifact on its own; MLflow tracks experiments and manages a model registry but does not orchestrate steps. They are complementary: you can log to MLflow from inside a Metaflow step. Pick MLflow alone if you only need tracking.
Metaflow vs Airflow: which should I use?
Use Metaflow for ML pipelines that need per-step compute, artifact versioning and resume; use Airflow for broad data-engineering scheduling across many systems. Metaflow can export flows to Airflow, but event triggering works only on Argo Workflows, so the Airflow route carries more limits.
Does Metaflow have a UI?
Not in local mode. The Metaflow UI is a separate service you deploy alongside the metadata service, and the metaflow-dev stack bundles it for local testing. Without it, you read results through the CLI, the Client API and HTML cards.
Is Metaflow still maintained after the Anaconda acquisition?
Yes. Twelve patch releases shipped between May and September 2026, the latest being 2.19.39, and the repository still sits under Netflix’s GitHub organization. Anaconda has committed to keeping Metaflow open source, though there is no 2.20 yet and managed pricing now runs through Anaconda sales.
