Highlights
v2.20 redesigns the web UI and rebuilds how it monitors runs. The Overview now leads with what needs a person, including problems that hold back many runs at once. Run lists and logs stay fast on busy servers. Browser steps can upload files and trust private certificate authorities. Per-DAG webhooks can get a public URL through Dagu Cloud. MCP now works behind proxies and with ChatGPT's connector.
v2.20.0 was tagged but not published, so v2.20.1 is the first v2.20 release.
A redesigned web UI
- New shell and look: a command palette (⌘K or Ctrl+K), a flat sectioned sidebar, and row actions that appear on hover or keyboard focus (#3147). The interface font is now bundled with the server, and the UI follows the system light or dark theme (#3145).
- Clearer and safer screens:
- status labels are readable and translated, and workflows have one name throughout (#3142);
- each screen's main action stands out, and disruptive actions ask for confirmation (#3144);
- a missing page or a failed request shows a not-found or error state instead of a blank page (#3141);
- layouts are fixed at desktop and phone widths (#3146).
- Run page: graph controls no longer cover nodes, commands no longer wrap into tall chips in the step table, and the header labels its actions (#3143).
Monitoring
-
Overview Activity view (#3151):
- one lane per workflow for the latest runs, with Load more and drag-to-zoom;
- Needs attention lists workflows whose latest run failed (with the failed step, error and Retry), runs waiting for input, and runs taking more than twice their usual time;
- In progress and Up next show running and scheduled runs;
- everything updates live.
-
System alerts in Needs attention:
- a stopped scheduler that holds back scheduled or queued runs (#3162);
- queues whose runs cannot start because no healthy worker matches their selector, none is available, or runs cannot be handed to a worker (#3179);
- a data disk that is 90% full or more (#3179).
Each queue also shows how full it is and how long its next run has waited.
-
Workflow and run pages (#3153): the workflow page summarizes the latest run and lets you answer approvals in place. The run page is the one place to open a run, and its tab and step are in the URL, so a link reopens them.
-
Logs:
- a 10,000-line log renders its first line in about 540 ms, down from 945 ms, and scrolls smoothly (#3154);
- the run log keeps your place while new lines arrive, and step logs switch between stdout and stderr in place (#3154);
- reading the end of a 121 MB log takes 0.33 ms instead of 33.5 ms, finished steps stop polling their logs, and stderr and "Open in new tab" links open the right log (#3150).
-
Faster run lists: the Executions page and the Overview read runs newest first and stop once they have a page, so their cost no longer grows with the number of runs per day (#3161).
Browser automation
upload: gives local files to a page's file input, or to the file picker an element opens, with no window shown (#3163).browser.trusted_cas: trusts private certificate authorities and self-signed server certificates for the hosts you list, without a client certificate.
Webhooks and Dagu Cloud
- A per-DAG webhook can get a public URL through Dagu Cloud (#3164).
- GitHub, Stripe, Slack or any Standard Webhooks sender can then start a DAG on a server that has no public address.
- It is off by default, and an admin turns it on per webhook.
- Requests wait at Dagu Cloud for up to 7 days while the server is offline.
- Server processes that share a data directory now keep one webhook per DAG (#3174).
MCP
- The idle MCP event stream (
GET /mcp) sends a heartbeat every 10 seconds (#3172).- Cloudflare no longer returns 524, and proxies with idle timeouts keep the stream open.
- Run-watch notifications now reach clients behind them.
dagu_changehas a flat input schema, so ChatGPT's connector sends every argument instead of onlytype(#3177).
Other changes
- Gemini thinking settings are sent inside
thinkingConfig, where the API accepts them (#3139). dagu computer cache showprints a device's recordings as pinned steps to copy into a workflow (#3140).- Quoted foreach item fields resolve in keys, bodies,
working_dirandcollect(#3148). - Email notifications with log attachments now include each step's stdout and stderr logs (#3166).
- The Events page shows each run's outcomes instead of a Running row for every step change (#3173).
- The preconditions spec states that a skipped step does not fail the run (#3159).
Upgrade notes
GET /event-logsno longer returnsdag.run.updatedevents unless you request them withtype=dag.run.updated(#3173). After the upgrade, a load-more cursor issued by the old version returns 400 once; refreshing clears it.
Changed
- Nest Gemini thinking settings in thinkingConfig (#3139) @Ehsan-hash
- Show computer recordings as pinned steps (#3140) @yohamta0
- Show readable status labels, correct plurals, and one name for workflows (#3142) @yohamta0
- Clean up the run graph, step table, and run header (#3143) @yohamta0
- Make main actions primary, add confirmations, and quiet list pages (#3144) @yohamta0
- Bundle the interface font and follow the system theme (#3145) @yohamta0
- Redesign the web UI shell and modernize its look (#3147) @yohamta0
- runtime: preserve foreach scope for quoted item fields (#3148) @Ehsan-hash
- Make the workflow and run pages one clear path (#3153) @yohamta0
- Make long logs fast and keep the reader in place (#3154) @yohamta0
- State that a precondition skip does not fail the run (#3159) @SCcagg5
- Upload files in browser steps (#3163) @yohamta0
- Give per-DAG webhooks public URLs through Dagu Cloud (#3164) @yohamta0
- Add scoped browser certificate authority trust (1e1606e) @yohamta0
- Keep idle MCP event streams open behind proxies (#3172) @yohamta0
- Hide run progress updates from the event feed (#3173) @yohamta0
- mcp: flatten the dagu_change input schema (#3177) @3dcrgr
- Run the dev image browser check on fewer PRs (#3180) @yohamta0
Fixed
- Show not-found and error states instead of blank pages (#3141) @yohamta0
- Fix cockpit, timeline, and mobile layout issues (#3146) @yohamta0
- Stop wasted log polling and fix log links (#3150) @yohamta0
- Replace the Overview timeline with an Activity view (#3151) @yohamta0
- Read run lists newest first and stop at the page (#3161) @yohamta0
- Show queues and a stopped scheduler on the Overview (#3162) @yohamta0
- fix(notification): preserve step log paths in persisted run events (#3166) @arkan
- Keep one webhook per DAG across server processes (#3174) @yohamta0
- Fix scoped CA trust follow-ups (#3178) @yohamta0
- Show stuck queues and a full disk on the Overview (#3179) @yohamta0
- Keep Overview countdown rows one line tall (225d4ee) @yohamta0
Contributors
Thanks to our contributors for this release:
| Contribution | Contributor |
|---|---|
| mcp: flatten the dagu_change input schema (#3177) | @3dcrgr |
MCP: standalone SSE stream (GET /mcp) never sends a byte when idle, so Cloudflare Tunnel holds the headers and returns 524 (#3168), MCP: dagu_change inputSchema uses a top-level oneOf, so ChatGPT strips every argument except type (#3175)
| @3dcrgr (report) |
| Nest Gemini thinking settings in thinkingConfig (#3139), runtime: preserve foreach scope for quoted item fields (#3148) | @Ehsan-hash |
| State that a precondition skip does not fail the run (#3159) | @SCcagg5 |
| fix(notification): preserve step log paths in persisted run events (#3166) | @arkan |
New Contributors
- @SCcagg5 made their first contribution in #3159
- @arkan made their first contribution in #3166
- @3dcrgr made their first contribution in #3177
Full Changelog: v2.19.2...v2.20.1