Skip to main content
Please make sure to review our current technical specifications and limitations before publishing, to ensure your agent can run stably on the Charm Cloud Runner.

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.
  1. 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.
  2. 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_seconds in your charm.yaml.
    • Solution: If your agent needs to run 24/7 or maintain persistent state, configure lifecycle: "daemon" in your charm.yaml.
  3. No Inbound Ports in Serverless Mode
    • In serverless mode, 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 daemon mode, which runs a persistent VM with full networking capabilities.
  4. System Package Installation
    • While apt-get is 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 own custom_image in charm.yaml with everything pre-installed.
  5. 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/...) or os.getcwd().
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.

Authentication

Sign in to the Charm platform and link your account.
charm auth login

Preparing your UAC manifest

Refer to the Manifest Configuration Guide and Manifest Reference for guidance on how to author a charm.yaml.

Local Validation & Development

Step A: Static Analysis Use Pydantic to validate that the YAML fields conform to the UAC schema.
charm validate .
Step B: Local Execution See Local Run for detailed information.

Publishing

charm push