need for speed

Faster Java SDK builds

The Java SDK runtime now invokes Maven with --threads 1C by default, using one thread per CPU for better build throughput on multi-core machines.

Targeted local-cache pruning

Manual local-cache pruning now supports explicit space thresholds, so teams running with automatic GC disabled can prune predictably without changing global policy.

Set per-call overrides for max used space, reserved space, minimum free space, and target space.

cloud

More reliable GitHub Checks integration

Dagger Cloud now integrates more reliably with GitHub Checks. Checks move to queued as soon as events are received, continue running even when GitHub API calls are delayed, and avoid noisy failures in repositories without a dagger.json module config. We also expanded commit-status reporting beyond Native CI workflows, so per-check results appear more consistently with direct links back to traces.

cloud

Checks keep running during GitHub outages

Dagger Cloud checks no longer block on GitHub API availability. If GitHub is delayed or temporarily unavailable, checks continue running and status updates are handled asynchronously, reducing flaky failures during incidents.

Dagger Generate

We added dagger generate for code and config generation workflows. Mark generator functions in your module, return Changesets, and Dagger runs and merges them in one pass.

Great for generated clients, repo scaffolding, and config drift cleanup without stitching together shell scripts.

dagger generate

Dagger Cloud v3

Dagger Cloud v3 delivers a new WebAssembly-based UI with better trace navigation, clearer error surfacing, and much faster handling of large traces and log volumes.

This is a Dagger Cloud release (not an open source engine release). To opt in, sign in to dagger.cloud and switch the top-right toggle to v3.

File metadata API

directory.stat() and container.stat() expose metadata directly through the API, removing brittle shell parsing for common file-inspection tasks.

JSON API

Lightweight JSON edits are now practical inside Dagger pipelines. Instead of shelling out to jq, read, modify, and write JSON through typed APIs.

@func()
async setPackageManager(src: Directory): Promise<Directory> {
  const updated = src
    .file("package.json")
    .asJSON()
    .withField(["packageManager"], dag.json().newString("pnpm@10.5.2"))

  return src.withFile(
    "package.json",
    dag.file("package.json", await updated.contents({ pretty: true })),
  )
}
need for speed

Faster file copies

WithDirectory and WithFile were optimized to avoid unnecessary disk copies in more cases, cutting avoidable I/O overhead in common workflows.

Dagger Checks

dagger check gives module developers one command to run validation anywhere: local dev, CI, and agents. Define checks once, run them consistently everywhere.

Checks are supported in Go, Python, and TypeScript, with Java support added in v0.19.11.

dagger check

dagger check -l

dagger check 'lint-*'
need for speed

Function Cache Control

Before this change, Dagger cached all system functions but not module developers' own functions. We couldn't safely infer purity from side effects, so default caching could have broken behavior.

Now module developers can explicitly set cache policy per function. With explicit control in place, default caching can improve performance safely.

@func() // pure function: default TTL caching
async test(): Promise<string> { ... }

@func({ cache: "15m" }) // refresh external data periodically
async latestBaseDigest(): Promise<string> { ... }

@func({ cache: "never" }) // side effects: always execute
async deploy(): Promise<string> { ... }

Changeset API

The new Changeset type lets module developers return a directory diff as an artifact, so generated files can be previewed and applied cleanly from the CLI.

Container.combinedOutput

Need stdout and stderr exactly as emitted? Container.combinedOutput returns a single merged stream, so module developers can handle real command output without stitching streams back together.

dagger shell -c 'container | from alpine | with-exec ls,-l,/etc/fstab,/etc/non-existent --expect=any | combined-output'

Address API

The new address API exposes Dagger's CLI-style reference parsing to modules, so module developers can turn user input into typed objects without reimplementing parsing logic.

Cloud.traceURL

Modules can now fetch the current Dagger Cloud trace URL directly. This makes it easy to publish clickable run links in logs, summaries, and CI notifications.

traceURL, err := dag.Cloud().TraceURL(ctx)
if err != nil {
  return "", err
}
return traceURL, nil

Git reference introspection APIs

Git-heavy modules got better primitives for reasoning about repository state: gitRepository.url, gitRepository.branches, gitRepository.latestVersion, and gitRef.commonAncestor.

Together, these APIs make it much easier to resolve origins, enumerate refs, pick stable versions, and compute merge bases without shelling out.

Dagger Shell

Dagger Shell brought bash-style syntax to Dagger's typed, container-native execution model. You get shell ergonomics with cached, reproducible pipelines and sandboxed-by-default execution.

It also made it easier to compose bigger workflows in one place: simple shell pipelines for day-to-day work, code when logic grows, all on the same system.

container |
  from alpine |
  with-exec apk add git