This release adds controller DAGs, a new DAG type where an LLM decides what runs next instead of you wiring the path in advance, tightens the CORS defaults (breaking for cross-origin setups), and fixes a long list of bugs across retries, distributed logs, scheduling, and handler outputs.
Highlights
Controller DAGs (#2435)
With type: controller, steps stop being a plan and become a catalog of actions. A tasks list declares the goals, an llm block picks the model, and the controller chooses one action per turn, observes the result, and marks tasks complete until every goal is settled.
type: controller
llm:
provider: anthropic
model: claude-sonnet-4-20250514
steps:
- name: run_tests
description: Run the test suite.
run: make test
- name: fix_flaky
description: Quarantine the known flaky test.
run: ./scripts/quarantine.sh
- id: sign_off
name: sign_off
action: human.task
with:
prompt: Tests are green. Ship it?
tasks:
- name: tests_green
description: Finished when run_tests succeeded on its most recent run.
- name: approved
description: Finished when a person answered sign_off with approved=true.Human tasks (#2396, #2399)
The human.task action pauses a run for an acknowledgement or typed operator input, validated against a JSON Schema form, with REST API and Web UI surfaces for answering pending tasks.
Cloud secret providers (#2402, #2403, #2404, #2438)
AWS Secrets Manager, GCP Secret Manager, Azure Key Vault, and Alibaba Cloud KMS join the secret provider set. Profiles and secrets are now managed from one place in the UI (#2416), and LLM provider and model fields accept value references (#2433).
Authentication and access control
Proxy header authentication (#2397) lets an upstream identity-aware proxy authenticate users, with trusted-proxy validation and Helm chart support. OIDC claims can map to workspace grants (#2395), and every DAG run now records the actor that triggered it (#2423).
Breaking change: CORS defaults are secure by default (#2387)
cors_allowed_origins / DAGU_CORS_ALLOWED_ORIGINS changed meaning:
| Before | Now | |
|---|---|---|
| Unset or empty | Every origin allowed, without credentials | Cross-origin browser access disabled |
| Exact origins | Only those origins, credentials enabled | Unchanged |
* in the list |
Treated the same as unset | Allows every origin without credentials, and logs a security warning (louder when auth.mode: none) |
If a separate front end or another host calls the Dagu API from a browser, list its origin explicitly before upgrading. Same-origin usage, including the bundled Web UI and any CLI or server-side client, is unaffected.
Other hardening in this release: DAG resolution is constrained to configured directories (#2424), Windows process tree termination no longer swallows errors (#2440), API key requests skip bcrypt on the hot path (#2394), Git Sync is limited to DAG files (#2413), and dependencies flagged by security scans were bumped (#2430, #2427, #2431).
Notable fixes
- Synchronous start API no longer times out on runs over a few minutes (#2386)
- Distributed run logs stream while the run is still active (#2409)
- Step and run retries inside child DAGs started via
dag.runnow target the persisted child run (#2419) - Scheduled runs resolve the workspace base config again, fixing unknown-action failures and silently wrong env (#2422)
stdout.outputsonhandler_onsteps is published to the DAG run outputs (#2439), andonInit/onWaithandlers appear on run status surfaces (#2441)- Parameter declaration order is preserved in the Start DAG UI (#2421)
- Relative
working_dirresolves against the file the DAG was written in (#2447) - Cached DAG load errors are re-checked instead of being served forever (#2442)
- Output of a step attempt that follows an earlier one is flushed (#2446)
- Controller no longer overrides parameters a step already decided (#2445)
- Workers reconnect to the coordinator after a heartbeat timeout (#2408), and failed queued dispatches are finalized (#2437)
- Succeeded parallel child runs are reused rather than re-executed (#2415)
Also added
Git worktree actions (#2391), dynamic template references (#2414), sub-workflows declaring the outputs their caller sees (#2444), a fallback pull policy (#2401), and Telegram topicId for forum group notifications (#2405).
Added
- feat: add git worktree actions (#2391) @yohamta0
- feat: add OIDC workspace grant mapping (#2395) @yohamta0
- feat: add human task workflow steps (#2396) @yohamta0
- feat: add proxy header authentication (#2397) @yohamta0
- feat: add human task API and web UI (#2399) @yohamta0
- feat: add fallback pull policy (#2401) @dodyirawan85
- feat: add AWS Secrets Manager provider (#2402) @yohamta0
- feat: add GCP Secret Manager provider (#2403) @yohamta0
- feat: add Azure Key Vault provider (#2404) @yohamta0
- feat: add Telegram topicId for forum group support notification (#2405) @dodyirawan85
- feat: reconnect worker to coordinator after heartbeat timeout (#2408) @pirm-in
- feat: support dynamic template references (#2414) @yohamta0
- feat: combine profiles and secrets management (#2416) @yohamta0
- feat: record DAG run trigger actor (#2423) @yohamta0
- feat: support value references in LLM provider and model fields (#2433) @yohamta0
- feat: add controller DAG type where an LLM chooses each step (#2435) @yohamta0
- feat: add Alibaba Cloud KMS provider (#2438) @yohamta0
- feat: let a sub-workflow declare the outputs its caller sees (#2444) @yohamta0
Changed
- chore(deps): bump the ui-security group across 1 directory with 4 updates (#2427) @dependabot
Fixed
- fix: update Go to 1.26.5 (#2384) @yohamta0
- fix: refresh synchronous DAG response deadline (#2386) @yohamta0
- fix: secure CORS defaults (#2387) @yohamta0
- fix: absorb Windows PowerShell cold start in command substitution (#2392) @yohamta0
- test: scale coordinator dispatch timeout on Windows (#2393) @yohamta0
- perf: avoid bcrypt on API key requests (#2394) @yohamta0
- fix: wait for replacement attempt initialization (#2398) @yohamta0
- fix: stream distributed logs while runs are active (#2409) @yohamta0
- fix: limit Git Sync to DAGs (#2413) @yohamta0
- fix: reuse succeeded parallel child runs (#2415) @yohamta0
- fix: target step retries in persisted child DAG runs (#2419) @yohamta0
- fix: preserve YAML parameter order in Start DAG UI (#2421) @yohamta0
- fix: resolve workspace base config for scheduled runs (#2422) @yohamta0
- fix: constrain DAG resolution to configured directories (#2424) @yohamta0
- fix: bump dependencies flagged by security scans (#2430) @yohamta0
- chore(deps): bump github.com/oapi-codegen/oapi-codegen/v2 from 2.5.1 to 2.7.1 in the go-security group across 1 directory (#2431) @dependabot
- refactor: streamline cloud secret providers (#2434) @yohamta0
- fix: finalize failed queued dispatches (#2437) @yohamta0
- fix: publish lifecycle handler outputs to the DAG run outputs (#2439) @yohamta0
- Security: Windows Process Tree Termination Ignores Errors (#2440) @tomaioo
- fix: expose onInit and onWait handlers on run status surfaces (#2441) @yohamta0
- fix: re-check cached DAG load errors instead of serving them forever (#2442) @yohamta0
- test: avoid Windows fault in scheduler panic recovery (#2443) @yohamta0
- fix: stop the controller overriding parameters a step already decided (#2445) @yohamta0
- fix: flush the output of a step attempt that follows an earlier one (#2446) @yohamta0
- fix: resolve a relative working_dir against the file the DAG was written in (#2447) @yohamta0
Contributors
Thanks to our contributors for this release:
| Contribution | Contributor |
|---|---|
| bug: Preserve YAML parameter declaration order in the Start DAG UI (#2420) | @VKFloFi (report) |
bug: Retrying a step (or the whole run) inside a child DAG started via dag.run silently does nothing (#2411), feat: Show which user triggered a manual DAG run (#2412) |
@VKdennis (report) |
| bug: The start-sync api has no response when the dag's execute time more than 3 minutes (#2385) | @aigeling (report) |
| Security issue with HTTP Headers of REST API that allow for remote code execution (#726) | @chrishoage (report) |
| chore(deps): bump the ui-security group across 1 directory with 4 updates (#2427), chore(deps): bump github.com/oapi-codegen/oapi-codegen/v2 from 2.5.1 to 2.7.1 in the go-security group across 1 directory (#2431) | @dependabot |
| feat: add fallback pull policy (#2401), feat: add Telegram topicId for forum group support notification (#2405) | @dodyirawan85 |
| feat: add outputBuffering option for step log streaming (#2310) | @four-bytes-robby (report) |
bug: stdout.outputs declared on a handler_on step is captured but never published to the DAG run outputs (#2428), question: onInit handler is recorded but never displayed — is that intended? (#2429) |
@oscar6echo (report) |
| feat: reconnect worker to coordinator after heartbeat timeout (#2408) | @pirm-in |
| Security: Windows Process Tree Termination Ignores Errors (#2440) | @tomaioo |
| bug: scheduled runs drop the workspace base config — unknown-action failures and silently wrong env (#2418) | @vk-marcel (report) |
New Contributors
- @dodyirawan85 made their first contribution in #2401
- @pirm-in made their first contribution in #2408
- @tomaioo made their first contribution in #2440
Full Changelog: v2.10.7...v2.11.0