Chat UI for claude-code-api.
No API key — runs on your existing Claude subscription.
One-command Docker deploy.
Browser
↓
claude-code-web (Next.js — auth, chat UI)
↓ HMAC token via exitx network
claude-code-api (worker pool + queue)
↓ Agent SDK
Claude Code CLI (agent execution)
- claude-code-web — Chat UI, user authentication, proxies requests to the API
- claude-code-api — Agent engine, worker pool, HTTP API with API key auth
claude-code-api must be running first. See claude-code-api for setup.
git clone https://github.com/exitxio/claude-code-web.git
cd claude-code-web
cp .env.example .env
# NEXTAUTH_SECRET= (must match claude-code-api)
# USERS=admin:yourpassword
pnpm docker:up| Script | Command |
|---|---|
pnpm docker:up |
Build & start containers |
pnpm docker:down |
Stop containers |
pnpm docker:logs |
Follow container logs |
pnpm docker:prod |
Start with pre-built GHCR image |
Open http://localhost:3000 → log in → click "Not logged in · Setup" in the header → authenticate with your Claude account via OAuth.
claude-code-web and claude-code-api run as separate Docker Compose stacks, connected via a shared exitx network.
claude-code-api (port 8080) ──┐
├── exitx network
claude-code-web (port 3000) ──┘
claude-code-api creates the network. claude-code-web joins as external:
# docker-compose.yml
services:
web:
environment:
- AUTOMATION_SERVER_URL=http://claude-code-api:8080 # env name kept for backward compat
networks:
- exitx
networks:
exitx:
external: trueStart order: api first, then web.
# 1. Start API
cd claude-code-api && pnpm docker:up
# 2. Start Web
cd claude-code-web && pnpm docker:up- Multi-turn sessions — per-user context persistence
- Single-shot mode — stateless worker pool for one-off requests
- Personal CLAUDE.md — per-user custom instructions
- Web OAuth — authenticate with your Claude subscription, no API key
- Credentials auth — env-based user management, no database
| Variable | Default | Description |
|---|---|---|
NEXTAUTH_SECRET |
required | Random secret for JWT signing (must match api) |
NEXTAUTH_URL |
http://localhost:3000 |
Public URL of the app |
USERS |
— | username:password pairs, comma-separated |
PORT |
3000 |
Web port |
Credentials are stored in a named Docker volume (claude-auth) on the api container. No local ~/.claude mount required.
- Open the app and log in
- Click "Not logged in · Setup" in the header
- Follow the OAuth link to claude.ai and sign in
- Copy the code from the callback page and paste it back
- Workers restart automatically — ready to use immediately
The web UI and API server are separate projects. For local development:
# Terminal 1 — run the API server
cd ../claude-code-api
pnpm install
pnpm dev
# Terminal 2 — run the web UI
pnpm install
cp .env.example .env.local
pnpm devThe HTTP API is served by claude-code-api. See the claude-code-api README for full API documentation, including API key authentication for external integrations (bots, CI, etc.).
- Security — permission modes, network security, credential storage




