Web-based terminal for Claude Code with Docker sandbox isolation. Each user gets an isolated Docker container with a persisted workspace.
# Install dependencies
pnpm install
# Build Docker image for Claude sandbox
npm run build
# Run server
ANTHROPIC_AUTH_TOKEN=sk-xxx ANTHROPIC_BASE_URL=https://api.kimi.com/coding/ npm start
# Open browser
open http://localhost:3000# Build both images
docker build -t claude-code-sandbox -f Dockerfile .
docker build -t claude-server -f Dockerfile.server .
# Run server container with Docker socket access
docker run -d \
-p 3000:3000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd)/.claude-workspaces:/app/.claude-workspaces \
-e ANTHROPIC_AUTH_TOKEN=sk-xxx \
-e ANTHROPIC_BASE_URL=https://api.kimi.com/coding/ \
claude-server
# Or use docker-compose
docker-compose up --buildHost Machine
├── Node.js server.js (host)
│ └── Spawns Docker containers per client
│ └── Container: claude-code-sandbox
│ └── /workspace (mounted from host)
Host Machine
├── Docker
│ ├── Container: claude-server
│ │ └── Node.js server.js
│ │ └── Spawns sibling containers via Docker socket
│ └── Container: claude-code-sandbox (per client)
│ └── /workspace (mounted from host)
| Variable | Description | Default |
|---|---|---|
ANTHROPIC_AUTH_TOKEN |
API token for Claude | (required) |
ANTHROPIC_BASE_URL |
API base URL | (Claude default) |
ANTHROPIC_MODEL |
Model name | (Claude default) |
PORT |
Server port | 3000 |
DOCKER_IMAGE |
Sandbox image name | claude-code-sandbox |
Each client container has:
- Isolated filesystem: Only
/workspaceis writable (mounted from host) - Network access: Internet allowed via
--network bridge - Full permissions:
--dangerously-skip-permissionsenabled - Auto-cleanup: Container stops when user disconnects
# Install deps
pnpm install
# Build Docker image
npm run build
# Run dev mode (build + start)
npm run dev