AIFlowPost

Windmill vs Kestra: Code-First Engines Compared

Updated 2026-11-02 · 1144 words

Windmill vs Kestra: Code-First Engines Compared — AIFlowPost cover

This page may contain affiliate links. If you buy through them we may earn a commission at no extra cost to you.

Quick take: if the actual job is turning scripts your team already writes into scheduled jobs, webhooks, or internal tools a non-developer can use, Windmill's script-first platform is built exactly for that. If the job is orchestrating data pipelines, backfills, or event-driven infrastructure triggers at scale, Kestra's YAML-defined flows and 1,800-plus plugin library are the better foundation. We self-hosted both via Docker and built the same nightly data job, plus a one-off ad hoc task, in each to see where the real split actually falls.

What Windmill and Kestra actually are

Windmill is an open-source developer platform built around a simple idea: write a script in Python, TypeScript, Go, Bash, or SQL, and Windmill turns it into a versioned, runnable unit you can schedule, trigger via webhook, chain into a multi-step flow, or expose as an auto-generated UI form pulled from the script's own parameters. It's less a workflow builder with an escape hatch into code and more a code-execution platform with workflow and app-building features layered on top. The core is AGPLv3-licensed, with a separate enterprise edition adding SSO, audit logs, and high-availability worker configurations on top of an otherwise ungated free build.

Kestra is an open-source orchestration platform built around declarative YAML flows rather than scripts, with a visual topology view for inspecting and editing flows that doesn't require reading raw YAML to understand what a pipeline does. It's designed for event-driven and scheduled orchestration across data pipelines and infrastructure jobs, backed by a plugin library of more than 1,800 integrations spanning cloud providers, data warehouses, and messaging systems. Its core engine is Apache 2.0 licensed, with no enterprise feature carve-out in the public repository.

Comparison table

Windmill Kestra
Core model Script-first (Python, TS, Go, Bash, SQL) Declarative YAML flows, with a visual topology view
License AGPLv3 + separate enterprise edition Apache 2.0, fully open core
Self-hosted cost Free Free
Plugin/integration count None built in; you write API clients as scripts 1,800+ plugins
Auto-generated internal tool UIs Yes, from script parameters No
Backfills across date ranges Manual, via script logic Built-in, UI and CLI driven
Cloud/managed option Windmill Cloud from around $10/month per author Kestra Cloud, usage-based, early access
Best for Internal tools, custom data scripts, ad hoc jobs Data pipelines, infrastructure jobs, event-driven orchestration at scale

Building the same job in both

We set up a daily job in both: pull rows from a database, transform them, push a summary to an external API, then deliberately re-ran it for a past date range to see how each handled a backfill.

In Windmill, the job was a single Python script, written and tested in its browser-based editor, attached to a cron schedule in a few more clicks. Done in about 20 minutes, most of which was writing the transform logic itself. Re-running it for a past date range meant adding a date parameter to the script and triggering it manually for each day, since Windmill has no built-in backfill concept; that's a script you write once and reuse, not a missing feature so much as a different division of labor.

In Kestra, the same job was a YAML flow chaining a database task, a transform task, and an HTTP task, editable as code or in the topology view. Setup took closer to 25 minutes, slightly longer up front because there's more structure to define than a single script file. The backfill, though, was where Kestra pulled ahead decisively: triggering a historical re-run for a date range was a built-in UI and CLI feature, no custom date-looping logic required, which is exactly the kind of orchestration primitive Kestra is designed around and Windmill simply isn't.

Where each one actually wins

Windmill's auto-generated UI forms are the feature with no real Kestra equivalent. Turning our transform script into a form a non-technical teammate could fill in with an order ID and trigger manually took zero extra work beyond writing the script's parameters with reasonable names and types. That's a genuine app-building capability riding on top of what looks like a workflow tool, and it's the reason teams reach for Windmill for internal ops tooling, not just scheduled jobs.

