Web UI for managing OpenClaw AI chatbots in Docker containers.
OpenClaw is a multi-channel AI chatbot framework. BotMaker provides the management layer: a dashboard to create, configure, and monitor OpenClaw bots without editing config files.
Traditional setups pass API keys directly to bots—if a bot is compromised, your keys leak. BotMaker uses a zero-trust model: bots never have access to real credentials, even if fully compromised.
Why this matters: API key leaks are common in AI applications—prompt injection attacks, compromised dependencies, and verbose logging all create leak vectors. With BotMaker:
- Bot containers receive only a proxy URL, never real API keys
- A separate keyring-proxy container holds encrypted credentials
- All AI provider requests route through the proxy, which injects credentials at the network edge
- Even a fully compromised bot cannot extract your API keys
- Multi-AI Provider Support - OpenAI, Anthropic, Google Gemini, Venice
- Multi-Channel Wizard - Telegram, Discord (all others supported by chatting with your bot post-setup)
- Container Isolation - Each bot runs in its own Docker container
- Dashboard - Creation wizard, monitoring, diagnostics
┌─────────────────────────────────────────────────────────────┐
│ Docker Network │
│ │
│ ┌─────────────┐ ┌───────────────┐ ┌─────────────┐ │
│ │ Bot A │ │ keyring-proxy │ │ OpenAI │ │
│ │ │────▶│ │────▶│ Anthropic │ │
│ │ (no keys) │ │ (has keys) │ │ etc. │ │
│ └─────────────┘ └───────────────┘ └─────────────┘ │
│ ▲ │
│ ┌─────────────┐ │ │
│ │ Bot B │────────────┘ │
│ │ (no keys) │ │
│ └─────────────┘ │
│ │
│ ┌─────────────┐ │
│ │ BotMaker │ ◀── Dashboard UI │
│ │ (manager) │ Bot lifecycle │
│ └─────────────┘ Key management │
└─────────────────────────────────────────────────────────────┘
Components:
| Container | Purpose | Has API Keys? |
|---|---|---|
| botmaker | Dashboard, bot lifecycle management | No (admin only) |
| keyring-proxy | Credential storage, request proxying | Yes (encrypted) |
| bot containers | Run OpenClaw chatbots | No |
- Docker and Docker Compose
- Node.js 20+ (for development only)
- OpenClaw base image — build from OpenClaw repo or use a prebuilt image:
# Option A: Build from source git clone https://github.com/jgarzik/openclaw && cd openclaw && docker build -t openclaw:latest . # Option B: Use a prebuilt image (set OPENCLAW_BASE_IMAGE in docker-compose.yml)
# 1. Initialize secrets (first time only)
mkdir -p secrets
openssl rand -hex 32 > secrets/master_key
openssl rand -hex 32 > secrets/admin_token
cp secrets/admin_token secrets/proxy_admin_token
openssl rand -base64 16 > secrets/admin_password
# 2. Build images (first time, or after code changes)
docker compose build botenv
docker compose build
# 3. Run services
docker compose up -d
# 4. Open dashboard (password is in secrets/admin_password)
open http://localhost:7100 # or visit in browser
cat secrets/admin_password # to see your generated passwordOther useful commands:
docker compose logs -f # View logs
docker compose down # Stop services
docker compose ps # Check status# Install dependencies
npm install
cd dashboard && npm install && cd ..
cd proxy && npm install && cd ..
# Start backend (with hot reload)
ADMIN_PASSWORD=devpassword12 npm run dev
# Start dashboard (in another terminal)
cd dashboard && npm run dev# Build everything
npm run build:all
# Start
ADMIN_PASSWORD=your-secure-password npm startThe dashboard requires password authentication. The password is read from secrets/admin_password.
Setup (done in Quick Start):
openssl rand -base64 16 > secrets/admin_passwordRequirements:
- Password must be at least 12 characters
- File must exist and be readable
Alternative (development only):
ADMIN_PASSWORD=your-password npm run devOn first visit, you'll see a login form. Enter the password to access the dashboard. Sessions are stored in-memory and expire after 24 hours.
-
Add API Keys — Go to the Secrets tab and add your AI provider API keys (OpenAI, Anthropic, etc.). These are stored encrypted in the keyring-proxy.
-
Create a Bot — Click "New Bot" and follow the wizard. You'll need:
- A name and hostname for your bot
- Select an AI provider (must have a key added first)
- A channel token (Telegram bot token or Discord bot token)
- A persona (name and personality description)
-
Monitor — The Dashboard tab shows all bots with their status. Start/stop bots, view logs, and check resource usage.
# Login
TOKEN=$(curl -s -X POST http://localhost:7100/api/login \
-H "Content-Type: application/json" \
-d '{"password":"your-password"}' | jq -r .token)
# Use token for API calls
curl -H "Authorization: Bearer $TOKEN" http://localhost:7100/api/bots
# Logout
curl -X POST -H "Authorization: Bearer $TOKEN" http://localhost:7100/api/logout| Variable | Default | Description |
|---|---|---|
ADMIN_PASSWORD_FILE |
/secrets/admin_password | Dashboard password file (recommended) |
ADMIN_PASSWORD |
- | Dashboard password (env var, dev only) |
PORT |
7100 | Server port |
HOST |
0.0.0.0 | Bind address |
DATA_DIR |
./data | Database and bot workspaces |
SECRETS_DIR |
./secrets | Per-bot secret storage |
BOTENV_IMAGE |
botmaker-env:latest | Bot container image (built from botenv) |
OPENCLAW_BASE_IMAGE |
openclaw:latest | Base image for botenv |
BOT_PORT_START |
19000 | Starting port for bot containers |
SESSION_EXPIRY_MS |
86400000 | Session expiry in milliseconds (default 24h) |
All /api/* endpoints require authentication via Bearer token (see Authentication section).
| Method | Path | Description |
|---|---|---|
| POST | /api/login |
Login with password, returns session token |
| POST | /api/logout |
Invalidate current session |
| Method | Path | Description |
|---|---|---|
| GET | /api/bots |
List all bots with container status |
| GET | /api/bots/:hostname |
Get bot details |
| POST | /api/bots |
Create bot |
| DELETE | /api/bots/:hostname |
Delete bot and cleanup resources |
| POST | /api/bots/:hostname/start |
Start bot container |
| POST | /api/bots/:hostname/stop |
Stop bot container |
| Method | Path | Description |
|---|---|---|
| GET | /health |
Health check (no auth required) |
| GET | /api/stats |
Container resource stats (CPU, memory) |
| GET | /api/admin/orphans |
Preview orphaned resources |
| POST | /api/admin/cleanup |
Clean orphaned containers/workspaces/secrets |
botmaker/
├── src/ # Backend (Fastify + TypeScript)
│ ├── bots/ # Bot store and templates
│ ├── db/ # SQLite database
│ ├── secrets/ # Per-bot secret management
│ └── services/ # Docker container management
├── proxy/ # Keyring proxy service
│ └── src/ # Credential storage & request proxying
├── dashboard/ # Frontend (React + Vite)
│ └── src/components/ # UI components
├── data/ # Database and bot workspaces
├── secrets/ # Shared secrets (master key, admin token)
└── scripts/ # Test and utility scripts
# Backend unit tests
npm test
# Dashboard unit tests
cd dashboard && npm test
# E2E tests (requires running server)
./scripts/test-e2e.sh- ESLint with TypeScript strict mode
- Run
npm run lintto check,npm run lint:fixto auto-fix
- Fork the repository
- Create a feature branch
- Make changes following the code style
- Submit a pull request
MIT License