Put your team's spare Claude capacity to work.
orch turns GitHub issues into a shared queue. Each task runs on a teammate's own machine, on their own Claude subscription, inside a throwaway container, and comes back as a pull request. No account is ever shared.
No pooled accounts
The server knows task statuses and usage estimates. It never sees a Claude credential.
Outbound only
Member machines dial out to the server over a WebSocket and open no inbound port.
Docker everywhere
Server, web, database, proxy, member agent, task sandboxes and every dev workflow.
How it works
From issue to pull request
Label an issue
An issue with the project's pool label becomes a task. You can also write one on the Backlog page, or let Claude Code split a feature into tasks through MCP.
orch offers it
In
automode the member with the most budget left gets it. Inapprovalmode nothing starts until they accept.orch pausealways wins.It runs locally
Claude Code works in a non-root container that only sees a fresh clone, on that member's subscription. You follow the run in live logs.
A PR comes back
orch pushes an
orch/issue-<n>-*branch and opens a draft PR. The project owner reviews and merges; dependent tasks start after.
The pieces
- caddyAutomatic HTTPS for
ORCH_DOMAIN, serves the web build, proxies the rest to the server. - serverREST API, GitHub OAuth and webhooks, dispatcher, agent WebSocket gateway, MCP server.
- postgresAll state. Internal network only.
- backupScheduled
pg_dumpwith rotation, optional age encryption and S3 upload. - agentRuns on each member's machine and drives their local Docker.
Features
What a small team gets
The work gets shared, and you can see what your Claude capacity is doing.
While a task runs
Live logs
Each task card has a Logs panel that follows Claude Code: messages, tool calls such as
Bash pnpm test, the start of each result. Secrets are masked on the machine before a line leaves it.Budgets and the pool
A member gives a project a share of their Claude capacity. orch estimates the 5-hour window from local usage, keeps a safety margin and only offers work that fits.
Auto or approval
Per project, choose which models are allowed and whether tasks start on their own or wait for you. Nobody, not even an admin, can change that for you.
Keeping everyone informed
Notifications
Task done, task failed, PR ready for review, a task offered to you, access requests. In the app, and per event in Slack, Discord, any JSON webhook, e-mail or browser push.
Usage dashboard
Tokens per day, task runs, success rate, and how much of its share each project has used in the current window, over 7, 30 or 90 days.
History and templates
Search every task that has run, with its PR, runs and failure class. Start new ones from built-in, personal or shared templates with
{{placeholders}}.Claude Code over MCP
Claude Code can view the pool, split work into tasks with dependencies, dry-run them and submit. No extra LLM key: your own Claude does the planning, with OAuth 2.1 sign-in.
Yours to run
- One Docker Compose stack. Caddy with automatic HTTPS, the server and Postgres. Cloudflare Tunnel works too.
- Backups built in. Scheduled
pg_dumpwith rotation, optional age encryption and S3 upload, and a restore script. - Observability on request. Prometheus metrics, OpenTelemetry traces and a ready-made Grafana dashboard, all off by default.
- Sign-in you control. GitHub sign-in limited to admins, an allowlist of logins or organizations, invite links and an audited Access page.
Security
For teams who trust each other
orch is a shared to-do list with automation, not a multi-tenant platform. This is what it protects, and what it does not.
What orch does
Credentials stay local. The Claude token lives on the member's machine. The server only sees task statuses and usage estimates.
Outbound only. Agents connect to the server over a WebSocket. Member machines open no inbound port.
A sandbox per task. Non-root container, only its own clone mounted, no Docker socket, no host home. Git metadata stays outside.
Compose guard. A repository's own compose file is checked for
privileged, host mounts, the Docker socket, host networking andcap_add.Secret redaction. Live logs mask the member's Claude token, the run's GitHub tokens and known token patterns, on the machine and again on the server.
Draft PRs. Auto-mode PRs open as drafts, and orch only pushes
orch/issue-<n>-*branches.
What it does not do
No egress filtering. In auto mode the task container has network access and the member's token. A malicious issue could exfiltrate it.
Not for strangers. Anyone who can label an issue for the pool is, in effect, writing a prompt that runs on a teammate's machine.
A root-equivalent agent. It drives Docker on the member's host to start task containers. Rootless Docker reduces this.
Exact budgets. Anthropic does not publish exact subscription limits, so treat budgets as hints.
The compose guard is still being completed on the agent side; until then, treat a repository's compose file as trusted code. Read the security model
Install
One server, then one command per member
You need a Linux host with Docker 26+ and Compose, ports 80 and 443, and a DNS name. Then create the GitHub App described in the docs.
On the server, once
git clone https://github.com/selfhostr/orch.git && cd orch/deploy/server cp .env.example .env # fill it in, then create the GitHub App docker compose up -dOn each member's machine
The My Server page hands each member this command with a one-time token, valid 15 minutes.
curl -fsSL https://<domain>/install.sh | ORCH_TOKEN=<one-time-token> sh orch loginIn Claude Code, optional
Then run
/mcp, pick orch and choose Authenticate.claude mcp add --transport http --scope user orch https://<domain>/mcp
Questions
Is it safe to use with strangers?
No. Anyone who can get an issue labeled for the pool can make Claude run on a teammate's machine, with network access and their token. Use orch with people you trust, on repositories where outsiders cannot file labeled issues.
Why are no tasks offered to me?
Offers need an active auto participation, an online and unpaused agent, a fresh usage report, enough estimated budget and an allowed model. orch list shows what you can take now, orch status shows the pause state and orch doctor checks the Claude binary and token.
The agent says “Claude login expired”. What now?
Run orch login. The running agent picks up the new token without a restart.
Caddy cannot get a certificate. Why?
DNS must resolve to the host and ports 80 and 443 must be reachable. Custom HTTP or HTTPS ports break the Let's Encrypt challenge; use another proxy or the Cloudflare Tunnel mode.
An upgrade broke something. How do I roll back?
Pin ORCH_VERSION on the server or ORCH_AGENT_TAG on the agent to the previous release and run docker compose up -d. Restore from a backup if needed.
A small team, one queue, everyone's own account.
The quickstart, concepts, CLI and MCP reference and the FAQ are in the documentation.