PenSec

Security assessment that tells you what it did not test.

PenSec scans your own repository locally, keeps an evidence ledger across sessions, and reports undecided controls as plainly as failed ones. Use it as a CLI or as a Claude Code plugin.

Built to be safe on your machine

The rules below are enforced by the engine, not by prompts.

Passive by default

Reads the repository as data. Never runs install scripts, builds or repository hooks, and sends no traffic to any target.

Human-approved network tests

A scope manifest you write, approved from an interactive terminal, bound to the file's hash, with a request budget and no redirects.

Secrets stay masked

Values are redacted before they are stored, printed, reported or returned to a model. .env and key files are recorded by name only.

No AI-confirmed findings

Agents are read-only and can only record hypotheses. PenSec reads the cited lines itself, so a model cannot supply evidence.

State that survives

A local SQLite ledger keeps assessments, findings and evidence across sessions, compaction and restarts.

Private

No account, no telemetry, no cloud backend. AGPL-3.0 open source.

Honest statuses

Only PASS and FAIL are decisive. Everything else is shown as a gap, never as "no issues".

PASSdecided for that control only
FAILconfirmed observation
SUSPECTEDheuristic, not proven
BLOCKEDtool, approval or review missing
UNSUPPORTEDno adapter yet
INCONCLUSIVEran, could not decide
ERRORadapter failed
STALEcode changed since

Cross-domain, not just per file

Eighteen domains, A to R. When two domains share a real asset in your code, PenSec creates an edge and tracks it on its own, so "authorization passed" never hides "identity to object access is untested".

EdgeCreated whenScenario
AB1login or token routes existnew auth route missing session coverage
CG1routes take object IDsa user reads another tenant's object
DG1webhook routes existunsigned callback drives privileged state
FG1payments and webhooksreplay moves a payment into an invalid state
IN1third-party CI actionsunpinned action changes code in your pipeline
DP1LLM SDK usageretrieved text triggers a tool action

Install

Prebuilt, checksum-verified binaries for Linux, macOS and Windows. Nothing else to install.

Claude Code plugin

/plugin marketplace add ratomirjovanovic/pensec
/plugin install pensec@pensec          # macOS, Linux
/plugin install pensec-windows@pensec  # Windows

# restart Claude Code, then in your project
# ask Claude to check its security, or:
/pensec:start

Claude runs the whole assessment, asks one question at the end and applies what you choose, retesting after every fix.

CLI

# macOS, Linux
brew tap ratomirjovanovic/pensec https://github.com/ratomirjovanovic/pensec
brew install ratomirjovanovic/pensec/pensec

# Windows
scoop bucket add pensec https://github.com/ratomirjovanovic/pensec
scoop install pensec/pensec

# or a release binary, or go install (Go 1.23+)

cd your-project
pensec assess

Step-by-step instructions, updating and troubleshooting are in the installation guide. Releases can be verified with checksums, an SBOM and signed build provenance.

What it is not

PenSec is alpha software and an automated technical assessment. It is not a certification, attestation, legal opinion or independently signed penetration test, and it cannot prove the absence of vulnerabilities. Runtime profiles beyond passive header review are on the roadmap.