Use Claude Code, Gemini CLI, and Codex as OpenAI-compatible APIs — managed through a modern web dashboard.
English | 简体中文
We have a Discord server — installation help, release announcements, and community chat.
discord.gg/7SrXxNueGA
CLIProxyAPI wraps OAuth-based CLI tools (Claude Code, Codex, Antigravity, Kimi, xAI, Devin and more; Gemini CLI, GitHub Copilot, Kiro and Cursor through CLIProxyAPI plugins) into OpenAI-compatible APIs. This dashboard gives you a web UI to manage everything — providers, API keys, configs, logs, and updates — without touching YAML files.
Local use (macOS/Windows/Linux): Only Docker Desktop required.
git clone https://github.com/itsmylife44/cliproxyapi-dashboard.git
cd cliproxyapi-dashboard
./setup-local.sh # macOS/Linux
# .\setup-local.ps1 # WindowsThe local setup scripts start Docker Compose with a local dashboard build (--build) so your current source changes are used.
Open http://localhost:3000 → create admin account → done.
Server deployment: See the full Installation Guide. Already running CLIProxyAPI?
sudo ./install.sh --dashboard-onlyinstalls the dashboard and its database while reusing your existing CLIProxyAPI. This mode also includes usage collection and backup scheduling helper services, as described in the installation guide.
- Visual Configuration — Manage CLIProxyAPI settings through structured forms, no YAML editing
- Multi-Provider OAuth — Connect Claude Code, Codex, xAI (Grok), Antigravity, Kimi, Kimi.ai, Devin, and Meta AI accounts; Gemini CLI, GitHub Copilot, Kiro, and Cursor appear once their CLIProxyAPI plugin is enabled
- CLIProxyAPI Plugins — Install, enable, configure, and remove plugins from the CLIProxyAPI plugin store (Settings), with a warning when the persistent plugins volume is missing
- Custom Providers — Add any OpenAI-compatible endpoint (OpenRouter, Ollama, etc.) with model mappings; admins can mark a provider as Shared so all team members see and use it
- Perplexity Pro Sidecar — Optional OpenAI-compatible wrapper for a Perplexity Pro subscription, enabled during setup
- API Key Management — Create, revoke, and track API keys with per-user ownership
- User Management — Admins create, edit, and delete users and grant admin rights
- Real-time Monitoring — Live log streaming, container health, and service management
- Quota Tracking — Rate limits and usage per provider (Claude, Codex incl. per-model and code review limits, Kimi, GitHub Copilot, Antigravity and Gemini per model)
- Telegram Quota Alerts — Automatic notifications when OAuth quota drops below threshold (configurable providers, check interval, and cooldown)
- Usage Analytics — Request counts, provider breakdown, model stats, error rates, estimated cost per model and provider
- Oh-My-Open-Agent Variant Toggle — Choose between oh-my-openagent (11 agents + 9 categories) and oh-my-opencode-slim (7 agents, lower tokens, fallback chains) with per-agent model/skills configuration
- Config Sync — Auto-sync OpenCode configs via the
opencode-cliproxyapi-syncplugin (includes slim config) - Config Sharing — Share model configs with others via share codes (
XXXX-XXXX) - One-Click Updates — Update both Dashboard (GHCR) and CLIProxyAPI (Docker Hub) from the admin panel
- Container Management — Start, stop, restart containers directly from the UI
- Backup & Restore — Create, schedule, upload, preview, and restore dashboard backups (Settings → Backup)
- Light/Dark Theme & Languages — Theme toggle; UI in English, German, Spanish, and Simplified Chinese
- Automatic TLS — Let's Encrypt certificates via Caddy, auto-renewed
Feature availability depends on the deployment mode. In dashboard-only mode, restarting or updating the CLIProxyAPI container requires separately providing compatible Docker access and container naming; see the Installation Guide. Version switching also requires writable version-pinning configuration; see the Environment Variables reference. Updating Dashboard from the web UI requires a deploy webhook service and
DEPLOY_SECRET; see Webhook / Deploy configuration.
Custom providers pointing at localhost or private networks are blocked by default to prevent SSRF from hosted installations. To enable them on self-hosted deployments:
- Set
ALLOW_LOCAL_PROVIDER_URLS=trueininfrastructure/.env. - Restart the dashboard container (
docker compose up -d dashboard). - Create a custom provider with the local base URL (e.g.
http://host.docker.internal:11434/v1for Ollama from within Docker, orhttp://localhost:11434/v1when running the dashboard outside a container). The API key field is optional — leave it empty if the provider doesn't require one.
Cloud instance-metadata addresses (169.254.169.254, 100.100.100.200) stay blocked regardless of this setting.
Get notified on Telegram when your OAuth provider quota is running low.
Setup (Quota → Telegram Alerts, admins only):
- Create a Telegram bot via @BotFather and copy the bot token
- Get your chat ID (send a message to the bot, then check
https://api.telegram.org/bot<TOKEN>/getUpdates) - In the dashboard, open the Quota page, scroll to Telegram Alerts, and enter:
- Bot token
- Chat ID
- Quota threshold (e.g. 20% remaining)
- Check interval and cooldown (minutes)
- Which providers to monitor (Claude, Antigravity, Gemini CLI, Gemini, Codex, Copilot, Kimi)
- Enable alerts — the scheduler checks every 5 minutes with a 1-hour cooldown between notifications by default
Use the Send Test button to verify your configuration before enabling, and Check Now to run a check immediately.
The dashboard supports two OpenCode orchestration variants. Toggle between them in the Using with OpenCode section:
| Variant | Agents | Description |
|---|---|---|
| Oh-My-Open-Agent | 11 agents + 9 categories | Full-featured orchestration with sisyphus, hephaestus, atlas, prometheus, oracle, and more |
| Oh-My-OpenCode Slim | 7 agents | Lightweight: orchestrator, oracle, council, designer, explorer, librarian, fixer. Lower token usage with dedicated fallback chains |
Generated configs target oh-my-openagent 5.1.33 and oh-my-opencode-slim 3.0.4 and are checked against their upstream schemas.
How it works:
- Select your variant in the dashboard -- the plugin in
opencode.jsonswitches automatically - Assign models to agents (auto-assigned by tier, or manually override)
- Toggle skills (per agent in Slim: simplify, codemap; disabled skills and hooks in Oh-My-Open-Agent)
- Config syncs automatically via the sync plugin
First-time setup (run once per variant):
bunx oh-my-openagent@latest install # Normal variant
bunx oh-my-opencode-slim@latest install --no-tui # Slim variantEach variant has its own config file (oh-my-openagent.json / oh-my-opencode-slim.jsonc) -- they don't conflict.
Setup Wizard — guided initial configuration
Provider Configuration — manage API keys and OAuth accounts
Quota Management — track rate limits with Telegram alerts
Settings — config sync, system info, and updates
Seven Docker containers plus the optional Perplexity sidecar, on two networks (frontend, and backend with no internet access):
| Service | Role |
|---|---|
| Caddy | Reverse proxy, automatic TLS, HTTP/3 |
| Dashboard | Next.js web app, JWT auth, Docker management via socket proxy |
| CLIProxyAPI | AI proxy server, OAuth callbacks, management API |
| Perplexity Sidecar | Optional (perplexity profile): OpenAI-compatible wrapper for Perplexity Pro subscription |
| Docker Socket Proxy | Restricted Docker API access (containers, images, networks only) |
| PostgreSQL | Database on isolated internal network |
| Usage Collector | Cron container that triggers usage collection every 5 minutes |
| Backup Scheduler | Cron container that runs due scheduled backups (checks every 5 minutes) |
| Component | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI | React 19 |
| Styling | Tailwind CSS v4 |
| Database | PostgreSQL 16 + Prisma 7 |
| Auth | JWT (jose) + bcrypt |
| Container Mgmt | Docker CLI via socket proxy |
cd dashboard
./dev-local.sh # Start dev environment
./dev-local.sh --reset # Reset database
./dev-local.sh --down # Stop containersOr manually:
cd dashboard
npm install
cp .env.development .env.local # Edit with your DB credentials
npx prisma migrate dev
npm run devDashboard at http://localhost:3000.
To browse the dashboard UI without PostgreSQL or login:
cd dashboard
SKIP_AUTH=1 npm run devOpens all routes as a fake admin user — useful for testing themes, layouts, and components.
| Guide | Description |
|---|---|
| Installation | Server deployment, local setup, manual installation |
| Configuration | Environment variables, config.yaml, config sync |
| Environment Variables | Full environment variable reference |
| Usage Collection | Usage tracking service, troubleshooting, manual collection |
| Troubleshooting | Common issues and solutions |
| Security | Best practices for production |
| Backup & Restore | Automated and manual backups |
| Service Management | Systemd and Docker Compose commands |
| Runbook | Health check, deployment, database, updates, monitoring |
- Fork → feature branch → PR
- Use Conventional Commits (
feat:,fix:,chore:) - Test locally before submitting
Release-Please auto-generates releases from commit messages. See the Contributing Guide for setup, scripts, code style, and the PR checklist.
Thanks to these wonderful people (emoji key):
itsmylife44 💻 📖 🚧 🚇 |
Rizki Hidayat 💻 |
Đặng Quốc Phong 💻 |
smart-tinker 💻 🐛 |
islee 💻 |
deftdawg 💻 🐛 |
dslife2025 💻 |
The dashboard supports multi-language UI. Currently, we offer English (en), German (de), Spanish (es), and Simplified Chinese (zh-CN). We welcome community contributions for additional languages!
-
Copy the English template:
cp dashboard/messages/en.json dashboard/messages/{locale}.jsonReplace
{locale}with the language code (e.g.,frfor French,esfor Spanish,jafor Japanese). -
Translate all strings:
- Open the new file in your editor
- Translate every value (keep all keys and the structure unchanged)
- Example:
{ "common": { "loading": "Wird geladen...", "cancel": "Abbrechen" } }
-
Register the new locale:
- Edit
dashboard/src/i18n/config.ts - Add your locale to the
supportedLocalesarray:export const supportedLocales = ["en", "de", "es", "zh-CN", "fr"] as const;
- Add the display name to
localeNames:export const localeNames: Record<Locale, string> = { en: "English", de: "Deutsch", es: "Español", "zh-CN": "简体中文", fr: "Français", // Add this };
- Edit
-
Test locally:
- Run
npm run devindashboard/ - Log in to the dashboard
- Open the User Panel (top right)
- Select your language from the Language dropdown
- Verify all UI strings display correctly in your language
- Run
-
Submit a PR:
- Title:
feat(i18n): add {language} translation - Include both files:
messages/{locale}.json, and changes tosrc/i18n/config.ts - PR description: Link to any external translation resources or notes
- Title:
- Keep translations concise and match the tone of the English version
- Use formal/business-appropriate language
- Test that UI elements don't overflow or break with your translations
- Plurals and gender (where applicable) should follow target language conventions
- Date/time formatting handled by
next-intl— no need to change - Currency codes are kept in English (e.g.,
USD,EUR)
Add more by following the steps above!
- Discord — Community chat, installation help, announcements
- CLIProxyAPI — Core proxy documentation
- Issues — Bug reports and feature requests
Built with ❤️ using Next.js, React, and Tailwind CSS


