QuadWork is a local-first, open-source automation framework that orchestrates a collaborative team of four autonomous AI agents — Head, Dev, and two Reviewers — to manage a complete, production-grade GitHub workflow. By enforcing strict safety rails such as mandatory two-person independent code reviews and branch protection, it allows solo founders and engineers to ship code 24/7 through a reliable "Issue → Branch → PR → Merge" loop while maintaining high code quality without manual oversight.
quadwork-demo.mp4
Issue → Branch → PR → Review × 2 → Merge
↑ │
└──────── next ticket ───────────────┘
Head creates issues and assigns them to Dev. Dev opens a PR. Reviewer 1 and Reviewer 2 each review independently — approve, request changes, or veto. Dev iterates until both approve. Head merges and picks the next ticket. The cycle repeats autonomously until the batch is complete.
- Autonomous Reliability: Runs overnight batches using a scheduled trigger, so you can wake up to a queue of successfully merged pull requests.
- Multi-Agent Governance: Unlike single-agent tools, QuadWork uses a system of checks and balances where agents must convince each other through code review before merging to
main. - Privacy & Control: Operates as a local Express server on your machine, managing your configured LLMs (Claude, OpenAI, Gemini) and GitHub CLI sessions without third-party proxying.
- Complete Visibility: Features a comprehensive 4-quadrant dashboard with real-time agent terminals, chat history, and progress tracking.
Manually reviewing every AI-generated PR is exhausting. Letting one AI agent
push straight to main is how you end up rolling back broken migrations at
2am. QuadWork solves this — you describe the work, kick off a batch, and come
back to merged PRs that were each reviewed twice before touching main.
- Solo founders / indie hackers who want to ship faster than they can review
- Open-source maintainers who get more PRs than they have hours to look at
- Engineers who want a team workflow without the overhead of hiring
- Tinkerers who've tried Claude Code / Codex and wished they had reviewers who pushed back
- Install Node.js 20+ if you don't have it
- On macOS, install Homebrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - Open your terminal and run:
npx quadwork init- The wizard installs everything else and opens your dashboard.
That's it. The wizard handles Python, GitHub CLI, AI tools, and
authentication — you just follow the prompts. Subsequent runs are one
command: npx quadwork start.
QuadWork runs a team of 4 AI agents on your local machine and enforces a GitHub-native workflow on them:
| Agent | Role | What it does |
|---|---|---|
| Head | Coordinator | Creates issues, assigns tasks, merges approved PRs |
| Dev | Builder | Writes code, opens PRs, addresses review feedback |
| Reviewer1 | Reviewer | Independent code review with veto authority |
| Reviewer2 | Reviewer | Independent code review with veto authority |
Every task follows the same cycle: Issue → Branch → PR → 2 Reviews → Merge. Branch protection ensures no agent can skip the process.
You: "@head start a batch for feature X"
│
▼
Head: creates issues + queue, asks you to kick off the batch
│
▼ (you click "Start Trigger" in the Operator panel)
Head: assigns the first issue to Dev
│
▼
Dev: opens a PR with code
│
▼
Reviewer1 + Reviewer2: independent reviews
│
▼ (both approve)
Head: merges, picks the next issue
│
└──── repeat overnight ────┐
│
▼
You wake up to merged PRs
- You drop a batch of 5 related tickets into chat:
@head start 5 sub-tickets under #123. - Head files the 5 issues on GitHub, writes them to
OVERNIGHT-QUEUE.md, and asks you to click Start Trigger. - You click it, close the laptop, and sleep.
- The Scheduled Trigger pulses the agents every 15 minutes. Each pulse, Head assigns the next queued issue to Dev.
- Dev opens a PR. Reviewer1 + Reviewer2 each review independently — approve, request changes, or veto. Dev iterates until both approve.
- Head merges and picks the next ticket. Loop until the queue is empty or the duration expires.
- You wake up to 5 merged PRs, a clean queue, and a chat transcript you can scroll.
- 📺 4-quadrant project view — chat, agent terminals (HEAD / DEV / RE1 / RE2), GitHub board, operator panel
- ⏰ Scheduled Trigger — recurring "queue check" pulses for autonomous overnight runs
- 📲 Telegram bridge — mirror the chat to your phone for remote monitoring
- 💬 Discord bridge — forward agent chat to a Discord channel for team visibility
- 💾 Project history export/import — JSON snapshots of the full chat transcript
- 🧯 Loop Guard control — raise the hop limit and auto-resume stuck chains without restarting AC
- 🔔 Notification sounds — Web Audio chime on new agent messages with a background-only mode
- 🎞️ Current Batch Progress panel — per-issue progress bars computed from live GitHub state
- 🗂️ Recently closed / merged feed — so finished work doesn't disappear from the GitHub panel
- 💤 Keep Mac Awake —
caffeinatewrapper so your laptop survives the night
- 🧭 Multi-project support — each project has its own AgentChattr instance + isolated worktrees
- 📝 Per-project
OVERNIGHT-QUEUE.mdwith auto-incrementing batch numbers - 💬 Slash commands —
/continue,/clear,/summary,/poetry,/roastreview - 🏷️ Chat polish — threaded replies, colored
@mentions, short reviewer labels (RE1/RE2) - 🧰 Operator identity — set your chat display name in Settings
- 🚧 GitHub branch protection enforced on
main - ✅ 2-of-2 reviewer approval required before merge
- 🛑 Sender lockdown — chat POSTs can't impersonate an agent (
head,dev, …) from the UI - 🗄️ Auto-snapshot of chat history to
~/.quadwork/{project}/history-snapshots/before every AgentChattr restart, with an in-dashboard Restore button and an optional auto-restore-on-restart opt-in
QuadWork stands on top of some great open-source work. Explicit thanks:
- AgentChattr — by @bcurts. The local chat server + MCP tooling that lets QuadWork's agents talk to each other. QuadWork would not exist without it — huge thanks to bcurts for building such a clean foundation.
- GitHub CLI (
gh) — used by all four agents for issues, PRs, reviews, and merges. - Claude Code — Anthropic's CLI. Recommended for the Dev / Reviewer2 roles.
- Codex CLI — OpenAI's CLI. Recommended for the Head / Reviewer1 roles.
- Next.js + Express — dashboard frontend + backend.
- node-pty — embeds the agent terminals.
- xterm.js — in-browser terminal rendering.
Global config lives at ~/.quadwork/config.json. Per-project AgentChattr
config lives at ~/.quadwork/{project_id}/agentchattr/config.toml. The per-
project queue lives at ~/.quadwork/{project_id}/OVERNIGHT-QUEUE.md.
{
"port": 8400,
"operator_name": "user",
"projects": [
{
"id": "my-project",
"name": "My Project",
"repo": "owner/repo",
"working_dir": "/path/to/project",
"agentchattr_url": "http://127.0.0.1:8300",
"mcp_http_port": 8200,
"mcp_sse_port": 8201,
"auto_continue_loop_guard": false,
"auto_continue_delay_sec": 30,
"auto_restore_after_restart": false,
"agents": {
"head": { "cwd": "/path/to/project-head", "command": "codex" },
"dev": { "cwd": "/path/to/project-dev", "command": "claude" },
"re1": { "cwd": "/path/to/project-re1", "command": "codex" },
"re2": { "cwd": "/path/to/project-re2", "command": "claude" }
}
}
]
}Each project gets its own AgentChattr instance, ports, and git worktrees.
QuadWork runs as a single Express server on 127.0.0.1:8400:
- Static frontend — pre-built Next.js export (the
out/directory) - REST API — agent lifecycle, config, GitHub proxy, chat proxy, triggers, loop guard, batch progress, project history
- WebSocket — xterm.js terminal PTY sessions + AgentChattr ws fan-out
Per-project AgentChattr clones live at ~/.quadwork/{project}/agentchattr/,
each with their own ports. Per-project git worktrees sit next to the repo:
{repo}-head, {repo}-dev, {repo}-re1, {repo}-re2. The
dashboard's xterm.js tiles attach to node-pty sessions over a WebSocket;
nothing about the agent state is held client-side.
| Command | Description |
|---|---|
npx quadwork init |
One-time setup — installs prerequisites, opens the dashboard |
npx quadwork start |
Start the dashboard server |
npx quadwork stop |
Stop all processes |
npx quadwork cleanup --project <id> |
Remove a project's AgentChattr clone and config entry |
npx quadwork cleanup --legacy |
Remove the legacy ~/.quadwork/agentchattr/ install after migration |
After init, create projects from the web UI at http://127.0.0.1:8400/setup.
Each project gets its own AgentChattr clone at
~/.quadwork/{project_id}/agentchattr/ (~77 MB per project):
| Projects | Disk |
|---|---|
| 1 | ~77 MB |
| 5 | ~385 MB |
| 10 | ~770 MB |
Per-project clones are necessary so multiple projects can run AgentChattr
simultaneously without port conflicts. Existing v1 users are auto-migrated
to per-project clones on the next npx quadwork start; once every project
has a working clone, the legacy shared install can be removed safely via
npx quadwork cleanup --legacy (which refuses to run if any project is
still on the legacy install).
Visit quadwork.xyz for an overview, demo, and getting started guide.
Want to talk with the creator? Join Hunt Town and find @project7.
MIT