Self-hosted Docker management with scope-based permissions, one-click app installs, and OpenClaw-native agent control. Give your AI agent exactly what it needs — nothing more.
WAGMIOS is a self-hosted Docker management platform built native for OpenClaw agents. Give your agent a scoped API key and it can manage your homelab — install apps, start/stop containers, pull images — with every action visible and auditable. Scope = permission. No sudo, no daemon access, just the exact access you grant.
Give agents exactly the permissions they need — nothing blanket.
One-click install Plex, Jellyfin, Ollama, Home Assistant, and more.
Built for OpenClaw agents — every action is visible and auditable.
WebSocket-powered feed shows everything happening in your homelab.
Give your OpenClaw agent a homelab. Install the skill directly into your agent:
/clawhub install wagmios
The skill tells your agent how to:
💡 Your agent needs an API key with the right scopes to use WAGMIOS. The Setup Wizard walks you through key creation and scope selection. Pick all the scopes your agent needs — you can always create separate keys for different agents.
Skill URL: https://clawhub.ai/mentholmike/wagmios
No build step. Images are pre-built for both x86_64 and ARM64.
curl -O https://raw.githubusercontent.com/mentholmike/wagmios/main/docker-compose.yaml
docker compose up -d
git clone https://github.com/mentholmike/wagmios.git
cd wagmios
docker compose up -d --build
| Service | URL |
|---|---|
| Frontend | http://localhost:5174 |
| Backend API | http://localhost:5179 |
| Health Check | http://localhost:5179/health |
The Setup Wizard walks you through naming your key and picking permissions. Copy the key — you won't see it again.
Every WAGMIOS API key has scopes — granular permissions that control exactly what an agent can do. If the key doesn't have a scope, the API returns SCOPE_REQUIRED and the agent can't work around it.
💡 The rule is simple: Scope = Permission. No scope = blocked.
| Scope | What It Allows |
|---|---|
containers:read | List containers, inspect, view logs |
containers:write | Create, start, stop, restart containers |
containers:delete | Delete containers |
images:read | List Docker images |
images:write | Pull and delete images |
marketplace:read | Browse the app marketplace |
marketplace:write | Install and manage marketplace apps |
templates:read | Use saved compose templates |
templates:write | Create and edit templates |
User asks agent to do X
│
├── Does key have scope for X?
│ NO → Tell user to enable it in Settings → Agent Permissions
│ YES → Continue
│
├── Is X destructive (delete)?
│ YES → Confirm with user first
│ NO → Execute
│
└── Report result
Base URL: http://localhost:5179 — All requests require X-API-Key: <key> header.
GET /api/auth/status → Check key scopes and metadata
GET /api/settings → Key info (label, prefix, created date, scopes)
GET /api/containers → List all containers (scope: containers:read)
GET /api/containers/{id}/logs?tail=100 → Container logs (scope: containers:read)
POST /api/containers/{id}/start → Start container (scope: containers:write)
POST /api/containers/{id}/stop → Stop container (scope: containers:write)
POST /api/containers/{id}/restart → Restart container (scope: containers:write)
DELETE /api/containers/{id}/delete → Delete container (scope: containers:delete)
GET /api/images → List images (scope: images:read)
POST /api/images/pull → Pull image { "image": "nginx:latest" } (scope: images:write)
DELETE /api/images/{id} → Delete image (scope: images:write)
GET /api/marketplace → Browse apps (scope: marketplace:read)
POST /api/marketplace/create → Install app { "app_id": "nginx", "container_name": "my-nginx" } (scope: marketplace:write)
POST /api/marketplace/start → Start app (scope: marketplace:write)
{
"success": true,
"data": { ... },
"error": null
}
// On error:
{
"success": false,
"data": null,
"error": { "code": "SCOPE_REQUIRED", "message": "containers:delete scope required" }
}
| Code | Meaning |
|---|---|
SCOPE_REQUIRED | Key missing required scope — do not retry |
INVALID_KEY | Key is invalid or revoked |
PROTECTED | Cannot modify system containers (wagmios-backend, wagmios-frontend) |
DOCKER_ERROR | Docker operation failed |
NOT_FOUND | Resource not found |
Browse and install 34+ pre-configured self-hosted apps. Visit marketplace.wagmilabs.fun ↗ for the full catalog.
Transmission, qBittorrent, Nextcloud, Filebrowser, Minecraft, n8n, RSSHub, Web-Check, OpenClaw, Gluetun, InfluxDB, Supabase, Puter, Novu, and Windows Docker.
WAGMIOS is designed to be controlled by AI agents running on OpenClaw. The agent skill at skills/wagmi/ provides the full context for agent operation.
🤖 The safety rail: On Linux, Docker commands require sudo. Without root access, your OpenClaw agent can only interact with your homelab through the WAGMIOS API — using exactly the scoped permissions you grant.
User: "Delete the test-nginx container"
Agent: I need containers:delete scope to do that.
→ Go to Settings → Agent Permissions → toggle ON → Save.
Let me know when it's enabled.
User: "Done."
Agent: DELETE /api/containers/{id}/delete → "Done. Container deleted."
User: "Install Jellyfin"
Agent: 1. GET /api/marketplace → find jellyfin app_id
2. POST /api/marketplace/create
3. "Compose downloaded. Start it now? (yes/no)"
User: yes
Agent: POST /api/marketplace/start
"Jellyfin is installed and running on port 8096."
# Start
docker compose up -d
# Stop
docker compose down
# Rebuild after updates
docker compose build && docker compose up -d
# View logs
docker compose logs -f backend
docker compose logs -f frontend
| Volume | Stores |
|---|---|
wagmios_data | API keys, settings, app data |
frontend_data | Frontend assets |
~/.wagmios/containers/ | Marketplace app compose files |
| Variable | Default | Description |
|---|---|---|
PORT | 5179 | Backend port |
WAGMIOS_DATA_DIR | /app/data | Data directory |
WAGMIOS isn't just for one machine. Because the API is standard HTTP with an X-API-Key header, any OpenClaw agent that can reach your backend's port can manage that machine's Docker host — from anywhere.
The model is simple: one agent, many machines, each with its own scoped key.
💡 Each WAGMIOS instance is fully independent. There is no shared state, no cluster, no sync between instances. Each deployment is standalone.
Give your agent one key per machine and label them clearly. Each key lives in your agent's skill config:
wagmios_instances:
nas:
url: http://192.168.1.10:5179
key: wag_live_xxxxxxxxxxxx
scopes: [containers:read, containers:write]
label: "Homelab NAS"
media:
url: http://192.168.1.20:5179
key: wag_live_yyyyyyyyyyyy
scopes: [marketplace:read, marketplace:write]
label: "Media Server"
vps:
url: https://vps.yourdomain.com:5179
key: wag_live_zzzzzzzzzzzz
scopes: [containers:read, images:write]
label: "VPS"
The agent knows which URL to hit for which machine — and the scope system ensures it can only do what you've explicitly allowed on each one.
WAGMIOS binds to all interfaces (0.0.0.0) by default. That's fine on a trusted LAN — but if you're exposing it beyond your local network, take these steps:
| Environment | What to do |
|---|---|
| Local LAN only | No extra steps. Keep port 5179 firewalled from the internet. |
| Internet / VPN | Put a reverse proxy in front and terminate TLS. Never send API keys over plain HTTP outside your LAN. |
🔐 Treat your WAGMIOS API key like an SSH key. Over a trusted LAN it's fine. Over the open internet, always use TLS.
Caddy (automatic HTTPS):
wagmios.yourdomain.com {
reverse_proxy localhost:5179
}
Nginx:
server {
listen 443 ssl;
server_name wagmios.yourdomain.com;
location / {
proxy_pass http://localhost:5179;
}
}