.ai-implement/image.yml to the default branch of your target repo. When AI-Implement starts a session for your repo, it reads this file and boots the Fly Machine using your image instead of the default.
How it works
Create a file at.ai-implement/image.yml in the default branch of your target repo:
image: value isn’t a well-formed image reference, the orchestrator falls back to the default runner image automatically — but that check only looks at the file itself. A syntactically valid reference that can’t actually be pulled (private, deleted, wrong tag) passes this check and fails later, when the session tries to start, with a manifest/unauthorized error.
The default base image is:
Building a custom image
Build your imageFROM the published base image so you inherit all the tools and configuration the default runner provides. Then add whatever your repo needs on top:
Setup steps
1
Create a Dockerfile
Start from the base image and add the tools or runtimes your repo requires.
2
Build and push to a public registry
Build the image and push it to a registry where it can be pulled without authentication. GitHub Container Registry (
ghcr.io) is a common choice.3
Commit .ai-implement/image.yml
Create the file in your target repo pointing at the image you just pushed:Commit this to your default branch. AI-Implement reads it from there on the next run.
.ai-implement/image.yml works for both execution modes.- In Fly Machines mode, the orchestrator boots the session machine directly on your image.
- In GitHub Actions mode, the orchestrator forwards your image to
claude-implement.ymlas thecontainer.imagefor the workflow job.
Alternative: GitHub Actions variable
Repos using GitHub Actions execution mode have a second image-override mechanism: theAI_IMPLEMENT_RUNNER_IMAGE repository variable.
When set, the synced claude-implement.yml workflow uses that image as the container for its job.
- The orchestrator’s resolved image (from
.ai-implement/image.ymlor its ownAI_IMPLEMENT_RUNNER_IMAGE— the deprecatedSESSION_IMAGEenv var name is still honored as a fallback) is forwarded as the workflow’srunner_imageinput, if either is explicitly set - Otherwise the workflow falls back to
AI_IMPLEMENT_RUNNER_IMAGEif that variable is set - Otherwise the built-in default (
ghcr.io/builddownai/ai-implement-runner:latest) is used