Destesi Review

AI code review
on every
pull request.

A reviewer that reads the diff, posts inline findings, and approves clean PRs. Config lives on your default branch — a malicious PR can’t loosen its own rules. Approves clean. Never requests changes.

Native to the tools your team already uses

GitHub App
Checks API
Inline review comments
PR summary
Slack notifications
How it works

Three steps from zero to first review

Install once. Commit a tiny config to your default branch. Open a PR.

01

Install the GitHub App

One-click install on the repos you want reviewed. Permissions scoped to Pull Requests, Checks, Issues, Contents and Metadata.

github.com/apps/destesi
02

Opt in on the default branch

Drop a .destesi.yml with review.enabled: true. Lives on the default branch — a PR can’t loosen its own rules.

review.enabled: true
03

Open a PR

Destesi posts a summary, batched inline findings, and a Checks API entry. Clean diff → auto-approves. Findings → comment-only.

queued → reviewing → done
// inline thread on the PR
@destesi:
Possible nil deref on cfg.Output when…
@you:
@destesi ignore — covered upstream
@destesi:
noted · rule muted for path on this PR ✓
override stored server-side · no bot commits in your history
Chat commands

Talk back to the reviewer.

Reply to any inline comment with @destesi ignore, @destesi explain, or @destesi recheck. An ignored rule stays ignored across re-reviews — no bot commits, no ignore files.

No bot commits, no .destesi-ignore files cluttering your repo. The decision lives where it belongs: with the review record.

Features

Designed to be trusted in production

🔒

Default-branch config

Rules are read from the default branch only. A PR’s edits to .destesi.yml are content to review — never policy in effect. Closes the prompt-injection loophole.

Approve on clean

Zero findings → the review is submitted as APPROVE. Findings → COMMENT. We never submit REQUEST_CHANGES — the Checks entry is the gate.

💬

Persistent ignores

Say @destesi ignore once and that finding stays ignored — even after new commits trigger a fresh review. The decision lives with the review record, not in your repo.

⚠️

Per-file failure isolation

Invalid LLM output for one file drops that file with reason review_failed. Other files continue. The review never fails just because one chunk was odd.

📐

Severity matrix

Per-finding severity drives the Checks API conclusion via a configurable matrix. Block on error, warn on warning, advise on info.

🚀

Batched inline review

All findings ship in a single PR review — not N individual comments. Cleaner timeline, atomic notifications, easier to dismiss.

📝

PR summary

A 2-3 sentence digest of what the PR does, posted as a summary comment alongside the inline findings. Re-renders on each new commit.

📖

No duplicate reviews

Re-pushed commits and replayed webhooks don’t trigger duplicate reviews of the same change. @destesi recheck always re-runs when you ask.

🔔

Slack notifications

Reviews posted · reviews failed · PRs auto-approved. Configure per-workspace channel; opt out per repo via the same YAML config.

Configuration

One YAML file. Lives on your default branch.

# .destesi.yml
version: 1
review:
enabled: true
triggers: [on_open, on_push, on_command:recheck]
output:
approve_on: clean
summary_comment: true
model:
concurrency: 4

A second pair of eyes on every PR.

Catch the things humans miss when they’re tired. Keep the things humans care about. Free to start.