Dagger

Dagger

Programmable CI/CD pipelines as code in Go, Python, TypeScript, or Java — runs locally and on any CI provider.

About Dagger

Dagger lets you write CI/CD pipelines as actual code in Go, Python, TypeScript, or Java. The pipelines run inside containers, locally or on any CI provider, with the same behavior either way. That last bit is the killer feature.

If you've ever debugged a YAML pipeline by pushing 14 commits with "fix CI" in the message, Dagger is the cure. You run pipelines on your laptop, find the bug in seconds, and ship a working change once. The CI provider becomes a dumb runner.

What Dagger does

Dagger is a programmable CI/CD engine. You define your pipeline in code using a typed SDK. The engine compiles your code into a graph of container operations, caches each step aggressively, and executes the graph wherever you want.

The pipeline definition isn't a config file with conditional logic crammed into expression strings. It's real code with functions, types, modules, and tests. You import other people's pipelines as modules. You write unit tests for build steps. You stop debugging YAML.

Why containers all the way down

Every operation in a Dagger pipeline runs in a container, not on the host. That's the source of the local-equals-CI guarantee. Whatever runs on your laptop runs identically in GitHub Actions, GitLab CI, CircleCI, or a self-hosted runner. The host OS stops mattering.

Who Dagger is for

Dagger fits engineering teams that have outgrown YAML pipelines but don't want to build a custom CI platform. Common adopters include platform teams running Kubernetes, polyglot codebases with complex builds, and teams whose CI debugging time is measurable in days per quarter.

Dagger isn't for a solo developer building a static site. The setup overhead and conceptual load aren't worth it for trivial pipelines. The break-even is around the point where your CI YAML hits 200 lines or has comments like "do not touch."

10x
typical CI debug-cycle reduction with Dagger

Dagger pricing

Dagger the open-source engine is free under Apache 2.0. You can self-host the engine, run pipelines locally, and execute on any CI provider without paying anything. That's the whole core product.

Dagger Cloud is the paid layer. It adds run history, traces, caching across teams, and observability into pipeline performance. Dagger Cloud has a free tier for individuals and a Team plan that prices per seat. The pricing is transparent on dagger.io.

Dagger features in practice

The Daggerverse is a public registry of community modules. You can import a module to build a Node app, push a Docker image, or deploy to fly.io, just by referencing it. That sharing model is closer to npm than to GitHub Actions marketplace.

Caching is automatic and content-addressed. If you've built the same Docker layer once, the engine reuses it across pipelines, projects, and machines if you have Dagger Cloud. The cache lives in your engine, not on the CI runner.

Language support

Dagger ships SDKs for Go, Python, TypeScript, Java, and PHP, with more in progress. The SDKs feel native to each language. You can mix languages in one pipeline by importing modules across SDKs, since everything compiles down to the same engine API.

Tradeoffs

Dagger has a real learning curve. The mental model of containers calling containers takes time. The first pipeline you write will probably be slower and uglier than your existing YAML. The third one will start to feel cleaner.

Dagger also requires the engine running somewhere. On laptops that's a local Docker daemon. On CI it's an action that boots the engine. The cold-start overhead is real, though caching offsets it after the first run.

Dagger turns CI from a separate platform you fight into code that lives next to your app code. The investment pays back the first week your pipeline breaks.

Dagger vs alternatives

Compared to GitHub Actions, Dagger replaces YAML with code and adds local execution. You can still trigger Dagger from GitHub Actions, which is the common pattern. Compared to Jenkins, Dagger is dramatically simpler to operate and modern in every way.

Compared to Earthly, Dagger leans further into general-purpose programming languages while Earthly uses a Dockerfile-flavored DSL. Earthly is easier to start with for simple cases. Dagger scales further for complex pipelines. See our best CI/CD platforms guide and GitHub Actions alternatives roundup.

Bottom line on Dagger

Dagger is the right answer when your team's CI complexity has outgrown YAML and you want pipelines that actually behave like software. The local-equals-CI promise is real, and once you experience it, debugging through 14 push attempts feels archaic.

The trial cost is a weekend of learning. The upside is years of saved CI debugging. For any platform team or growing engineering org, Dagger deserves a serious look against the YAML status quo. Compare it to Buildkite and Earthly before committing.

Dagger pipeline patterns that work

