orch
MIT licenceDockerNode 22+

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.

1GitHub issuepool label2Dispatcherauto or approval3A teammate's machinethrowaway container4Pull requestdraft PR
The dispatcher picks the route: only a teammate who is online, unpaused and has budget left receives the task.
  • 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

  1. 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.

  2. orch offers it

    In auto mode the member with the most budget left gets it. In approval mode nothing starts until they accept. orch pause always wins.

  3. 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.

  4. 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_dump with 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_dump with 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 and cap_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.

  1. 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 -d
  2. On 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 login
  3. In 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.