Penthera

io.github.danoszzPublished by GitHub account danoszzv2.3.2Updated Nov 7, 2026

Offline, rule-based security checks for your repo, dependencies, AI agent config and local app.

VerifiedSTDIODesktop onlyDeveloper ToolsSecurity & Monitoring

Overview

AI-generated overview

Offline, rule-based security scanner that gives an AI assistant six read-only tools to check a repo, dependencies, AI tooling and a URL.

What you can do
  • Scan a repository for routes, trust boundaries, code-execution sinks and leaked secrets
  • Check npm and Python dependencies for capabilities, lookalike names and licenses
  • Audit AI tooling such as skills, MCP servers, hooks and plugins for hidden instructions and over-broad permissions
  • Look up runtime advisories for PHP, nginx, Apache, Node.js, Python, OpenSSL and MongoDB versions
  • Explain a finding and run a passive URL scan of a site
When to use it
Useful when you want an assistant to run a quick security review of your own project, vet a package before installing it, or check the configuration of your AI coding tools, without sending code to a cloud service.
Requirements
Runs as a local process via npx, so Node.js 22 or later is needed. No account, API key or environment variable is declared. The README states it works offline and makes no requests past loopback during its benchmark.
Before you install
The README says some modes send attack payloads to a target URL after confirmation; scan only systems you own or are authorized to test. The fix loop can apply changes on a local branch, so review them. Findings are rule-based and the README says it does not replace a human pentester.

Installation

In SourceWeft

  1. Open Penthera in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[Your elite cyber security agent. Audit your app/site/code before you publish to protect yourself, and your users. Free, open source, offline. Penthera.]



Penthera: your open-source cyber security agent

The security review you never had time for. Offline, rule-based, and you can verify every finding yourself.

penthera.org: check your live site in a few seconds. Passive, nothing stored.

Daily notes from Penthera: x.com/penthera_org

Who builds it: Daan van der Zwaag, part-time and in the open.

How it compares: next to Snyk, Socket, Semgrep, ZAP and GitHub.

132 readable rules · 6 read-only MCP tools · 0 runtime dependencies · 0 requests past loopback in the benchmark · MIT, no telemetry


[npm] [npm downloads] [GitHub stars] [node] [license] [CI] [OpenSSF Scorecard] [Socket]


[A 12-second loop: npx penthera sets up a project, an offline scan runs in the terminal, the dashboard shows the verdict in Simple mode and the triage matrix in Advanced mode, and a fix is approved]




What it is

Penthera checks your app, its dependencies and your AI coding tools on your own machine. It fixes what it can, with your approval. Every finding comes from a rule you can read, with its evidence at file:line. A model may propose; a rule decides.

It is also an open R&D project. We measure every check in public and publish the results, good or bad, so you can see how far to trust it.

It finds known classes of problems, not novel ones. It does not replace a human pentester.

Start in 30 seconds

You need Node.js 22 or later. No install, no account.

Building with Cursor, Claude Code, Codex, VS Code, Windsurf, Gemini CLI, Zed, JetBrains or Kiro, or an app builder such as Lovable, Bolt, Base44, Replit or v0? Penthera in your coding tool has the setup for each.

In your terminal. Run this in your project folder:

bash
npx penthera

It detects your setup offline, asks what to check, and gives you a grade per area and the three things to fix first. It scans your running app only after you confirm the app is yours. Nothing is committed or pushed (guided start).

In your coding agent. Pick yours, then ask "scan my app for security issues". The MCP lines pin the version.

AgentRun this
Claude Code, plugin (skill only, runs the CLI)claude plugin marketplace add danoszz/penthera, then claude plugin install penthera@penthera
Claude Code, MCP server onlyclaude mcp add penthera -- npx -y [email protected] mcp
Codexcodex mcp add penthera -- npx -y [email protected] mcp
GitHub Copilot CLIcopilot plugin marketplace add danoszz/penthera, then copilot plugin install penthera@penthera
GitHub Copilot in VS Codethe code --add-mcp line in mcp.md
Gemini CLIgemini extensions install https://github.com/danoszz/penthera
Cursor, Windsurfthe JSON in mcp.md
Any agent that reads skillsnpx skills add danoszz/penthera

The skill tells your agent how to run Penthera; the MCP server gives it six read-only tools. More routes: skill.md, mcp.md.

To run it in a container: docker build -t penthera . && docker run --rm penthera https://your-app.example.

Public benchmarks

