English | 简体中文
Multi-provider AI proxy with a built-in admin UI, routing, and usage tracking.
- Proxy endpoints for Claude, OpenAI, Gemini, and Codex formats
- Compatible with Claude Code, Codex CLI, and other AI coding tools as a unified API proxy gateway
- Admin API and Web UI
- Provider routing, retries, and quotas
- SQLite-backed storage
Maxx supports three deployment methods:
| Method | Description | Best For |
|---|---|---|
| Docker | Containerized deployment | Server/production use |
| Desktop App | Native application with GUI | Personal use, easy setup |
| Local Build | Build from source | Development |
Start the service using Docker Compose:
docker compose up -dThe service will run at http://localhost:9880.
Full docker-compose.yml example
services:
maxx:
image: ghcr.io/awsl-project/maxx:latest
container_name: maxx
restart: unless-stopped
ports:
- "9880:9880"
volumes:
- maxx-data:/data
environment:
- MAXX_ADMIN_PASSWORD=your-password # Optional: Enable admin authentication
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:9880/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
maxx-data:
driver: localDownload pre-built desktop applications from GitHub Releases.
| Platform | File | Notes |
|---|---|---|
| Windows | maxx.exe |
Run directly |
| macOS (ARM) | maxx-macOS-arm64.dmg |
Apple Silicon (M1/M2/M3) |
| macOS (Intel) | maxx-macOS-amd64.dmg |
Intel chips |
| Linux | maxx |
Native binary |
macOS via Homebrew:
# Install
brew install --no-quarantine awsl-project/awsl/maxx
# Upgrade
brew upgrade --no-quarantine awsl-project/awsl/maxxmacOS Note: If you see "App is damaged" error, run:
sudo xattr -d com.apple.quarantine /Applications/maxx.app
# Run server mode
go run cmd/maxx/main.go
# Run with admin authentication enabled
MAXX_ADMIN_PASSWORD=your-password go run cmd/maxx/main.go
# Or run desktop mode with Wails
go install github.com/wailsapp/wails/v2/cmd/wails@latest
wails devCreate a project in the maxx admin interface and generate an API key, then configure Claude Code using one of the following methods:
settings.json (Recommended)
Configuration location: ~/.claude/settings.json or .claude/settings.json
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "your-api-key-here",
"ANTHROPIC_BASE_URL": "http://localhost:9880"
}
}Shell Function (Alternative)
Add to your shell profile (~/.bashrc, ~/.zshrc, etc.):
claude_maxx() {
export ANTHROPIC_BASE_URL="http://localhost:9880"
export ANTHROPIC_AUTH_TOKEN="your-api-key-here"
claude "$@"
}Then use claude_maxx instead of claude to run Claude Code through maxx.
Note:
ANTHROPIC_AUTH_TOKENcan be any value for local deployment.
Add the following to your ~/.codex/config.toml:
[model_providers.maxx]
name = "maxx"
base_url = "http://localhost:9880"
wire_api = "responses"
request_max_retries = 4
stream_max_retries = 10
stream_idle_timeout_ms = 300000Then use --provider maxx when running Codex CLI.
Build frontend first:
cd web
pnpm install
pnpm buildThen run backend:
go run cmd/maxx/main.goOr run frontend dev server (for development):
cd web
pnpm devSee WAILS_README.md for detailed desktop app documentation.
Quick start:
# Install Wails CLI
go install github.com/wailsapp/wails/v2/cmd/wails@latest
# Run desktop app
wails dev
# Build desktop app
wails build- Admin API: http://localhost:9880/admin/
- Web UI: http://localhost:9880/
- WebSocket: ws://localhost:9880/ws
- Claude: http://localhost:9880/v1/messages
- OpenAI: http://localhost:9880/v1/chat/completions
- Codex: http://localhost:9880/v1/responses
- Gemini: http://localhost:9880/v1beta/models/{model}:generateContent
- Project proxy: http://localhost:9880/{project-slug}/v1/messages (etc.)
| Deployment | Data Location |
|---|---|
| Docker | /data (mounted via volume) |
| Desktop (Windows) | %USERPROFILE%\AppData\Local\maxx\ |
| Desktop (macOS) | ~/Library/Application Support/maxx/ |
| Desktop (Linux) | ~/.local/share/maxx/ |
| Server (non-Docker) | ~/.config/maxx/maxx.db |
Maxx supports SQLite (default) and MySQL databases.
No configuration needed. Data is stored in maxx.db in the data directory.
Set the MAXX_DSN environment variable:
# MySQL DSN format
export MAXX_DSN="mysql://user:password@tcp(host:port)/dbname?parseTime=true&charset=utf8mb4"
# Example
export MAXX_DSN="mysql://maxx:secret@tcp(127.0.0.1:3306)/maxx?parseTime=true&charset=utf8mb4"Docker Compose with MySQL:
services:
maxx:
image: ghcr.io/awsl-project/maxx:latest
container_name: maxx
restart: unless-stopped
ports:
- "9880:9880"
environment:
- MAXX_DSN=mysql://maxx:secret@tcp(mysql:3306)/maxx?parseTime=true&charset=utf8mb4
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
container_name: maxx-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: maxx
MYSQL_USER: maxx
MYSQL_PASSWORD: secret
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
volumes:
mysql-data:
driver: localThere are two ways to create a new release:
- Go to the repository's Actions page
- Select the "Release" workflow
- Click "Run workflow"
- Enter the version number (e.g.,
v1.0.0) - Click "Run workflow" to execute
./release.sh <github_token> <version>Example:
./release.sh ghp_xxxx v1.0.0Both methods will automatically create a tag and generate release notes.
