Manage AI coding agents like human engineers — plan, implement, review, and ship every change as a real pull request.
Website · Documentation · Live demo · Discord · Built with ProPR
ProPR is a self-hosted platform that runs AI coding agents through the GitHub pull-request workflow. It monitors issues and PRs, runs your choice of agents in isolated containers on your own server, and drives the complete path from a labeled issue to a reviewed pull request — with a Web UI for configuration and monitoring and a CLI that doubles as the local control plane. You bring your existing AI subscriptions or API keys; ProPR never marks up tokens.
A real PR, planned, implemented, and reviewed by ProPR — every run posts its full record to the pull request.
ProPR builds itself: since May 2025, 2,100+ merged pull requests across its author's products have shipped through it — including 690+ merged pull requests in this repository.
ProPR is a set of stages you can adopt independently — use one or all:
- Plan — turn an issue or idea into a reviewable implementation plan (Planner Studio)
- Implement — label an issue and let an agent open a PR for it
- Review & fix — drive existing PRs with slash commands (
/review,/fix,/ultrafix, model routing) - Operate — monitor tasks, costs, logs, and agent capacity from the Web UI
- Multi-agent: Claude Code, OpenAI Codex, Google Antigravity, OpenCode, and Mistral Vibe — all first-class, selectable per issue
- Label-based model routing: pick the agent/model per issue with
llm-<agent>-<model>labels; multiple labels fan out into parallel jobs - Web UI dashboard: configure repositories, branches, labels, agents, and defaults; watch tasks, logs, commits, and cost in real time
- CLI control plane: scaffold, verify, start, and stop the local Docker stack — and drive plans, issues, tasks, and repos against the backend
- GitHub PR automation: slash commands, automatic state labels, and PR follow-ups
- Deterministic git workflow: isolated worktrees, model-specific branches, and a strict setup → implement → finalize pipeline
- Production-ready: Docker-isolated agent execution, Redis-backed job state with correlation IDs, retries with backoff, and Agent Tank capacity/rate-limit tracking
You need a Docker-capable Linux host, Node.js 22+, and a provider account for at least one coding agent. Reuse a host login (claude auth login, agy login, …), create one through the agent image with propr agent login <agent>, or add the agent in the Web UI and log in directly to an isolated ProPR-managed credential directory.
npm install -g propr-cli
propr setup # guided one-pass: verify host, authorize agents, connect GitHub, startpropr setup is re-runnable and wraps the individual steps (propr init stack, propr check, propr start), which remain available for scripting.
Then open the Web UI at http://localhost:5173 and add a repository and an agent (propr repo add, propr agent add, or via the UI).
See the Local Setup tutorial for the full walkthrough, Server Setup for shared/production hosts, and Secure VPS Deployment for a hardened install.
No Node.js on the host? The stack can also be launched from the prebuilt
propr/launcherimage with a singledocker run. See Setup.
| Agent | Type | Provider | Execution image |
|---|---|---|---|
| Claude Code | claude |
Anthropic | propr/agent |
| Codex | codex |
OpenAI | propr/agent |
| Antigravity | antigravity |
Google (multi-model) | propr/agent |
| OpenCode | opencode |
OpenCode (multi-provider) | propr/agent |
| Mistral Vibe | vibe |
Mistral | propr/agent |
You supply your own provider credentials. The full model catalog, per-agent credential setup, and label formats live in Agents & Models.
Add an llm-<agent>-<model> label to an issue to choose who processes it:
llm-claude-opus5— Claude Opus 5llm-codex-gpt54— Codex GPT-5.4llm-opencode-deepseek-v4-flash-free— OpenCode DeepSeek V4 Flash Freellm-antigravity-pro-high— Antigravity Gemini 3.1 Pro Highllm-antigravity-opus46-thinking— Antigravity Claude Opus 4.6 Thinking
Multiple model labels on one issue create one independent job (and branch) per model. Add a base-<branch> label to target a non-default branch.
Each labeled issue runs through a deterministic three-phase pipeline:
- Pre-agent setup — clone/update the repo, create an isolated worktree on a model-specific branch, and push it to GitHub.
- AI implementation — run the selected agent in a sandboxed container with implementation-only prompts and full issue + comment context.
- Post-agent finalization — commit changes, push, and open a pull request linked to the issue (
Closes #123), then manage state labels.
Branches follow <issueId>/<model>-<sanitized-title>-<YYYYMMDD-HHMM>-<random>, e.g. 349/claude-opus5-feat-implement-onboarding-20260529-1506-3he.
State labels are derived from the trigger label, so an issue labeled AI moves through AI-processing → AI-waiting → AI-done / AI-failed-*, while a propr-labeled issue uses the propr-* set. Configure trigger labels in the UI or via PRIMARY_PROCESSING_LABELS.
The docs site also ships inside the stack — run propr docs to open the bundled copy.
Bootstrap credentials and infrastructure paths are set once via a .env file (GitHub App ID/key, OAuth, session secret, storage paths). Everything operational — repositories, branches, labels, agents, supported models, defaults — is managed in the Web UI or via the CLI.
Start from .env.example and see GitHub authentication and Deployment for the full reference.
ProPR ships as a set of prebuilt images orchestrated by the propr/launcher umbrella image (mirrored to ghcr.io/proprdev/*):
| Image | Contents |
|---|---|
propr/launcher |
Orchestrator that spawns the stack |
propr/app |
Server — daemon / workers / API (role selected at launch) |
propr/ui |
Web UI static bundle |
propr/docs |
Docusaurus documentation site (optional) |
propr/agent |
Unified execution container for every supported coding agent |
End users must supply their own provider API credentials and accept those providers' terms. Bundled third-party attributions are preserved at /usr/share/licenses/propr/ in each image; offline copies are in NOTICE and THIRD_PARTY_LICENSES.md.
A source checkout is only needed to modify ProPR itself (requires Node.js, Redis, Git, and Docker).
npm ci # install workspace dependencies
npm run compose:up # build and run the full stack from source
npm test # run the test suiteCommon workspace scripts:
npm run daemon:dev # issue-detection daemon (debug logging)
npm run worker:dev # job worker (debug logging)
npm run dashboard:dev # dashboard API
npm run images:build # build all Docker images locally
npm run images:smoke # smoke-test locally built imagesSee the source setup tutorial for the development flow and the architecture docs for how the pieces fit together.
propr/
├── src/ # Daemon, workers, jobs, polling, GitHub handling
├── packages/
│ ├── core/ # Git/worktree management, agents, queue, config, DB migrations
│ ├── api/ # Dashboard REST API, webhooks, authentication
│ ├── cli/ # The `propr` command (published to npm as propr-cli)
│ └── shared/ # Shared model catalog and types
├── propr-ui/ # Web UI (React + Vite)
├── docs/ # Docusaurus documentation site
├── docker/ # Launcher and production app images
├── scripts/ # Agent entrypoints, build/compose/release helpers
└── docker-compose*.yml
Docker image releases run via the Docker Images GitHub Actions workflow.
Bump the version, merge the release commit, then tag that merged commit (the
workflow verifies the tag matches package.json):
git tag vX.Y.Z # must match the version in package.json
git push origin vX.Y.ZThe propr-cli npm package is published separately from the same merged commit:
npm run cli:pack # build and npm-pack dry-run
npm view propr-cli@X.Y.Z version # should 404 before publishing
PROPR_NPM_OTP=123456 npm run cli:publish # omit PROPR_NPM_OTP if npm does not ask
npm view propr-cli@X.Y.Z version # should print X.Y.Z after publishingnpm run cli:publish builds and publishes the standalone, unscoped
propr-cli package. It also regenerates the staged launcher manifest from the
current commit, so the CLI release is not dependent on a dirty local manifest
from an image build.
Hosted UI tunnel releases must ship both artifacts from the same merged commit:
- Publish the Docker images so the launcher manifest includes the
cloudflaredsidecar and tunnel-aware API/UI environment handling. The Docker image license label is derived frompackage.json. - Publish
propr-cliso Connect's generatedpropr tunnel setup --token ... --url ... --startcommand is available to users. - Smoke-test with a fresh stack: install
propr-cli@X.Y.Z, run the Connect setup command, verify the stack recreates withAPI_PUBLIC_URL/FRONTEND_URLapplied, then runpropr tunnel verify.
ProPR is free and open source under the Apache License 2.0. The optional hosted relay, ProPR Connect, is a separate service — free for up to 3 users — and you can skip it entirely by bringing your own GitHub App.
Contributions are welcome. Please follow existing code patterns, keep tests passing, update docs alongside code, and use the structured logger for output. See CHANGELOG.md for release history.




