VELKA
English | Português (BR)
The Code Sin Judge
"Thou who art Undead, art chosen... to expose the guilty."
Features
- 52 Detection Rules: AWS, GCP, Azure, GitHub, Stripe, SendGrid, Twilio, Datadog, Cloudflare, Supabase, Vercel, and more
- Privacy First: Zero telemetry, no network calls, secrets redacted by default
- High Performance: Memory-mapped I/O, parallel scanning, compiled regex
- CI/CD Ready: JUnit, SARIF, CSV, Markdown, HTML output formats
- Incremental Scanning:
--diffand--stagedfor fast pre-commit checks - Git Forensics:
--deep-scanfinds secrets buried in commit history - Library API: Use as a Rust crate in your own tools
Installation
Cargo (from crates.io)
Cargo (from GitHub)
From Source (local checkout)
Docker
As Library
# Cargo.toml
[]
= "1.2"
use ;
Usage
# Basic scan
# Show progress bar
# Only changed files (fast pre-commit)
# Only staged files
# Git history forensics
# Only critical issues
# Different output formats
# Use configuration profile
# Show full secrets (debugging only)
# Verify secrets via API (opt-in; makes network calls for GitHub token, etc.)
# Migrate secrets to .env and update source (opt-in; requires .env in .gitignore)
# Scan from stdin (e.g. pipe from git diff)
|
|
# Install pre-commit hook
Exit codes
- 0: no Mortal sins found
- 1: at least one Mortal sin found
Configuration
Create velka.toml in your project root:
[]
= ["vendor/**", "tests/fixtures/**"]
= 4.6
= ["localhost", "example.com", "test@example.com"]
[]
= true
[]
= true
= "both" # "project", "user", or "both"
[]
= ["HARDCODED_IP"]
[[]]
= "INTERNAL_API"
= "MYCOMPANY_[A-Z0-9]{32}"
= "Mortal"
= "Internal API key detected"
[]
= false
= true
[]
= 5.0
= false
Inline ignores: Add velka:ignore comment on any line to skip it.
Detection Rules
Mortal Sins (Critical)
| Rule | Description |
|---|---|
AWS_ACCESS_KEY |
AWS Access Key ID |
AWS_SECRET_KEY |
AWS Secret Access Key |
GOOGLE_API_KEY |
Google API Key |
GITHUB_TOKEN |
GitHub Personal Access Token |
STRIPE_SECRET |
Stripe Secret Key |
PRIVATE_KEY |
SSH/PGP Private Keys |
SLACK_WEBHOOK |
Slack Webhook URL |
SENDGRID_API |
SendGrid API Key |
TWILIO_API |
Twilio API Key |
NPM_TOKEN |
NPM Auth Token |
PYPI_TOKEN |
PyPI API Token |
DISCORD_TOKEN |
Discord Bot Token |
TELEGRAM_BOT |
Telegram Bot Token |
DB_CONNECTION_STRING |
Database Connection String |
HARDCODED_PASSWORD |
Hardcoded Password |
AZURE_STORAGE_KEY |
Azure Storage Account Key |
GCP_SERVICE_ACCOUNT |
GCP Service Account Key |
HEROKU_API_KEY |
Heroku API Key |
MAILGUN_API_KEY |
Mailgun API Key |
SQUARE_ACCESS_TOKEN |
Square Access Token |
SQUARE_OAUTH_SECRET |
Square OAuth Secret |
CREDIT_CARD |
Credit Card (Luhn validated) |
HIGH_ENTROPY |
High Entropy Strings |
K8S_PRIVILEGED |
Kubernetes Privileged Pod |
Venial Sins (Warnings)
| Rule | Description |
|---|---|
JWT_TOKEN |
JWT Token |
HARDCODED_IP |
Hardcoded IP Address |
EVAL_CALL |
eval() Call |
DOCKER_ROOT |
Dockerfile Root User |
DOCKER_LATEST |
Dockerfile :latest Tag |
K8S_HOST_NETWORK |
Kubernetes Host Network |
K8S_HOST_PID |
Kubernetes Host PID |
GENERIC_API_KEY |
Generic API Key Pattern |
GENERIC_SECRET |
Generic Secret Pattern |
CI/CD Integration
GitHub Actions
Use the Velka action (installs from crates.io then scans; requires Velka to be published):
- uses: actions/checkout@v4
- uses: wesllen-lima/velka@main
with:
path: .
fail-on-secrets: true
format: terminal # or sarif, json, junit, etc.
Or run Velka manually and upload SARIF:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo install velka --locked
- run: velka scan . --format sarif > results.sarif
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
GitLab CI
velka-scan:
script:
- velka scan . --format junit > velka-report.xml
artifacts:
reports:
junit: velka-report.xml
Pre-commit Hook
Option 1 – pre-commit framework (add to .pre-commit-config.yaml):
repos:
- repo: https://github.com/wesllen-lima/velka
rev: v1.2.0
hooks:
- id: velka
Requires velka on PATH (cargo install velka). Then run pre-commit run velka.
Option 2 – Git hook only:
Security
- Zero Telemetry: No data ever leaves your machine
- Redaction by Default: Secrets are masked in output (
AKIA****MPLE) - Secure Cache: Only stores file hashes, never secret content
- Path Validation: System paths (
/proc,/sys,/dev) cannot be scanned - Secure Errors: Error messages don't leak sensitive paths
Performance
- Parallel Scanning: Uses
ignorecrate's parallel walker - Memory-Mapped I/O: Files >1MB use
mmapfor efficiency - Compiled Regex: All patterns compiled once via
std::sync::LazyLock - Lock-free Channels:
crossbeam-channelfor zero-contention - Smart Skipping: Binary detection via magic bytes, minified code skipped
- Batch Cache Writes: Cache misses are buffered and flushed once per run to reduce RwLock contention
Benchmarks
Run cargo bench to reproduce. Benchmarks live in benches/scan_bench.rs.
Throughput (cache disabled):
| Files | Benchmark name | Typical median |
|---|---|---|
| 100 | scan_100_files |
~2 ms |
| 1,000 | scan_1000_files |
~4.5 ms |
| 5,000 | scan_5000_files |
~12 ms |
| 10,000 | scan_10000_files |
~21 ms |
Cache impact (1,000 files, cache enabled):
| Benchmark name | Description |
|---|---|
scan_1000_files_cache_cold |
First run: full scan, cache populated |
scan_1000_files_cache_hit |
Second run: cache hit, no re-scan |
Run only cache benchmarks: cargo bench scan_1000_files_cache. Run a single bench: cargo bench scan_1000_files.
Velka is designed to be significantly faster than alternatives (e.g. TruffleHog, detect-secrets) due to Rust's zero-cost abstractions, parallel file walking, and memory-mapped I/O. Run both on your codebase to compare.
VS Code Extension (MVP)
A minimal VS Code extension is in vscode-extension/. It adds a command Velka: Scan for secrets that runs Velka on the workspace and shows output in a channel. Requires velka on PATH (cargo install velka). See vscode-extension/README.md for setup.
Documentation
- Contributing - How to contribute
- Changelog - Version history
- Security Policy - Vulnerability reporting
License
Licensed under MIT OR Apache-2.0.
See LICENSE, LICENSE-MIT, and LICENSE-APACHE.