Setting Fletcher up
Install the GitHub App, then tune what Fletcher looks at with a
.fletcher.json file in your repository.
Get started
- Sign in with GitHub.
- Install the Fletcher GitHub App on your account or organization, then pick the repositories it can see.
- Back in onboarding, choose which repositories get reviews. Every repository you gave the App starts with reviews on; an admin can turn them off.
- Open a pull request. Each workspace gets 5 free reviews on Fletcher's key. After that, an admin adds a Gemini key in the workspace settings or subscribes to the paid plan (see pricing).
No .fletcher.json is needed. Without one, Fletcher uses the
defaults below.
When Fletcher reviews
- When a pull request is opened or reopened, or when new commits are pushed to it. On a new push, Fletcher remembers what he said last time.
- Only when the pull request's author is an owner, member, or collaborator on the repository. Pull requests from anyone else, such as outside contributors' forks, aren't reviewed on their own.
-
On demand: an owner, member, or collaborator comments
/fletcher againon the pull request. Fletcher reviews the latest commit if it hasn't been reviewed yet (for example, an outside contributor's pull request), or retries a review that failed.
Fletcher reviews each commit once. /fletcher again on a
commit that already has a review doesn't start another one; push a new
commit to get a new review.
How Fletcher answers /fletcher again
Fletcher answers every /fletcher again from an owner,
member, or collaborator, so you can tell it was heard:
| What's happening | Fletcher's answer |
|---|---|
| A review starts now, or the commit's review is already queued or running | 👀 reaction on your comment |
| The latest commit already has a finished review | 👍 reaction; nothing new to review |
| The account hit its limit of 50 reviews in 24 hours | A reply asking you to try again later |
| Reviews are off for this repository | No answer |
Comments from anyone else are ignored without an answer.
Reviews are posted as comments. Fletcher never approves or blocks a pull request, so branch protection rules don't change.
.fletcher.json
Put .fletcher.json at the root of the repository. Fletcher
reads it from the default branch, never from the pull
request, so a pull request can't turn its own review off or hide files.
Changes to the file take effect once they're merged.
Every field is optional. A typical file:
{
"severityThreshold": "warning",
"intensity": "carnegie",
"ignore": [
"*.md",
"**/*.md",
"**/__generated__/**",
"fixtures/**"
]
}
| Field | Values | Default | What it does |
|---|---|---|---|
enabled |
true, false | true |
false skips reviews for this repository. The
dashboard shows them as skipped. |
severityThreshold |
critical, warning, suggestion | "suggestion" |
The lowest severity that gets posted.
"warning" posts critical and warning findings;
"critical" posts only critical ones. The verdict
isn't affected. |
intensity |
sectional, studio_band, carnegie | "studio_band" |
How hard Fletcher looks. sectional is terse and
businesslike. carnegie holds the change to the
highest standard: naming, edge cases, and tests. |
tone |
standard, ruthless | "standard" |
How Fletcher words things. It never changes which findings are raised. A tone set on the repository's dashboard page wins over this field. |
ignore |
array of globs | [] |
Files left out of the review. See Ignoring files. |
guidelines |
array of paths or globs, null | null |
The files that hold your review rules, read from the default
branch. null uses the usual places. See
What Fletcher reads. |
The defaults, written out in full:
{
"enabled": true,
"severityThreshold": "suggestion",
"intensity": "studio_band",
"tone": "standard",
"ignore": [],
"guidelines": null
}
To turn reviews off for a repository:
{ "enabled": false }
Ignoring files
Each glob is matched against the file's full path from the repository
root, with no leading / or ./:
/docs/** matches nothing.
-
*and?stay inside one folder:*.mdmatchesREADME.mdbut notdocs/guide.md. -
**crosses folders:docs/**matches everything underdocs/. -
**/*.mdneeds at least one folder, so it doesn't matchREADME.mdat the root. To match a file type everywhere, list both*.mdand**/*.md. -
Braces (
{a,b}), character classes ([ab]), and negation (!) aren't supported and match literally.
These are always ignored, with or without a config file:
-
Lockfiles:
pnpm-lock.yaml,package-lock.json,yarn.lock,bun.lock,bun.lockb - Minified files:
*.min.js,*.min.css -
Images, PDFs, and web fonts (
png,jpg,jpeg,gif,webp,ico,pdf,woff,woff2) - Test snapshots (
*.snap) -
.sqlfiles andmeta/inside anydrizzle/folder, andworker-configuration.d.ts
Nothing else is ignored by default, including other ecosystems'
lockfiles (Cargo.lock, go.sum,
poetry.lock) and SVGs. Add those to ignore
if you don't want them reviewed.
What Fletcher reads
Besides the diff, each review gets:
-
Your rules.
AGENTS.md,CLAUDE.md,CONTRIBUTING.md,.github/CONTRIBUTING.md,docs/CONTRIBUTING.md, and.github/copilot-instructions.md, plus anyAGENTS.mdorCLAUDE.mdin a folder the pull request changes. They're read from the default branch, so a pull request can't rewrite the rules it's reviewed against. Up to 8 files and 40 KB in total. Setguidelinesto pick the files yourself, for example["docs/style/**"]. -
Your dependencies. The root manifest
(
package.json,go.mod,pyproject.toml,Cargo.toml, and the like) and the nearest one to each changed file, so library versions newer than the model's training aren't flagged as mistakes. - The changed files in full, as they are in the pull request, so code just outside the diff counts. Up to 25 files and 150 KB, most-changed first; files over 60 KB are reviewed from the diff only.
Findings that cite a rule quote it and name its file. Fletcher still comments only on lines the pull request adds, and these files don't count toward the 300 KB diff limit or your credits.
Things that catch people out
-
One bad value resets everything. If the file isn't
valid JSON, or any field has a value not listed above, Fletcher
ignores the whole file and uses the defaults, including
"enabled": trueand no ignores. Nothing is posted about it, so check the file carefully. - Plain JSON only. No comments and no trailing commas.
-
Misspelled fields are skipped without a warning.
"severity"or"ignored"does nothing. - Very large pull requests aren't reviewed. The limit is 300 KB of diff, and it counts every file, including ignored ones and lockfiles. Split big changes, or move large generated changes into their own pull request.
-
Edits in a pull request don't apply to that pull request.
Merge the change to
.fletcher.jsonfirst. Commits Fletcher has already reviewed or skipped stay that way; the new settings apply from the next push.