Skip to content
NewSuggestions that span files

Every pull request, reviewed in under a minute.

Nitpick reads the diff the moment it opens, comments on the exact lines that need a second look, and writes the fix so the author can apply it in one click.

For GitHub, GitLab, and Bitbucket.

quayside/storefront / pull/2184/files

Add saved carts for signed-in shoppers #2184

Openpriya-raman wants to merge 1 commit intomainfrompriya/saved-carts

Nitpick is reviewing the pull request.

src/server/routes/saved-carts.tsNew file+20
src/components/SavedCartsPanel.tsxNew file+20

Reviewing pull requests at

  • quayside
  • NORTHBEAMFREIGHT
  • Halcyon Health
  • tallowtree
  • orrery
  • Brightwork

What it catches

Six rules, each one a switch.

Every finding is tied to the rule that raised it. Turn a rule off and the review below changes with it, the same way it would on your own pull requests.

Review rules6 of 6 on
northbeam/dispatch Export shipments as CSV #911Nitpick6 findings
src/routes/shipments/export.ts+27
1+import { Router } from "express";
2+import { db } from "../db";
3+import { putObject } from "../storage";
4+import { toCsvRow } from "./csv";
5+​
6+const BUCKET_KEY = "nbf_live_9f2c41d7e8a3b6c0";
Live storage key in sourceHigh

Move it to a secret and rotate it. It is already in this branch’s history.

7+​
8+export const router = Router();
9+​
10+router.post("/shipments/export", async (req, res) => {
New route has no testLow

Nothing in test/ calls POST /shipments/export.

11+ const shipments = await db.shipment.findMany({
12+ where: { accountId: req.body.accountId },
accountId is taken from the request bodyHigh

No session check, so any caller can export any account’s shipments.

13+ });
14+​
15+ const rows = [];
16+ for (const s of shipments) {
17+ const carrier = await db.carrier.find(s.carrierId);
One carrier query per shipmentMedium

An export of 2,000 shipments runs 2,001 queries. Fetch carriers once.

18+ rows.push(toCsvRow(s, carrier));
19+ }
20+​
21+ const url = await putObject(BUCKET_KEY, rows.join("\n"));
Upload failure isn’t handledMedium

If putObject rejects, the request hangs until it times out.

22+ res.json({ url });
23+});
24+​
25+function legacyHeader() {
legacyHeader is never calledLow

No references anywhere in the repo. Safe to delete.

26+ return "id,carrier,eta,status";
27+}

Start to merge

Thirteen minutes from opened to merged.

The same pull request, played back step by step.

  1. 10:02:14Opened

    Priya opens #2184

    Forty new lines across a route and a component.

    priya-raman opened this pull request

  2. 10:02:52Reviewed

    Nitpick reviews it in 38 seconds

    Three comments on the exact lines. Both high-severity ones carry a fix.

    nitpick reviewed: 3 issues, 2 suggested fixes

  3. 10:09:30Fixes pushed

    Both suggestions applied

    Priya applies the two fixes and adds the empty state. One commit.

    priya-raman pushed 1 commit: apply suggestions, add empty state

  4. 10:14:05Approved

    Approved by Tomás Ferreira

    A human reviewer reads a smaller, cleaner diff and signs off.

    tomas-ferreira approved these changes

  5. 10:15:41Merged

    Merged into main

    Checks are green and nothing is left to nitpick.

    priya-raman merged commit a3f9c1e into main

Fits your workflow

Comments land where your team already reviews.

Install Nitpick on GitHub, GitLab, or Bitbucket, in the cloud or on your own instance. It comments in the thread, posts a check, and reads its rules from a file in your repository.

  • 01Review comments on the exact lines, in the thread your team already reads.
  • 02A check that passes once nothing high-severity is left.
  • 03Rules in a YAML file, reviewed like any other change.
GitHub App · Cloud and Enterprise Server

PRpriya-raman opened pull request #2184· Add saved carts for signed-in shoppers

src/components/SavedCartsPanel.tsxL13–17
13+ <ul className="cart-grid">
14+ {carts.map((cart) => (
nitpickbotLow38s after opening

Empty state isn’t handled

A shopper with no saved carts sees a heading over an empty list. Show a short message and a link back to the catalog.

Check runNitpick review · 1 low-severity issue, nothing blocking
.nitpick.ymlReviewed like any other change
.nitpick.yml configuration
1# .nitpick.yml2version: 13​4review:5  on: [opened, synchronize]6  min_severity: low7  suggest_fixes: true8​9rules:10  n-plus-one: on11  missing-auth: on12  unhandled-errors: on13  secrets: { severity: high, block_merge: true }14  route-tests: { paths: ["src/routes/**"] }15  dead-code: off16​17ignore:18  - "**/*.generated.ts"19  - "vendor/**"

Security

Your code is read, never kept.

Nitpick needs a diff for about a minute. It holds it in memory for that long and no longer.

  • 01

    Never stored or used for training

    Diffs stay in memory for the length of a review and are discarded when the comments post. Model calls run with zero data retention.

  • 02

    SOC 2 Type II

    Audited every year by an independent firm. The latest report is available under NDA.

  • 03

    Single-tenant option

    An isolated deployment with its own encryption keys and network, on the Enterprise plan.

  • 04

    Data residency in the US or EU

    Reviews run in Virginia or Frankfurt, and code never leaves the region you choose.

Where your code goes during a review
Your code hostGitHub · GitLab · BitbucketDiff andcontextCommentsand a checkYOUR REGIONUS · Virginia or EU · FrankfurtReview workerIn memory, in your regionModelZero retentionDiscarded when the review postsNo disk · No logs of codeNo training

In numbers

Median time from opened to first review
38s
Of suggested fixes applied by the author
61%
Pull requests reviewed so far
4.2M

Across all customers. Median and apply rate over the last 90 days.

From engineering leads

“Our senior engineers stopped leaving the same five comments on every pull request. Nitpick leaves them in the first minute, with the fix attached, and people apply it.”

Hannah Okafor, Director of Engineering, Northbeam FreightNORTHBEAMFREIGHT

“The auth rule caught a route that would have served patient records to anyone with the URL. It was in staging for eleven minutes.”

Daniel Reyes, Head of Platform, Halcyon HealthHalcyon Health

“It is quiet. Three comments, not thirty. So when Nitpick flags something, the team actually reads it.”

Mei Lindqvist, Engineering Manager, Orreryorrery

Pricing

Priced per author, not per seat.

An author is anyone who opens a pull request in a month. Reviewers, approvers, and bots are free.

Team

$24per author / month

For teams that want every pull request reviewed.

  • Unlimited repositories
  • All six review rules
  • One-click suggested fixes
  • GitHub, GitLab, and Bitbucket Cloud
Book a demo

Business

Most teams

$40per author / month

For companies with an identity provider and auditors.

  • Everything in Team
  • SSO with SAML or OIDC
  • Audit log with export
  • Self-managed GitLab and Bitbucket Data Center
Book a demo

Enterprise

Talk to us

For security reviews, regions, and isolation.

  • Single-tenant deployment
  • US or EU data residency
  • Security review and DPA
  • A named support engineer
Book a demo

Book a demo

See Nitpick review your own code.

Thirty minutes with an engineer from our team. We install it on a repository you choose and review your last ten pull requests together.

  • No code leaves your region
  • Set up in about five minutes
  • Free for 14 days after the call
Team sizeEngineers who open pull requests
Code host

We use these details only to arrange the demo.