Favicon of Kestra

Kestra

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.

LicenseOpen source (permissive)· Apache-2.0
DeploymentSelf-hostedManaged
PricingFreeSubscription
Operational complexityMedium
WorkloadBatch
LanguageJava

Use it when

  • The work is polyglot; YAML declares the flow while script tasks in fifteen languages and 1,900+ plugins run it.
  • Mixed-skill teams need a no-code editor and engineers need the same engine underneath.
  • Triggers should be event-driven at millisecond latency: Kafka, Pulsar, SQS, Pub/Sub, NATS, or Debezium CDC.
  • You want a simple self-hosted start on Postgres or MySQL with an enterprise scale path later.

Think twice when

  • Engineers want pipelines as Python code with tests; Airflow, Dagster, and Prefect fit that culture, and YAML at scale needs discipline.
  • Asset-level lineage matters; assets are an Enterprise overlay, not the unit you author.
  • Key scale features (the Kafka and Elasticsearch backbone, worker groups, RBAC, SSO) sit behind the Enterprise edition.

How it runs

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.

Details

Compare

How Kestra answers the questions Workflow Orchestration turns on.

Workflow Orchestration
How it works
Authoring modelDeclarative YAML: an id, a namespace and a list of tasks; a no-code editor over it
Unit of workA 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 dataOutputs 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
TriggersCron 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 guaranteeRetries declared per task · per flow or globally · constant · exponential or random
Caching and rerunstaskCache 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 runWorker processes: the only component that touches your infrastructure
Connections
Task languagesDedicated 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
Connectors1,900+ plugins across data, cloud, infrastructure, AI and business systems; HTTP and container tasks cover whatever is not packaged
Cost
Billing unitFree 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

Share:

Alternatives to Kestra

Favicon

 

  
  
Favicon

 

  
  
Favicon