We test Penthera on public datasets that other people built, next to the free open-source tools that do the same job, scored the same way. Each dataset was split in half before we looked: we improved Penthera on one half and scored it once on the other, sealed half. The rules for scoring and ranking were written down before that run (protocol).

BenchmarkScorePenthera 1.9.0Penthera 2.0.0Rank among free toolsBest other free tool
Leaked secrets (Samsung CredData)F10.180.742nd of 10deepsecrets 0.78
Malicious npm packages (DataDog)caught minus false alarms0.570.711st of 6, tied 1st to 3rd ⁴malcontent 0.63
Malicious PyPI packages (DataDog)caught minus false alarms0.740.821st of 8, tied 1st to 3rd ⁴GuardDog 0.74
Injection bugs in JS libraries (SecBench.js)found in the right file0.160.701st of 8, tied 1st to 4th ⁴odgen 0.68

⁴ A tied range is a rank interval: the range Penthera's rank fell in, in 95% of 10,000 bootstrap redraws of each tool's counts (on SecBench.js, of its 64 test bugs). Penthera alone came out first in 76% of the redraws on npm, 82% on PyPI and 60% on SecBench.js. Exploratory: computed after the registered ranking.

Leaked secrets: 2nd by F1, the registered score; 1st by F0.5, which weighs precision more (0.82 against deepsecrets 0.80); 2nd by F2, which weighs recall more (0.68 against deepsecrets 0.77).

Some ranked tools are barely in the contest. Other ranked tools scoring below 0.10: 1 of 9 on CredData (trufflehog); 3 of 5 on npm (clamav, yara, ossgadget); 4 of 7 on PyPI (clamav, ossgadget, bandit4mal, aura); 1 of 7 on SecBench.js (njsscan).

If 1 package in 1,000 were malicious, the share of Penthera's malware flags that would be right: npm, about 2.7% at the top of the false-alarm interval (it raised no false alarm on that sample); PyPI, about 1.6% at the measured false-alarm rate, 0.9% at the top of its interval. Exploratory, like the rank intervals.

