AI reviews your pull requests. You keep the pen.
Reviewify is a self-hosted PR-review dashboard. Bring your own model key, get a full AI review in one click, then curate every comment — accept, edit, reject, or redo — before a single word reaches the PR. Run it solo or invite a team; the operator decides.
- 🔑 Bring your own model — one OpenRouter key unlocks Claude, Kimi, Minimax, GPT and dozens more, on your quota.
- ✋ Curate before posting — the AI proposes, a human approves. Nothing is posted to GitHub until you say so.
- 🏠 Open & self-hostable — your diffs and keys never leave your infrastructure.
- 📐 Standards as config — ADRs, house rules, and coding standards are first-class inputs the model actually applies.
Status: early MVP. The manual review loop (sign in → inbox → review → curate → post) is scaffolded end to end. See the roadmap.
How it works
Propose → Curate → Post
│ │ │
AI review accept / only approved
on the edit / comments go
diff reject to GitHub
Stack
Next.js (App Router) · PostgreSQL + Prisma · a polling worker for async reviews.
Everything comes up with one docker compose up.
Quick start (self-host)
1. Register a GitHub App at https://github.com/settings/apps/new for your
org or account:
- Permissions: Pull requests (read & write), Contents (read), Metadata (read)
- Subscribe to the Pull request webhook event
- Callback URL:
${APP_URL}/api/auth/callback - Setup URL:
${APP_URL}/api/github/setup(enable "Redirect on update") - Webhook URL:
${APP_URL}/api/webhooks/github
2. Configure secrets:
cp .env.example .env
# generate the two secrets
openssl rand -base64 32 # -> ENCRYPTION_KEY
openssl rand -base64 32 # -> SESSION_SECRET
# then paste your GitHub App's id, client id/secret, webhook secret & private key3. Bring it up:
docker compose up --buildOpen http://localhost:3000, sign in with GitHub, install the App on your
repos, and add your OpenRouter key in Settings.
Deploy to Railway
Reviewify ships with a railway.json that builds from the
Dockerfile and runs migrations on boot.
- Create a project and add a Postgres database (Railway → New → Postgres).
- Deploy this repo as a service; set variables:
DATABASE_URL→ reference the Postgres plugin (${{Postgres.DATABASE_URL}})ENCRYPTION_KEY,SESSION_SECRET→openssl rand -base64 32eachAPP_URL→ your service's public URL (e.g.https://reviewify.up.railway.app)GITHUB_*→ from your GitHub App (paste the PEM intoGITHUB_APP_PRIVATE_KEY)
- Add a second service from the same repo for the worker. Both services share
one image; the start command dispatches on
SERVICE_ROLE, so just setSERVICE_ROLE=workeron the worker service (plus the sameDATABASE_URL,ENCRYPTION_KEY, andGITHUB_*variables). Leave it unset on the web service.
Point your GitHub App's callback, setup, and webhook URLs at APP_URL.
Local development
npm install
# start Postgres however you like, then point DATABASE_URL at it
npm run db:migrate # create the schema
npm run dev # web app on :3000
npm run worker:dev # background review worker (separate terminal)Run the checks CI runs:
npm run lint
npm run build
npm test # Vitest unit tests (diff parser, crypto)Project layout
prisma/schema.prisma the 8-table data model
src/lib/env.ts validated config
src/lib/crypto.ts AES-256-GCM for stored model keys
src/lib/providers/ OpenRouter client + the JSON findings contract
src/lib/vcs/ platform-agnostic VCS seam + GitHub impl
src/lib/review/ prompt builder + run orchestration
src/app/api/ auth, webhooks, review/finding actions
src/app/{inbox,pr,settings} the review UI
worker/ polls for pending runs and executes them
Roadmap
- Phase 1 — the self-hosted loop (MVP, in progress): GitHub sign-in, assigned-PR inbox, one-click review, inline curation, team rules, post to GitHub.
- Phase 2 — depth & breadth: repo-level context beyond the diff, native Anthropic prompt caching, per-team model policy, outbound notifications.
- Phase 3 — autopilot (gated): optional auto-review + auto-post on assignment; GitLab support.
Contributing
Issues and PRs welcome — see CONTRIBUTING.md.