Docs · Quickstart

From install to
first review.

Install the app, pick the repositories and open a pull request. The first review arrives in about a minute and a half.

Updated 4 Nov 2026 · v3.8

Install

Firstpass is an app on your code host. An organisation owner installs it once; nothing changes in your pipelines and there is no agent to add to CI.

1.

Open the Firstpass page on your host’s marketplace and choose Install.

2.

Pick the organisation. You can start with a single repository.

3.

Approve the permissions: read access to code and pull requests, write access to comments and checks.

If you prefer the terminal, the CLI does the same and writes a starter rules file into the repository:

terminal

Copy

npx firstpass init

 

# Signed in as ines@northlane.example

# Organisation northlane

# Repositories payments-api, web-app

# Wrote firstpass.yml

# Done. Open a pull request to get your first review.

Permissions

Firstpass never asks for admin access and cannot push to protected branches. A suggestion you apply is committed to the pull request branch under your name.

Choose repositories

Reviews run only on the repositories you select. Add or remove them at any time from Settings, then Repositories, or keep the list in code:

terminal

Copy

npx firstpass repos add northlane/search

npx firstpass repos list

 

# payments-api TypeScript pnpm test active

# web-app Ruby bundle exec rspec active

# search Go go test ./… active

How the build is detected

Firstpass reads the lockfile and the usual build files to work out how to build and test a repository. When it guesses wrong, state the commands in firstpass.yml:

firstpass.yml

Copy

build: pnpm install --frozen-lockfile && pnpm build

test: pnpm test --changed

timeout: 10m

First review

Open a pull request as you normally would. Firstpass receives a webhook from the host, checks out the branch in an isolated container, builds it and runs the tests that cover the changed lines.

webhook payload (shortened)

Copy

POST /hooks/github

X-GitHub-Event: pull_request

 

{

  “action”: “opened”,

  “number”: 4127,

  “repository”: { “full_name”: “northlane/payments-api” },

  “pull_request”: { “head”: { “sha”: “7c1e9f2” }, “base”: { “ref”: “main” } }

}

The review has three parts:

—

A summary at the top of the pull request: risk, the number of comments by severity and whether it is safe to merge.

—

Comments on the exact lines, each with the evidence: a failing test, a measured cost or the rule it breaks.

—

A suggestion where the fix is small and the tests pass with it. Apply it in one click or dismiss it.

Ask for another pass

Every push to the branch is reviewed again. To ask for a review without pushing, comment /firstpass review on the pull request.

Rules file

​firstpass.yml sits in the root of the repository. Rules are plain sentences; Firstpass applies each one to every pull request and cites it in the comment.

firstpass.yml

Copy

rules:

  - “Money is stored as integer cents, never floats”

  - “Every new endpoint needs an auth test”

  - text: “No direct imports from /internal in /web”

    paths: [“web/**”]

 

ignore:

  - “**/*.snap”

  - “vendor/**”

 

severity: block_on_bug

Writing a rule that works

—

One rule, one sentence. Split a rule that contains the word “and”.

—

Say what must be true, not what to avoid in general: “Dates are stored in UTC” beats “Be careful with time zones”.

—

Limit a rule to a folder with paths when it only makes sense there.

Limit

A repository can hold up to 40 rules. Past that, comments start to read like a linter and people stop reading them.

Severity

Every comment has one of three levels. The severity key decides which of them hold the merge.

Level

Meaning

Default

BLOCKING

Firstpass can show the failure: a failing test, a leaked secret, a broken rule.

Holds the merge

SHOULD FIX

A likely problem with a measured cost, such as an N+1 query.

Reported

NIT

Small and optional.

Hidden

firstpass.yml

Copy

# block_on_bug only BLOCKING holds the merge (default)

# block_on_all BLOCKING and SHOULD FIX hold the merge

# report_only nothing holds the merge

severity: block_on_bug

show_nits: false

Self-hosted runners

On Enterprise, builds and tests can run in your own cloud account. Source code stays inside your network; only the review text leaves it.

terminal

Copy

docker run -d --name firstpass-runner \

  -e FIRSTPASS_RUNNER_TOKEN=fpr_your_token_here \

  -e FIRSTPASS_REGION=eu \

  -v /var/run/docker.sock:/var/run/docker.sock \

  firstpass/runner:3.8

A runner needs outbound HTTPS to runners.firstpass.example and nothing inbound. Size it at 4 vCPU and 8 GB of memory for each review you want to run at the same time.

Tokens

Create runner tokens in Settings, then Runners. A token is shown once; store it in your secret manager, not in the repository.

FAQ

Does a review use our CI minutes?

No. Firstpass builds in its own containers, or in your runners on Enterprise. Your pipelines run as before.

What happens to the code after a review?

The container and the checkout are destroyed when the review is posted. Build snapshots are kept for 7 days to speed up the next review and can be switched off.

Can we stop it reviewing a pull request?

Add the label no-firstpass, or put [skip firstpass] in the title. Draft pull requests are skipped unless you set review_drafts: true.

Open a pull request.

Get your

first pass.

Free for public repositories · 14-day trial for private ones · no card

Open a pull request.

Get your

first pass.

Free for public repositories · 14-day trial for private ones · no card

Open a pull request.

Get your

first pass.

Free for public repositories · 14-day trial for private ones · no card

Create a free website with Framer, the website builder loved by startups, designers and agencies.