Build once.
Reuse everywhere.
hammerkit runs your build in containers, on your laptop and in CI alike, and skips every task whose inputs didn’t change — wherever it ran first.
npm install --global hammerkitSame tools everywhere
Every task runs in the image it names. No “works on my machine”.
Skips what didn’t change
A task reruns only when a file it reads changes — locally and in CI.
Shared across machines
Laptops, CI runners and agent sandboxes reuse each other’s results.
Agent-ready
Hand your coding agent the migration guide and it rewrites your CI.
Start with your stack
Take a small project from an empty build file to a cached CI pipeline. Every tutorial runs in hammerkit’s own test suite, so what you copy works.
Already have a pipeline? Let your coding agent migrate it →
One file for every machine
Tasks declare their image, what they read and what they produce, and a shared cache holds the results.
caches: shared: method: checksum backend: type: registry repository: ghcr.io/my-org/hammerkit-cachetasks: install: image: node:24-alpine src: [package.json, package-lock.json] generates: [node_modules] cmds: [npm ci] test: image: node:24-alpine deps: [install] src: [src, test] cmds: [npm test] build: image: node:24-alpine deps: [install] src: [src, tsconfig.json] generates: [dist] cmds: [npm run build] ci: deps: [test, build]…and CI shrinks to this
Pull what’s already built, run the same command, push what’s new. Cache hits execute nothing.
permissions: contents: read packages: write # push to the cache in GHCRsteps: - uses: actions/checkout@v4 - uses: no0dles/hammerkit-github-action@v1 - uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - run: hammerkit cache pull --remote shared - run: hammerkit run ci - run: hammerkit cache push --remote shared