ccp
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Fail
- spawnSync — Synchronous process spawning in src/bin/add-repo.ts
- process.env — Environment variable access in src/bin/add-repo.ts
- fs module — File system access in src/bin/add-repo.ts
- spawnSync — Synchronous process spawning in src/bin/install-launchd.ts
- process.env — Environment variable access in src/bin/install-launchd.ts
- fs module — File system access in src/bin/install-launchd.ts
- spawnSync — Synchronous process spawning in src/bin/intake-dispatch.ts
- fs module — File system access in src/bin/intake-dispatch.ts
- fs module — File system access in src/bin/intake-job.ts
- fs module — File system access in src/bin/intake-linear.ts
Permissions Pass
- Permissions — No dangerous permissions requested
This tool is an open-source orchestration pipeline that automates the entire software delivery lifecycle. It converts tickets into code, creates pull requests, monitors CI pipelines, and can even auto-merge and fix errors using AI coding agents.
Security Assessment
The overall security risk is Medium. The tool exhibits several highly privileged behaviors typical of an automation orchestrator, including widespread synchronous shell command execution (`spawnSync`) and direct file system access. It also reads environment variables, which means it likely interacts with sensitive API keys for services like GitHub, Linear, Sentry, and Discord. While this deep integration is necessary for its core functionality, it handles the complete control plane of your repositories. You must be extremely careful to configure its environment variables securely and ensure it only receives trusted webhook payloads, as malicious inputs could potentially trigger unintended system commands.
Quality Assessment
The repository is actively maintained, with its most recent push occurring today. It uses the permissive MIT license and includes a highly detailed, well-structured README that clearly outlines its complex architecture. However, it suffers from extremely low community visibility, having only 5 GitHub stars. This lack of widespread adoption means the codebase has not undergone extensive peer review or real-world battle-testing by the broader developer community.
Verdict
Use with caution — the active maintenance is promising, but the highly privileged system access and lack of broader community validation require you to thoroughly audit the codebase before trusting it with your production environment.
☭ Coding Control Plane — Seize the means of code production. Autonomous ticket → code → PR → review → auto-merge → error → fix loop.
☭ CCP — Coding Control Plane
Seize the means of code production.
CCP is an open-source control plane that turns coding agents (Claude Code, Codex, etc.) into a continuous delivery pipeline. It handles the orchestration that nobody else does: ticket intake → job dispatch → coding → PR creation → review → auto-merge → error detection → remediation.
Linear Ticket → CCP → Coding Agent → PR → CI → Auto-Merge → Deploy
↑ |
└──── Sentry Error / Vercel Failure / CI Failure ────────┘

What It Does
- Job Pipeline — Queue, dispatch, and monitor coding jobs with full lifecycle tracking
- Linear Integration — Auto-dispatch from Linear tickets, sync state back, create tickets from errors
- PR Review & Auto-Merge — Per-repo auto-merge config, CI check monitoring, disposition analysis
- Remediation Loop — CI failures auto-spawn fix jobs; errors → tickets → fixes → deploy
- Webhook Intake — Sentry errors, Vercel deploy failures, GitHub CI failures all create tickets
- Discord Notifications — Compact one-liners for runs, threads for non-clean outcomes
- Dashboard — Dark-themed web UI to monitor jobs, configure repos, track PR reviews
- Nightly Runs — Scheduled coding runs for maintenance, tech debt, compound tasks
Architecture
┌──────────────────────────────────────────────────────────┐
│ Intake Layer │
│ Sentry webhook ──┐ │
│ Vercel webhook ──┼── intake-server.ts ── normalize ──┐ │
│ GitHub webhook ──┘ │ │
│ Linear webhook ──── linear-dispatch.ts ──────────────┤ │
│ Discord message ── intake-text.ts ───────────────────┤ │
│ ▼ │
│ Job System (jobs.ts) │
│ ┌────────────────┐ │
│ │ queued │ │
│ │ → preflight │ │
│ │ → running │ ◄── tmux + claude │
│ │ → coded │ │
│ │ → verified │ │
│ └────────────────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ ▼ ▼ ▼ │
│ PR Review Linear Sync Notifications │
│ (pr-review) (linear.ts) (Discord) │
│ │ │
│ ▼ │
│ PR Watcher ── auto-merge / remediation │
│ (every 15s) │
└──────────────────────────────────────────────────────────┘
Quick Start
Prerequisites
- Node.js 20+
- Claude Code (
npm i -g @anthropic-ai/claude-code) or another coding agent - GitHub CLI (
gh) authenticated - Linear account with API key
Install
git clone https://github.com/kyan12/ccp.git
cd ccp
npm install
# Configure
cp .env.example .env
cp configs/repos.json.example configs/repos.json
cp configs/linear.json.example configs/linear.json
# Edit .env with your API keys
# Edit configs/repos.json with your repositories
# Edit configs/linear.json with your Linear team/project IDs
Run
# Start the supervisor (monitors and runs jobs)
node src/bin/supervisor.ts --interval=15000 --max-concurrent=1
# Start the intake server (receives webhooks, serves dashboard)
node src/bin/intake-server.ts
# Dashboard at http://localhost:4318/dashboard
Create a Job Manually
node src/bin/intake-text.ts \
--title "Fix login page timeout" \
--repo my-app \
--dispatch
Run on macOS with launchd
# Generate and install launchd plists
node src/bin/install-launchd.ts
Configuration
configs/repos.json — Repository mappings
{
"mappings": [
{
"key": "my-app",
"ownerRepo": "myorg/my-app",
"localPath": "/home/user/repos/my-app",
"aliases": ["app", "frontend"],
"autoMerge": true,
"mergeMethod": "squash"
}
]
}
configs/linear.json — Linear integration
{
"apiKeyEnv": "LINEAR_API_KEY",
"teamId": "your-team-uuid",
"teamKey": "ENG",
"projectIds": {
"product": "uuid-for-product-project",
"reliability": "uuid-for-reliability-project"
}
}
Per-Repo Auto-Merge
Set "autoMerge": true in your repo config. CCP will:
- Wait for all CI checks to pass
- Attempt GitHub approval (skips if self-authored)
- Squash merge (or rebase/merge per
mergeMethod)
Webhook Setup
| Source | Endpoint | Events |
|---|---|---|
| Sentry | /ingest/sentry |
Internal integration with issue events |
| Vercel | /ingest/vercel |
deployment.error, deployment.canceled |
| GitHub | /webhook/github |
check_run, pull_request |
| Linear | /webhook/linear |
Issue create/update |
Expose your intake server via Tailscale Funnel, ngrok, or a public URL.
Dashboard
Access at http://localhost:4318/dashboard when the intake server is running.