Every tool, every number (95% intervals)
Leaked secrets (Samsung CredData)
RankToolPrecisionRecallF1
1deepsecrets 2.2.00.80 [0.79, 0.82]0.77 [0.75, 0.78]0.78
2Penthera 2.0.00.89 [0.87, 0.90]0.64 [0.62, 0.66]0.74
3noseyparker 0.24.00.76 [0.74, 0.78]0.62 [0.60, 0.64]0.69
4gitleaks 8.30.10.85 [0.84, 0.86]0.37 [0.35, 0.39]0.52
5ripsecrets 0.1.110.65 [0.64, 0.67]0.35 [0.33, 0.37]0.45
6kingfisher 2.14.00.96 [0.94, 0.97]0.29 [0.28, 0.31]0.45
7detect-secrets 1.5.00.30 [0.29, 0.31]0.53 [0.51, 0.56]0.38
8secretlint 13.0.70.92 [0.89, 0.94]0.19 [0.18, 0.21]0.32
9whispers 2.4.00.46 [0.43, 0.50]0.09 [0.08, 0.10]0.15
10trufflehog 3.99.30.40 [0.35, 0.45]0.05 [0.05, 0.07]0.10
–credsweeper 1.19.4 ¹1.00 [1.00, 1.00]0.98 [0.98, 0.99]0.99
–Penthera 1.9.00.56 [0.51, 0.60]0.10 [0.09, 0.12]0.18
Free tools, mean / median0.68 / 0.760.36 / 0.350.43 / 0.45
Malicious npm packages (DataDog)
RankToolCaughtFalse alarms on benign packagesCaught minus false alarms
1Penthera 2.0.00.71 [0.62, 0.78] (79/112)0.00 [0.00, 0.02] (0/150)0.71
2malcontent 1.27.1 (bf280ad6), yara-x 1.21.00.68 [0.59, 0.76] (76/112)0.05 [0.03, 0.10] (8/150)0.63
3GuardDog 3.2.0 ²0.62 [0.52, 0.70] (69/112)0.03 [0.01, 0.07] (4/150)0.59
4ossgadget 0.2.20 (414b6a59)0.94 [0.88, 0.97] (105/112)0.89 [0.83, 0.93] (133/150)0.05
5clamav 1.5.40.01 [0.00, 0.05] (1/112)0.00 [0.00, 0.02] (0/150)0.01
6yara yara-python 4.5.4 (YARA 4.5), YARA-Forge core 202610040.00 [0.00, 0.03] (0/112)0.00 [0.00, 0.02] (0/150)0.00
–osv-scanner 2.6.0 ³0.90 [0.83, 0.94] (101/112)0.01 [0.00, 0.04] (1/150)0.90
–Penthera 1.9.00.57 [0.48, 0.66] (64/112)0.00 [0.00, 0.02] (0/150)0.57
Malicious PyPI packages (DataDog)
RankToolCaughtFalse alarms on benign packagesCaught minus false alarms
1Penthera 2.0.00.87 [0.81, 0.92] (131/150)0.05 [0.03, 0.10] (8/150)0.82
2GuardDog 3.2.0 ²0.85 [0.79, 0.90] (128/150)0.11 [0.07, 0.17] (16/147)0.74
3malcontent 1.27.1 (bf280ad6), yara-x 1.21.00.93 [0.87, 0.96] (139/150)0.22 [0.16, 0.29] (32/147)0.71
4yara yara-python 4.5.4 (YARA 4.5), YARA-Forge core 202610040.25 [0.18, 0.32] (37/150)0.00 [0.00, 0.03] (0/147)0.25
5clamav 1.5.40.00 [0.00, 0.02] (0/150)0.00 [0.00, 0.03] (0/147)0.00
6ossgadget 0.2.20 (414b6a59)0.77 [0.70, 0.83] (116/150)0.97 [0.93, 0.99] (143/147)-0.20
7aura 2.1 (SourceCode-AI/aura b40e6dd2)0.59 [0.51, 0.67] (88/149)0.83 [0.75, 0.88] (100/121)-0.24
8bandit4mal lyvd/bandit4mal 03ba95f3 (bandit 1.6.3 fork)0.59 [0.51, 0.67] (89/150)0.84 [0.78, 0.89] (124/147)-0.25
–Penthera 1.9.00.83 [0.77, 0.88] (125/150)0.09 [0.06, 0.15] (14/150)0.74
–osv-scanner 2.6.0 ³0.74 [0.66, 0.80] (110/149)0.00 [0.00, 0.03] (0/147)0.74
Injection bugs in JavaScript libraries (SecBench.js)
RankToolCommand injectionCode injectionBoth
1Penthera 2.0.035/4710/170.70 [0.58, 0.80]
2odgen c5157ee36/466/160.68 [0.55, 0.78]
3codeql 2.27.2 (used under the GitHub CodeQL terms, for research on open-source code)37/474/170.64 [0.52, 0.75]
4eslint-plugin-security 4.2.032/479/170.64 [0.52, 0.75]
5semgrep 1.180.015/479/170.38 [0.27, 0.50]
6graudit 849d7c712/4710/170.34 [0.24, 0.47]
7bearer 2.1.114/470/170.22 [0.14, 0.33]
8njsscan 1.0.12/451/150.05 [0.02, 0.14]
–semgrep, every file 1.180.0 (another setting of semgrep, not ranked)16/479/170.39 [0.28, 0.51]
–Penthera 1.9.00/4710/170.16 [0.09, 0.26]

A rank is shown only where at least 5 other free tools were measured; otherwise "–". The rank column orders tools by score, and close scores can swap places. Penthera's 95% rank interval (bootstrap, exploratory): 2nd on CredData, 1st to 3rd on npm, 1st to 3rd on PyPI, 1st to 4th on SecBench.js.

Paid tools (GitGuardian, Socket, Snyk, Phylum, Semgrep Pro) publish no results on these benchmarks, so they are not in the tables.

Published elsewhere, on other datasets (context, not comparable):

¹ Not ranked: trained on this dataset by its authors. ² Found most samples in this dataset, so its rate is inflated by construction. ³ Not ranked: a lookup of already-reported packages, not detection.

What these numbers do not show: a benchmark is not your code. CredData replaces real secrets with look-alikes, which favors pattern rules like ours over tools that verify keys; the free tools ran on their defaults while Penthera was tuned on the other half; GuardDog helped build the malware dataset. Accuracy on real projects is experiment E1. To reproduce every table, get the sealed split with npm run bench:public -- --fetch-split, then run npm run bench:public -- --split test --final and npm run bench:public -- --competitors --split test --final.

What it does

