Kestra is an open-source orchestration platform whose workflows are declared in YAML rather than written in a programming language: an event-driven, language-agnostic engine with a large plugin catalogue, a JVM runtime backed by Postgres or MySQL, and Enterprise and Cloud editions above the Apache-2.0 core.
A JVM platform (webserver, scheduler, executor, workers) self-hosted with orchestration state in Postgres, MySQL, or H2; only the workers touch your infrastructure. Task outputs pass through the execution context, capped near 1MB, with larger data in internal storage as a URI. The core is Apache-2.0; Enterprise is priced per instance, and Kestra Cloud is the managed option.
How Kestra answers the questions Workflow Orchestration turns on.
| How it works | |
| Authoring model | Declarative YAML: an id, a namespace and a list of tasks; a no-code editor over it |
| Unit of work | A task inside a flow, and the flow (id, namespace, tasks) is what you deploy; subflows compose them. Assets exist but are an Enterprise lineage overlay declared on a task, not the thing you author |
| Passing data | Outputs in the execution context, read as {{ outputs.task.attribute }} and capped near 1MB because the context is one database row; larger data goes to internal storage as Ion (filesystem, S3, GCS or Azure Blob) and passes as a URI, with a namespace key-value store for state between flows |
| Triggers | Cron schedules with scheduling conditions and backfill, another flow reaching a state, a webhook URL, polling an external system at an interval, and realtime triggers at millisecond latency on Kafka, Pulsar, AMQP, MQTT, SQS, Pub/Sub, Event Hubs, NATS, Redis and Debezium CDC |
| Delivery guarantee | Retries declared per task · per flow or globally · constant · exponential or random |
| Caching and reruns | taskCache stores a runnable task's status and outputs in the database under a ttl and skips it when the same execution runs again with identical inputs; separately, WorkingDirectory caches files by glob so dependency installs are not repeated, but only under the Process runner, and the Docker runner every script task defaults to throws instead |
| Running it | |
| Where tasks run | Worker processes: the only component that touches your infrastructure |
| Connections | |
| Task languages | Dedicated script plugins for fifteen languages (Python, R, Node.js, Shell, PowerShell, .NET, Julia, Ruby, Go, Deno, Lua, Bun, PHP, Perl and Groovy) each with an inline Script and a file-based Commands task; anything else runs through Shell in a container |
| Connectors | 1,900+ plugins across data, cloud, infrastructure, AI and business systems; HTTP and container tasks cover whatever is not packaged |
| Cost | |
| Billing unit | Free self-hosted, with unlimited flows, tasks and executions; Enterprise is an annual subscription priced per instance rather than per seat or per run, and Kestra Cloud is usage-based with no unit published |
vs Kestra: Free · Operational complexity: High · Python, TypeScript
vs Kestra: Self-hosted · Free · Operational complexity: High
vs Kestra: Self-hosted · Free · Operational complexity: High · Go