A test fails on your GitHub Actions. Nightingale receives the webhook, loads the failing file, calls GPT-4o for a typed fix plan, runs the full test suite in an isolated sandbox, and opens a pull request. Under 10 seconds.
"Most CI failures are not interesting."
A wrong assertion. A class imported with the wrong casing. An off-by-one that only shows in tests. These take a senior engineer two minutes to fix and cost an hour of their day once you add the notification, context switch, branch, PR, and review wait. Nightingale handles the two-minute fixes so engineers only see the ones that actually need them.
The fix itself is almost never the slow part. Every routine CI failure pulls a senior engineer out of deep work, forces them to context-switch, open a branch, wait for review, and wait for CI to re-run.
That overhead compounds. Ten incidents a week at 77 minutes each is 770 minutes of senior engineering time spent on work a machine can do.
Five weighted factors determine whether Nightingale acts or escalates. The formula is transparent. Every factor is logged. There is no black box.
Below 85%, nothing is written. The fix plan and full incident report are generated anyway and sent to the engineer, so even escalations are useful.
Every incident, confidence score, root cause, and pipeline trace persists in SQLite and survives restarts. The dashboard polls every 3 seconds with DOM-diffed updates -- no page flash, no visual disruption.
Each component has a single job. Nothing is shared across concerns. The full pipeline runs in under 10 seconds for most failures -- context load, reasoning, sandbox verification, confidence scoring, and PR creation.
GPT-4o fix generation with a reflective loop. Up to 3 attempts. Failure output from each attempt feeds back into the next prompt.
Applies the fix in a sandbox, runs the full pytest suite, and returns a typed VerificationResult with pass ratio and output.
Five-factor weighted formula. Uses gpt-4o-mini for independent risk classification of changed files. Transparent, logged per-factor.
Copies the repository to a temporary directory. SHA-256 hashes the original before and verifies it after. Any mismatch rejects the result.
Creates a branch, commits the fix, and opens a PR via the GitHub REST API. Falls back to direct file write if no token is configured.
SQLite-backed store for incident history, live status updates, metrics, and config. Survives process restarts.
Coordinates the full pipeline. Registers incidents, drives the reflective loop, calls the scorer, and hands off to the resolution engine.
FastAPI server. Receives GitHub webhooks, serves the live dashboard, and exposes a REST API for incident history and metrics.
Nightingale runs locally against your own repository. Set an API key, run the demo to verify everything works, then start the server and point a webhook at it.
Clone the repository, install dependencies, and set your OpenAI API key.
Nine-point diagnostic confirms everything is wired up. The demo runs all three scenarios against the included test repo.
The server runs on port 8000. Open the dashboard at localhost:8000 to see the live incident feed.
Nightingale needs to run on a machine with network access and a local copy of your repository. A small VPS, an EC2 instance, or the CI server itself all work. The webhook does the rest.
Open source. Self-hosted. No merge without human review.