Architecture
clawui bridge network. Only ports
3000, 8080, and 6379 are exposed on the host.
Prerequisites
| Tool | Version | Notes |
|---|---|---|
| Docker | ≥ 24 | Docker for Mac or OrbStack |
| Docker Compose | v2 | docker compose (not docker-compose) |
| Node.js | ≥ 22 | Only needed for local dev, not Docker |
| Go | ≥ 1.24 | Only needed for local dev, not Docker |
Quick Start
1. Configure environment
| Variable | Default | Description |
|---|---|---|
OPENCLAW_ENDPOINT | http://localhost:8000 | OpenClaw gateway URL |
OPENCLAW_TOKEN | (required) | Auth token for OpenClaw |
CORS_ALLOWED_ORIGINS | http://localhost:3000 | Restrict CORS |
FRONTEND_PORT | 3000 | Host port for frontend |
REDIS_PORT | 6379 | Host port for Redis |
2. Deploy
- Build the Go binary (multi-stage Docker build)
- Build the SolidStart frontend (node:22-alpine)
- Start Redis, wait for it to be healthy
- Start the backend, wait for
/healthto return 200 - Start the frontend
3. Verify
Startup Sequence
Services start in this strict order (Dockerdepends_on + condition: service_healthy):
Health Check Endpoints
| Service | Endpoint | Method | Expected |
|---|---|---|---|
| Backend | http://localhost:8080/health | GET | 200 OK |
| Redis | redis-cli ping (internal) | — | PONG |
| Frontend | http://localhost:3000/ | GET | 200 OK |
Common Commands
Updating the Application
up call. Docker layer cache makes
rebuilds fast for unchanged layers.
Data Persistence
Redis data is stored in a named Docker volumeredis_data. It persists across
container restarts and docker compose down. To wipe all data:
Local Development (without Docker)
For active development, run services individually: Redis (if not using system Redis):Note: Dev mode runs on port 3001. Theapp.config.tsproxies/apitohttp://localhost:8080automatically.
Troubleshooting
Backend won’t start — “redis: connection refused”
Redis isn’t healthy yet. Wait 10–15 seconds, or check:Frontend build fails — “Cannot find module”
Node dependencies may be stale. The Docker build handles this, but for local dev:Backend returns 500 — “openclaw: connection refused”
OPENCLAW_ENDPOINT is unreachable. Verify the gateway is running and the
endpoint URL in .env is correct.
CORS errors in browser
EnsureCORS_ALLOWED_ORIGINS in .env matches the origin your browser uses
(e.g., http://localhost:3000).
Port conflict
If port 3000, 8080, or 6379 is in use:.env:
Known Issues
| ID | Severity | Description |
|---|---|---|
| BUG-001 | Critical | OpenClaw adapter is mock-only; no real AI integration |
| SEC-001 | Critical | CORS wildcard — set CORS_ALLOWED_ORIGINS in .env |
| SEC-002 | Critical | SSE endpoints have no auth middleware |
| BUG-011 | Critical | Frontend does not send idempotency keys on retry |
| BUG-006 | High | No SSE reconnection on stream failure |
UAT note: The deployment is functional for testing the UI, content
rendering, pinning, and session persistence. Real AI responses require
OPENCLAW_TOKEN to point to a working gateway.