Kestra's win is integration breadth and orchestration primitives purpose-built for pipeline work: backfills, retries, event-driven triggers reacting to messages or files landing in storage, and a plugin catalog that reaches into cloud infrastructure and data warehouses Windmill's script-first model leaves entirely to you to wire up by hand. If the job looks like classic data engineering, Kestra's plugins mean less custom code than writing the equivalent API client as a Windmill script.

Licensing and self-hosting

Both are free to self-host with real production use, not a crippled trial build. Windmill's AGPLv3 core has no seat limit, bounded only by how many workers you run; its enterprise tier is a separate, optional layer for SSO and high-availability features rather than a gate on the product itself. Kestra's Apache 2.0 license is more permissive still, with its Enterprise Edition, SSO, RBAC, audit logs, a similarly separate layer rather than a feature-gated core. Neither license restricts self-hosting in production, and neither requires Kubernetes to run reliably; both deploy with a standard Docker Compose setup that scales by adding workers.

When NOT to use Windmill

Skip Windmill if the actual job is data-pipeline orchestration: backfills across date ranges, event-driven triggers reacting to infrastructure events, or connecting to the kind of data-warehouse and cloud-service plugins Kestra ships natively. You'd be writing and maintaining that integration code yourself as scripts, where Kestra gives you the primitive already built.

When NOT to use Kestra

Skip Kestra if the job is building internal tools from scripts your team already writes, or ad hoc automation where a non-developer needs a usable form, not a pipeline run. Kestra has no path to generating an interactive tool from a flow the way Windmill does from a script's parameters, and you'd be building that interface layer yourself on top of it.

Which should you pick?

Choose Windmill if your team writes scripts and wants those scripts turned into scheduled jobs, webhooks, or lightweight internal tools without separate app infrastructure; our Windmill review covers the setup and tradeoffs in more depth, and our guide to self-hosting Windmill covers the production Docker deploy. Choose Kestra if the job is orchestrating data pipelines, backfills, or event-driven infrastructure jobs at a scale where purpose-built orchestration primitives matter more than script flexibility; our Kestra vs Apache Airflow comparison covers how it stacks up against the more established orchestrator in that same category. If SaaS business automation is actually closer to the job than either data pipelines or internal dev tooling, our n8n vs Kestra comparison covers that adjacent decision directly.

Read the source docs before you commit either way: Windmill covers its worker model and enterprise tier in detail, and Kestra documents its plugin catalog and current Cloud and Enterprise pricing.

Frequently asked questions

Is Windmill or Kestra easier to learn for a non-developer?

Neither is really built for a non-developer, but Kestra comes closer. Its flows are YAML, not a programming language, so someone comfortable editing structured config can get further without writing real code than they can in Windmill, where every step is an actual script in a real language. Windmill's visual flow builder helps with sequencing steps, but it won't write the script logic inside each one.

Can Kestra generate internal tools the way Windmill does?

No. Kestra has no equivalent to Windmill's auto-generated UI forms. Its output is a pipeline run you monitor through its topology view and execution logs, not an interactive tool a teammate opens and fills in. If building lightweight internal tools from scripts is the actual goal, Windmill is the one built for that; Kestra is built for orchestrating pipelines, not generating app-like interfaces around them.

Which one has better support for AI agent workflows?

Neither has a dedicated agent-reasoning concept the way n8n's AI Agent node does. Both can call an LLM API as a step, a script in Windmill or a plugin task in Kestra, but you're scripting a model call rather than orchestrating autonomous agent behavior in either tool. If an AI-agent step is central to the job, a platform built around that, or a code framework like the ones in our [best open source AI agent frameworks](/self-hosted/best-open-source-ai-agent-frameworks/) roundup, is the better starting point than either.

Do I need Kubernetes to run either one in production?

No, neither requires it. Both deploy via Docker Compose for a standard production setup, with Windmill's worker model and Kestra's executor model each scaling horizontally by adding more containers rather than requiring a Kubernetes cluster from day one. Kubernetes is an option for larger deployments of either, not a prerequisite to get either one running reliably.

↑ Back to top