How EpicScan works

EpicScan reads your changed code the way a careful reviewer would: first it understands the file, then it hunts for bugs, then it argues with itself about every finding before reporting it.

The pipeline

  1. 1 · Context

    A model writes a security briefing for each file: what it does, where untrusted data enters, which buffers exist and how big they are.

  2. 2 · Scan

    Primed with that briefing, the model checks the code function by function and records structured findings.

  3. 3 · Skeptical triage

    Every finding of medium severity or above is challenged over several rounds (5 by default). The reviewer can search the codebase to confirm or refute a claimed defence.

  4. 4 · Verdict

    An arbiter reads every round and marks the finding valid or invalid. The confidence score is the share of rounds that said valid.

Results are saved as Markdown for people and JSON for tools.

Quick start: the CLI

Live

You need Python 3.8 or newer and an API key for the model you use. No packages to install.

git clone https://github.com/Huge/nano-analyzer.git
cd nano-analyzer
python3 scan.py --help

Scan a file or a whole folder:

python3 scan.py ./src/

Useful options:

OptionDefaultWhat it does
--modelgpt-5.4-nanoModel used for every stage
--triage-rounds5Rounds of skeptical review per finding
--min-confidence0.0Show only findings above this confidence (0.0 to 1.0)
--repo-dirautoRepository root the reviewer may search
--output-dir~/nano-analyzer-results/<timestamp>/Where results are written

The full list of options is in the README.

Run it in your CI

Live

Any CI job that can run Python can run the scanner. Store your model API key as a protected CI variable and keep the results as a job artifact. A GitLab example:

security-scan:
  image: python:3.12
  script:
    - git clone https://github.com/Huge/nano-analyzer.git /tmp/nano-analyzer
    - python3 /tmp/nano-analyzer/scan.py ./src --output-dir scan-results
  artifacts:
    paths:
      - scan-results/

A ready GitLab merge-request job and a GitHub Action are in private testing. Early-access members get them first.

Command syntax

Roadmap

Comment on any pull or merge request:

@epicscan €<amount> [--max-delay <time>] [--depth <level>]
PartExampleMeaning
€<amount>€0.50Most you will spend on this scan, in euros
--max-delay5mFinish by then; if time runs out, post a partial report. Accepts 90s, 5m, 1h
--depthdeepquick, standard (default) or deep: how the budget is spent

EpicScan plans the depth to fit both limits and reports what it covered and what it cost. Try it in the simulator.

What works today

FeatureStatus
Open-source CLI scannerLive
Running the scanner in your own CILive
GitLab merge-request jobIn testing
GitHub ActionIn testing
Your own model endpointIn testing
Hosted scans on our Mac Studio machinesIn testing
@epicscan comment commandRoadmap
Budget and deadline capsRoadmap
Prepaid creditsRoadmap
Skipping unchanged files on re-scanRoadmap

Limits you should know

  • Tuned for C and C++ memory-safety bugs; other languages give weaker results.
  • Each file is analysed on its own, so bugs that span several files may be missed.
  • Logic bugs, race conditions, crypto and authentication flaws are often missed.
  • A clean scan does not mean the code is safe.
Request early access