Skip to main content
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.
Splitting secrets by audience. Keep CYCLS_API_KEY in .env on your machine and provider keys in .providers.env, then rename during the copy so the container sees only what it needs:
The agent’s dotenv loader finds .env at the expected name, and your deploy key never enters the image.

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:
They are then reachable at https://your-app.cycls.ai/public/logo.png.

Next

Volumes

Persistent storage that outlives any single deployment.