πŸŽ‰ All member features free until June 30, 2026 β€” Star the repo and sign in. No credit card. No catch.  Β·  ⭐ Sign in with GitHub β†’
πŸ†• v4.5 β€” ZIP Scan Β· GitHub Login Β· 51 patterns Β· 9 languages

AI writes the bugs.
AINAScan catches them.

Deterministic AST analysis β€” no LLM, no false surprises. Precision 100%, Recall 100%, F1 100% on 90-case benchmark.

terminal β€” ~/myproject
β€”
total scans
β€”
findings caught
0
patterns
0
languages
100%
F1 score (90 cases)
The problem

AI-generated code has repeating patterns of failure

Claude, GPT, and Cursor reliably produce these bugs. They look correct on the surface. They break in production.

BLOCK MISSING_WRITE
# AI writes this β€” looks complete
def save_user(name, email):
    user = {"name": name, "email": email}
    return {"status": "saved"}
# No INSERT. Data silently vanishes.
BLOCK SQL_INJECTION_RISK
# Copy-pasted from every tutorial
def get_user(user_id):
    return db.execute(
        f"SELECT * FROM users
         WHERE id='{user_id}'"
    )
WARN FAKE_ASYNC
# async keyword, zero benefit
async def fetch_data(url: str):
    # Blocks the event loop
    return requests.get(url).json()
BLOCK COMMAND_INJECTION
# AI uses shell=True constantly
def run(cmd):
    subprocess.run(
        f"process {cmd}",
        shell=True  # ← exploit here
    )

These exact patterns appear repeatedly in AI-generated codebases. Semgrep missed them all.


Try it now

Scan your file

Free beta key included. No signup. Supports .py .js .ts .go .java .kt .php .rb .c .cpp

