Getting started with the Chainguard Agent Skills public catalog
Browse, inspect, install, and run hardened agent skills from Chainguard's public catalog with chainctl.
For the complete documentation index, see llms.txt.
Chainguard Actions are a set of hardened drop-in replacements for popular GitHub Actions. Each action preserves the same inputs and outputs as the upstream version, but has been examined and revised to better protect your CI/CD pipelines from supply chain attacks. The only change in your workflow configuration is the name of the action in the uses: line.
Coverage spans GitHub first-party (actions/*), cloud-provider (aws-actions/*, azure/*, google-github-actions/*), Docker, HashiCorp, and security tools actions (Trivy, Grype, CodeQL, Semgrep), as well as a growing catalog of community actions.
Each hardened action:
uses: and container image reference pinned to an immutable SHA digestHARDENING.md report documenting exactly what was checked and fixedChainguard Actions protect against common threats including tag hijacking, dependency confusion, pull_request_target abuse, and secret exfiltration.
This page provides enough to get you started. See the Chainguard Actions README in GitHub for deeper technical details and some example migrations.
Before using Chainguard Actions, log in to Chainguard and enable the Chainguard Actions entitlement for your organization.
Authenticate using chainctl:
chainctl auth loginCreate the Chainguard Actions entitlement to enable access to the hardened actions hosted at github.com/chainguard-actions:
chainctl actions entitlements create --parent $ORGANIZATIONThe output confirms the entitlement:
Enabled Actions product for org chainguard.edu ($ENTITLEMENT_ID) [entitlement id: $ENTITLEMENT_ID]Confirm your entitlement:
chainctl actions entitlements list --parent $ORGANIZATION ID | CREATED
------------------------------------------|-------------------------
$ENTITLEMENT_ID | 2026-06-18 17:33:24 UTCTo use a Chainguard hardened action, edit your workflow’s YAML configuration file and change the uses: line to match the location in chainguard-actions:
- uses: chainguard-actions/<action-name>@mainAction names often have the upstream organization appended to the action name for clarity, for example, tj-actions/changed-actions becomes tj-actions-changed-actions. This prevents two different sources of a changed-actions action from clashing in the Chainguard Actions repository.
Search the Chainguard Actions repository, find the action you want to use, and then use the name you find there.
Note: This example uses
@main, a mutable reference, to illustrate the mechanics of switching organizations. For production workflows, pin to an immutable SHA digest instead. The Configure your workflows section covers the full migration, including how to find the correct SHA digest.
The rest of this page goes a bit deeper into how to use Chainguard Actions.
Run this from the root of your repository to get a deduplicated list of every uses: line across every workflow:
grep -rhE "uses:\s*[^@]+@" .github/workflows/ | sort -uBrowse the Chainguard Actions repository or use the GitHub search UI. Match by organization and action name — for example, if you use tj-actions/changed-files, search for org:chainguard-actions tj-actions-changed-files.
If the action isn’t in the catalog, open an issue to request it.
uses: line in each workflow.
Change the uses: line to match the location in chainguard-actions. Find and pin to the commit SHA digest and preserve the original tag as a comment so Dependabot, Renovate, and human reviewers can track upgrades:
# Before
- uses: tj-actions/changed-files@v47# After
- uses: chainguard-actions/tj-actions-changed-files@<SHA> # v47
# originally - uses: tj-actions/changed-files@v47To find the SHA digest for a specific release, use the gh CLI:
gh api repos/chainguard-actions/tj-actions-changed-files/commits/v47 --jq '.sha'25a1eb5aa40568ec6f8c0e58f2e809ef4270ebfaFor the short SHA digest:
gh api repos/chainguard-actions/tj-actions-changed-files/commits/v47 --jq '.sha[:7]'25a1eb5The resulting uses: line with the full SHA digest:
- uses: chainguard-actions/changed-files@25a1eb5aa40568ec6f8c0e58f2e809ef4270ebfa # v47If your GitHub organization or repository restricts which actions can run (Settings > Actions > General > Allow select actions), add chainguard-actions/* to the allowed patterns. Without this, workflows fail with a policy error on first run.
Note: It’s a good idea to remove allowed actions that are no longer being used.
The action’s inputs, outputs, and behavior are almost always identical to the upstream version, so no other workflow changes are typically needed.
However, read the HARDENING.md file for each Chainguard Action before migrating. In rare cases, the hardening process requires a change to inputs, outputs, or behavior — those changes are documented in this file.
If something breaks, file an issue with a reproducer.
Use chainctl to scan every workflow and composite action in a repository and list all dependencies transitively:
chainctl actions discover $GIT_ORGANIZATION/$REPO scanning $GIT_ORGANIZATION/$REPO for workflows and actions
ACTION | REQUESTED | USED BY
-------------------------------------|-----------|---------
actions/checkout | v4 | 1
chainguard-actions/actions-checkout | v6.0.2 | 1
2 actions, 0 container imagesWhile you can search the Chainguard Actions repository directly in GitHub, you can also use chainctl to find an action.
chainctl actions catalog list --upstream-owner=$OWNERFor example, to list all the actions from the tj-actions source:
chainctl actions catalog list --upstream-owner=tj-actionsThis example returns a list of all actions in the Chainguard Actions repository that originate from the tj-actions upstream source.
The main branch of each hardened action repository contains:
HARDENING.md — the authoritative, per-action record of what was checked, what was fixed, and howaction.yml or action.yaml — the hardened action definition, preserving upstream inputs and outputs with fixes appliedLICENSE_CHAINGUARD — the Chainguard license for the hardened variantsource.json and published.json — manifests pointing at the upstream source and the upstream version being tracked (not yet present in all repos; some older repos don’t include them)Then, the version branches in the hardened action repos contain the hardened actions.
Chainguard Actions are continuously re-hardened:
HARDENING.md report is regenerated on every hardening run, with its own policy SHA pinning the exact set of rules that were appliedTo request a new action, open an issue.
If an action isn’t working as expected, open an issue with the action reference, a description of the problem, and steps to reproduce.
Last updated: 2026-06-18 00:00