Skip to content

Self-Hosting

The healing stack is four long-running pieces. All of them ship in the autowright-v3 repo.

The stack

ComponentPortWhat it does
service4400Coordination API — script registry, error intake, dedup, fix queue (SQLite state)
fixerPolls for jobs, runs the Claude agent, opens PRs, notifies Slack
minio9000 (API), 9001 (console)S3-compatible artifact storage for evidence bundles
dashboard4300Next.js UI — run/fix stats, per-fix cost and detail pages

Docker Compose

Terminal window
git clone https://github.com/nawaaz-korvol/autowright-v3
cd autowright-v3
cp .env.example .env # add ANTHROPIC_API_KEY, GITHUB_TOKEN, SLACK_WEBHOOK_URL
docker compose up service fixer minio minio-init

minio-init is a one-shot container that creates the artifact bucket. The service persists its SQLite database to a volume, so fix history survives restarts.

Run the dashboard alongside:

Terminal window
npm install
npm run dev -w @autowright/dashboard # http://localhost:4300

Tilt (local development)

For live-reload development of the stack itself:

Terminal window
tilt up # Tilt UI at http://localhost:10350

Tilt groups resources by label: infra (minio, minio-init), backend (service, fixer), and demo (target-site).

Try it end-to-end with the demo

The repo includes a demo target site with a built-in failure switch:

Terminal window
docker compose up target-site # demo site on :3000
npm run scraper -w @autowright/demo # scrape it — succeeds
CHAOS=true docker compose up target-site
npm run scraper -w @autowright/demo # selector breaks → fix pipeline runs

With CHAOS=true the site renames #login-btn to #signin-button, giving you a deterministic SELECTOR_NOT_FOUND and, a minute or two later, a real pull request that fixes the scraper.

Production notes

  • Storage: point STORAGE_ENDPOINT at real S3 (or any compatible store) instead of MinIO; the browser package uploads bundles directly, so storage must be reachable from wherever scripts run.
  • Ports: only the service (4400) needs to be reachable from your scripts. The fixer makes outbound calls only (service, storage, GitHub, Anthropic, Slack).
  • Scaling fixes: raise MAX_CONCURRENT_FIXES on the fixer when a busy fleet of scripts shares one stack.