cycls.Image is the container declaration. Chain methods to describe what the
container needs, then hand it to any decorator with image=.
Methods
Every call returns a new
Image, so a base image can be branched without
affecting the original.
Bundling files
Copied paths land in/app, which is on sys.path, so bundled modules import
normally inside the function body.
Caching
Cycls hashes the declaration, including the contents of copied files, into a deterministic Docker tag. Identical inputs reuse the cached build. Change one package and only what depends on it rebuilds. The first build of a new image takes a minute or two. After that it is cached anywhere that config appears, on your machine and in the cloud.What is already in the image
You do not need to declare the basics. Apps get FastAPI, hypercorn, PyJWT and cryptography. Agents add the Anthropic and OpenAI SDKs, the MCP client, PDF tooling,ripgrep, jq, curl and fonts. Declare what your own code needs on
top of that.
Public static files
Files served at/public belong on cycls.Web, not on the
image:
https://your-app.cycls.ai/public/logo.png.
Next
Volumes
Persistent storage that outlives any single deployment.