This release makes workflows easier to write, inspect, and run safely.
This release improves value resolution, step outputs, runtime context, and shell execution. It also adds container support for harness.run, Podman runtime support for sandboxing, flexible Kanban views, and HTML artifact previews.
Special thanks to @iandvt for the Podman support and the containerized harness work. These changes make it much easier to run coding agents in a controlled container environment.
Added
Harness steps can now run in containers
Contributed by @iandvt.
harness.run can now run CLI providers inside container:. This works with providers such as claude, codex, copilot, and opencode. It also works with custom harness providers.
Use this when an agent needs a fixed toolchain, explicit mounts, limited credentials, or a separate network setup.
container:
image: ghcr.io/acme/dagu-agent-runner:latest
volumes:
- .:/workspace:rw
working_dir: /workspace
steps:
- name: Test
run: go test ./...
- name: Fix with Codex
action: harness.run
with:
provider: codex
prompt: "Fix the failing tests and keep the patch minimal"
sandbox: workspace-writeThe container is the outer execution boundary. Provider-specific options, such as Codex's sandbox flag, are still passed to the provider CLI.
Notes:
- The provider CLI must exist inside the container image.
provider: builtindoes not run in a container.- Containerized harness steps do not support stdin-based prompt mode.
- Custom providers should use
prompt_mode: argorprompt_mode: flag.
Podman is now supported
Contributed by @iandvt.
Dagu can now use Podman through its Docker-compatible API.
The same runtime setting applies to root-level container:, step-level container:, docker.run, and containerized harness.run.
DAGU_CONTAINER_RUNTIME=podman \
DAGU_PODMAN_HOST=unix:///run/user/1000/podman/podman.sock \
dagu start-allThese settings come from the Dagu process environment. They are not DAG YAML fields. A workflow cannot switch the runtime by setting DAGU_CONTAINER_RUNTIME inside env:.
Step outputs are now first-class
Steps can publish named outputs through $DAGU_OUTPUT_FILE. Later steps can read them with ${steps.<id>.outputs.<name>}.
steps:
- id: build
run: |
printf 'image_tag=v1.2.3\n' >> "$DAGU_OUTPUT_FILE"
outputs:
- name: image_tag
- id: deploy
depends: build
env:
IMAGE_TAG: ${steps.build.outputs.image_tag}
run: ./deploy.sh "$IMAGE_TAG"This gives workflows a clear way to pass values between steps. It avoids parsing stdout or logs for data flow.
Value resolution is more predictable
Dagu now has clearer rules for references such as:
${params.name}${env.NAME}${steps.build.outputs.image_tag}${context.run.id}
If a reference cannot be resolved, Dagu preserves it as text. Validation and the Web UI can show a passive notice. Normal run logs stay quiet.
Runtime context is available through ${context.*}
Workflows can read stable run metadata without relying on internal paths or host environment details.
steps:
- id: notify
run: notify.sh '${context.dag.name}' '${context.run.id}'This includes values such as the DAG name, run ID, step name, log path, artifact directory, and output file path.
Use this instead:
Other improvements
- Added
${context.*}references for common run metadata, including DAG name, run ID, step name, log paths, artifact paths, and output file paths. - Added inline preview for
.htmland.htmartifacts in the Web UI, with raw mode available. - Added saved views to the Overview page. Views can store filters such as workspace, labels, DAG name, and time range.
- Container volume sources can now use environment variables.
- Container cleanup is more reliable.
- Fixed local sub-DAG retry status handling.
- Scoped DAG detail SSE updates more accurately to the selected remote node.
Fixed
- fix: make value resolution misses warning-only (#2287) @yohamta0
- chore(deps): bump the ui-security group across 1 directory with 2 updates (#2289) @dependabot
- fix: scope DAG detail remote node for SSE (#2291) @yohamta0
- fix: avoid duplicate container cleanup (#2297) @yohamta0
- fix: repair stale local subdag retry status (#2301) @yohamta0
- test: add value resolution conformance coverage (#2305) @yohamta0
Acknowledgements
Thank you to @iandvt for the Podman runtime support and the containerized harness work. This is a major improvement for users who run coding agents through Dagu and need tighter control over the execution environment.
Contributors
Thanks to our contributors for this release:
| Contribution | Contributor |
|---|---|
| bug: subdag still shows running after unexpected restart of dagu container (#2298) | @Kirandeep-Singh-Khehra (report) |
| chore(deps): bump tar from 7.5.13 to 7.5.16 in /npm/dagu in the npm_and_yarn group across 1 directory (#2288), chore(deps): bump the ui-security group across 1 directory with 2 updates (#2289), chore(deps): bump the ui-security group across 1 directory with 3 updates (#2295) | @dependabot |
| feat(runtime): service-selected Docker/Podman container runtime (#2293) | @iandvt |
New Contributors
Full Changelog: v2.7.17...v2.8.0