Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
521a2b2
docs(release): create 1.4.0 release branch
aj-emerich Mar 9, 2026
7ccec14
Merge branch 'main' into docs/1.4.0-release
aj-emerich Mar 18, 2026
addb3cc
docs(prototype): split config and expression pages (#4241)
aj-emerich Mar 18, 2026
8a2979f
docs(function-reference): recover credential()
aj-emerich Mar 18, 2026
84a938c
docs(plugin-defaults): add cpu cores configuration and update defaults
aj-emerich Mar 18, 2026
4af0868
docs(password-policy): update configuration
aj-emerich Mar 18, 2026
33ecfa3
docs(script-commands-triggers): add to polling and language how-to gu…
aj-emerich Mar 19, 2026
1f48316
docs(git-blueprints): add Blueprint Sync and Push docs
aj-emerich Mar 31, 2026
984f3d0
docs(PurgeLogs): add new flags
aj-emerich Mar 31, 2026
1b00371
docs(agent-skills): add tools section and skill example
aj-emerich Mar 31, 2026
89cf5cd
docs(allowed-namespaces): match current ui
aj-emerich Apr 2, 2026
e4b9178
Merge branch 'main' into docs/1.4.0-release
aj-emerich Apr 13, 2026
4c7f58c
docs(PurgeLogs): add batch size
aj-emerich Apr 13, 2026
1713323
Merge branch 'main' into docs/2.0.0-release
aj-emerich Apr 13, 2026
56cc53d
docs(executor-metrics): add new metrics
aj-emerich Apr 13, 2026
a0323ff
Merge branch 'main' into docs/2.0.0-release
aj-emerich Apr 13, 2026
b120009
docs(expressions): bring back the monolith page (#4564)
aj-emerich Apr 13, 2026
fb4fb1e
Merge branch 'main' into docs/2.0.0-release
aj-emerich Apr 13, 2026
184a5ca
docs(runif-when): add migration guide
aj-emerich Apr 13, 2026
217f939
docs(when): use when instead of conditions and runIf
aj-emerich Apr 13, 2026
6ea6be4
docs(TRACEPARENT): add tracing for scripts
aj-emerich Apr 13, 2026
47a2389
docs(tls/mtls): update enterprise config
aj-emerich Apr 16, 2026
cb26b85
Merge branch 'main' into docs/2.0.0-release
aj-emerich Apr 16, 2026
3cc7341
docs(ai-agents): mention usage metric emits
aj-emerich Apr 17, 2026
d334f40
Merge branch 'main' into docs/2.0.0-release
aj-emerich Apr 20, 2026
f30039a
docs(ldap): add mode property controls
aj-emerich Apr 20, 2026
84749d3
docs(checks.conditions): conditions now when
aj-emerich Apr 20, 2026
f695967
docs(trigger-redesign)
aj-emerich Apr 20, 2026
4c5b9ce
docs(trigger-redesign): Enforce better style
aj-emerich Apr 20, 2026
f21ff0d
docs(loop): add new loop task
aj-emerich Apr 20, 2026
44ffb44
docs(checks): improve page
aj-emerich Apr 20, 2026
6446eac
Merge branch 'main' into docs/2.0.0-release
aj-emerich Apr 21, 2026
427cc66
Merge branch 'main' into docs/2.0.0-release
aj-emerich Apr 21, 2026
e2c7670
docs(2.0-migration-guide): add call out and links to metadata migrations
aj-emerich Apr 21, 2026
3e1f8fd
docs(trigger-redesign): fix flows and add more to migration guide
aj-emerich Apr 21, 2026
25cc015
docs(migration-guides): further polish
aj-emerich Apr 22, 2026
57e97c1
docs(worker-groups): dynamic resolve to null
aj-emerich Apr 22, 2026
aad45e7
docs(migration-guide): ForEach^ to Loop
aj-emerich Apr 24, 2026
fa75dff
docs(s3-files): add configuration
aj-emerich Apr 27, 2026
7d12791
docs(plugin-defaults): forced on flow level
aj-emerich May 4, 2026
f916680
chore(merge): resolve conflicts with origin/main
aj-emerich May 4, 2026
42cbc26
docs(k8s-runner): add connection-concurrency section
aj-emerich May 5, 2026
3ef5015
docs(logshipper): add Dash0
aj-emerich May 5, 2026
9ba65b7
docs(aws): ensure mention of image
aj-emerich May 5, 2026
d31280e
docs(fs): add recursive migration guide
aj-emerich May 5, 2026
6847209
docs(style): small style edits to new content
aj-emerich May 5, 2026
9105204
docs(outputfiles): script output files
aj-emerich May 5, 2026
e7f325e
Merge remote-tracking branch 'origin/main' into docs/2.0.0-release
aj-emerich May 6, 2026
ce94549
Merge branch 'main' into docs/2.0.0-release
aj-emerich May 6, 2026
eba7436
docs(runIf): revert change to when
aj-emerich May 8, 2026
9e21b30
docs(loop): update output exp
aj-emerich May 11, 2026
f428e1f
docs(regex): improve regex filter and timeout docs for 2.0
aj-emerich May 15, 2026
1b70b77
chore(merge): merge main into 2.0.0-release, keep regex docs
aj-emerich May 15, 2026
5f4011e
docs(loop): major updates after enablement session
aj-emerich May 18, 2026
22535c9
docs(read-only-secrets): add exclude on tags
aj-emerich May 19, 2026
ddd940c
docs(functions): remove parentOutput
aj-emerich May 19, 2026
7aa5322
docs(expressions): switch to fromJson()
aj-emerich May 19, 2026
968d1d6
docs(expressions): add isLastWorkingDay
aj-emerich May 21, 2026
d012c92
docs(read-only-secrets): add tags filters
aj-emerich May 21, 2026
bfb176e
docs(plugin): correct exclusion behavior
aj-emerich May 22, 2026
04a1aca
Merge branch 'main' into docs/2.0.0-release
aj-emerich May 22, 2026
537f899
Merge branch 'main' into docs/2.0.0-release
aj-emerich May 22, 2026
59f869c
docs(mcptrigger): add docs across set
aj-emerich May 27, 2026
e439b6b
docs(file-uploads): add to local file access page and config
aj-emerich May 28, 2026
d09b1db
docs(cloudrun): add waitUntilCompletion details
aj-emerich May 28, 2026
d09b7cc
docs(unit-tests): expectedState property
aj-emerich May 29, 2026
9766528
docs(plugin-defaults): remove warning
aj-emerich May 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ This section covers two distinct things: (1) guidance for AI agents interacting
- [AI Agents](https://kestra.io/docs/ai-tools/ai-agents.md): Build autonomous orchestration patterns where agents decide which tasks to run based on runtime context
- [AI Workflows](https://kestra.io/docs/ai-tools/ai-workflows.md): Patterns for building AI-native workflows — LLM calls, tool use, and multi-step inference pipelines — using Kestra tasks
- [RAG Workflows](https://kestra.io/docs/ai-tools/ai-rag-workflows.md): Retrieval-augmented generation patterns — indexing, chunking, embedding, and querying — orchestrated as Kestra flows
- [MCP Server](https://kestra.io/docs/ai-tools/mcp-server.md): Expose Kestra flows as MCP tools for AI agents — configure MCP servers, connect Claude Desktop/Code/Cursor, and understand OSS vs EE auth options

## Authoring flows

Expand All @@ -38,7 +39,8 @@ Use this section when writing, editing, or understanding the structure of a Kest
- [Flowable tasks](https://kestra.io/docs/workflow-components/tasks/flowable-tasks.md): Control flow primitives — `Sequential`, `Parallel`, `ForEach`, `ForEachItem`, `Switch`, `If`, `DAG`, `LoopUntil`, `Subflow`, `AllowFailure`, `Pause`, `WorkingDirectory`
- [Inputs](https://kestra.io/docs/workflow-components/inputs.md): Typed runtime parameters (`STRING`, `INT`, `BOOLEAN`, `FILE`, `JSON`, `ARRAY`, `ENUM`, `DATETIME`, etc.) with optional defaults and validation
- [Outputs](https://kestra.io/docs/workflow-components/outputs.md): Reference task outputs with `{{ outputs.task_id.attribute }}`, dynamic task outputs with `{{ outputs.task_id[taskrun.value].attribute }}`, and sibling outputs inside loops
- [Triggers](https://kestra.io/docs/workflow-components/triggers.md): Start flows automatically — Schedule (cron), Flow (react to another flow's completion), Webhook, Polling, and Realtime triggers
- [Triggers](https://kestra.io/docs/workflow-components/triggers.md): Start flows automatically — Schedule (cron), Flow (react to another flow's completion), Webhook, Polling, Realtime, and MCP Tool triggers
- [MCP Tool Trigger](https://kestra.io/docs/workflow-components/triggers/mcp-tool-trigger.md): Register a flow as a named MCP tool — `toolName`, `title`, `toolDescription`, `mcpServer`, and `annotations` properties; flow inputs/outputs auto-mapped to JSON schema
- [Variables](https://kestra.io/docs/workflow-components/variables.md): Flow-level named values referenced as `{{ vars.name }}`; useful for values reused across multiple tasks
- [Subflows](https://kestra.io/docs/workflow-components/subflows.md): Call another flow as a task, pass inputs, wait for completion, and consume its outputs
- [Errors](https://kestra.io/docs/workflow-components/errors.md): `errors` block for flow-level error handling tasks; `AllowFailure` for marking individual tasks as non-fatal
Expand Down Expand Up @@ -197,6 +199,7 @@ Every page in the Kestra documentation. Use this section to enumerate all availa
- [AI Copilot in Kestra – Generate and Edit Flows](https://kestra.io/docs/ai-tools/ai-copilot.md)
- [RAG Workflows in Kestra – Retrieval-Augmented Generation](https://kestra.io/docs/ai-tools/ai-rag-workflows.md)
- [AI Workflows in Kestra: Orchestrate with Any LLM](https://kestra.io/docs/ai-tools/ai-workflows.md)
- [MCP Server in Kestra – Expose Flows as AI Tools](https://kestra.io/docs/ai-tools/mcp-server.md)
- [API Reference: Enterprise and Open Source Editions](https://kestra.io/docs/api-reference.md)
- [Cloud & Enterprise API Reference for Kestra](https://kestra.io/docs/api-reference/enterprise.md)
- [SDK Language Clients for the Kestra API](https://kestra.io/docs/api-reference/kestra-sdk.md)
Expand Down Expand Up @@ -654,4 +657,5 @@ Every page in the Kestra documentation. Use this section to enumerate all availa
- [Realtime Trigger in Kestra – Millisecond Eventing](https://kestra.io/docs/workflow-components/triggers/realtime-trigger.md)
- [Schedule Trigger in Kestra – Cron-Based Scheduling](https://kestra.io/docs/workflow-components/triggers/schedule-trigger.md)
- [Webhook Trigger in Kestra – Start Flows via HTTP](https://kestra.io/docs/workflow-components/triggers/webhook-trigger.md)
- [MCP Tool Trigger in Kestra – Expose Flows as AI Tools](https://kestra.io/docs/workflow-components/triggers/mcp-tool-trigger.md)
- [Variables in Kestra – Reuse Values Across Flows](https://kestra.io/docs/workflow-components/variables.md)
2 changes: 1 addition & 1 deletion src/contents/blogs/release-1-2/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ id: vm_provisioning
namespace: company.team

checks:
- condition: "{{ kv('VMs') | length < 2 }}"
- when: "{{ kv('VMs') | length < 2 }}"
message: "You have provisioned too many VMs"
style: ERROR
behavior: BLOCK_EXECUTION
Expand Down
5 changes: 2 additions & 3 deletions src/contents/docs/03.tutorial/04.triggers/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,9 @@ triggers:

- id: flow_trigger
type: io.kestra.plugin.core.trigger.Flow
conditions:
- type: io.kestra.plugin.core.condition.ExecutionFlow
dependsOn:
- flowId: first_flow
namespace: company.team
flowId: first_flow
```

:::alert{type="info"}
Expand Down
36 changes: 16 additions & 20 deletions src/contents/docs/03.tutorial/05.flowable/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ For example, you can use the [If task](/plugins/core/flow/io.kestra.plugin.core.

The example below redesigns the flow to use a `SELECT` input for product category rather than a `STRING` URI, while still calling [dummyjson](https://dummyjson.com). An API request is made based on the selected category — `beauty` or `notebooks` (one does not exist).

The `check_products` If task has a `condition` of `"{{ json(outputs.api.body).products | length > 0 }}"` (i.e., checking whether the API body is not empty and contains at least one product). The log message then depends on whether the actual product category exists or not. The `then` property defines the action for a true condition, and the `else` property defines the action for a false result.
The `check_products` If task has a `condition` of `"{{ fromJson(outputs.api.body).products | length > 0 }}"` (i.e., checking whether the API body is not empty and contains at least one product). The log message then depends on whether the actual product category exists or not. The `then` property defines the action for a true condition, and the `else` property defines the action for a false result.

```yaml
id: getting_started
Expand All @@ -41,11 +41,11 @@ tasks:

- id: check_products
type: io.kestra.plugin.core.flow.If
condition: "{{ json(outputs.api.body).products | length > 0 }}"
condition: "{{ fromJson(outputs.api.body).products | length > 0 }}"
then:
- id: log_status
type: io.kestra.plugin.core.log.Log
message: "Found {{ json(outputs.api.body).products | length }} products for category {{ inputs.category }}"
message: "Found {{ fromJson(outputs.api.body).products | length }} products for category {{ inputs.category }}"
- id: python
type: io.kestra.plugin.scripts.python.Script
containerImage: python:slim
Expand Down Expand Up @@ -87,31 +87,27 @@ Execute the flow twice, once with `beauty` and once with `notebooks` to examine

A common orchestration pattern is operating on a set of values. Kestra offers several approaches depending on your use case. The standalone examples below demonstrate each type.

### ForEach
### Loop

The **ForEach** flowable task executes a group of tasks for each value in the list. There are many ways to implement ForEach for complex looping operations, possibly incorporating conditional flowable tasks or subtasks. See more examples in the [ForEach documentation](/plugins/core/flow/io.kestra.plugin.core.flow.foreach).
The `Loop` flowable task iterates over a list of values and runs child tasks for each item. Each iteration runs as an isolated sub-execution. Access the current value with `{{ item.value }}` and the zero-based index with `{{ item.index }}`.

As an introduction to the feature, the below example demonstrates using ForEach to make an API call to [OpenLibrary](https://openlibrary.org/dev/docs/api/search) to get a list of associated titles for each author in the list. The values are defined as a JSON string or an array, i.e., a list of string values `["value1", "value2"]` or a list of key-value pairs `[{"key": "value1"}, {"key": "value2"}]`.

You can access the current iteration value using the variable `{{ taskrun.value }}`:
Values can be a static list, a JSON array string, a map, or an ION file URI. The example below makes an API call for each author in the list:

```yaml
id: for_loop_example
id: loop_example
namespace: tutorial

tasks:
- id: for_each
type: io.kestra.plugin.core.flow.ForEach
- id: loop
type: io.kestra.plugin.core.flow.Loop
values: ["pynchon", "dostoyevsky", "hedayat"]
tasks:
- id: api
type: io.kestra.plugin.core.http.Request
uri: "https://openlibrary.org/search.json?author={{ taskrun.value }}&sort=new"
uri: "https://openlibrary.org/search.json?author={{ item.value }}&sort=new"
```

After execution, the Gantt view shows separate runs for each of the three listed authors in the task.

![forEach example](./for-each-author.png)
After execution, the Gantt view shows a separate task group for each author. See the [Loop documentation](../../05.workflow-components/01.tasks/00.flowable-tasks/index.md#loop) for output collection, nested loops, error handling, and map-reduce patterns.

### LoopUntil

Expand Down Expand Up @@ -147,11 +143,11 @@ This flow checks an HTTP endpoint every 30 seconds and stops either when it retu

A common orchestration requirement is executing independent processes **in parallel**. For example, you can process data for each partition in parallel. This can significantly speed up the processing time.

The flow below uses the `ForEach` flowable task to execute a list of `tasks` in parallel.
The flow below uses the `Loop` flowable task with `concurrencyLimit: 0` to process all partitions simultaneously.

1. The `concurrencyLimit` property with value `0` makes the list of `tasks` to execute in parallel.
1. The `concurrencyLimit` property set to `0` removes the cap on parallel iterations.
2. The `values` property defines the list of items to iterate over.
3. The `tasks` property defines the list of tasks to execute for each item in the list. You can access the iteration value using the `{{ taskrun.value }}` variable.
3. The `tasks` property defines the child tasks for each iteration. Access the iteration value with `{{ item.value }}`.

```yaml
id: python_partitions
Expand All @@ -171,7 +167,7 @@ tasks:
Kestra.outputs({'partitions': partitions})

- id: processPartitions
type: io.kestra.plugin.core.flow.ForEach
type: io.kestra.plugin.core.flow.Loop
concurrencyLimit: 0
values: '{{ outputs.getPartitions.vars.partitions }}'
tasks:
Expand All @@ -186,7 +182,7 @@ tasks:
import time
from kestra import Kestra

filename = '{{ taskrun.value }}'
filename = '{{ item.value }}'
print(f"Reading and processing partition {filename}")
nr_rows = random.randint(1, 1000)
processing_time = random.randint(1, 20)
Expand Down
19 changes: 7 additions & 12 deletions src/contents/docs/03.tutorial/06.errors/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,11 @@ tasks:

- id: check_products
type: io.kestra.plugin.core.flow.If
condition: "{{ json(outputs.api.body).products | length > 0 }}"
condition: "{{ fromJson(outputs.api.body).products | length > 0 }}"
then:
- id: log_status
type: io.kestra.plugin.core.log.Log
message: "Found {{ json(outputs.api.body).products | length }} products for category {{ inputs.category }}"
message: "Found {{ fromJson(outputs.api.body).products | length }} products for category {{ inputs.category }}"
- id: python
type: io.kestra.plugin.scripts.python.Script
containerImage: python:slim
Expand Down Expand Up @@ -141,14 +141,9 @@ tasks:
triggers:
- id: listen
type: io.kestra.plugin.core.trigger.Flow
conditions:
- type: io.kestra.plugin.core.condition.ExecutionStatus
in:
- FAILED
- WARNING
- type: io.kestra.plugin.core.condition.ExecutionNamespace
namespace: company.team
prefix: true
dependsOn:
- states: [FAILED, WARNING]
when: "{{ namespace | startsWith('company.team') }}"
```

Adding this flow ensures you receive a Slack alert for any flow failure in the `company.team` namespace.
Expand Down Expand Up @@ -242,11 +237,11 @@ tasks:

- id: check_products
type: io.kestra.plugin.core.flow.If
condition: "{{ json(outputs.api.body).products | length > 0 }}"
condition: "{{ fromJson(outputs.api.body).products | length > 0 }}"
then:
- id: log_status
type: io.kestra.plugin.core.log.Log
message: "Found {{ json(outputs.api.body).products | length }} products for category {{ inputs.category }}"
message: "Found {{ fromJson(outputs.api.body).products | length }} products for category {{ inputs.category }}"
- id: python
type: io.kestra.plugin.scripts.python.Script
containerImage: python:slim
Expand Down
Loading
Loading