mermaid
flowchart LR    U["You or your AI agent"] --> P(("Penthera<br/>on your machine"))
    P --> APP["Your app<br/>URL scan, repo scan<br/>runtime advisories"]    P --> DEP["Your dependencies<br/>capabilities, install firewall<br/>typosquats, upgrade diff"]    P --> AI["Your AI tooling<br/>skills, MCP, hooks<br/>plugins, rule files"]
    APP --> F[["Findings<br/>severity, confidence<br/>evidence at file:line"]]    DEP --> F    AI --> F
    F --> FIX["Fix loop<br/>asks first, local branch<br/>cannot edit its own tests"]    FIX -. "re-scan proves it" .-> F    F --> R["Reports and dashboard<br/>terminal, Markdown, SARIF<br/>penthera ui, MCP tools"]    F --> E["Evidence<br/>signed bundle<br/>NIS2 and CRA drafts"]
    classDef core fill:#0000ed,stroke:#0000ed,color:#ffffff    classDef box fill:#ffffff,stroke:#000000,color:#000000    class P core    class U,APP,DEP,AI,F,FIX,R,E box

For the full black-box and white-box view, see Under the hood.

Before you deploy

JobWhat Penthera doesCommand
Test the appScans your localhost or preview URL (TLS, headers, CORS, cookies, auth, JWT, IDOR, OAuth, OpenAPI; injection and fuzzing only when you ask, after a confirmation) and your repository (routes, trust boundaries, code-execution sinks, secrets including AI keys)penthera <url> --repo .
Check your runtimesWhether the PHP, nginx, Apache, Node.js, Python, OpenSSL or MongoDB version you run is affected by a known advisory, from the signed advisories packRuntime advisories
Fix and verifyApplies deterministic fix recipes on a local branch, re-scans to prove they worked, and remembers the result. Never pushespenthera agent --loop
Block it at commit timeStops secrets, risky agent config and dependency changes before they are committedpenthera hook install

What you build with

JobWhat Penthera doesCommand
Vet dependenciesShows what every npm and Python package can do (install scripts, shell, network, env, obfuscation), what an upgrade added, lookalike names and licensespenthera deps --base main
Guard installsShows what a new package brings before any install script runs, and stops it under your policypenthera install <pkg>
Review pull requestsComments the dependency capability diff on every PR that touches the lockfileGitHub Action
Audit your AI toolingChecks skills, MCP servers, hooks, plugins and rule files for hidden instructions, unpinned servers, over-broad permissions and silent updatespenthera agents --home
Work from your agentSix read-only MCP tools: scan the repo, check dependencies, audit AI tooling, runtime advisories, explain a finding, a passive URL scanpenthera mcp

After you ship

JobWhat Penthera doesCommand
Report and proveWrites reports for developers, owners and auditors; a hashed, signable evidence bundle; NIS2 and CRA readiness reports and draftspenthera <url> --audience auditor --evidence out/
See it allA local dashboard on 127.0.0.1. Simple mode for non-programmers: a one-sentence verdict, problems in plain words, and a check-and-fix mode with Apply, Skip and Stop per change. Advanced adds dependencies, AI tooling, history and evidencepenthera ui
Keep watchingScheduled checks of production for drift: certificates, headers, new endpoints, keys in bundles, new CVEs in your SBOMon the roadmap

Every finding carries a severity, a confidence label (confirmed, likely, potential, needs-human-review), its evidence and the research behind it. Reports come out as Markdown, JSON and SARIF for GitHub code scanning. Exit code 1 means critical or high findings. Every command and flag is in docs/commands/. Compliance output is readiness tooling, not a certification and not legal advice.

AI mode (opt-in). penthera --repo . --ai lets a local model propose problems no rule describes. Penthera checks each proposal with its rules, and anything unconfirmed is labelled "model-proposed, unverified" and never fails CI. Whether it finds more than the rules alone is not measured yet (AI mode).

How far each part has been taken

PartStatus
Scans: URL, repo, dependencies, AI tooling, installs, pre-commit hookStable: in every release since 1.x, covered by the tests and the release gate
Fix loop and local dashboard (penthera ui)Stable; the dashboard was redesigned in 1.9.0
MCP server, Agent Skill, Claude Code pluginStable, since 1.9.0
Gemini CLI extensionStable: it installs the newest release (2.3.2)
Evidence bundles, NIS2 and CRA draftsStable as readiness tooling, not a certification
AI mode (--ai)Experimental: whether it finds more than the rules alone is not measured yet (AI mode)
Live check on penthera.orgBeta: passive only, terms

Under the hood

