github dagucloud/dagu v2.20.1

3 hours ago

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.
    • It applies to workflow browsers and browser sessions, and an entry only ever adds trust (1e1606e, #3178).
    • Browser sessions report tls_verified, and dagu browser session list reports capabilities so applications can detect support.

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_change has a flat input schema, so ChatGPT's connector sends every argument instead of only type (#3177).

Other changes

  • Gemini thinking settings are sent inside thinkingConfig, where the API accepts them (#3139).
  • dagu computer cache show prints a device's recordings as pinned steps to copy into a workflow (#3140).
  • Quoted foreach item fields resolve in keys, bodies, working_dir and collect (#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-logs no longer returns dag.run.updated events unless you request them with type=dag.run.updated (#3173). After the upgrade, a load-more cursor issued by the old version returns 400 once; refreshing clears it.

Changed

Fixed

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

Full Changelog: v2.19.2...v2.20.1

Don't miss a new dagu release

NewReleases is sending notifications on new releases.