A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
Self-hosted gateway that runs Claude Code · Codex · Gemini · shell sessions on your own infra with a shared local-first
Self-hosted gateway for Claude Code · Codex · Gemini · shell, with one shared local-first memory layer across them.
Run sessions on your own infra. Drive from web, mobile, or chat. Open REST + WebSocket API for integrations.
🌐 English · 简体中文 · فارسی · Español · Português · 日本語 · 한국어 · Français · Deutsch · Русский
Three frictions in day-to-day work with AI coding CLIs that opendray is built to fix.
Sessions die when your laptop sleeps. Running Claude Code or Codex over SSH means the agent dies the moment your machine closes the lid or drops Wi-Fi. Context, in-flight tool calls, the partial diff you were about to review. Gone. opendray runs the agent on a host that doesn't sleep (a Mac mini under your desk, a NAS, a VPS) and lets you reattach from a web admin, a Flutter mobile app, or a chat message. The session keeps executing whether or not anyone's connected.
Hitting a rate limit shouldn't kill what you were doing. If you have multiple Anthropic accounts (work + personal, family plan + Pro), opendray treats them as a pool. It surfaces tier, quota and active-session count per account, balances new sessions across them, and lets you swap a live session to a different account without losing the conversation. The transcript moves with you. Same model for Codex and Gemini accounts.
Memory is a first-class layer, not an afterthought. Most AI CLIs re-index project context from scratch every session, burning tokens on repeated retrieval. opendray ships a local-first vector store (ONNX / Ollama / LM Studio embeddings) with three-domain retrieval across user, project, and session, plus drift detection across layers. Every byte stays on your network.
opendray wraps the AI coding CLIs you already use (Claude Code, Codex, Gemini, plus any shell) and turns them into something you can drive from anywhere. Run sessions on your home server / NAS / VPS, get notified on Telegram when one goes idle, reply from your phone to feed the next prompt back in, all over a self-hosted gateway you control end to end.
claude login accounts into the gateway; the panel auto-discovers them via a filesystem watcher, balances new sessions across enabled accounts, and lets you switch a live session between accounts without losing the conversation (transcript is migrated under the hood). Each account row shows live capacity (subscription tier, rate-limit tier, active sessions, last-used, current Anthropic email) so you can pick the right one at a glance.A single Go binary on your host runs the show. Clients drive sessions through HTTP/WebSocket, the session manager spawns each AI CLI in its own PTY, and the memory layer keeps shared state in Postgres with vector embeddings from your own provider.
flowchart LR
subgraph clients [Clients]
web[Web admin<br/>React SPA]
mob[Mobile app<br/>Flutter]
chat[Chat<br/>Telegram, Slack,<br/>Discord, Feishu,<br/>DingTalk, WeCom]
api[Third-party apps<br/>REST + WS]
end
subgraph gw [opendray gateway · single Go binary on your host]
direction TB
http[HTTP + WS<br/>chi · auth · audit]
sess[Session manager<br/>PTY · ring buffer]
mem[Memory layer<br/>three-domain retrieval]
end
subgraph cli [AI CLIs · spawned via PTY]
cc[Claude Code]
co[Codex]
ge[Gemini]
sh[Shell]
end
subgraph data [Persistence · stays on your network]
pg[(PostgreSQL<br/>+ pgvector)]
em[ONNX · Ollama<br/>LM Studio embeddings]
end
clients --> http
http --> sess
http --> mem
sess --> cc
sess --> co
sess --> ge
sess --> sh
sess -.-> mem
mem --> pg
mem --> em
Everything in the diagram runs on your network. No cloud dependencies, no inference outside your control.
v2.7.6 (latest). The v2 generation continues to iterate. See
VERSIONING.md for the major-as-generation policy
(major = product generation, not strict SemVer "breaking change") and
CHANGELOG.md for the full release history.
This generation ships:
opendray update / start / stop / restart / status / providers list / providers update so operators
don't touch systemctl / launchctl for routine ops.Linux / macOS / WSL2
curl -fsSL https://raw.githubusercontent.com/Opendray/opendray/main/scripts/install.sh | bash
Windows sets up WSL2 first, then runs the Linux installer inside it. details →
irm https://raw.githubusercontent.com/Opendray/opendray/main/scripts/install-windows.ps1 | iex
Walks through Postgres setup, AI-CLI install, admin credentials, and service registration, landing a running gateway in ~5 to 10 minutes. See scripts/README.md for what the wizard does, the file layout it creates, options, and troubleshooting.
Want the manual walkthrough? Read docs/getting-started.md, a 15-minute end-to-end guide that mirrors what the wizard does so you can verify each step yourself.
Install globally and put opendray on PATH:
npm install -g opendray
Or run on demand without installing:
npx opendray
This installs just the binary, no wizard, no service, no Postgres. The package pulls the matching opendray-{linux,darwin}-{x64,arm64} platform binary via optionalDependencies (the esbuild / Biome pattern, no postinstall, no network call at install time). Good for scripted environments, ephemeral runners, or when you already run your own Postgres and process supervisor.
You still bring a database and start the gateway yourself:
# 1. PostgreSQL 15+ with pgvector. Point a DSN at it, set an admin password.
export OPENDRAY_DATABASE_URL="postgres://opendray:pw@127.0.0.1:5432/opendray?sslmode=disable"
export OPENDRAY_ADMIN_PASSWORD="$(openssl rand -base64 24)"
# 2. Apply the schema, then run (foreground).
opendray migrate
opendray serve # → http://127.0.0.1:8770/admin/
Full walkthrough (pgvector setup, config.toml, running as a systemd / launchd service, and updating) in docs/install-binary.md.
Default. Stops the gateway and removes the binary, but keeps your config.toml, data directory (bcrypt keyfile, sessions, notes, vault), logs, and the PostgreSQL database so a re-install resumes where you left off:
curl -fsSL https://raw.githubusercontent.com/Opendray/opendray/main/scripts/uninstall.sh | bash
Full purge. Also drops the PG database + role, deletes config / data / logs, removes the service user. Includes a post-delete verification step that bails loudly if anything survived:
curl -fsSL https://raw.githubusercontent.com/Opendray/opendray/main/scripts/uninstall.sh | OPENDRAY_PURGE=1 bash
After install, the opendray binary handles its own lifecycle, with no need to remember systemctl / launchctl incantations:
sudo opendray update --restart # download latest release, verify SHA, atomic replace + restart
sudo opendray providers update # bump installed AI CLIs (claude / codex / gemini) to npm-latest
opendray providers list # see which AI CLIs are installed + their versions
sudo opendray start # start | stop | restart | status, wraps systemd / launchd
opendray --help lists the full subcommand set.
Every supported path includes session spawn, AI-CLI access, encrypted backups, and the full integration API. opendray is a host-resident gateway; it spawns AI CLIs via PTYs and shares process state (~/.claude, ssh-agent, project files) with them. That model is incompatible with the container isolation that production Docker would impose, so Docker is not a supported deployment path for v2.x.
| Path | Best for | Jump to |
|---|---|---|
| 📦 Pre-built binary | "Just run it", Linux / macOS, any supervisor | Releases page → see Production deploy |
| 🐧 systemd unit | Bare-metal / VM / LXC Linux box | Production deploy §A |
| 🍎 macOS LaunchDaemon | Mac mini / Mac Studio as home server | Production deploy §C |
| 🛠 Build from source | Dev / contributing / custom builds | Quickstart below |
For a full walkthrough with prereqs and troubleshooting, see docs/quickstart.md. The condensed dev path:
# 1. Have a Postgres 15+ running on 127.0.0.1:5432 with pgvector enabled
# (apt install postgresql-16 postgresql-16-pgvector / brew install postgresql@16 pgvector).
# Point [database].url at any other DSN if you'd rather use a remote PG.
# 2. Local config, already gitignored.
cp config.example.toml config.toml
$EDITOR config.toml # set [database].url, [admin].password
# 3. Build the web bundle into the embed tree.
cd app/web && pnpm install && pnpm build && cd ../..
# 4. Apply schema.
go run ./cmd/opendray migrate -config config.toml
# 5. Run.
go run ./cmd/opendray serve -config config.toml
# → REST + WS: http://127.0.0.1:8770/api/v1/...
# → Web admin: http://127.0.0.1:8770/admin/
This runs OpenDray in the foreground; Ctrl-C kills it. For a long-running daemon, see Production deploy below.
Four supported deploy paths, pick whichever fits your environment. Each one gives you auto-restart on crash, persistent state, and separation of secrets from config.
The recommended Linux deploy path. Ships a hardened unit at
deploy/systemd/opendray.service
with sandboxing (ProtectSystem=strict, NoNewPrivileges,
MemoryDenyWriteExecute, capability scrub), migrate-then-serve
boot, and a 20s graceful-stop window.
Get a binary first. Either grab a pre-built archive from the
Releases page
(opendray_*_linux_<arch>.tar.gz, which unpacks to a single opendray
binary), or build from source via the Quickstart
above (go build ./cmd/opendray).
# 1. Install the binary you just grabbed (or built).
sudo install -m 0755 /path/to/opendray /usr/local/bin/opendray
# 2. Create the service user + state dir.
sudo useradd -r -s /usr/sbin/nologin -d /var/lib/opendray opendray
sudo install -d -o opendray -g opendray -m 0700 /var/lib/opendray
# 3. Drop config + secrets (root-owned; mode 0640).
sudo install -D -m 0640 config.example.toml /etc/opendray/config.toml
sudo $EDITOR /etc/opendray/config.toml # set [database].url etc.
sudo install -D -m 0640 -o root -g opendray /dev/null /etc/opendray/env.d/secrets
sudo $EDITOR /etc/opendray/env.d/secrets # OPENDRAY_ADMIN_PASSWORD=…
# 4. Install + enable the unit.
sudo cp deploy/systemd/opendray.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now opendray
# 5. Verify.
sudo systemctl status opendray
sudo journalctl -u opendray -f --no-pager
The unit runs opendray migrate as ExecStartPre, so the first boot
applies all migrations before serve ever starts. Restarts are
on-failure with a 5s back-off and a 5-burst limit per minute.
For LXC without systemd, FreeBSD rc.d, OpenRC, or anything else.
Build once, run with whatever supervisor you already use:
# Cross-compile a release archive locally:
goreleaser release --clean --snapshot
ls dist/ # opendray_*_linux_amd64.tar.gz etc.
# Or grab a published release artefact:
# https://github.com/Opendray/opendray/releases
Then point your supervisor (s6, runit, supervisord, runwhen) at:
/usr/local/bin/opendray serve -config /etc/opendray/config.toml
Pre-flight: run opendray migrate -config /etc/opendray/config.toml
once before the first serve, or as a pre-start hook in your
supervisor of choice.
For Apple Silicon Mac mini / Mac Studio running 24/7. Ships a
LaunchDaemon at
deploy/launchd/com.opendray.opendray.plist
that starts at boot before any user login, restarts on crash with
a 5s throttle, and logs to /usr/local/var/log/opendray/.
# 1. Install the darwin binary + config + state dirs.
sudo install -m 0755 ./opendray /usr/local/bin/opendray
sudo install -d -m 0755 \
/usr/local/etc/opendray \
/usr/local/var/lib/opendray \
/usr/local/var/log/opendray
sudo install -m 0640 config.example.toml /usr/local/etc/opendray/config.toml
sudo $EDITOR /usr/local/etc/opendray/config.toml # set [database].url etc.
# 2. Apply migrations once.
sudo /usr/local/bin/opendray migrate \
-config /usr/local/etc/opendray/config.toml
# 3. Install + load the LaunchDaemon.
sudo cp deploy/launchd/com.opendray.opendray.plist /Library/LaunchDaemons/
sudo chown root:wheel /Library/LaunchDaemons/com.opendray.opendray.plist
sudo chmod 0644 /Library/LaunchDaemons/com.opendray.opendray.plist
sudo launchctl bootstrap system /Library/LaunchDaemons/com.opendray.opendray.plist
# 4. Verify.
sudo launchctl print system/com.opendray.opendray
tail -f /usr/local/var/log/opendray/opendray.log
Restart with sudo launchctl kickstart -k system/com.opendray.opendray;
unload entirely with sudo launchctl bootout system/com.opendray.opendray.
Postgres on macOS: install via Homebrew (brew install postgresql@17 && brew services start postgresql@17) and point [database].url at
postgres://$USER@127.0.0.1:5432/opendray. Add pgvector with
brew install pgvector and CREATE EXTENSION vector inside the
opendray database.
For Proxmox-specific LXC notes (PTY in unprivileged containers,
networking, cgroup tweaks), see deploy/lxc/proxmox-pty-notes.md.
For reverse-proxy / TLS termination (nginx, Caddy, Traefik, Cloudflare
Tunnel), see docs/operator-guide.md §Topology.
# Master passphrase (env-only, never write into config.toml).
export OPENDRAY_BACKUP_KEY="$(openssl rand -base64 32)"
export OPENDRAY_BACKUP_ENABLED=1
# pg_dump / pg_restore must match the server's major version. On
# Apple Silicon dev machines pointing at a PG17 server:
export OPENDRAY_BACKUP_PG_DUMP_PATH=/opt/homebrew/opt/postgresql@17/bin/pg_dump
export OPENDRAY_BACKUP_PG_RESTORE_PATH=/opt/homebrew/opt/postgresql@17/bin/pg_restore
Restart opendray; the sidebar grows a Backups page (/backups)
for encrypted PostgreSQL dumps + restore, and /export for
zip-bundle data exports + import. See docs/operator-guide.md §Backup for the full lifecycle.
A single Go binary carries the whole web bundle, so no Node runtime
is required at runtime, no separate static-file server, no Caddy/nginx
needed. Cloudflare Tunnel terminates TLS in front of :8770.
cmd/opendray/ binary entry point
internal/ Go backend — gateway, sessions, memory, channels,
integrations, git, search, … (one package per domain)
app/web/ React + Vite admin SPA (embedded in the binary)
app/mobile/ Flutter app (iOS + Android)
app/shared*/ cross-surface shared UI + i18n strings
docs/ guides: install, getting-started, integration, ops
deploy/ systemd / launchd / LXC units + install scripts
app/web/ builds a single SPA into internal/web/dist/, which the Go
binary embeds and serves at /admin/*. The Vite dev server at :5173
proxies /api to :8770 for HMR-driven development.
# dev (hot reload on the React side, separate Go server for the API)
cd app/web && pnpm dev # http://localhost:5173
go run ./cmd/opendray serve -config ../../config.toml # other terminal
# prod (one binary delivers everything)
cd app/web && pnpm build # writes ../../internal/web/dist
cd ../..
go build ./cmd/opendray # bakes dist into the binary
./opendray serve -config config.toml
See app/web/README.md for the frontend stack
(React + Vite + Tailwind v4 + shadcn/ui + TanStack Router/Query +
Zustand + xterm.js) and per-W milestone notes.
app/mobile/ is a Flutter app for iOS and Android with feature
parity with the web admin. It attaches to a running gateway over HTTPS —
enter the Gateway URL + admin login on first launch and you get the
same Sessions / Channels / Integrations / Memory / Git surfaces. There's
no App Store / Play Store build by design (self-hosted, single-tenant):
you build it yourself and sign it with your own identity.
→ Build & install guide — make the gateway reachable from the phone, then sideload an Android APK or install on iPhone via Xcode. (all 10 languages — switch at the top of the guide.)
docs/getting-started.md: start here if you're new. Zero to first session in 15 minutes, including installing the wrapped CLIs and bootstrapping Postgres.docs/install-binary.md: install from the npm package or a release binary (bring your own Postgres) and run it as a systemd / launchd service.docs/quickstart.md: 5-minute dev environment (assumes you already know the moving parts).docs/mobile-app.md: build & install the Flutter mobile app — sideload an Android APK or install on iPhone via Xcode, then point it at your gateway.docs/operator-guide.md: deploy + ops reference for production-ish setups.docs/integration-guide.md: how to write an external integration in any language.VERSIONING.md: versioning strategy (major-as-generation).CHANGELOG.md: release history.go test -race ./... # backend
cd app/web && pnpm build # web (TS strict + vite production build)
End-to-end smoke flows are tracked in commit messages per milestone. A Playwright harness is a planned follow-up.
v1 (Opendray/opendray) is the legacy codebase, now archived. v2 is
the current and active generation, feature-complete and the only
branch receiving development. Of the 16 v1 builtins, four migrated
into the v2 backend; the rest became client-side features, channel
adaptors, or integration-API consumers.
Apache 2.0. See LICENSE. (v1 was MIT; v2 is licensed
independently.)
Claude Code skill for YouTube creators — channel audits, video SEO, retention scripts, thumbnails, content strategy, Sho
AI image generation skill for Claude Code -- Creative Director powered by Gemini
A Claude Code skill by Hao (駱君昊) that learns your Facebook voice and auto-posts to FB / IG / Threads / X with a 14-day c
Universal SEO skill for Claude Code. 25 sub-skills + 18 sub-agents covering technical SEO, E-E-A-T, schema, GEO/AEO, bac