🌿 secrets-scan v1.0.1 · MIT

Detect hardcoded secrets and credential patterns in a codebase — pre-commit and cron friendly, exit codes you can gate on.

The problem

One careless password = "..." in a commit can outlive every later cleanup — git history remembers. Worse: a half-automated redaction pass that replaces a secret with "***" breaks the code and still leaks a fragment, a case most scanners miss.

What it detects

PatternSeverityCatches
HARDCODED_PASSWORDCRITICALpassword = "..." assignments
HARDCODED_API_KEYCRITICALapi_key = "..." assignments
HARDCODED_TOKENCRITICALbearer / access / auth tokens
SK_KEY_PATTERNCRITICALsk-… provider API key literals
PRIVATE_KEY_HEADERCRITICAL-----BEGIN … PRIVATE KEY----- blocks
REDACTED_SECRETCRITICAL"***" or "…" where a secret used to be
CONNECTION_STRINGHIGHDB URLs with embedded credentials
ENV_FILE_SECRETHIGHsecrets committed in .env files

False-positive guards

Install (pip)

pip install secrets-scan @ git+https://mandrilly.com/git/secrets-scan.git

Usage

secrets-scan                    # scan current directory, fail on CRITICAL
secrets-scan /path/to/repo      # scan a specific path
secrets-scan --json             # machine-readable output (cron / CI)
secrets-scan --fail-on HIGH     # also fail on HIGH severity findings
secrets-scan --ignore skips.txt # extra relative paths to skip
secrets-scan --version          # v1.0.1

Exit codes: 0 clean · 1 findings at/above --fail-on · 2 usage/IO error.

Pre-commit example

#!/bin/sh
secrets-scan --json . >/dev/null 2>&1 && exit 0
echo "commit blocked: hardcoded secrets detected (run: secrets-scan)" >&2
exit 1

Self-test

bash run_tests.sh
# 7/7 PASS — fixtures cover clean trees, comment/env-var skips, md fences,
# .env detection, ignore lists, exit codes