Find a file
Bryan Helmkamp 12ea5341bb
feat(dev): generate options reference
Add a settings reference generator backed by OptionsMetadata on the sparse config layer structs. The generated user-configuration page is fenced and checked in CI alongside the CLI reference.
2026-04-24 16:49:16 -04:00
.ai/prompts Unify fabro run foreground to use create + start + attach (#141) 2026-03-22 22:48:09 -04:00
.cargo feat(dev): add fabro-dev scaffold 2026-04-24 15:43:30 -04:00
.claude docs: refresh changelog and setup docs 2026-04-24 13:00:15 -04:00
.config refactor(runs): blocked status canonicalization cleanup (#165) 2026-04-19 14:53:46 -04:00
.context/compound-engineering/todos docs 2026-04-23 08:35:43 -04:00
.fabro fix(ci): stabilize snapshot test and double CLI test timeout 2026-04-15 11:39:06 -04:00
.github feat(dev): generate options reference 2026-04-24 16:49:16 -04:00
apps fix(install): mount wizard at root route 2026-04-24 12:59:16 -04:00
bin feat(dev): port release automation 2026-04-24 16:00:25 -04:00
docker feat(install): add browser-based setup flow 2026-04-19 11:20:58 -04:00
docs feat(dev): generate options reference 2026-04-24 16:49:16 -04:00
docs-internal feat(dev): port docker build workflow 2026-04-24 15:55:03 -04:00
evals/swe-bench Persist fabro_run_dir in scoreboard instances.jsonl 2026-03-20 16:43:25 -04:00
files-internal test(http): improve HTTP test failure diagnostics 2026-04-20 08:06:14 -04:00
installer refactor(release): simplify pre-release channel to nightly only 2026-04-17 11:39:19 -04:00
lib feat(dev): generate options reference 2026-04-24 16:49:16 -04:00
test refactor(static): centralize env var names 2026-04-24 12:29:51 -04:00
.dockerignore feat(docker): publish multi-arch server image to GHCR 2026-04-17 19:39:10 -04:00
.env.example docs(docker): document FABRO_DOMAIN in .env.example 2026-04-18 00:34:19 -04:00
.gitattributes feat: embed fabro spa and align interruption semantics 2026-04-08 14:43:44 -04:00
.gitignore chore: update gitignore 2026-04-18 10:51:34 -04:00
AGENTS.md feat(dev): port SPA asset tooling 2026-04-24 16:05:29 -04:00
bun.lock fix(deps): bump astro from 5.9.3 to 6.1.6 2026-04-23 15:08:28 -04:00
Caddyfile feat(docker): reorganize compose, add Caddy reverse proxy for prod 2026-04-18 00:33:11 -04:00
Cargo.lock feat(dev): generate options reference 2026-04-24 16:49:16 -04:00
Cargo.toml feat(options): add options metadata derive 2026-04-24 16:13:32 -04:00
CLAUDE.md Move CLAUDE.md to AGENTS.md with symlink for compatibility 2026-03-09 13:02:06 -04:00
clippy.toml refactor(redact): extract redaction into dedicated crate 2026-04-24 15:02:23 -04:00
CONTRIBUTING.md Add issue-based contribution policy to README and CONTRIBUTING 2026-03-18 17:41:34 -04:00
docker-compose.prod.yaml feat(docker): reorganize compose, add Caddy reverse proxy for prod 2026-04-18 00:33:11 -04:00
docker-compose.yaml feat(install): add browser-based setup flow 2026-04-19 11:20:58 -04:00
Dockerfile feat(install): add browser-based setup flow 2026-04-19 11:20:58 -04:00
Dockerfile.deploy feat(railway): deploy from prebuilt GHCR image instead of source build 2026-04-18 15:24:22 -04:00
fly.toml feat(fly): add fly.toml and full deploy guide 2026-04-18 16:15:13 -04:00
install.md Move install files to apps/marketing/public, symlink from repo root 2026-03-16 13:23:58 -04:00
install.sh Move install files to apps/marketing/public, symlink from repo root 2026-03-16 13:23:58 -04:00
LICENSE.md Add README.md and MIT LICENSE 2026-03-10 14:48:58 -04:00
package.json chore: remove stale SQLite references after retirement 2026-04-05 21:29:24 -04:00
railway.toml feat(install): add browser-based setup flow 2026-04-19 11:20:58 -04:00
README.md docs: add Discord badge to README 2026-04-22 16:46:02 -04:00
render.yaml feat(render): add Render blueprint and deploy button 2026-04-18 16:04:35 -04:00
rustfmt.toml fmt 2026-04-11 11:27:46 -04:00

Fabro

The open source dark software factory for expert engineers

AI coding agents are powerful but unpredictable. You either babysit every step or review a 50-file diff you don't trust. Fabro gives you a middle path: define the process as a graph, let agents execute it, and intervene only where it matters. Why Fabro?

Rust License: MIT docs Discord

# With Claude Code
curl -fsSL https://fabro.sh/install.md | claude

# With Codex
codex "$(curl -fsSL https://fabro.sh/install.md)"

# With Homebrew
brew install fabro-sh/tap/fabro-nightly

# With Bash
curl -fsSL https://fabro.sh/install.sh | bash

Then run fabro server start to finish setup in your browser. The server opens a web wizard, exits when the wizard completes, and starts in configured mode the next time you run it.

Fabro Runs board showing workflows across Working, Pending, Verify, and Merge stages

Use Cases

  • Extend disengagement time — Stop babysitting an agent REPL. Define a workflow with verification gates and walk away — Fabro keeps the process on track without you.
  • Leverage ensemble intelligence — Seamlessly combine models from different vendors. Use one model to implement, another to cross-critique, and a third to summarize — all in a single workflow.
  • Share best practices across your team — Collaborate on version-controlled workflows that encode your software processes as code. Review, iterate, and reuse them like any other source file.
  • Reduce token bills — Route cheap tasks to fast, inexpensive models and reserve frontier models for the steps that need them. CSS-like stylesheets make this a one-line change.
  • Improve agent security — Run agents in cloud sandboxes with full network and filesystem isolation. Keep untrusted code off your laptop and out of your production environment.
  • Run agents 24/7 — Fabro's API server queues and executes runs continuously. Close your laptop — workflows keep running and results are waiting when you return.
  • Scale infinitely — Move execution off your laptop and into cloud sandboxes. Run as many concurrent workflows as your infrastructure allows.
  • Guarantee code quality — Layer deterministic verifications — test suites, linters, type checkers, LLM-as-judge — into your workflow graph. Failures trigger fix loops automatically.
  • Achieve compounding engineering — Automatic retrospectives after every run feed a continuous improvement loop. Your workflows get better over time, not just your code.
  • Specify in natural language — Define requirements as natural-language specs and let Fabro generate — and regenerate — implementations that conform to them.

Key Features

Feature Description
🔀 Deterministic workflow graphs Define pipelines in Graphviz DOT with branching, loops, parallelism, and human gates. Diffable, reviewable, version-controlled
🙋 Human-in-the-loop Approval gates pause for human decisions. Steer running agents mid-turn. Interview steps collect structured input
🎨 Multi-model routing CSS-like stylesheets route each node to the right model and provider, with automatic fallback chains
☁️ Cloud sandboxes Run agents in isolated Daytona cloud VMs with snapshot-based setup, network controls, and automatic cleanup
🔌 SSH access and preview links Shell into running sandboxes with fabro sandbox ssh and expose ports with fabro sandbox preview for live debugging
🌲 Git checkpointing Every stage commits code changes and execution metadata to Git branches. Resume, revert, or trace any change
📊 Automatic retros Each run generates a retrospective with cost, duration, files touched, and an LLM-written narrative
Comprehensive API REST API with SSE event streaming and a React web UI. Run workflows programmatically or as a service
🦀 Single binary, no runtime One compiled Rust executable with zero dependencies. No Python, no Node, no Docker required
⚖️ Open source (MIT) Full source code, no vendor lock-in. Self-host, fork, or extend to fit your workflow

Example Workflow

A plan-approve-implement workflow where a human reviews the plan before the agent writes code:

Plan-Implement workflow graph showing Start → Plan → Approve Plan → Implement → Simplify → Exit with a Revise loop
digraph PlanImplement {
    graph [
        goal="Plan, approve, implement, and simplify a change"
        model_stylesheet="
            *        { model: claude-haiku-4-5; reasoning_effort: low; }
            .coding  { model: claude-sonnet-4-5; reasoning_effort: high; }
        "
    ]

    start [shape=Mdiamond, label="Start"]
    exit  [shape=Msquare, label="Exit"]

    plan      [label="Plan", prompt="Analyze the goal and codebase. Write a step-by-step plan.", reasoning_effort="high"]
    approve   [shape=hexagon, label="Approve Plan"]
    implement [label="Implement", class="coding", prompt="Read plan.md and implement every step."]
    simplify  [label="Simplify", class="coding", prompt="Review the changes for clarity and correctness."]

    start -> plan -> approve
    approve -> implement [label="[A] Approve"]
    approve -> plan      [label="[R] Revise"]
    implement -> simplify -> exit
}

Agents run as multi-turn LLM sessions with tool access. Human gates (hexagon) pause for approval. The stylesheet routes planning to a cheap model and coding to a frontier model. See the Graphviz DOT language reference for the full syntax.


📖 Documentation

Fabro ships with comprehensive documentation covering every feature in depth:

  • Getting Started -- Installation, first workflow, and why Fabro exists
  • Defining Workflows -- Node types, transitions, variables, stylesheets, and human gates
  • Executing Workflows -- Run configuration, sandboxes, checkpoints, retros, and failure handling
  • Tutorials -- Step-by-step guides from hello world to parallel multi-model ensembles
  • API Reference -- Full OpenAPI spec with authentication, SSE events, and client SDKs

Quick Start

Install

# With Claude Code
curl -fsSL https://fabro.sh/install.md | claude

# With Codex
codex "$(curl -fsSL https://fabro.sh/install.md)"

# With Homebrew
brew install fabro-sh/tap/fabro-nightly

# With Bash
curl -fsSL https://fabro.sh/install.sh | bash

Release binaries and the multi-arch Docker image ship with SLSA Build Provenance attestations. See Verifying Releases to check an artifact was built by our GitHub Actions workflow.

Then finish setup in your browser and initialize Fabro in your project:

fabro server start     # opens a web install wizard in your browser
                       # (server exits when the wizard finishes — start it again to run Fabro)

cd my-project
fabro repo init        # per project

For headless or scripted environments, fabro install runs the same setup as a CLI-only wizard.


Self-host the Fabro server

Running Fabro as an HTTP server with the web UI lets a team share one instance. The repository ships a Dockerfile that serves the API (with the embedded web UI) on $PORT (default 32276) and persists state to /storage.

Deploy on Railway Deploy to Render

Click a button to provision a Fabro service from this repository. On Railway, attach a Volume at /storage so your runs and checkpoints survive redeploys; on Render, the render.yaml blueprint provisions a 1 GB disk at /storage automatically. The Railway and Render deploy guides walk through env vars, accessing the dev token, and pointing the CLI at your deployment.

Prefer to run Fabro elsewhere? See Running the Fabro Server for generic Docker guidance and the companion guides for Fly.io and DigitalOcean.


Contributing to Fabro

Fabro uses an issue-based contribution model. Instead of accepting outside pull requests, we accept bug reports and feature requests as GitHub Issues.

AI can rapidly write or edit large amounts of plausible-looking code. Accepting these patches from external sources opens up risks to security and quality. To mitigate these risks, we are tightly controlling the inputs into the software development process.

Contributions follow these steps:

  1. Open an issue -- File an issue with a bug report or feature request. The more detail your issue contains, the easier it will be for us to address it quickly and successfully.

  2. We build it -- A Fabro maintainer will follow our software development process to create a patch, supervising AI coding agents and workflows.

  3. You get credit -- We will include you as a co-author on the commit which lands the change.

As a result, you get the feature you need, without needing to keep a fork in sync.

If you need a capability which is not in-scope for Fabro, you always have the option to maintain a fork of Fabro as it is distributed under the MIT license.


Help or Feedback


License

Fabro is licensed under the MIT License.