Get started with Chainguard Checks
Sign up for Chainguard Checks, add a .chainguard/ci.yaml file to a repository, and see your first checks run on a GitHub …
For the complete documentation index, see llms.txt.
Chainguard Checks runs your repository’s CI on Chainguard’s infrastructure instead of on GitHub Actions runners. You define your checks, such as linting and tests, in a .chainguard/ci.yaml file in your repository. On every pull request, Chainguard Checks runs each check in its own microVM, built on Chainguard OS, and reports the results on the pull request as GitHub checks.
CI runners usually hold long-lived secrets and can reach the whole internet while they run untrusted code, such as a pull request’s changes or a compromised dependency. In Chainguard Checks, each check runs in a fresh VM that has no long-lived credentials, and no network access unless the check lists the hosts it needs.
Note: Chainguard Checks is in beta. Available to organizations that turn it on with
chainctl develop init, which comes with a free monthly compute allowance, or that arrange access with their Chainguard account team.
Chainguard Checks reaches your repositories through the Chainguard App, a GitHub App that you install on your GitHub organization or personal account. When you link that account to your Chainguard organization, each repository that has a .chainguard/ci.yaml file, or a .chainguard/ci/ directory, opts in to Chainguard Checks.
When someone opens or updates a pull request, the following happens:
Each new push to the pull request cancels the run for the previous push and starts a new one. Chainguard Checks can also run checks on each new commit on your default branch, for work that should run after a change merges. Refer to Use Chainguard Checks on GitHub for details.
Here’s a minimal .chainguard/ci.yaml file for a Go repository:
version: 1
environment:
packages: [go]
checks:
vet:
cmd: go vet ./...
network:
egress: [proxy.golang.org, sum.golang.org]
test:
cmd: go test ./...
network:
egress: [proxy.golang.org, sum.golang.org]This file installs Go in every check’s VM and defines two checks, vet and test. Each check runs in a fresh VM with no network access unless it asks for some, so both list the Go module proxy and checksum database under network.egress to download the modules your code depends on. Refer to the configuration reference for every option.
Every check starts from the same minimal base and gets only what you declare:
| Resource | What a check gets |
|---|---|
| Packages | BusyBox, GNU tar, and the packages your configuration file lists. A check has no git, package manager, or language toolchain unless you list it. |
| Network | No network access unless the check lists hosts under network.egress. Chainguard Checks always blocks cloud metadata endpoints, loopback addresses, and private IP ranges. |
| Credentials | No long-lived credentials. Your repository’s code is already in the VM, so most checks need none. A check that must authenticate to Google Cloud or to Chainguard can request a workload identity for short-lived access. |
| Caches | None unless the check declares one. During the beta, a Go check can reuse build output from earlier runs through cache pools that your default branch defines. Refer to Caches. |
By default, Chainguard Checks refuses a connection to a host the check doesn’t list, and the check keeps running. With policy: destroy, Chainguard Checks stops the check’s VM instead, and the check fails.
Chainguard Workspaces reads the same .chainguard/ci.yaml file. In a Workspaces session, the run-ci command runs your checks against the session’s working tree, uncommitted changes included, so you or a coding agent can find failures before pushing.
The run-ci command runs each check in the session’s own environment, which can have different packages and network access than the check declares. Its result predicts the pull request’s result, but only Chainguard Checks, which runs each check in a fresh VM, decides what GitHub shows. You can use Chainguard Checks without Chainguard Workspaces, and the other way around. Refer to Run checks before you push.
Chainguard Checks is offered as a Technology Preview, as described in the Chainguard Master Service and License Agreement. Technology Previews aren’t recommended for production use. Don’t use a Technology Preview to process personal data, or any data subject to legal or regulatory compliance requirements, unless Chainguard specifically authorizes it. If you turn on the requested checks agent, Chainguard Checks sends pull request content to a model, so don’t turn it on for a repository whose pull requests contain such data.
During the beta, Chainguard Checks has the following limits:
chainctl develop init turns on the Starter allowance: 500 vCPU-hours of Checks each month, separate from the Workspaces allowance. The allowance resets on the first day of each month (UTC) and comes with the following limits:
Chainguard counts each check’s vCPUs for as long as its VM runs. A check with the default resources uses 2 vCPU-hours for each hour it runs, and a medium check uses 4. Chainguard doesn’t show your usage during the beta. When the allowance is used up, Chainguard Checks doesn’t start new runs until it resets, and runs already in progress finish. Refer to Troubleshoot Chainguard Checks for what a pull request shows then.
If your organization arranged access with its Chainguard account team, its allowance and limits can differ.
To ask questions or get support, use the #checks-questions channel in the Chainguard community Slack. If you aren’t a member yet, the link invites you to join.
.chainguard/ci.yaml format.chainctl checks command and flag.Last updated: 2026-10-13 14:50