The Dagger workflow most teams settle into starts with a single pipeline file per language they use. The Go SDK file lives next to the Go service and orchestrates build, test, lint, and Docker image creation for that service. The TypeScript SDK file does the same for the frontend. Each pipeline imports common modules from the Daggerverse for shared steps like Docker push or Kubernetes deploy.

The local development loop matters most. Engineers run "dagger call build" or "dagger call test" on their laptop. The same call runs in CI. When CI breaks, the engineer reproduces it locally in seconds. That fast feedback loop is the productivity unlock that justifies the migration cost.

Caching that compounds

Dagger's caching uses content-addressed hashes for every operation. The first run is slow because everything is cold. The second run reuses cache for unchanged steps. Across a team with shared remote cache, you get cache hits the moment one team member has run the same pipeline before.

The cache key includes source files, environment variables, dependencies, and base images. Anything that affects the output. If nothing relevant changes, the output is reused. This means you can run "build all 30 services" and get a result in seconds when nothing has changed, even though running each from scratch would take an hour.

Dagger and existing CI providers

Dagger doesn't replace your CI provider. It runs inside whatever CI you already use. The pattern is: GitHub Actions (or GitLab, CircleCI, Jenkins) does the bare minimum to start the Dagger engine, and Dagger does everything from there. Your CI provider becomes a thin runner that just hosts the engine.

This pattern unlocks portability. You can switch CI providers without rewriting pipelines. The pipeline is in code, lives in your repo, and runs identically across providers. The CI provider becomes a commodity. That's the strategic value beyond the speed gains.

Common Dagger questions

Is Dagger ready for production? Yes. The engine has been stable for over a year and is used in production by Vercel, Replicate, and others. The SDKs are at version 0.x but practically stable. Breaking changes are rare and well-communicated.

How does Dagger compare to Earthly? Earthly is closer to "Dockerfile plus Make" with a custom DSL. Dagger is "real programming language" with full SDK support. Earthly is easier to learn for simple cases. Dagger scales further for complex needs and refactors. Both are solid choices; the right one depends on team preference.

Can Dagger build non-container artifacts? Yes. While operations run in containers, the outputs can be anything: binaries, packages, docs, deployments. Dagger handles file extraction from containers as a first-class operation. Most CI work involves container outputs anyway, so the model fits naturally.

Dagger Cloud value

Dagger Cloud adds run history, distributed tracing across pipeline operations, and shared remote cache across machines. The trace view shows exactly which steps ran, how long they took, and what they produced. For debugging slow pipelines or flaky CI, this visibility is the difference between guessing and knowing.

The free tier of Dagger Cloud covers most small teams. The team plan starts paying off when pipeline complexity makes manual debugging painful. Most teams adopt Dagger first, run it for a month, and add Dagger Cloud once they realize they want the trace view permanently.

Final take on Dagger

Dagger represents a real shift in how engineering teams should think about CI. The "pipelines as YAML" pattern has hit its limits for complex codebases. The "pipelines as code" pattern that Dagger pioneered makes pipelines testable, modular, and portable. The local-equals-CI guarantee changes the debug loop fundamentally.

The adoption curve has accelerated through 2025 and into 2026. Vercel acquiring Dagger gave the project resources and credibility. Major engineering organizations have either migrated or are evaluating migration. The Daggerverse module ecosystem is growing fast, which is a leading indicator of broader adoption.

For platform teams managing complex CI for growing engineering orgs, Dagger is the most credible answer to YAML fatigue. The migration is a real project but pays back fast. For smaller teams with simple pipelines, the investment isn't justified yet. The break-even is somewhere around the moment your YAML config crosses a few hundred lines and starts having "do not touch" comments. That's when Dagger earns its keep.

Key Features

  • Pipelines written in Go, Python, TypeScript, or Java
  • Identical execution locally and in any CI provider
  • Content-addressed caching for fast re-runs
  • Daggerverse marketplace of reusable modules
  • Open-source engine with optional paid cloud

Pros & Cons

What we like

  • Same pipeline truly runs locally and in CI
  • Type-checked pipelines catch errors before push
  • Free and open source at the engine level

Room for improvement

  • Steeper learning curve than declarative YAML CI

Best For

Platform teams unifying CI across many languagesRefactoring sprawling Bash and YAML pipeline scriptsLocal-first development of complex build workflowsMulti-stage Docker builds with shared caching

Alternatives to Dagger

View all

Reviews (0)

No reviews yet

Be the first to share your experience with Dagger

Sign in to write a review