Skip to content

For founders shipping with AI

Your AI wrote it. We make sure it works and is safe.

Keep shipping at AI speed. Before each release goes live, Stableship tests a private copy of your app as every kind of user, holds anything broken or unsafe, and writes the fix.

Free, no account. You prove you own the site, then the scan reads only what any visitor's browser receives. Scan policy.

Releases › Push to main

"add invoices page"

Deploy held · 1 critical finding

  1. Code reviewed

    Passed
  2. Private copy started

    Passed
  3. Used as 4 kinds of user

    Passed
  4. 4

    Tried the classic attacks

    1 of 31 checks failed

    Critical
  5. 5

    Production deploy

    Held until the critical is fixed

    Held
Critical/invoices/:id

User B opened User A's invoice.

Signed in as a regular member of Beta Co, we changed the invoice number in the address bar to one belonging to Acme Ltd. The page loaded with Acme's name, amount and card ending 4421.

  1. 0:02Signed in as member@beta-co.test
  2. 0:09Changed invoice 1042 to 1017 in the address bar
  3. 0:14Invoice 1017 loaded with Acme Ltd's details

Proposed fix · src/api/invoices.ts

Check that the invoice belongs to the signed-in user's company before returning it. Same rule your orders page already uses. Re-tested on the private copy: passes.

What a held release looks like.

Why it matters

Shipping fast is the right call. Three things quietly go wrong.

None of them show up when you test your own app, because you are always signed in as yourself. Open one.

98% of 1,072 vibe-coded apps scanned by Symbiotic Security had at least one security flaw.

How it works

Set up in an afternoon. No security experience needed.

Three steps. The only question you answer is the one nobody else can: who should see what.

  1. 01

    Connect

    GitHub and your database, one approval each. A consent screen lists exactly what will be read.

    GitHub · acme/appConnected
    Supabase · prod-euConnected
  2. 02

    Answer

    Roles are read from your app. You confirm a few plain questions like this one. Try it.

    Who should be able to open an invoice?

    An invoice can be opened by the customer it belongs to and admins. Everyone else gets "not found".

  3. 03

    Ship

    Push like you always do. Each release is checked against your rules and you hear about it only when something needs you.

    • "fix invoice ownership check"Cleared · 2m ago
    • "add invoices page"Held · 1h ago
    • "new pricing copy"Cleared · Yesterday

Already technical? Everything above is also available as files in your repo, a CLI and an MCP server for your coding agent. Hands-on mode

What it checks

Code review, security and product QA, against one rulebook.

The rulebook is the plain-English record of who may see and do what in your app. Every check reads it. Pick one.

Security

Signs in as each role and tries to read or change what it shouldn't. Checks keys in the bundle, open tables, headers and injection.

Runs against a private copy

An example finding

Critical/invoices/:id

User B opened User A's invoice.

What you get

Four things you can count on, every release.

  1. 01

    It works.

    Signup, checkout and the core actions work for every type of user, on desktop and mobile.

  2. 02

    It's safe.

    People only see and change what they should. No leaked keys, no open tables, no admin page anyone can reach.

  3. 03

    It stays that way.

    Every push is checked. A broken or unsafe change is held before customers see it, and the fix is written for you.

  4. 04

    You can prove it.

    A launch report you can hand to an investor, a customer or a security questionnaire.

Speed

Built so you keep shipping.

A check you cannot trust gets switched off. So only real, reproduced problems hold a deploy, and the fix arrives with them.

~2 minQuick check on every push. Free, unlimited.
~15 minFull check before a risky release.
1 tapTo approve a fix we wrote and re-tested.
0Attacks on production. Ever.
  • Only a reproduced problem holds a deploy. Everything else is a note.
  • A second agent re-runs every failure before it can block.
  • If we are ever down, low-risk changes release on their own after 20 minutes.
  • "Ship anyway" is always one tap away, and always recorded.

Trust

Production is never attacked.

A tool that tests your app for safety has to be safe to use. These rules are built in, not settings you have to find.

  • Production is never attacked

    Every active test runs on a verified private copy. Production only ever gets passive, read-only checks.

  • Production keys never reach an agent

    Test-tier keys only: database branches, Stripe test mode, development auth instances. Production keys are never requested or stored.

  • Isolation is checked first

    Before any active test, the agent confirms the copy talks to a test database, not production. Until then, a project gets passive checks only.

  • Your code is never training data

    Model providers are used under zero-data-retention terms where available. Code is held only while a run needs it.

Pricing

A plan you can predict.

Quick checks are unlimited. Launch checks are counted, and you buy more only when you choose to.

Starter

$19/month

  • 1 project
  • 10 launch checks a month
  • Continuous checks, hold, fix agent, weekly audit

Builder

Most teams start here

$49/month

  • 5 projects
  • 30 launch checks a month
  • Everything in Starter, bring-your-own-key option

Pro

$99/month

  • 10 projects
  • 60 launch checks a month
  • Everything in Builder, one launch report per quarter
See all plans

Team, Agency and launch reports are on the pricing page.

stableship

Keep shipping fast. Start with the free scan.

It takes a few minutes and tells you what any visitor's browser can already see.

Free, no account. You prove you own the site, then the scan reads only what any visitor's browser receives. Scan policy.

Want the full product? Get early access →