πŸ” File Scanner Free Β· 50 files/day
πŸ“
Drop your file here or click to upload
.py .js .ts .go .java .php .rb .kt .c .cpp
Analyzing AST…
πŸ“‹ Full Pattern Checklist

    Members Only

    Member-Only Features

    Star this repo on GitHub and sign in to unlock all features for free.

    πŸ“¦
    ZIP / Folder Scan πŸ”’
    Upload your entire project as a ZIP. All source files scanned in parallel.
    Member only β€” up to 200 files per ZIP
    πŸ“„
    7-Section Auto Docs
    Auto-generates project structure, function list, dependencies, Mermaid diagram, API endpoints, DB schema, and validation status as Markdown.
    πŸ”
    Scan History Dedup
    Re-scanning the same file updates the previous result β€” no duplicate entries, clean history.
    ⚑
    Dead Code / Dead Table
    Detects functions never called from other files and DB tables unreferenced in any query.
    ⭐ Star on GitHub to Join Free β†’
    You must star the repository to activate your account

    New in v4.0

    ZIP / Folder Scan πŸ”’

    Upload a ZIP of your whole project. AINAScan checks every source file in parallel β€” up to 200 files.
    πŸ”’ Member only. ⭐ Star the repo & sign in to unlock ZIP scan.

    πŸ“¦
    πŸ“‚ 폴더λ₯Ό λ“œλž˜κ·Έν•˜κ±°λ‚˜ .zip νŒŒμΌμ„ μ˜¬λ €μ£Όμ„Έμš”

    πŸ”’ Members Only

    7-Section Auto Documentation

    Upload a ZIP and get a 7-section Markdown document instantly β€” pure AST analysis, no LLM.

    β‘  Project Structure
    File tree + fn/class/API counts
    β‘‘ Function Reference
    name Β· line Β· params Β· return type
    β‘’ Dependencies
    requirements.txt parsing
    β‘£ Mermaid Diagram
    Module dependency graph
    β‘€ API Endpoints
    FastAPI/Flask auto-detected
    β‘₯ DB Schema
    SQLAlchemy Column extraction
    ⑦ Validation Status
    BLOCK/WARN summary per file

    This feature requires membership. Star the repo on GitHub and sign in to unlock instantly.

    ⭐ Star on GitHub to Join Free

    Detection

    48 patterns across 9 languages

    Security vulnerabilities + vibe-coding structural bugs. BLOCK = must fix before production. WARN = review recommended.

    SECURITY β€” BLOCK (20 patterns)

    πŸ’‰SQL_INJECTION_RISKBLOCK
    πŸ’»COMMAND_INJECTIONBLOCK
    πŸ“‚PATH_TRAVERSALBLOCK
    🌐SSRF_RISKBLOCK
    ⚑EVAL_EXEC_RISKBLOCK
    πŸ”‘HARDCODED_SECRETBLOCK
    πŸ€–LLM_OUTPUT_INJECTIONBLOCK
    πŸ€–LLM_SSRFBLOCK
    πŸ€–PROMPT_SQL_INJECTIONBLOCK
    🎨TEMPLATE_INJECTIONBLOCK
    πŸ“¦INSECURE_DESERIALIZATIONBLOCK
    🌍XSS_RISKBLOCK
    β†ͺ️OPEN_REDIRECTBLOCK
    πŸ›DEBUG_MODE_RISKBLOCK
    🌐CORS_WILDCARDBLOCK
    🚧BOUNDARY_MISSINGBLOCK
    πŸ—ƒοΈDB_SCHEMA_DRIFTBLOCK
    ⚠️TYPE_UNSAFE_ACCESSBLOCK
    πŸ”„CONSTANT_CONDITIONBLOCK
    βž—DIVISION_BY_ZERO_RISKBLOCK

    VIBE-CODING STRUCTURAL β€” BLOCK (9 patterns)

    πŸ’€STUB_SKELETONBLOCK
    🎭MOCK_PATTERNBLOCK
    πŸ“‹HARDCODED_TABLEBLOCK
    πŸ”€TRIVIAL_IF_CHAINBLOCK
    ☠️DEAD_DB_RESULTBLOCK
    πŸ”ŒINPUT_OUTPUT_DISCONNECTEDBLOCK
    πŸ”’CONST_SQL_NO_PARAMBLOCK
    ↩️UNIFORM_RETURNBLOCK
    πŸ”€ENCODING_CORRUPTIONBLOCK

    CODE QUALITY β€” WARN (19 patterns)

    🚫FAKE_ASYNCWARN
    πŸ’ΎMISSING_WRITEWARN
    πŸ—‘οΈDEAD_CALL_RESULTWARN
    πŸ™ˆEMPTY_EXCEPTWARN
    πŸ”’MAGIC_NUMBERWARN
    πŸ“MUTABLE_DEFAULTWARN
    πŸ”WEAK_CRYPTOWARN
    🎲INSECURE_RANDOMWARN
    🀫SILENT_FAILUREWARN
    ∞RECURSIVE_WITHOUT_BASEWARN
    ⚰️DEAD_BRANCHWARN
    πŸ”„INCONSISTENT_RETURNWARN
    πŸ“„MISSING_PAGINATIONWARN
    πŸ”ALIASED_STUBWARN
    βœ…TRIVIAL_ASSERTWARN
    πŸ”§PARAMETER_MUTATIONWARN
    πŸ‘»PARAM_INTENT_IGNOREDWARN
    πŸ”—SHORT_PASSTHROUGHWARN
    ⚠️BARE_EXCEPTWARN

    Comparison

    What others miss

    Compared against common static analysis tools. Synthetic test cases based on real AI-generated bug patterns.

    FindingAINAScanSemgrep (free)BanditClaude inline
    COMMAND_INJECTION (shell=True + user input)βœ… BLOCK❌❌❌
    COMMAND_INJECTION (f-string in subprocess)βœ… BLOCK❌❌❌
    PATH_TRAVERSAL (open with user path)βœ… BLOCK⚠️ partial❌❌
    MISSING_WRITE (no INSERT in save fn)βœ… BLOCK❌❌❌
    FAKE_ASYNC (blocking event loop)βœ… WARN❌❌❌
    LLM_OUTPUT_INJECTION (AI output β†’ eval)βœ… BLOCK❌❌❌

    Live stats

    Pattern leaderboard

    Most commonly detected patterns across all real-world scans. Updated live.

    #PatternFrequencyCount
    Loading…

    API

    Integrate in 30 seconds

    REST API. Free key included. Works with any language that can do HTTP.

    bash
    # Scan a file (free β€” no signup)
    curl -X POST https://pleasing-transformation-production-90c2.up.railway.app/v1/scan \
      -H "X-API-Key: vg_free_test" \
      -F "file=@your_file.py"
    
    # Get auto-fix suggestions
    curl -X POST https://pleasing-transformation-production-90c2.up.railway.app/v1/fix \
      -H "X-API-Key: vg_free_test" \
      -F "file=@your_file.py"
    
    # Install CLI
    pip install aina-scan
    aina-scan config --key vg_free_test
    aina-scan scan your_file.py
    Trust & Privacy

    We never see your code.

    This isn't a policy promise β€” it's the architecture. Here's exactly what happens to your files.

    πŸ”¬
    Analyzed in memory, never saved
    Your file is read into RAM, scanned by our AST engine, and the buffer is released immediately. No file is written to permanent storage. Python temp files used during analysis are deleted within the same request lifecycle.
    πŸ—„οΈ
    What we actually store
    We store: filename (not path), issue type (e.g. COMMAND_INJECTION), line number, severity.

    We never store: source code, function bodies, variable values, file contents, or any data that can reconstruct your code.
    πŸ“‹
    Scan history is yours
    Scan history (filename, verdict, timestamp) is stored per API key in server memory β€” it resets on redeploy. We don't persist scan results to a database. Member login stores only your GitHub public profile (login, avatar) via OAuth.
    βœ…
    Verifiable β€” not just a promise
    The api.py source is the entire backend. You can scan it with AINAScan itself (we do). No hidden services, no data pipelines, no analytics SDKs. SQLite schema: fp_store (FP reports), users (GitHub profile), vg_scan_log (vuln_type + 0/1 flag only).
    Member ZIP / Folder Scan limits:  20 scans/day Β· 500 MB total upload/day Β· resets at midnight UTC.
    These limits exist to prevent abuse β€” not to monetize your usage. Normal development workflows (scan once per PR, a few times per sprint) will never hit them.

    Free period: All member features are free until June 30, 2026. After that, ZIP scan and auto-docs will require a Pro subscription ($19/mo). Single-file scan stays free forever.