Kelp
§ 00Open source · MIT

AI wrote your app.
Kelp finds the doors it left open.

Open-source security scanner for vibe-coded apps. Hardcoded secrets, permissive Supabase RLS, unauthenticated edge functions — Kelp probes the way an attacker would and hands you the fix, ready to paste back into whatever AI tool built the app.

No signupPublic repos only
scan/roamly-app
4 specialists · streaming
13:04:12[postgrest]probing rls on public schema…
13:04:12[edge-fn]listing functions… found 6
13:04:13[auth]reading supabase config.toml
13:04:13[secrets]walking src/… 214 files
13:04:14[postgrest]profiles.email — READ open to anon
13:04:14[edge-fn]get-order verify_jwt=false
13:04:15[secrets]VITE_SERVICE_ROLE at src/lib/db.ts:14

An excerpt from an actual dispatch. Nothing invented, nothing dramatised.

§ 01 · How it moves

Four specialists probe in parallel.
A reviewer keeps the honest ones.

Every finding is evidence-gated: Kelp’s reviewer re-runs the reproduction before it lands in your report. Nothing invented, nothing hand-waved. Hover a specialist to see its beat.

[postgrest]
Probes RLS + GRANTs on every table via the anon PostgREST surface.
[edge-fn]
Lists every edge function, replays each without a JWT and inspects the response.
[auth]
Reads supabase/config.toml + the auth flows for missing rate limits and open redirects.
[secrets]
Walks the source tree for hardcoded API keys, service-role JWTs, third-party secrets.
◇ TARGETroamly-appsupabase + edge fnsreviewerre-runs · gates§ REPORTCRITICALVITE_SERVICE_ROLE in …HIGHget-order verify_jwt=…HIGHprofiles.email — READ…MEDIUMreset flow missing ra…
§ 02Coverage

Small on purpose. Every finding is real.

Kelp covers the classes that actually breach vibe-coded apps, and it ships evidence for each. Everything else is honestly out of scope — see docs/SECURITY-MODEL.md for what Kelp explicitly won't verify.

SEC-001
Class 01

Hardcoded secrets in source.

Service-role keys, Stripe secrets, and OpenAI tokens committed to the repo — including those bundled to the client. Kelp finds them with provider patterns plus entropy fallback, and never persists the raw value: only a masked preview reaches your report.

RLS-002
Class 02

Row-Level Security, checked policy-by-policy.

Kelp reads your Supabase schema and finds the tables and columns anyone can read or write. The reviewer re-runs the check before it lands — if it doesn't reproduce, it doesn't ship.

EDGE-003
Class 03

Edge functions that skip the JWT.

verify_jwt=false in supabase/config.toml, unauthenticated replays, permissive CORS. Every finding comes with the exact curl the executor ran and the response it got.

§ 03Install

One engine. Three surfaces. Pick what fits.

The detection engine is the same everywhere. Run it locally with the CLI, gate PRs with the GitHub Action, or connect a repo to the hosted app for continuous scanning. None of them require a Kelp account by default.

Surface 01

CLI — for local + CI shells

One command, no signup, no keys. Uses the same @kelp/core scanners as everything else.

$ npx kelp scan ./my-app
Surface 02

GitHub Action — for pull-request gating

Fails the check when a PR introduces new critical or high findings against the base branch. Auto-comments the verdict, updated in place on each commit.

$ uses: kelp-security/kelp-action@v1
Surface 03

Hosted app — for continuous scanning

Connect a repo once, get scans on every push, dashboards, agent chat per finding, and one-click fix PRs. Optional — the CLI and Action need nothing.

$ kelp.build
§ 04Evidence-gating

Kelp's model never decides a finding is real.

Every agent-produced lead requires a reproduction — a probe with an expected observable, or a source citation. The executor re-runs it. Only findings that survive the re-run reach your report. Autonomy in reasoning, zero fabrication.

Invariant · 01

Agents reason, the executor proves.

Specialists form hypotheses freely; the executor accepts them only when the exploit reproduces against your actual endpoints, with real user context.

Invariant · 02

The reviewer only narrows.

A second pass reads each specialist's transcript, spawns targeted follow-ups, and drops the leads that don't reproduce. It never adds noise.

Invariant · 03

Full transcript per finding.

Every finding ships with the reasoning, the probe, and the response — the receipt for exactly how Kelp knows. Read the full principle in docs/EVIDENCE-GATING.md.

§ 05Questions

What people ask before they run Kelp.

Q · 01

Is Kelp actually free?

The engine, CLI, and GitHub Action are MIT-licensed and free to use forever — for any purpose, including commercial. The hosted app at kelp.build runs on infrastructure that costs money, so it may add a paid tier for high-usage workflows later, but the code itself stays open.

Q · 02

Do I need to sign up for anything?

No. `npx kelp scan ./my-app` works with zero configuration. `uses: kelp-security/kelp-action@v1` runs in CI without any Kelp-side account. Signup only matters if you want the hosted app's continuous scanning + history.

Q · 03

Does Kelp change my code without asking?

Never. Fixes are opened as PRs against a fresh kelp/… branch, never pushed to your default branch. Database fixes are proposed as migrations you review and run yourself. The CLI never touches your code at all — it only reads.

Q · 04

Does Kelp claim to find every vulnerability?

No. Kelp covers a small set of high-impact classes (secrets, RLS, edge-function auth, CORS) with high precision — the ones that actually breach AI-generated apps. Real fixes for those beats a forty-page report of maybes. See docs/SECURITY-MODEL.md for what's explicitly out of scope.

Q · 05

How do I extend Kelp — new secret pattern, new backend?

Open a PR against packages/core/src/scanners/ for a new pattern, or read docs/ADAPTERS.md for adding a whole new backend (Firebase, Convex, etc.). CONTRIBUTING.md has the full walkthrough.

§ 06Ship it

Scan your app before your users do.

Two minutes with the CLI. Six lines of YAML for the Action. Kelp is MIT-licensed — clone it, fork it, or send a PR to add the vuln class you wish it caught.