> ## Documentation Index
> Fetch the complete documentation index at: https://docs.charmos.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Publish

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](/platform/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](https://github.com/CharmAIOS/Charm/issues/new/choose) or ask in our [community](\{discord_url}). 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.

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
charm auth login
```

#### Preparing your UAC manifest

Refer to the [Manifest Configuration Guide](/guides/manifest) and [Manifest Reference](/references/manifest) 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.

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
charm validate .
```

Step B: Local Execution

See [Local Run](../guides/local-run) for detailed information.

#### Publishing

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
charm push
```