For developers and security specialists: the diagram above, as the code runs it. Black box tests the running app over HTTP. White box reads the code and config. Opt-in items say so. The limits of each part, such as what IDOR/BOLA or taint-lite can and cannot tell, are in METHODOLOGY.md.

mermaid
flowchart LR    APP["Your running app<br/>penthera URL"]
    subgraph DEF["Default: no attack payloads"]        B1["Transport and headers<br/>TLS certificate, ciphers<br/>security headers, CSP<br/>cookie flags, CORS"]        B2["Discovery<br/>wordlist routes<br/>OpenAPI spec<br/>hidden parameters<br/>exposed files, templates"]        B3["Auth<br/>one invalid login POST<br/>JWT, with --auth-bearer<br/>OAuth redirect<br/>client-side auth<br/>IDOR/BOLA: human review"]        B4["Versions and leaks<br/>JS libraries, Retire.js<br/>keys in JS bundles<br/>server version advisories<br/>SPF and DMARC"]    end
    subgraph OPT["Opt-in"]        B5["No payloads<br/>--recon: crt.sh,<br/>Wayback, OTX<br/>--templates: Nuclei YAML"]        G{{"Gate<br/>type the hostname back<br/>or --confirm-target<br/>10 requests a second"}}        B6["Active<br/>--deep: SQLi, SSTI,<br/>SSRF, XSS, CMDi,<br/>open redirect,<br/>login burst<br/>--fuzz, --adaptive"]    end
    APP --> B1 & B2 & B3 & B4 & B5    APP --> G --> B6    B1 & B2 & B3 & B4 & B5 & B6 --> F[["Findings"]]
    classDef core fill:#0000ed,stroke:#0000ed,color:#ffffff    classDef box fill:#ffffff,stroke:#000000,color:#000000    classDef gate fill:#ffffff,stroke:#0000ed,color:#000000,stroke-width:2px    class F core    class APP,B1,B2,B3,B4,B5,B6 box    class G gate    style DEF fill:none,stroke:#0000ed,stroke-width:2px    style OPT fill:none,stroke:#0000ed,stroke-width:2px,stroke-dasharray:6 4
mermaid
flowchart LR    REPO["Your code<br/>and config"]
    subgraph RS["penthera --repo ."]        W1["Secrets<br/>provider key formats<br/>.gitignore aware<br/>code, config, HCL,<br/>notebooks"]        W2["Routes and boundaries<br/>Next.js, Express,<br/>Hono, Fastify<br/>auth per route<br/>risky patterns"]        W3["Code sinks, taint-lite<br/>eval, new Function,<br/>node:vm, shell exec<br/>with request data<br/>one file, no call graph"]        W4["Library mode<br/>exported parameters<br/>count as untrusted"]        W5["CI and runtimes<br/>Actions: pwn request,<br/>script injection,<br/>unpinned actions<br/>runtime pin advisories"]    end
    subgraph OWN["Their own commands"]        W6["penthera deps<br/>npm, requirements,<br/>poetry, uv, Pipfile,<br/>pdm, .venv<br/>capabilities, IOC packs<br/>typosquats, licenses<br/>upgrade diff"]        W7["penthera agents<br/>MCP servers, hooks<br/>skills, plugins<br/>permissions, rule files<br/>hidden content<br/>penthera.lock pins"]        W8["Before code lands<br/>penthera install<br/>penthera hook"]    end
    REPO --> W1 & W2 & W3 & W4 & W5 & W6 & W7 & W8    W1 & W2 & W3 & W4 & W5 & W6 & W7 & W8 --> F[["Findings"]]
    classDef core fill:#0000ed,stroke:#0000ed,color:#ffffff    classDef box fill:#ffffff,stroke:#000000,color:#000000    class F core    class REPO,W1,W2,W3,W4,W5,W6,W7,W8 box    style RS fill:none,stroke:#0000ed,stroke-width:2px    style OWN fill:none,stroke:#0000ed,stroke-width:2px
