Application security · starts with GitHub

Security monitoring that opens the pull request.

Connect GitHub. ShipLock reads your code, follows each entry point through to the data it can reach, and opens a fix for you to approve. Connect the rest of your stack when you want its live configuration checked too. No checklist to work through, and nothing to copy and paste.

Get started Free while in preview · read-only on your code
GET /api/invoices/:idan entry point in your code
auth() resolves a userwe know who is calling
no workspace checknothing narrows it to them
invoices1,140 workspaces of billing data
critical

Any signed-in user can read every workspace’s invoices.

Pull request opened, waiting for your approval

How it works

Three steps, then it keeps going on its own.

01

It reads the repository

Every route handler, the schema, the imports. Your code already names your auth provider, your database and your payment webhooks, so we know what to check without asking you to describe it.

02

It works out what an attacker reaches

Starting at each entry point and following the guard: who can call this, what does it resolve about them, and does anything narrow the result to that person. Findings are paths, not line numbers.

03

It opens the pull request

On its own branch, never merged by us, and only after the change has been tested against the problem it fixes. Where the answer is a decision about your product, we say so instead of guessing.

Who it is for

Startups with customers and no security hire.

Small teams shipping quickly, where most of the code was written with an AI assistant and nobody has time to audit it by hand. Supabase and Postgres today; other databases after that.

What you get

Paths that reach customer data, ranked by what they reach
A pull request for the ones with a mechanical fix
The reasoning behind every finding, with the file it came from
A record of what each audit did not cover
A re-audit on every pull request you open

What it actually does

Two halves: read everything, then prove one thing.

The first half runs on your repository alone. The second is what separates a finding you have to believe from one you can watch happen.

1 · It reads every layer, and joins them

One connection. None of these layers is a finding on its own. The join is.

Entry pointsroute handlers
39 routes · 2 anonymous
Identityyour auth library
Clerk resolves a user
Datayour schema
invoices · workspace_id
Dependenciesyour manifest
no known advisory

Correlated. An authenticated route reads invoices without workspace_id. None of these layers says that alone.

2 · It attacks a copy, never your app

A disposable replica with synthetic tenants and none of your data.

sandboxnever your production app
Disposable copy builtyour table and its rules, none of your data
Two synthetic tenants seededrows we invented, so nothing real is at risk
Signed in as tenant A, read A1 row returned, so the copy is trustworthy
Signed in as tenant A, read Bthe query a real attacker would send

1 row returned that should not exist. The leak is reproduced rather than inferred, and the fix is re-run against the same copy before it reaches you.

Reproduction needs your database connected. Reading the code does not.

Point it at a repository.

The first audit takes a few minutes and tells you where you stand.

Get started