open source, self-hosted — star openfactory on GitHub →

openfactory

Signals in. Pull requests out.

Tickets, alerts, and feature requests flow into a declared, versioned production line of AI agents. Write a blueprint — one markdown file — and the factory triages, fixes, adversarially verifies, and ships. You approve what merges.

1
file per factory line
×N
agents, quorum-verified
4
intake channels
2
sdks — ts · python
---
blueprint: support-triage
on:
  - event: CustomerTicket
    filter: severity <= p1
agents:
  Triager:  { model: claude-haiku-4-5 }
  Engineer: { model: claude-sonnet-5, env: node-20 }
outputs: { pr_url: url }
---

## triage @Triager
Classify {{ event.link }} by severity and area.

## fix @Engineer [needs: triage] [retry: 2]
Fix the bug. Open a PR when tests pass.

## verify @Engineer ×3 [needs: fix] [vote: 2/3]
Adversarially verify. Try to refute the fix.

## ship? [needs: verify]
Human gate: approve for merge.
line running · outputs: pr_url

Works with

Claude CodeDevinE2BDaytonaSlackTelegramEmailGitHubLinear
LINE 01 · ISSUES → PRSLIVE
VERIFY
issue intakestamp: verifiedpull request
SIGNAL
ticket · alert · issue
BLUEPRINT
declared pipeline
AGENTS
sandboxed workers
VERIFY
quorum + gates
PR
shipped output

One file per factory line

A blueprint is markdown with YAML frontmatter: the frontmatter declares the world — triggers, typed events, agents, outputs — and every ## heading is a step in the line, its body the agent's instructions.

  • [needs: …] wires the DAG
  • ×3 [vote: 2/3] fans out and takes a quorum
  • [if: …] [retry: 2] guards and retries
  • ## ship? pauses for a human
---
blueprint: support-triage
on:
  - event: CustomerTicket
    filter: severity <= p1
agents:
  Triager:  { model: claude-haiku-4-5 }
  Engineer: { model: claude-sonnet-5, env: node-20 }
outputs: { pr_url: url }
---

## triage @Triager
Classify {{ event.link }} by severity and area.

## fix @Engineer [needs: triage] [retry: 2]
Fix the bug. Open a PR when tests pass.

## verify @Engineer ×3 [needs: fix] [vote: 2/3]
Adversarially verify. Try to refute the fix.

## ship? [needs: verify]
Human gate: approve for merge.

Blueprints

Declare the whole factory in one markdown file — triggers, agents, steps, gates. Version it, review it, diff it. Your infrastructure-as-code habit, pointed at your backlog.

Agent lines

Steps fan out to coding agents in sandboxed environments. Retries, conditions, ×N fan-out with quorum voting — adversarial verification is one attribute, not a meeting.

Human gates

A trailing ? on a step pauses the line for sign-off. Everything before it is automated; everything after it waits for you. You stay the factory boss.

Every channel

Slack threads, Telegram messages, forwarded email, or a raw HTTP POST — every channel normalizes into the same issue inbox the factory works from.

Live previews

Every PR gets a full-stack preview environment in an E2B or Daytona sandbox — web, API, and worker booted from the branch, behind your own proxy domain.

Encrypted intake

Reporter names, external ids, and arbitrary metadata are KMS-encrypted at rest. The factory floor is open; the paperwork is locked.

Send anything into the factory

Zero-dependency SDKs for TypeScript and Python post issue-shaped events to the API channel — with idempotency keys, retries, and typed events matching your blueprints. Or skip the SDK and POST JSON with a bearer token.

npm install @openfactory/sdk
pip install openfactory-sdk

Your backlog is a bill of materials

Stop hand-crafting every fix. Declare the line once and let the factory run around the clock.

Start your factory