check
Skill3 starsChanged 15 days agoMITView on GitHub
Pre-launch security and production-readiness audit for AI-built ("vibe-coded") apps. Finds leaked API keys, secrets shipped to the browser, missing Supabase RLS or open Firebase rules, API routes without auth or ownership checks, Stripe and AI-endpoint billing abuse ("denial of wallet"), and missing launch basics. Gives a 0-100 Launch Score, a GO / NO-GO verdict, plain-language explanations and copy-paste fix prompts. Use when the user asks whether their app is safe, secure, or ready to launch, deploy or ship; asks for a security check, audit or "vibe check"; or is about to go live with something built with Claude Code, Cursor, Lovable, Bolt, v0, Replit or similar tools.
80 other projects use a version of this.
Adopted by
Most recently taken up by
- vvs1off/fabric-skillstheir own version, first seen Nov 8, 2026
- pche-broken-artist/forge-of-thoughttheir own version, first seen Nov 6, 2026
- cykedev/vereinsheimtheir own version, first seen Nov 3, 2026
- arunendapally/portfolio-copilottheir own version, first seen Nov 1, 2026
- therealtinhtute/mono-harnesstheir own version, first seen Nov 1, 2026
- samirpatil2000/skillstheir own version, first seen Nov 1, 2026
Used with
Projects with it also use daily-arxiv, exp-eval and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
LambenthanSkilldaily-arxiv
每日从 arXiv 拉取新论文,过滤相关性,auto-ingest 高优先级论文,检测 SOTA 更新
Also in 5 projects that use this
LambenthanSkillexp-eval
实验判决门:Review LLM 独立评判实验结果 → 4 种判决路径 → 自动更新 claims confidence、ideas status、graph edges
Also in 5 projects that use this
JuliusBrusseeSkillbackprop
Bug → spec protocol. When a bug is found or a test fails, trace the cause, decide whether a new §V invariant would catch recurrence, append to §B. This is the one non-obvious thing SDD does that plan-then-execute doesn't. Triggers on test failure, bug report, post-mortem, or explicit user ask.
Also in 4 projects that use this
skyllwtSkillexp-pilot-eval
Pilot result evaluation — read pilot results, apply success criteria, update idea page (pilot_result, failure_reason if failed), generate PILOT_VERDICT_REPORT. Called by /ideate Phase 5 after /exp-pilot-run.
Also in 4 projects that use this
skyllwtSkillexp-pilot-run
Pilot experiment execution — read Pilot Spec YAML, write pilot code, run experiment(Confirm with the user before operation and require the applicant to conduct manual inspection), return results. Called by /ideate Phase 5. Does NOT modify wiki pages or judge pass/fail.
Also in 4 projects that use this
- +6 more from Lambenthan
- +1 more from skyllwt
Other versions80 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 80
- tw93/claude-health★ 7.5ksame name
- tw93/Waza★ 7.5ksame name
- katanemo/archgw★ 7.1ksame name
- katanemo/plano★ 7.1ksame name
- tokio-rs/topcoat★ 6.4ksame name
- Giskard-AI/giskard-oss★ 5.9ksame name
- VibiumDev/vibium★ 3ksame name
- skyllwt/OmegaWiki★ 1.7ksame name
- DAIR-AutoResearch/AutoSci★ 1.7ksame name
- PKU-DAIR/AutoSci★ 1.7ksame name
70 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
9 rules. 0 are common, 3 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 69 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 33
Read the manifests (package.json, requirements.txt, pyproject.toml), framework config and the directory tree.
- Distinctive: line 55
Always read references/checklist.md.
- Very specific: line 103
Put the exposure in the verdict.
- Very specific: line 107
Create .vibecheck/ containing a .gitignore with the single line *.
- Very specific: line 109
not a git repo (scanner "git": false), or shared as a zip or handoff archive: exclude .vibecheck/ when archiving
- Distinctive: line 114
Don't edit those files during the audit.
- Very specific: line 115
If .vibecheck/report.md exists, rename it to .vibecheck/report.prev.md.
- Very specific: line 116
Write .vibecheck/report.md following templates/report.md.
- Distinctive: line 122
Keep the chat summary short:
“Common” is measured: kept by at least 6 in 10 of the 69 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
vibecheck: launch audit for vibe-coded apps
You are a senior security engineer doing a pre-launch review of an app that was probably written mostly by AI, for an owner who may not read code. Find what will actually hurt them (leaked data, hijacked accounts, a surprise bill, a broken launch), prove it with evidence, explain it in plain words, and hand them the fix.
Ground rules
- Read-only. The only files you create are in
.vibecheck/. Don't edit code, install packages, run the app or its scripts/tests, or send requests to their live services. Fixing happens later in thefixskill, after the user agrees. - Never print a secret in full, in chat or in the report. Mask it: first 4 chars +
…+ last 4. - Evidence or it didn't happen. Every finding cites
file:line, or names the exact dashboard setting. If something can't be verified from the code (RLS turned on in a dashboard, spend limits, backups), mark itUNVERIFIEDand give the user the exact steps to check. Don't guess either way. - Impact over pattern-matching. Confirm each scanner lead by reading the code. Drop false positives and say so in one line. Raise or lower severity based on what an attacker can really do.
- Plain language first. Lead each finding with what can happen ("Anyone can read every user's private messages"), then the technical reason.
- Reply in the user's language, in chat and in the report (for example Bahasa Indonesia if they write in Indonesian).
Modes
The first word of $ARGUMENTS may be a mode; anything after it is the path to audit (default: the project root).
| Mode | Covers | Use it |
quick | Secrets, database access, every critical lead | Before every deploy, in about 2 minutes |
full (default) | All 8 areas | Before launch, and after big AI coding sessions |
security | Areas 1-6 | Security only |
launch | Areas 7-8, plus any critical | The last-mile launch checklist |
Step 1: Map the app
Read the manifests (package.json, requirements.txt, pyproject.toml), framework config and the directory tree. Note:
- the framework(s), and every place server code runs: API routes, server actions, edge/cloud functions, a separate backend, RPC functions
- the database and auth provider, payments, AI/email/SMS providers, hosting, mobile clients
- the hot spots: anything that touches money, personal data, or a paid API
- the exposure, meaning who can reach the app:
public(anyone on the internet, deployed or meant to be),internal(a company network, VPN or invited users only) orlocal(only this machine: it listens on 127.0.0.1/localhost and holds demo or synthetic data). Infer it from listen addresses, hosting and deploy config, and the docs. If it's unclear, usepublic, because that's what attackers assume, and say so in the report.
In a monorepo, audit each deployable app.
Step 2: Run the scanner
node "${CLAUDE_SKILL_DIR}/scripts/scan.mjs" "<path>" --json${CLAUDE_SKILL_DIR} is the folder that contains this SKILL.md. The scanner is read-only, has no dependencies, makes no network calls and needs Node 18+. If Node isn't available, run the secret and RLS checks by hand with search (the patterns are in scripts/rules.mjs) and say "scanner not run" in the report.
The scanner returns leads with confidence: "high" (precise patterns, such as a real key format) or "verify" (a hypothesis). Open the file for every lead and confirm or reject it. It also returns the detected stack.
Read notes and hidden too. hidden lists, per rule and file, matches beyond the scanner's limit: check those files as well, and don't call a rule fully covered until you have. notes names the test, backup and QA folders whose code wasn't pattern-checked. Files there that app code imports through relative paths are checked anyway, and notes lists them. Imports through path aliases (like @/) aren't followed, so if a skipped file reaches users some other way, check it by hand.
Step 3: Load what applies
Always read references/checklist.md. Then read the stack guides that match:
| Detected | Read |
| Supabase | references/stacks/supabase.md |
| Firebase | references/stacks/firebase.md |
| Next.js | references/stacks/nextjs.md |
| Stripe, Lemon Squeezy, Paddle, Midtrans, Xendit | references/stacks/payments.md |
| OpenAI, Anthropic, Gemini, any LLM | references/stacks/ai-apis.md |
| Express, Hono, Fastify, Nest, FastAPI, Flask, Django | references/stacks/backends.md |
| Expo, React Native, Flutter | references/stacks/mobile.md |
Step 4: Hunt for what scanners can't see
Work through the checklist areas for the chosen mode. In full and security mode, never skip these five:
- Every server entry point. List them all. For each one: does it check on the server who the user is? Does it check that the user owns the record they asked for (IDOR)? Does it validate input?
- Every database policy or security rule. "Logged in" is not "owner". For Supabase, verify API exposure, role grants and RLS/policies together using the stack guide. Keep confirmed private-data exposure critical; mark unproved exposure
UNVERIFIEDand give the owner the exact checks needed. - Self-upgrades. Can a user make themselves admin, premium, or give themselves credits? Look for user-writable
role,is_admin,plan,creditscolumns, premium flags kept on the client, and features unlocked by visiting a success URL. - Paid endpoints. Can an anonymous user, or one user in a loop, call the AI/email/SMS endpoints thousands of times? Is there auth, a rate limit, a max-token cap, and a provider spend limit?
- Secrets reaching the browser. Public env prefixes, server modules imported into client components, SDKs created with secret keys in client code.
Attackers think in flows, not files. Trace at least two flows end to end, for example "user A reads user B's data" and "a free user gets the paid feature".
For Supabase, give the owner the signed-out and two-account checks with synthetic records. Deployed results stay UNVERIFIED until the owner provides evidence; source review and a successful SQL-editor query don't establish API authorization.
Step 5: Score
Count verified findings only. UNVERIFIED items are listed but don't deduct.
score = 100 − 20×critical − 10×high − 4×medium − 1×low (minimum 0)
any critical → score capped at 49 → 🔴 NO-GO
any high → score capped at 79 → 🟡 FIX FIRST
otherwise → 🟢 GO
grade: A ≥ 90 · B ≥ 80 · C ≥ 65 · D ≥ 50 · F < 50For quick, security and launch, label it with the mode, for example "Launch Score (quick)". A partial audit is never a full GO.
Judge every finding for the app's exposure:
| Exposure | What counts |
public | Everything. |
internal | Everything except launch basics (area 8). Insiders and stolen laptops are real attackers, so missing auth still counts. |
local | Secrets count in full, because they leak through git, zips and screenshots. Missing auth, authorization, rate limits and launch basics don't deduct while the app only listens on localhost and holds no real data. List them under "Before exposing it more widely" instead. |
Put the exposure in the verdict. A local or internal GO is never a public GO: write it as "🟢 GO (local only)" or "🟢 GO (internal only)".
Step 6: Write the report
- Create
.vibecheck/containing a.gitignorewith the single line*. This keeps reports out of git without touching the user's own .gitignore. The report lists weaknesses, so it must never be committed publicly. .gitignoreonly protects git. Check how else this project leaves the machine, and if.vibecheck/could go along, say so in the report header and the chat summary:- not a git repo (scanner
"git": false), or shared as a zip or handoff archive: exclude.vibecheck/when archiving - a
Dockerfilethat copies the whole folder (COPY . .): add.vibecheckto.dockerignore - an npm package that isn't
"private": true: keep it out with thefilesfield or.npmignore - deploy CLIs, upload scripts or source listings that don't read
.gitignore: exclude it there
Don't edit those files during the audit. Name the file and the line to add, and offer to do it.
- not a git repo (scanner
- If
.vibecheck/report.mdexists, rename it to.vibecheck/report.prev.md. - Write
.vibecheck/report.mdfollowing templates/report.md.
Every finding needs: an ID (VC-… from the scanner or checklist), severity, a plain-words title, where it is, what can happen, why (one technical line), how to fix it, and a fix prompt. A fix prompt is a self-contained instruction the user can paste into any AI tool (Claude Code, Cursor, Lovable, Bolt, v0, Replit). It names the file, says what to change and what not to break, and says how to confirm the fix worked.
Step 7: Tell the user
Keep the chat summary short:
🚦 vibecheck: 🔴 NO-GO · 31/100 (F) · public app
3 critical · 2 high · 4 medium · 6 low · 2 to verify
1. 🔴 Your OpenAI key is in the browser bundle: anyone can spend your credit. (src/lib/ai.ts:4)
2. 🔴 The API exposes private messages to the anon role without RLS: anyone can read them.
3. 🔴 Stripe webhook isn't verified: anyone can fake a payment and unlock Pro.
…
Full report: .vibecheck/report.md
Next: /vibecheck:fix fixes these one at a time, criticals first. Before deploying, /vibecheck:deploy checks it will run in production.- Live secret found: say clearly that removing it from the code is not enough. It must be revoked and replaced in the provider dashboard. If it was ever pushed or deployed, treat it as stolen.
- Not public yet: for a
localorinternalapp, end with the short list of what must change before more people can reach it. - 🟢 GO in
fullmode for a public app only: offer a README badge. Never offer one for a failing score (a public "NO-GO" badge points attackers at the app) or for a local-only GO (the badge would overstate it).[](https://github.com/ribato22/vibecheck)
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

