leakguard — fast secret scanner for your codebase
Project description
leakguard
Fast, lightweight secret scanner for codebases (Rust CLI + Python package).
leakguard scans source files for accidentally committed credentials, tokens, and sensitive config values.
Why leakguard
- 104 built-in rules across cloud, LLM, database, HTTP auth, observability, and SaaS ecosystems
- Fast local scanning with sensible defaults
- CI-friendly outputs:
pretty,json,sarif,markdown - GitHub Actions summary support via
--github-summary - False-positive controls: inline ignore markers + rule-level disable in config
- Binary-safe scanning: non-text files are skipped
- Safe defaults:
.envfiles are excluded
Quickstart
Install from source
git clone https://github.com/adrian-lorenz/leakguard.git
cd leakguard
cargo install --path .
Install via pip
pip install leakguard-secret-leaks
leakguard check .
Use prebuilt binaries
Download the latest release from GitHub Releases.
| Platform | Binary |
|---|---|
| Linux x86_64 | leakguard-linux-amd64 |
| Linux ARM64 | leakguard-linux-arm64 |
| Windows x86_64 | leakguard-windows-amd64.exe |
| macOS Apple Silicon | leakguard-macos-arm64 |
chmod +x leakguard-linux-amd64
sudo mv leakguard-linux-amd64 /usr/local/bin/leakguard
CLI
Common commands
# Scan current directory
leakguard check
# Scan specific path
leakguard check --source ./src
# JSON for automation
leakguard check --format json
# SARIF for GitHub code scanning
leakguard check --format sarif
# Markdown report (useful for CI summaries)
leakguard check --format markdown
# Show warning-level findings in details
leakguard check --warnings
# Verbose file-level logging
leakguard check --verbose
# Max file size in KB (default: 1024)
leakguard check --max-size 512
# Use custom config file
leakguard check --config /path/to/leakguard.toml
# Write GitHub Actions job summary
leakguard check --github-summary
# Show all built-in rules
leakguard rules
# Create default config
leakguard init-config
Exit codes
| Code | Meaning |
|---|---|
0 |
No findings, or only LOW / WARNING findings |
1 |
At least one CRITICAL, HIGH, or MEDIUM finding |
Python API
Use leakguard as a library, for example before sending text to an LLM:
from leakguard import scan_text, scan_text_dict, replace_text
findings = scan_text("My API key is sk-proj-abc123xyz...")
for f in findings:
print(f.rule_id, f.severity, f.secret, f.secret_hash)
# Disable specific rules for this call
findings = scan_text("...", disable_rules=["http-insecure-url"])
# Optional replacer for secret output
findings = scan_text("...", replace_secret_with="[MASKED]")
# Directly sanitize text before sending it to an LLM
safe_text, replaced_any = replace_text(
"My API key is sk-proj-abc123xyz...",
replacement="[MASKED]"
)
if replaced_any:
print("Secrets were replaced before LLM call")
Finding fields:
rule_id, description, severity, line_number, line, secret, secret_hash, tags
Pydantic (dict-ready)
from pydantic import BaseModel
from leakguard import scan_text_dict
class Finding(BaseModel):
rule_id: str
description: str
severity: str
line_number: int
line: str
secret: str
secret_hash: str
tags: list[str]
rows = scan_text_dict("My API key is sk-proj-abc123xyz...")
findings = [Finding.model_validate(row) for row in rows]
Configuration
Generate a config file:
leakguard init-config
Default leakguard.toml:
[scan]
# Empty means all files except .env and .git
extensions = []
exclude_paths = []
exclude_files = []
[rules]
# Example: disable = ["jwt-token", "http-insecure-url"]
disable = []
Auto-loading behavior:
leakguard.tomlin the current working directory is loaded automatically.
Suppression and false positives
Inline suppression markers on a line:
api_url = "http://internal-service/api" # leakguard-ignore
Supported markers:
# leakguard-ignore# noqa-secrets# nosec-secrets
Built-in false-positive filtering includes patterns such as:
- templated values (
{DB_PASSWORD},%(password)s) - shell variable references (
$DB_PASSWORD) - attribute references (
settings.DB_PASSWORD) - localhost URLs (
http://localhost:8080)
Detection coverage
Current built-in categories include:
- Cloud / VCS: AWS, GitHub/GitLab, Google, Stripe, Slack, NPM, Docker Hub
- LLM / AI: OpenAI, Anthropic, Cohere, Mistral, Hugging Face, Groq, Perplexity, xAI, and related env leaks
- Azure / M365: tenant/app credentials, storage/service keys, Graph, Teams webhooks
- Databases / BaaS: PostgreSQL/MySQL/Mongo/Redis/MSSQL/JDBC, Supabase
- Observability: Datadog, New Relic, Grafana, Honeycomb, OTLP-related patterns
- HTTP/Auth: Bearer/Basic headers, credentialed URLs
- Crypto / Generic: PEM keys, JWT-like tokens, high-entropy secret assignments
Use leakguard rules for the complete, authoritative list.
GitHub Actions
Example workflow job:
jobs:
leakguard:
name: leakguard secret scan
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Install leakguard
run: |
curl -sSfL \
https://github.com/adrian-lorenz/leakguard/releases/latest/download/leakguard-linux-amd64 \
-o /usr/local/bin/leakguard
chmod +x /usr/local/bin/leakguard
- name: Run scan
run: leakguard check --format markdown >> "$GITHUB_STEP_SUMMARY"
Alternative install method:
- name: Install leakguard
run: pip install leakguard-secret-leaks
License
MIT — Copyright (c) 2026 Adrian Lorenz a.lorenz@noa-x.de
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file leakguard-1.0.1-cp38-abi3-win_amd64.whl.
File metadata
- Download URL: leakguard-1.0.1-cp38-abi3-win_amd64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.8+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2de52d1a056550cfea085fa9673ac989127132d184235f03df5cb1fe3218c21b
|
|
| MD5 |
5167f73cde74287a869db645f543c859
|
|
| BLAKE2b-256 |
c5b13d8df9d466d71990b0049027c28cd3d28cfe3ce0f4de27af8c4354dd6507
|
Provenance
The following attestation bundles were made for leakguard-1.0.1-cp38-abi3-win_amd64.whl:
Publisher:
release.yml on adrian-lorenz/leakguard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
leakguard-1.0.1-cp38-abi3-win_amd64.whl -
Subject digest:
2de52d1a056550cfea085fa9673ac989127132d184235f03df5cb1fe3218c21b - Sigstore transparency entry: 989084281
- Sigstore integration time:
-
Permalink:
adrian-lorenz/leakguard@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/adrian-lorenz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file leakguard-1.0.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: leakguard-1.0.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
821a23843c6a9c341cb85f54492d7579ca677515e85b892d5ffe4810f2a87deb
|
|
| MD5 |
bc840beb90cb80e98ccd54a672fba257
|
|
| BLAKE2b-256 |
08e17df071593fa161118dc65464ac561287f7d52b2f3790ccb1dd17cbc71f50
|
Provenance
The following attestation bundles were made for leakguard-1.0.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on adrian-lorenz/leakguard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
leakguard-1.0.1-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
821a23843c6a9c341cb85f54492d7579ca677515e85b892d5ffe4810f2a87deb - Sigstore transparency entry: 989084087
- Sigstore integration time:
-
Permalink:
adrian-lorenz/leakguard@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/adrian-lorenz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file leakguard-1.0.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: leakguard-1.0.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
89424147cd45c2b7b7214467f55e76fb9399f2aa764eb97e39b4daeaf51d09ac
|
|
| MD5 |
c10299dad6146aa536502884ef2dea83
|
|
| BLAKE2b-256 |
9f1586cb2f0f27cf8319fa8a4392e17d4b3ed69c712bb98201e4d8efc0a0f9c4
|
Provenance
The following attestation bundles were made for leakguard-1.0.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on adrian-lorenz/leakguard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
leakguard-1.0.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
89424147cd45c2b7b7214467f55e76fb9399f2aa764eb97e39b4daeaf51d09ac - Sigstore transparency entry: 989084145
- Sigstore integration time:
-
Permalink:
adrian-lorenz/leakguard@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/adrian-lorenz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file leakguard-1.0.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.
File metadata
- Download URL: leakguard-1.0.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.8+, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6a7aef6191537b96e82537d832a2dc35a55969cb9157c8345d9582427a434fd
|
|
| MD5 |
b80aae7e5c0c1a220119783785451a7a
|
|
| BLAKE2b-256 |
7e7dd3df293f40e162adb7ef4970bef056872a3f1382f8147ceac841ab46f9b1
|
Provenance
The following attestation bundles were made for leakguard-1.0.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:
Publisher:
release.yml on adrian-lorenz/leakguard
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
leakguard-1.0.1-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl -
Subject digest:
c6a7aef6191537b96e82537d832a2dc35a55969cb9157c8345d9582427a434fd - Sigstore transparency entry: 989084214
- Sigstore integration time:
-
Permalink:
adrian-lorenz/leakguard@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/adrian-lorenz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ff6151a705bccd67cf252d7bd0d35eb18e0a7341 -
Trigger Event:
workflow_dispatch
-
Statement type: