Dagger is a portable CI/CD engine that lets you write pipelines as code in a real programming language — Go, Python, TypeScript, PHP, Java, or any language for which an SDK exists — and executes them as containerized DAGs on top of BuildKit. The same pipeline runs locally on your laptop and in any CI system (GitHub Actions, GitLab, Jenkins, CircleCI) because the CI system’s only job is to call dagger call.
Under the hood, Dagger is a GraphQL API served by the Dagger Engine. When you call a function from an SDK, it compiles to GraphQL queries that describe container operations — pull image, run command, mount directory, set env — and BuildKit executes them with aggressive caching based on content-addressed layers. Reruns that hit the cache are effectively free, even across branches and machines, if you point Dagger at a shared cache like Dagger Cloud or a remote BuildKit instance. Pipelines are packaged as “Modules” with typed functions that can be published and composed: your release pipeline can import someone else’s test module the same way you’d import a library.
Dagger was founded by the creators of Docker (Solomon Hykes and team) and is the main contender in the “programmable CI” space alongside Pulumi’s approach for infrastructure and tools like Earthly. The pitch is simple: stop writing thousands of lines of YAML that only run in one CI vendor, and start writing pipelines in a language with types, tests, and IDE support.

