WAGMIOS

v2.4.0

Give Your Agent
a Homelab

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.

GitHub Marketplace ↗

What is WAGMIOS?

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.

🔐

Scope-Based Permissions

Give agents exactly the permissions they need — nothing blanket.

🏪

34+ Marketplace Apps

One-click install Plex, Jellyfin, Ollama, Home Assistant, and more.

🤖

OpenClaw-Native

Built for OpenClaw agents — every action is visible and auditable.

Real-Time Activity

WebSocket-powered feed shows everything happening in your homelab.


🤖 OpenClaw Agent Skill

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


Quick Start

Option 1 — Pull from Docker Hub (Recommended)

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

Option 2 — Build from Source

git clone https://github.com/mentholmike/wagmios.git
cd wagmios
docker compose up -d --build

3. Open the UI

ServiceURL
Frontendhttp://localhost:5174
Backend APIhttp://localhost:5179
Health Checkhttp://localhost:5179/health

4. Get Your API Key

The Setup Wizard walks you through naming your key and picking permissions. Copy the key — you won't see it again.


Scope System

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.

ScopeWhat It Allows
containers:readList containers, inspect, view logs
containers:writeCreate, start, stop, restart containers
containers:deleteDelete containers
images:readList Docker images
images:writePull and delete images
marketplace:readBrowse the app marketplace
marketplace:writeInstall and manage marketplace apps
templates:readUse saved compose templates
templates:writeCreate and edit templates

Agent Decision Tree

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

API Reference

Base URL: http://localhost:5179 — All requests require X-API-Key: <key> header.

Auth

GET /api/auth/status     → Check key scopes and metadata
GET /api/settings        → Key info (label, prefix, created date, scopes)

Containers

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)

Images

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)

Marketplace

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)

Response Format

{
  "success": true,
  "data": { ... },
  "error": null
}

// On error:
{
  "success": false,
  "data": null,
  "error": { "code": "SCOPE_REQUIRED", "message": "containers:delete scope required" }
}

Error Codes

CodeMeaning
SCOPE_REQUIREDKey missing required scope — do not retry
INVALID_KEYKey is invalid or revoked
PROTECTEDCannot modify system containers (wagmios-backend, wagmios-frontend)
DOCKER_ERRORDocker operation failed
NOT_FOUNDResource not found

Marketplace

Browse and install 34+ pre-configured self-hosted apps. Visit marketplace.wagmilabs.fun ↗ for the full catalog.

Media & Entertainment

Plex
Media Server
32400
Jellyfin
Media Server
8096
Immich
Photo Backup
2283

AI & Local Models

Ollama
AI Models
11434
Open WebUI
Chat UI
8080
Lethe
AI Memory
18483

Home Automation

Home Assistant
Smart Home
8123

arr Stack

Sonarr
TV Downloads
8989
Radarr
Movie Downloads
7878
Prowlarr
Indexer Manager
9696

Monitoring

Uptime Kuma
Monitoring
3001
Grafana
Dashboards
3000
Prometheus
Metrics
9090
Glances
System Monitor
61208

Security

Vaultwarden
Password Manager
80

Networking

Nginx
Web Server
80
Pi-hole
Ad Blocking
80
AdGuard Home
DNS Blocking
3000
WireGuard
VPN
51820

+ More

Transmission, qBittorrent, Nextcloud, Filebrowser, Minecraft, n8n, RSSHub, Web-Check, OpenClaw, Gluetun, InfluxDB, Supabase, Puter, Novu, and Windows Docker.


For AI Agents

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.

What Agents Can Do (with the right scopes)

Example Dialogues

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."

Docker Management

# 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

Data Persistence

VolumeStores
wagmios_dataAPI keys, settings, app data
frontend_dataFrontend assets
~/.wagmios/containers/Marketplace app compose files

Environment Variables

VariableDefaultDescription
PORT5179Backend port
WAGMIOS_DATA_DIR/app/dataData directory

Multi-Machine Management

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.

flowchart LR A["🤖 OpenClaw Agent"] -->|"Key A (read+write)\nnas.yourdomain.com:5179"| B["Machine A\nHomelab NAS"] A -->|"Key B (marketplace)\nmedia.yourdomain.com:5179"| C["Machine B\nMedia Server"] A -->|"Key C (images:write)\nvps.yourdomain.com:5179"| D["Machine C\nVPS"] style A fill:#F59E0B,color:#000 style B fill:#111318,color:#e8eaf0,stroke:#00ADD8 style C fill:#111318,color:#e8eaf0,stroke:#42D392 style D fill:#111318,color:#e8eaf0,stroke:#2496ED

How It Works

  1. Install WAGMIOS on each machine you want to manage
  2. Each instance gets its own URL and its own set of API keys
  3. Your agent holds one key per machine, each with only the scopes that machine needs
  4. The agent can't cross machines, can't escalate its own permissions, and every action is logged in each instance's activity feed

💡 Each WAGMIOS instance is fully independent. There is no shared state, no cluster, no sync between instances. Each deployment is standalone.

Skill Setup

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.

Security: Network Exposure

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:

EnvironmentWhat to do
Local LAN onlyNo extra steps. Keep port 5179 firewalled from the internet.
Internet / VPNPut 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;
  }
}

Architecture

flowchart LR A["🤖 OpenClaw Agent"] -->|"X-API-Key"| B["Go API
:5179"] B -->|"scope check"| C["Docker Socket
/var/run/docker.sock"] C -->|"events"| B B <-->|"WebSocket"| D["Vue UI
:5174"] D -->|"user actions"| B subgraph Backend B --> E[middleware] B --> F[scope enforcement] B --> G[marketplace handler] B --> H[Docker socket proxy] end subgraph Data I["JSON flat-file
wagmios_data volume"] E --> I F --> I end
request flow
OpenClaw Agent
X-API-Key header
Go API
scope check
Docker Socket
/var/run/docker.sock
Vue UI
:5174
backend
Go 1.21
net/http · gorilla/mux
API server, middleware, scope enforcement, Docker socket proxy, marketplace handler.
gorilla/mux v1.8.1 gorilla/websocket v1.5.1 google/uuid v1.6.0
WebSocket feed
gorilla/websocket · real-time
Live activity broadcast to UI. Every agent action — start, stop, pull, install — emits an event.
activity log audit trail
frontend
Vue 3
Vite · Composition API
Reactive UI with dark mode. Container manager, marketplace browser, API key wizard, live activity feed.
vue 3 vite tailwindcss
TypeScript
api.ts · typed client
Fully typed API client layer. All requests and responses are typed — no silent runtime failures.
strict mode api.ts
infrastructure
Docker
socket · compose · multi-arch
Backend communicates via the Docker socket. Two-stage Alpine build. Multi-arch images for x86_64 and ARM64.
alpine:3.19 docker-compose arm64 + amd64
Data layer
JSON flat-file · gopkg.in/yaml.v3
API keys, settings, and app metadata stored in named Docker volumes. No external database required.
wagmios_data yaml.v3 zero deps