mermaid
flowchart LR    subgraph ENG["Engine: rules decide"]        R["Signed rule packs<br/>core, advisories, IOC<br/>SSH signature, SHA-256<br/>ship in the release"]        GI["--giants, opt-in<br/>gitleaks, TruffleHog,<br/>Semgrep, osv-scanner,<br/>Trivy, Checkov,<br/>nuclei, ZAP baseline<br/>if installed, no shell"]        AI["--ai, opt-in<br/>an Ollama model proposes<br/>asks consent every run"]        OFF["Offline by design<br/>no telemetry<br/>no rule downloads"]    end
    R --> FD[["Finding<br/>severity<br/>confidence: confirmed,<br/>likely, potential,<br/>needs-human-review<br/>file:line or URL"]]    GI --> FD    AI -. "a rule must confirm" .-> FD    FD --> EX{"Exit code<br/>0 none critical or high<br/>1 critical or high<br/>2 incomplete or refused"}
    subgraph OUT["Outputs and integrations"]        O1["Reports<br/>terminal, JSON,<br/>Markdown, SARIF<br/>audience reports<br/>agent brief"]        O2["penthera ui<br/>dashboard on 127.0.0.1"]        O3["penthera mcp<br/>six read-only tools"]        O4["GitHub Action<br/>PR capability diff<br/>SARIF upload"]        O5["Vercel Deployment Check<br/>relays the Action result"]        O6["Evidence bundle<br/>SHA-256 manifest<br/>SSH signature<br/>SBOM, AI-BOM<br/>NIS2 and CRA drafts"]    end
    EX --> O1 & O2 & O3 & O4 & O5 & O6
    classDef core fill:#0000ed,stroke:#0000ed,color:#ffffff    classDef box fill:#ffffff,stroke:#000000,color:#000000    class FD core    class R,GI,AI,OFF,EX,O1,O2,O3,O4,O5,O6 box    style ENG fill:none,stroke:#0000ed,stroke-width:2px    style OUT fill:none,stroke:#0000ed,stroke-width:2px

How it is measured

Each feature goes through the same path: method → evidence → tool.

  • Method. The methodology states the threat model, what black-box (HTTP) and white-box (source) analysis can and cannot see, the confidence model, and the false-positive controls on each probe. Each design choice cites the research or standard it rests on: 158 verified references, in APA style, in docs/references.md.
  • Evidence. A benchmark runs on every release, and the release gate fails if precision or recall drops by more than 0.02. Experiments that decide what ships next are pre-registered in docs/research/prereg/ before any data is collected, and the results are published either way.
  • Tool. What holds up ships in a reviewed, signed release. What does not hold up is dropped, and the rules stay.
MeasureResultSample
Precision, bundled benchmark0.92, 95% CI 0.74 to 0.9822 true and 2 false positives
Recall, bundled benchmark0.96, 95% CI 0.79 to 0.991 miss, explained
Requests past loopback during the benchmark0Enforced by a network guard
Public benchmarks (E11b), sealed test half1st on npm and PyPI malware (tied 1st to 3rd), 1st on JS library injection bugs (tied 1st to 4th), 2nd on leaked secrets4 public datasets, up to 10 free tools each (results, summary)
E10 pilot, known-vulnerable appsPrecision 0.88, 95% CI 0.78 to 0.93. Recall 0.07 before fixes, 0.71 (CI 0.45 to 0.88) after14 root causes in Juice Shop and DVNA (results). No run logs in, so it doesn't cover login or access rules
Detection rules, all readable132 in this release: 16 URL scan templates, 24 secret and AI-key patterns, 15 dependency capabilities, 47 AI-tooling rules, 5 fix recipes, and 25 rules in the signed rule packsRule packs

The bundled benchmark is 24 findings in small labs we wrote ourselves. It catches regressions; it does not measure real-world accuracy. The E10 pilot used one labeller and is not independent: the fixes were written after seeing the misses on the same two apps. On WebGoat, held out, recall stayed at 2 of 9. Accuracy on real projects is experiment E1, pre-registered and not yet run. Intervals are Wilson. What Penthera cannot see is listed under Known limitations. Refresh the counts with npm run docs:numbers and npm run bench.

Cite this repository with the button on GitHub or CITATION.cff. APA and BibTeX forms are in the methodology.

Why you can trust it

  • Local and offline. No account, no telemetry, no cloud. --offline limits network traffic to the target you named, and every report lists the hosts it contacted (network use).
  • Tested unplugged. Repo scans, agents, deps, brief, evidence bundles and URL scans with --offline made no outside connections. They gave the same result twice, and the same with the network blocked, on macOS and Ubuntu (E17 results). The test can't watch git, which Penthera uses only for local commands.
  • Deterministic. Rules you can read, with file:line evidence. A model may propose a fix or a lead; a deterministic re-scan and your tests decide.
  • Non-destructive by default. Default scans send no attack payloads. Payload testing (--deep, --fuzz, --adaptive, --all) is opt-in, asks for a confirmation bound to the target, and is rate-limited. It can change data, so read what active modes can change first.
  • Asks before it changes anything. The fix loop works on a local branch, asks before every change by default, and never pushes or opens pull requests.
  • No update channel to hijack. Detection rules ship inside reviewed releases as signed, versioned rule packs. You can add your own by path (--rules <dir>). Nothing is downloaded and run at run time.
  • Releases you can verify. npm provenance through trusted publishing, a maintainer approval with 2FA for every version, SHA-pinned CI, CodeQL and OpenSSF Scorecard. Every release passes an internal audit of eight gates (latest report).

