Skip to contentLockpick
How it worksPricingDocs
Sign inCheck it

You built it.Know what you left open.

Antivirus for vibe-coded apps, websites, skills and repos.

Try an example
Try an example

This scan reads public website and domain information. We keep the results and redacted evidence. How your data is used

57,87101234567890123456789,01234567890123456789012345678957,871 new vulnerabilities published this year. A live estimate from Zero Day Clock data.

  1. We look at your homepage the way an attacker would.From the outside, the way anyone could. Website scans never need your code. Repo and skill checks read public code and never run it.
  2. We explain what we found in plain words.Each finding says what we saw and what someone could do with it. No jargon.
  3. We write the prompt that fixes it.Works with your AI coding agent. Copy the repair prompt into the tool you already use.
    • Codex
    • Gemini
    • Claude Code
    • Cursor
    • Replit
    • GitHub Copilot

More bugs, exploited sooner.

Your public assets are the first things an attacker can reach.

  • 57,87101234567890123456789,01234567890123456789012345678957,871vulnerabilities published worldwide in 2026, a live estimate
  • 2.7×0123456789.0123456789×as many last quarter as a year before, 30k vs 11k
  • 135012345678901234567890123456789exploited the day they went public, first half of 2026
  • #1#0123456789web apps and plugins were the most exploited category in 2026, 211 of 679

Sources and methods behind these figures

One leaked key, found and fixed.

An example of what a Pulse scan finds. This mistake is common.

atlas.example
AAtlasStudio

Good morning, Studio

1,248 customers37 invoices due

