New in 1.8: tutorials for six languages →

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.

Get startednpm install --global hammerkit
your laptopCI runner

Same 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.

.hammerkit.yaml
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.

.github/workflows/ci.yml
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
Let an agent migrate your CI →