
A minimal LLM-powered zero-day vulnerability scanner by AISLE.
A minimal LLM-powered zero-day vulnerability scanner by AISLE.

Research prototype for demonstration purposes. This is a simple, single-file harness that is able to detect real zero-day vulnerabilities. Note that it is a prototype, biased towards C/C++ memory safety bugs, and will produce false positives. We are sharing it as-is in the spirit of open research — expect sharp corners.
Nano-analyzer is a simple single-file Python scanner that sends source code through a three-stage LLM pipeline:
Results are saved as Markdown and JSON files for human review.
This is a v0.1 prototype. Please keep the following in mind:
rg) for triage grep lookupscsearch/cindex) for faster grep on large reposgit clone https://github.com/weareaisle/nano-analyzer.git
cd nano-analyzer
# No dependency installation needed. Run directly:
python3 scan.py --help
Set your API key as an environment variable:
# For OpenAI models (model names without a slash, e.g. "gpt-5.4-nano"):
export OPENAI_API_KEY=sk-...
# For OpenRouter models (model names with a slash, e.g. "qwen/qwen3-32b"):
export OPENROUTER_API_KEY=sk-or-...
The scanner determines which key to use based on the model name: if it contains a /, it routes through OpenRouter; otherwise it uses the OpenAI API directly.
# Scan a single file
python3 scan.py ./path/to/file.c
# Scan a directory recursively
python3 scan.py ./path/to/src/
# Use a different model
python3 scan.py ./src --model gpt-5.4
# Control parallelism
python3 scan.py ./src --parallel 30
# Point triage grep at the full repo root (useful when scanning a subdirectory)
python3 scan.py ./lib/crypto/ --repo-dir ./
# Only surface high-confidence findings
python3 scan.py ./src --min-confidence 0.7
# More triage rounds for higher accuracy (default: 5)
python3 scan.py ./src --triage-rounds 7
Results are saved to ~/nano-analyzer-results/<timestamp>/ (or --output-dir):
<timestamp>/
├── summary.json # machine-readable scan summary
├── summary.md # human-readable scan summary
├── <filename>.md # raw scanner output per file
├── <filename>.context.md # context briefing per file
├── <filename>.json # full result data per file
├── triages/ # detailed triage reasoning
│ └── T0001_<file>_<title>.md
├── findings/ # findings that survived triage
│ └── VULN-001_<file>.md
├── triage.json # all triage verdicts
└── triage_survivors.md # summary of validated findings
When a scan finds a medium-or-above severity issue, the triage pipeline kicks in:
Findings that survive triage are written to the findings/ directory with full reasoning chains.
This tool is a research prototype. It is not a replacement for professional security audits, manual code review, or established static analysis tools. Do not rely on it as your sole security assessment. Use at your own risk.
Apache License 2.0
| Flag | Default | Description |
|---|
path | (required) | File or directory to scan |
--model | gpt-5.4-nano | Model for all stages (context, scan, triage) |
--parallel | 50 | Max concurrent scan API calls |
--triage-threshold | medium | Triage findings at or above this severity |
--triage-rounds | 5 | Triage rounds per finding |
--triage-parallel | 50 | Max concurrent triage API calls |
--max-connections | parallel + triage-parallel | Total API call cap |
--min-confidence | 0.0 | Only show findings above this confidence (0.0–1.0) |
--project | directory name | Project name used in triage prompts |
--repo-dir | auto | Repo root for grep lookups (auto: parent dir for files, scan dir for folders) |
--output-dir | ~/nano-analyzer-results/<timestamp>/ | Where to save results |
--max-chars | 200,000 | Skip files larger than this |
--verbose-triage | off | Show per-round triage progress |