The claim map ties these claims to the tests that hold them.

Verify it yourself. In an empty folder:

bash
npm install [email protected] && npm audit signaturesnpx [email protected] rules list

The first checks npm's registry signature and the build provenance of the package you got. The second lists every bundled rule pack and the key that signed it; a pack whose signature does not verify is refused unless you pass --allow-unsigned-rules.

Penthera finds known classes of problems, not novel ones, and it does not replace a human pentester or incident response. The decisions behind it, its limits, and how to challenge them are in the manifesto and FAQ.

How it fits with other tools

Penthera works next to the tools you already use; its SARIF output goes straight into GitHub code scanning, for example. Each comparison page says where the other tool goes further and how to run the two together.

FocusWhere it runsHow it decides
PentheraYour app, dependencies and AI tooling; fixes; EU evidenceYour machine or CI, offlineReadable deterministic rules, with evidence
SocketSupply-chain risk across package registriesCloud service, GitHub App, CLIRegistry-scale package analysis, including AI review
SnykKnown vulnerabilities in dependencies, code, containers, IaCCloud service, IDE, CLICurated vulnerability database plus static analysis
GitHub Dependabot and code scanningKnown-CVE alerts, update PRs, CodeQLGitHubAdvisory database, CodeQL queries
OWASP ZAPDynamic testing of web appsYour machine or CIActive and passive scan rules
SemgrepStatic analysis of your own codeYour machine, CI, cloud platformPattern rules, plus a paid cross-file engine

All comparisons, including Cloudflare's security-audit skill: docs/compare/.

Run the free tools you already have: --giants

--giants runs the free scanners installed on your machine after Penthera's own scan: gitleaks, TruffleHog, Semgrep with your local rules, osv-scanner, Trivy and Checkov for a repository, nuclei and the ZAP baseline for a URL. Their findings go into the same report and SARIF, each labelled with the tool, its version and its rule. Nothing is downloaded or uploaded, and an area that neither Penthera's rules nor another tool reached is reported as "not covered".

bash
penthera giants              # which tools you havepenthera --repo . --giants   # Penthera, then each installed tool

This runs the tools you have and merges their findings. It is not a claim that the combination finds more: experiment E14 measured that (results). Details, safety rules and the policy key: docs/commands/giants.md.

Start here

You want to knowRead
Is my app secure?I'm new, then scan
What should my small team do about security now?A Practical Guide to Security for 2027: 10 steps, each with the command and its limit
Is this package or MCP server safe?deps, install, agents
How do I use it from my coding agent?MCP server, skill, agents safely
How do I put it in CI?The GitHub Action, scan in CI
What do I give my auditor?Evidence bundles, NIS2, CRA
How do I run the fix loop?Fix and verify, the local loop

The full map, by situation and from first scan to research, is in docs/index.md.

Ethics and authorization

Penthera sends HTTP requests to the targets you give it, and some modes (--deep, --fuzz, --adaptive, --all) send attack payloads, after a confirmation. Scan only what you own, what you have written authorization to test, or local environments you control. Do not use it to probe third-party systems, exfiltrate data, disrupt services, or harm anyone. Unauthorized testing may break computer-misuse laws such as the US CFAA, the UK Computer Misuse Act, and their EU equivalents. When in doubt, do not scan.

The software is provided "as is", without warranty. The author accepts no liability for misuse, and you are responsible for making sure every scan you run is lawful. The live check on penthera.org has its own terms.

Building in public

What changed, what we are measuring, and what comes next, in one place.

