* feat: allow early return on steps inside a branch to one The "Early return for sync webhooks" flow setting could only point at a top-level step. It can now also point at a step inside a branch to one, in any branch including the default one, and through nested branches to one. When the branch is taken, the sync call returns that step's result as soon as it completes while the rest of the flow keeps running. When it is not taken, the call returns the flow's final result. The sync wait loops already resolved nested steps and fell back to the final result, so they are unchanged. Worker: check_if_early_return_or_last_in_early_return_parent now accepts a job whose step id matches early_return at any depth, as long as every job between it and the root is a branch to one. A loop iteration or a subflow reusing the same id does not take the stream. The existing case, the last step of a branch to one that is itself the early-return step, is unchanged. Frontend: the native <select> is replaced by EarlyReturnPicker, a searchable list in flow order where each nested step shows its path (e.g. `a › Branch 1`). Branch to all and loops inside a branch to one, and the steps inside them, are not offered: the results lookup cannot resolve them when nested. Picking a nested step shows a hint that it only runs if its branch is taken. * fix: stream the last step when the early return branch is not taken Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: keep the stream off the last step once the early return step ran Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor: list early return steps by id only Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor: use the standard select for the early return step Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: match the early return step by its flow scope, not its path Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: keep branch to all and loop steps off the early return stream Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat: allow early return on steps inside a branch to all Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: resolve a nested branch to all or loop as the early return step Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: pin which step streams for an early return inside branches Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix: return an empty nested loop or branch to all as its early return list Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * revert: read an empty container's early return status from the root An empty nested loop or branch to all falls back to the flow's final result again, so an empty top-level loop that failed keeps its real status. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: stefan <stefan.radovanovic@ip-paris.fr> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Windmill CLI
A simple CLI allowing interactions with windmill from the command line.

You can find more information in Windmill Docs
Installation
Install the wmill CLI tool using npm install -g windmill-cli.
Update to the latest version using wmill upgrade.
Workspaces
To get started run wmill workspace add or use the instructions from the
workspace settings.
Running Flows & Scripts
Run a script or flow using wmill flow/script run u/username/path/to/script and
pass any inputs using --data + Inputs specified as a JSON string or a file
using @ <filename> or stdin using @-.
Curl-style syntax using -d @- for stdin or -d @<filename> is also supported.
Flow Steps and Logs will be streamed during execution automatically.
Pushing Resources, Scripts & More
The CLI can push specifications to a windmill instance. See the examples/ folder for formats.
Switch to a different workspace
wmill workspace switch <workspace_name>
Sync a workspace
Pull
wmill sync pull
Push
wmill sync push
We recommend using the --yaml option to use yaml instead of json as the encoding format. Yaml will be made the default soon.
Pushing individual files
You can push individual resources using
wmill <type> push <file_name> \<remote_name\>. This does not require a special
folder layout or file name, as this is given at runtime.
Listing
All commands support listing by just not providing a subcommand, ie
wmill script will result in a list of scripts. Some allow additional options,
learn about this by specifying --help.
User Management
You can add & remove users via wmill user add/remove, and list them using
wmill user
Pulling
You can pull the entire workspace using wmill pull
Completion
The CLI comes with completions out of the box via wmill completions <shell>.
(Via cliffy)
Bash
To enable bash completions add the following line to your ~/.bashrc:
source <(wmill completions bash)
Fish
To enable fish completions add the following line to your
~/.config/fish/config.fish:
source (wmill completions fish | psub)
Zsh
To enable zsh completions add the following line to your ~/.zshrc:
source <(wmill completions zsh)
Development
AI Guidance Variants
wmill init can now materialize alternate AI guidance bundles without changing
the generated defaults in the repo, but this is exposed as internal env-var
overrides rather than public CLI flags.
Examples:
WMILL_INIT_AI_SKILLS_SOURCE=/path/to/custom/skills wmill init --use-default
WMILL_INIT_AI_SKILLS_SOURCE=/path/to/custom/skills WMILL_INIT_AI_AGENTS_SOURCE=/path/to/AGENTS.md wmill init --use-default
WMILL_INIT_AI_SKILLS_SOURCE=/path/to/custom/skills WMILL_INIT_AI_CLAUDE_SOURCE=/path/to/CLAUDE.md wmill init --use-default
This is the same guidance-writing path used by the benchmark CLI under
ai_evals/, so the benchmark harness and wmill init now generate the same
project guidance shape:
AGENTS.mdCLAUDE.md.agents/skills/*.claude/skills/*
windmill-yaml-validator
wmill lint imports the sibling windmill-yaml-validator package from source rather than
from npm, so its schemas always match the OpenAPI specs of the current checkout. bun install regenerates them through this package's preinstall script; run it again after
editing openflow.openapi.yaml or backend/windmill-api/openapi.yaml:
npm --prefix ../windmill-yaml-validator run gen
Running Tests
Prerequisites:
- PostgreSQL running locally (default:
postgres://postgres:changeme@localhost:5432) - Rust toolchain installed
Run tests locally (full features):
bun test test/
Run tests in CI mode (minimal features, skips EE tests):
CI_MINIMAL_FEATURES=true bun test test/
| Variable | Description |
|---|---|
CI_MINIMAL_FEATURES |
Set to true to skip EE-dependent tests |
DATABASE_URL |
PostgreSQL connection string |
EE_LICENSE_KEY |
Enterprise license key for EE features |
