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.
Extensibility Overview
Charm separates a small stable core from community-owned extensions. Not every extension works the same way — some are runtime Python plugins, some are store contributions, and some are manifest PRs. Use this page to pick the right path before you start building.Extension paths at a glance
| What you want to add | Registration | Runs where | Needs custom_image on cloud? | Needs store deploy? |
|---|---|---|---|---|
| Custom adapter plugin | charm.adapters entry point | Agent container | Yes | No |
| Custom runtime only | runtime.custom_image in YAML | Agent container | Yes | No |
| Telemetry exporter | charm.telemetry entry point | Agent container | Yes | No |
| Memory backend | charm.memory entry point | Agent container | Yes (if not built-in) | No |
| Input form widgets | interface.ui in YAML | Store UI | No | Only for new widget types |
| Output renderers | _charm_render_type in agent output | Store UI | No | Only for new renderer types |
| Starter templates | PR to templates-manifest.json | charm init | No | No (manifest merge) |
Two kinds of “custom” (important)
These names overlap — they are not the same thing:| Term | Meaning |
|---|---|
runtime.adapter.type: custom | Built-in Charm adapter for plain Python agents (CharmCustomAdapter in core). Good default for charm init projects. |
runtime.custom_image | Docker image override for the cloud runner. Required for third-party adapter/telemetry/memory plugins. |
| Third-party adapter plugin | New adapter name (e.g. ag2, plugin_test) registered via [project.entry-points."charm.adapters"]. |
type: custom with custom_image (extra deps, no new adapter class).Scenario: you can use
type: ag2 with custom_image (new adapter plugin + image that installs it).
Recommended workflow for plugin authors
- Start from a normal agent —
charm init my-agent --template python - Add a pip package with your adapter/telemetry/memory classes and
pyproject.tomlentry points - Point
charm.yamlat your plugin —runtime.adapter.type: your_plugin_name - Build a Docker image that installs your package (and compatible
charmos) — see Custom Runtimes - Set
runtime.custom_imageto that image URI charm validate→charm push→ run on the Store
pip install your plugin at runtime. Your package must already be in the container image.
Built-in vs third-party
| Layer | Built-in (no plugin package) | Third-party (plugin author) |
|---|---|---|
| Python agent logic | charm init + type: custom | Same |
| Adapter type | custom, langchain, openclaw, … | New name via entry points |
| Runtime image | Official runner-* images | Your custom_image |
| Store form widgets | text, textarea, file | New widgets → store PR |
| Rich output UI | Built-in _charm_render_type values | New types → store PR |
Cloud prerequisites
For any custom image on production:- Push the image to a registry the runner can pull (Artifact Registry, GHCR, etc.)
- Grant the runner service account read access to that registry (if private)
- Declare
runtime.custom_imageincharm.yaml— the runner selects it over default adapter images
Next steps
- Custom Adapters — third-party framework integration
- Custom Runtimes — Docker image overrides
- Telemetry Exporters
- State & Memory
- Input Forms (UI Schema)
- Output Renderers
- Community Templates
