agentleFS
ribato22ribato22/vibecheck/skills/check/SKILL.md

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

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.
  • LambenthanSkill

    daily-arxiv

    每日从 arXiv 拉取新论文,过滤相关性,auto-ingest 高优先级论文,检测 SOTA 更新

    Also in 5 projects that use this

  • LambenthanSkill

    exp-eval

    实验判决门:Review LLM 独立评判实验结果 → 4 种判决路径 → 自动更新 claims confidence、ideas status、graph edges

    Also in 5 projects that use this

  • JuliusBrusseeSkill

    backprop

    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

  • skyllwtSkill

    exp-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

  • skyllwtSkill

    exp-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

    1. tw93/claude-health★ 7.5ksame name
    2. tw93/Waza★ 7.5ksame name
    3. katanemo/archgw★ 7.1ksame name
    4. katanemo/plano★ 7.1ksame name
    5. tokio-rs/topcoat★ 6.4ksame name
    6. Giskard-AI/giskard-oss★ 5.9ksame name
    7. VibiumDev/vibium★ 3ksame name
    8. skyllwt/OmegaWiki★ 1.7ksame name
    9. DAIR-AutoResearch/AutoSci★ 1.7ksame name
    10. 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.

  • In this repository3 other files it gives its agents.

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
  1. Very specific:

    Read the manifests (package.json, requirements.txt, pyproject.toml), framework config and the directory tree.

    line 33
  2. Distinctive:

    Always read references/checklist.md.

    line 55
  3. Very specific:

    Put the exposure in the verdict.

    line 103
  4. Very specific:

    Create .vibecheck/ containing a .gitignore with the single line *.

    line 107
  5. Very specific:

    not a git repo (scanner "git": false), or shared as a zip or handoff archive: exclude .vibecheck/ when archiving

    line 109
  6. Distinctive:

    Don't edit those files during the audit.

    line 114
  7. Very specific:

    If .vibecheck/report.md exists, rename it to .vibecheck/report.prev.md.

    line 115
  8. Very specific:

    Write .vibecheck/report.md following templates/report.md.

    line 116
  9. Distinctive:

    Keep the chat summary short:

    line 122

“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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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 the fix skill, 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 it UNVERIFIED and 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).

ModeCoversUse it
quickSecrets, database access, every critical leadBefore every deploy, in about 2 minutes
full (default)All 8 areasBefore launch, and after big AI coding sessions
securityAreas 1-6Security only
launchAreas 7-8, plus any criticalThe 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) or local (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, use public, 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:

DetectedRead
Supabasereferences/stacks/supabase.md
Firebasereferences/stacks/firebase.md
Next.jsreferences/stacks/nextjs.md
Stripe, Lemon Squeezy, Paddle, Midtrans, Xenditreferences/stacks/payments.md
OpenAI, Anthropic, Gemini, any LLMreferences/stacks/ai-apis.md
Express, Hono, Fastify, Nest, FastAPI, Flask, Djangoreferences/stacks/backends.md
Expo, React Native, Flutterreferences/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:

  1. 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?
  2. 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 UNVERIFIED and give the owner the exact checks needed.
  3. Self-upgrades. Can a user make themselves admin, premium, or give themselves credits? Look for user-writable role, is_admin, plan, credits columns, premium flags kept on the client, and features unlocked by visiting a success URL.
  4. 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?
  5. 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 < 50

For 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:

ExposureWhat counts
publicEverything.
internalEverything except launch basics (area 8). Insiders and stolen laptops are real attackers, so missing auth still counts.
localSecrets 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

  1. Create .vibecheck/ containing a .gitignore with 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.
  2. .gitignore only 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 Dockerfile that copies the whole folder (COPY . .): add .vibecheck to .dockerignore
    • an npm package that isn't "private": true: keep it out with the files field 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.

  3. If .vibecheck/report.md exists, rename it to .vibecheck/report.prev.md.
  4. Write .vibecheck/report.md following 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 local or internal app, end with the short list of what must change before more people can reach it.
  • 🟢 GO in full mode 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). [![vibecheck: GO 92/100](https://img.shields.io/badge/vibecheck-GO%2092%2F100-brightgreen)](https://github.com/ribato22/vibecheck)

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.