View source/_next/static/chunks/app.js

  1. (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{
  2. 1204:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return s}});
  3. var r=n(7437),a=n(2265),i=n(6463);function l(e){return e.replace(/\s+/g," ")}
  4. let o={sm:640,md:768,lg:1024},u=(0,a.createContext)(o);
  5. function s(e){let{title:t,children:n}=e;return(0,r.jsx)("section",{children:n})}
  6. },3310:function(e,t,n){n.d(t,{Z:function(){return c}});var r=n(2265);
  7. function c(e){let[t,n]=(0,r.useState)(!1);return[t,()=>n(e=>!e)]}
  8. },4821:function(e,t,n){"use strict";n.d(t,{db:function(){return o}});
  9. var r=n(2265),a=n(8830);let c=(0,r.createContext)(null);
  10. function u(e){let{children:t}=e;return(0,r.useMemo)(()=>t,[t])}
  11. let i={SUPABASE_URL:"https://db.atlas.example",
  12. SUPABASE_SERVICE_ROLE_KEY:"eyJhbGciOiJI…"},
  13. o=(0,a.createClient)(i.SUPABASE_URL,i.SUPABASE_SERVICE_ROLE_KEY);
  14. function l(){return o.from("customers").select("*")}
  15. function d(e){return o.from("customers").delete().neq("id",e)}

customersAnyone who opens atlas.example

NameEmail
Mara Quinnmara@northwind.example
Theo Alberstheo@kestrel.example
Ines Duarteines@fieldnote.example
and 1,245 more rowsDelete all 1,248

LockpickExample

Database admin key in the website's code

FoundPulse scan

atlas.example
AAtlasStudio

Good morning, Studio

1,248 customers37 invoices due

View source/_next/static/chunks/app.js

  1. (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{
  2. 1204:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return s}});
  3. var r=n(7437),a=n(2265),i=n(6463);function l(e){return e.replace(/\s+/g," ")}
  4. let o={sm:640,md:768,lg:1024},u=(0,a.createContext)(o);
  5. function s(e){let{title:t,children:n}=e;return(0,r.jsx)("section",{children:n})}
  6. },3310:function(e,t,n){n.d(t,{Z:function(){return c}});var r=n(2265);
  7. function c(e){let[t,n]=(0,r.useState)(!1);return[t,()=>n(e=>!e)]}
  8. },4821:function(e,t,n){"use strict";n.d(t,{db:function(){return o}});
  9. var r=n(2265),a=n(8830);let c=(0,r.createContext)(null);
  10. function u(e){let{children:t}=e;return(0,r.useMemo)(()=>t,[t])}
  11. let i={SUPABASE_URL:"https://db.atlas.example",
  12. Key removed
  13. o=(0,a.createClient)(i.SUPABASE_URL,i.SUPABASE_ANON_KEY);
  14. function l(){return o.from("customers").select("*")}
  15. function d(e){return o.from("customers").delete().neq("id",e)}

customersAnyone who opens atlas.example

NameEmail
Mara Quinnmara@northwind.example
Theo Alberstheo@kestrel.example
Ines Duarteines@fieldnote.example
and 1,245 more rowsDelete all 1,248

permission denied for table customersThe website's public key cannot read this table.

LockpickExample

Database admin key in the website's code

FixedChecked again

Before. Atlas's database admin key is in the website's code, and anyone who opens the site can open the customer table.

What we saw

A key that unlocks the whole database was sitting in the website's code.

Technical detail

Found in 1 of 4 scripts the homepage loads, /_next/static/chunks/app.js. A Supabase JWT starting eyJhbGciOiJI (redacted here) carries the role service_role, which skips row level security. Lockpick read the script the way any browser does and did not use the key.

What someone could do

Read, change or delete every customer record. No password needed.

The prompt

A ready-to-paste prompt for your coding agent. Rotate the key, move it to the server, lock the table, then check again.

Free to start. Deep when you want more.

Billing

Prices in USD

  • Free

    $0/month$0/month

    No card neededNo card needed

    Pulse checks what your site exposes to the public.

    For one site you want to keep an eye on.

    Start free

    Your plan See it in Billing

    • 5 Pulse scans a month
    • 1 site at a time, switch any time
    • Weekly auto-checks, each uses one of your scans
    • Your AI can start Pulse scans and read reports
    • Plain-words reports and fix prompts
  • Deep

    Recommended

    $19/month$15.83/month

    Billed monthlyBilled yearly: $190. 2 months free

    Deep follows routes and tests how your site handles access.

    For founders who want to know what's really exposed, week after week.

    Your first month is free. $0 today, then $19 a month. Cancel any time.

    Your first 2 months are free. $0 for 2 months, then $19 a month. Cancel any time.

    Get DeepGet Deep

    $19 charged every month. Renews automatically until you cancel. Cancel anytime in Billing.$190 charged once a year. Renews automatically until you cancel. Cancel anytime in Billing.

    Your plan See it in Billing

    • 20 Deep scans and 100 Pulse scans a month
    • 10 sites
    • Daily Pulse auto-checks included, emailed when something urgent appears
    • Your AI can start Pulse and Deep scans and read reports
    • 3 seats
    • Plain-words reports and fix prompts

    What Deep checks

    • Up to 30 pages and 200 requests, plus everything a Pulse scan looks at
    • Your API, including GraphQL, OpenAPI routes and CORS
    • Supabase, Firebase and Convex access rules
    • Up to 20 scripts and the libraries in them against known advisories
    • Email and domain security, including DMARC, SPF and subdomain takeover
    • Your lockfile against known advisories, from the CLI
  • Master Key

    Coming soon

    From $49/monthFrom $40.83/month

    Not on sale yetFrom $490 billed yearly · Not on sale yet

    Checks whether one user can see another user’s data.

    For apps where people sign in and keep their own data.

    Join the waitlist

    Your plan See it in Billing

    • Signs in to your app with two test accounts
    • Checks whether one user can see another user's data
    • Plain-words reports and fix prompts
  • Teams and agencies

    Priced to your sites and teamPriced to your sites and team

    More sites, seats and client workspaces.

    For teams and agencies that check many sites. Tell us what you need.

    Contact us

    Your plan See it in Billing

    • Custom scan volume
    • Unlimited seats
    • Client workspaces and share pages with your name
    • Priority queue and email support
    • Plain-words reports and fix prompts
See Deep

Public HTTPS pages only. Scan only sites you are authorized to test.

Questions before you scan.

Is it safe to scan my site?

Yes. A Pulse scan reads only what any browser or mail server can already see. It covers the homepage and the files it loads, email sender settings (SPF and DMARC), security headers and TLS, and public DNS, certificate and subdomain records, in at most 10 requests. It never signs in or submits a form.

Do you need my code?

Not for your site. Website scans check your live site from the outside, the way an attacker would, so they never need your code. Repo and skill checks read only the public code of a GitHub link you paste, and never run it.

Which builders does it work with?

Any public website on HTTPS, whatever built it. Each finding comes with a fix prompt for your coding assistant, whether that is Lovable, Bolt, Replit, Cursor, Claude Code or another one.

What does “authorized to test” mean?

It means the site is yours, or its owner has said you may check it. You confirm that before a Pulse scan, and a Deep scan also asks you to prove you own the site.

What do Early AI-dopters members get?

Members get 10 Pulse scans a month on 2 sites and a free month of Deep. VIP members get 20 on 3 sites and 2 free months of Deep. Claim it from the Lockpick tile in EA Apps.

Can I cancel any time?

Yes. Cancel Deep from Billing whenever you like. Free has nothing to cancel.

Check your site before you share the link.

Check it

Only pick locks you own.

Lockpick
PricingMethodologyDocsBlogGuidesSecurity checksLearn with PickSecurity and trustLockpick for ClaudeChangelogStatusFacts for AI assistants

Lockpick is a security scanner for vibe-coded apps. It checks what your live site exposes and what a GitHub repo or AI skill would do before you install it, then gives you a fix prompt for Lovable, Bolt, Replit, Cursor or Claude Code.

Lockpick assesses public pages you are authorized to test, and public GitHub code it never runs.

© 2026 LockpickTermsPrivacyContactSign in