![]() |
![]() |
![]() |
Job Lifecycle
queued → preflight → running → coded → verified → done
│
├── blocked (missing deps, can't resolve repo)
├── failed (agent error, timeout)
└── coded → PR created
│
├── checks pass + autoMerge → merged ✅
├── checks fail → remediation job spawned 🔄
└── needs review → thread created 💬
The Error→Fix Loop
CCP's killer feature is the closed remediation loop:
- Runtime error → Sentry captures → webhook → Linear ticket created
- Ticket dispatched → coding agent fixes the bug → PR created
- CI passes → auto-merge → deploy
- CI fails → GitHub webhook → remediation job spawned with failure logs
- Deploy fails → Vercel webhook → incident ticket created
- Repeat until green ✅
CLI Tools
| Command | Description |
|---|---|
node src/bin/supervisor.ts |
Main supervisor loop |
node src/bin/intake-server.ts |
HTTP server for webhooks + dashboard |
node src/bin/intake-text.ts |
Create jobs from text descriptions |
node src/bin/jobs.ts list |
List all jobs and their states |
node src/bin/jobs.ts inspect <id> |
Inspect a specific job |
node src/bin/pr-watcher.ts --once |
Run one PR review cycle |
node src/bin/linear-dispatch.ts |
Dispatch pending Linear tickets |
node src/bin/linear-sync.ts <id> |
Sync a job's state to Linear |
Environment Variables
| Variable | Required | Description |
|---|---|---|
LINEAR_API_KEY |
Yes | Linear API key |
CCP_DISCORD_RUNS_CHANNEL |
No | Discord channel for job notifications |
CCP_DISCORD_ERRORS_CHANNEL |
No | Discord channel for errors |
CCP_DISCORD_REVIEW_CHANNEL |
No | Discord channel for PR reviews |
CCP_PR_AUTOMERGE |
No | Global auto-merge default (false) |
CCP_PR_MERGE_METHOD |
No | Default merge method (squash) |
CCP_INTAKE_PORT |
No | Intake server port (4318) |
CCP_MAX_CONCURRENT |
No | Max concurrent jobs (1) |
VERCEL_TOKEN |
No | Vercel API token |
SENTRY_AUTH_TOKEN |
No | Sentry auth token |
How It Compares
| CCP | Devin | Raw Claude Code | GitHub Actions | |
|---|---|---|---|---|
| Ticket → Code → PR | ✅ | ✅ | Manual | ❌ |
| Auto-merge on green | ✅ | ❌ | ❌ | ✅ (limited) |
| Error → Fix loop | ✅ | ❌ | ❌ | ❌ |
| CI failure remediation | ✅ | ❌ | ❌ | ❌ |
| Per-repo config | ✅ | ❌ | ❌ | ✅ |
| Dashboard | ✅ | ✅ | ❌ | ✅ |
| Self-hosted | ✅ | ❌ | ✅ | ❌ |
| Cost | Your API keys | $500/mo | Your API keys | Free tier |
License
MIT — Seize it. Fork it. Ship it.
Credits
Built by Kevin Yan and Crab 🦀 — an AI coding orchestrator running on OpenClaw.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found