Where it standsRead more
Latest release2.3.2 (2026-11-06) on npm latest, a security patch: hostile files can no longer hang a scan, secrets stay masked in what reports quote, and a dependency file Penthera can't read fails the check. 2.3.0 brought: GitHub Actions workflow checks, less noise on the first run, a verdict-first repo scan, no runtime dependencies, and an install line per agentCHANGELOG, roadmap
ResearchPublic benchmarks (E11b) published: on a sealed half of four public datasets, 1st of the free tools on npm and PyPI malware (tied 1st to 3rd), 1st on JS library injection bugs (tied 1st to 4th), 2nd on leaked secrets (summary). E10 pilot published: precision 0.88, recall 0.07 to 0.71 on two known-vulnerable apps after fixes (one labeller, not independent; a re-run is pending because default scans no longer send login checks). E1 on real code is pre-registered; E8 (agent guardrails) is a draftE11b results, E10 results, E1 pre-registration, agents safely
NextReal-world precision and recall with intervals (E1), published whatever the resultRoadmap: next, research plan

[Star history]

[Walkthrough video: setup, a scan, the dashboard in Simple and Advanced mode, one fix approved, the report]

Watch the 80-second walkthrough: setup, a scan, the dashboard, a fix approved, the report. Demo data, no sound, captions in the video.

Releases are deliberately slow: a feature freeze, an independent review, the release checks, and a release candidate before any new minor version. Watch the repository for releases or join the Discussions.

How Penthera is built

Penthera is developed with substantial help from generative AI: 91% of the commits up to v1.7.0 were written with Claude (Anthropic) through Claude Code, directed and reviewed by the maintainer, and marked with an AI-Assisted: trailer. Generated code passes the same gates as any change: tests, CodeQL, an independent review, the internal audit, and a 2FA-approved release. Inside the product, models only ever propose; deterministic checks decide. The full disclosure, and the rules for AI-assisted contributions, are in docs/genai.md.

Contributing and support

Clone the repository and run npm install, then npm test for the suite and npm run bench for precision and recall. CONTRIBUTING.md covers the project layout, the release cadence and the release checklist; AGENTS.md is the short version for coding agents. The roadmap shows what ships next, and the research plan what we measure. Issues and pull requests are welcome.

Penthera is free and stays free. If it caught something before you shipped it, you can sponsor its maintenance. Sponsorship pays for maintainer time and buys no influence over findings (tiers).

License

MIT. See LICENSE. Report vulnerabilities in Penthera itself through SECURITY.md.

Source: README.md at commit 42fa855

Tools

6

scan_repo

Scan a repository

White-box scan of a local project folder: hardcoded secrets, code-execution sinks, API routes and trust boundaries, runtime versions with known advisories. Offline and read-only. Returns findings with evidence at file:line and confidence labels.

Parameterspathmax_findings

scan_url

Scan a running app (passive)

Passive black-box scan of a running web app the user is authorized to test: TLS, security headers, cookies, CORS, exposed files and docs, OpenAPI and auth checks. Sends no attack payloads: profile quick sends no login request, standard sends one POST /api/login with invalid credentials. Only loopback targets, or hosts the user listed with --allow-host when configuring this server, can be scanned, and a redirect off them is refused.

Parametersurlrequiredprofilemax_findings

check_dependencies

Check dependencies

What each npm or Python dependency can do (install scripts, shell, network, eval, credential access), known-malicious packages and typosquats, read offline from the lockfile and installed tree. Read-only.

Parameterspathprodmax_findings

audit_ai_tooling

Audit AI agent config

Audit the project's AI agent setup: skills, MCP servers, hooks, permissions, plugins and rule files, for hidden instructions, curl-pipe-shell, unpinned MCP packages, inline secrets and wildcard permissions. Grades A to F, or gives no grade when it finds no agent config. Offline, deterministic, read-only.

Parameterspathmax_findings

explain_finding

Explain a finding

Explain a finding's rule: what it checks, why it matters, how to fix it, effort, whether it is an owner action (rotate a key, change DNS), research references and OWASP MCP/Agentic ids. Pass the `rule` field of a finding as `id` (e.g. agents/mcp-unpinned, secrets, headers).

Parametersidrequired

runtime_advisories

Runtime advisories

Is the PHP, nginx, Apache, Node.js, Python or OpenSSL an app runs affected by a published advisory, or past end of life? Give a project path (reads Dockerfiles, compose files and version pins) or the response headers you already have (Server, X-Powered-By). Offline.

Parameterspathheadersmax_findings

Version history

5
  1. v2.3.2LatestNov 7, 2026
  2. v2.3.1Nov 5, 2026
  3. v2.2.0Nov 3, 2026
  4. v2.0.0Oct 25, 2026
  5. v1.9.0Oct 23, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts