Runtime Environments
Charm automatically selects the optimal container base image depending on your framework (adapter.type). See Base Images for more information on available runtimes and how to inject your own custom Docker image.
Technical Constraints
Please read this section carefully. Most deployment failures are caused by violating these rules.-
No Heavy Local Models / GPU Support
- Do NOT load local LLMs (e.g., Ollama, Llama.cpp) or large embedding models (e.g., HuggingFace transformers > 500MB) into memory.
- The runtime environments do not have GPU access (No CUDA).
- Solution: Use cloud APIs (OpenAI, Anthropic, Groq, HuggingFace Inference API) for all inference tasks.
-
Resource Limits
- Memory varies by execution mode:
- Serverless: 2 GB RAM, 2 vCPU.
- Daemon: 1 GB RAM, 1 shared vCPU.
- Attempting to load large datasets or models beyond these limits will cause an OOM (Out Of Memory) crash.
- The default execution timeout for serverless jobs is 600 seconds (10 minutes), but you can customize this via
policies.execution_timeout_secondsin yourcharm.yaml. - Solution: If your agent needs to run 24/7 or maintain persistent state, configure
lifecycle: "daemon"in yourcharm.yaml.
- Memory varies by execution mode:
-
No Inbound Ports in Serverless Mode
- In
serverlessmode, do NOT start servers that listen on inbound ports (e.g.,flask run,express,fastapi). The serverless runner is designed for task execution, not hosting web services — any process waiting for inbound HTTP requests will timeout. - Note: This restriction does not apply to
daemonmode, which runs a persistent VM with full networking capabilities.
- In
-
System Package Installation
- While
apt-getis technically available inside the container, installing system packages at runtime is strongly discouraged for serverless jobs because packages are not persisted between invocations and will significantly slow down each cold start. - Solution: If you need system binaries like FFmpeg or Chrome, use an adapter that provides them (e.g.,
adapter.type: "openclaw"includes FFmpeg, Node.js, and browser libraries) or provide your owncustom_imageincharm.yamlwith everything pre-installed.
- While
-
No Absolute Paths
- The runner executes in a dynamic container. Do NOT use hardcoded paths like
/Users/me/project/.... - Solution: Use relative paths (e.g.,
./data/...) oros.getcwd().
- The runner executes in a dynamic container. Do NOT use hardcoded paths like
If you hit any issues, feel free to open an issue or ask in our community. It really helps us make the docs and product better.
Zero-Ops Publishing
Register your agent on the Charm Store.If you’re using uv, please prefix all commands with uv run.
