New to Kestra?
Use blueprints to kickstart your first workflows.
A Hello World example flow in Kestra. Take a user input, pass values between tasks, run a shell command, and log a personalized welcome message.
A beginner-friendly Hello World flow that introduces the core building blocks of Kestra orchestration: inputs, outputs, task chaining, logging, and scheduled triggers. It takes a user input, generates a value in one task, runs a shell command in another, then logs a friendly welcome message that combines the input with both task outputs. It solves the first problem every new orchestration user faces: understanding how data flows declaratively from inputs through tasks to logs without writing glue code.
user input of type STRING with a default of Rick Astley, so it runs out of the box with no configuration.first_task uses io.kestra.plugin.core.output.OutputValues to emit a message value (thrilled) that downstream tasks can reference.second_task uses io.kestra.plugin.scripts.shell.Commands to run quick shell commands and surfaces structured output via the ::{"outputs":{...}}:: convention.hello_world uses io.kestra.plugin.core.log.Log to print a greeting built from {{ inputs.user }}, {{ outputs.first_task.values.message }}, and the second task's returned data.io.kestra.plugin.core.trigger.Schedule trigger is defined with a 0 9 * * * cron (left disabled: true) to demonstrate how recurring runs are wired up.Kestra makes task dependencies, inputs, and outputs explicit in declarative YAML, so data flow is readable and versioned rather than buried in scripts. Event triggers, schedules, automatic retries, and full execution lineage are built in, giving you observability and reliability that a bare shell script or a lone cron entry cannot provide. A plain cron line can fire a command on a timer, but it cannot pass typed inputs, chain task outputs, capture per-task logs, or replay a failed run, which is exactly the gap this flow illustrates.
{{ secret('NAME') }} values and runs without credentials.tutorial namespace.user input.disabled: false on the Schedule trigger to enable the daily 09:00 run.second_task with a real script (Python, Node, or shell) that calls an API or processes a file.If or Switch tasks.