Guardy
Fast, secure git hooks in Rust with secret scanning and protected file synchronization.
Features
- 🚀 Fast Security Scanning: Multi-threaded secret detection with entropy analysis
- 🔄 Protected File Synchronization: Keep configuration files in sync across repositories
- 🪝 Git Hook Support: Pre-commit, pre-push, and other git hooks
- ⚙️ Flexible Configuration: YAML, TOML, and JSON configuration support
- 📊 Multiple Output Formats: JSON, HTML, and plain text reporting
- 🔍 Comprehensive Scanning: Detect secrets, credentials, and sensitive data
Installation
From crates.io
From source
Quick Start
1. Initialize in your repository
This installs git hooks and creates a default configuration.
2. Configure hooks
Guardy supports both custom commands and built-in actions in hooks:
# guardy.yaml
hooks:
pre-commit:
enabled: true
parallel: false # Run commands in parallel (default: false)
# Built-in actions
builtin:
# Custom commands
custom:
- command: "cargo fmt --check"
description: "Check formatting"
fail_on_error: true
glob: # Only run on Rust files (optional)
- command: "eslint {files} --fix"
description: "Fix ESLint issues"
all_files: true # Run on all files matching glob, not just staged
glob:
stage_fixed: true # Auto-stage fixed files
commit-msg:
enabled: true
builtin: # Validates conventional commits format
pre-push:
enabled: true
parallel: true # Run all commands in parallel for speed
custom:
- command: "cargo check"
description: "Run type check"
fail_on_error: true
- command: "guardy sync update --force --config ./guardy.yaml"
description: "Sync protected files before push"
fail_on_error: true
3. Configure repository sync (optional)
Keep files synchronized from upstream repositories:
# guardy.yaml
sync:
repos:
- name: "shared-configs"
repo: "https://gitlab.com/your-org/shared-configs"
version: "v1.0.0" # Can be tag, branch, or commit
source_path: ".gitlab"
dest_path: "./.gitlab"
include:
exclude:
4. Configure scanning (optional)
# guardy.yaml
scanner:
file_extensions:
- "*.rs"
- "*.js"
- "*.py"
ignore_patterns:
- "target/"
- "node_modules/"
entropy_threshold: 3.0
hooks:
pre_commit:
enabled: true
commands:
- scan
3. Use the core features
# Scan files for secrets
# Check installation status
# Sync configuration files
Commands
Core Commands
guardy hooks install- Install git hooks in the current repositoryguardy scan <PATH>- Scan files/directories for secrets and sensitive dataguardy status- Show installation and configuration statusguardy config- Manage configuration settingsguardy hooks uninstall- Remove all installed git hooks
File Synchronization
guardy sync- Interactively update files from remote repositoriesguardy sync diff- Show differences without making changesguardy sync --force- Update all changes without promptingguardy sync status- Show sync configuration and status
Advanced
guardy hooks run <HOOK>- Manually run a specific git hook for testing
Configuration
Guardy supports multiple configuration formats (YAML, TOML, JSON):
Basic Configuration (guardy.yaml)
# Scanner settings
scanner:
file_extensions:
- "*.rs"
- "*.js"
- "*.py"
- "*.go"
ignore_patterns:
- "target/"
- "node_modules/"
- "*.log"
max_file_size: 1048576 # 1MB
entropy_threshold: 3.5
# Git hooks configuration
hooks:
pre-commit:
enabled: true
builtin: # Built-in secret scanning
custom: # Add custom commands here
pre-push:
enabled: true
custom:
- command: "guardy sync update --force --config ./guardy.yaml"
description: "Sync protected files"
fail_on_error: true
# File synchronization
sync:
repos:
- name: "shared-configs"
repo: "https://gitlab.com/yourorg/shared-configs"
version: "main"
source_path: "."
dest_path: "."
include:
exclude:
Library Usage
Guardy can be used as a library for building custom security tools:
use ScannerConfig;
use GuardyConfig;
// Load configuration
let config = load?;
let scanner_config = from_config?;
// Scan for secrets
let results = scanner_config.scan_path?;
// Process findings
for finding in results.findings
Git Hooks Integration
Guardy provides flexible git hook management with both built-in actions and custom commands:
Built-in Actions
scan_secrets- Scan staged files for secrets and credentialsvalidate_commit_msg- Validate commit messages using conventional commits format
Hook Features
Parallel Execution
Run commands in parallel for faster execution (enabled by default):
hooks:
pre-push:
parallel: true # Default: true - commands run simultaneously with optimal concurrency
custom:
- command: "cargo check"
- command: "cargo clippy"
- command: "cargo fmt --check"
Guardy automatically profiles your system and workload to determine optimal parallelism:
- Small workloads (≤3 commands): Sequential execution
- Medium workloads (4-5 commands): Conservative parallelism
- Large workloads (6+ commands): Full parallelism (capped at 8 concurrent commands)
- System-aware: Respects available CPU cores and limits concurrency appropriately
Glob Pattern Filtering
Target specific file types with glob patterns:
custom:
- command: "prettier --write {files}"
glob:
- command: "black {files}"
glob:
All Files Mode
Process all matching files, not just staged ones:
custom:
- command: "eslint {files} --fix"
all_files: true # Process all JS files in repo
glob:
stage_fixed: true # Auto-stage corrected files
Conventional Commits Validation
Ensures commit messages follow the conventional commits format using the git-conventional library:
hooks:
commit-msg:
enabled: true
builtin:
Supported formats:
feat(scope): add new featurefix: resolve bug in authenticationdocs: update READMEchore(deps): update dependencies
Features:
- Full conventional commits specification support
- Helpful error messages with examples
- Optional scope validation warnings
- Automatic comment filtering from commit messages
Installing Specific Hooks
# Install all hooks
# Install specific hooks
# Force overwrite existing hooks
File Synchronization from other Repositories
Keep configuration files synchronized across multiple repositories:
# Configure sync in guardy.yaml
# Bootstrap from a repository
Automating Sync with Hooks
Integrate sync into your git workflow to ensure files stay synchronized:
# guardy.yaml
sync:
repos:
- name: "shared-configs"
repo: "https://gitlab.com/org/shared-configs"
version: "v1.0.0"
source_path: ".gitlab"
dest_path: "./.gitlab"
include:
hooks:
pre-push:
enabled: true
custom:
- command: "guardy sync update --force --config ./guardy.yaml"
description: "Ensure configs are synchronized before push"
fail_on_error: true
This ensures synced files are always synchronized before pushing changes.
Features:
- Diff visualization with syntax highlighting
- Interactive updates with per-file control
- Selective sync with include/exclude patterns
- Version pinning to specific tags or commits
- Multi-repository configuration support
- Automatic restoration of modified protected files
Examples
Scanning specific file types
# Scan only Rust files
# Scan excluding test files
# Output as JSON
Custom git hooks
# guardy.yaml
hooks:
pre-commit:
enabled: true
builtin:
custom:
- command: "cargo fmt -- --check"
description: "Check formatting"
fail_on_error: true
- command: "cargo clippy -- -D warnings"
description: "Run clippy"
fail_on_error: true
File sync with filters
sync:
repos:
- name: "eslint-config"
repo: "https://gitlab.com/company/eslint-configs"
version: "v2.1.0"
source_path: "configs"
dest_path: "."
include:
exclude:
Performance
- Multi-threaded: Utilizes all CPU cores for scanning
- Memory efficient: Processes large repositories without high memory usage
- Fast I/O: Optimized file reading with memory-mapped files
- Smart filtering: Skips binary files and respects .gitignore patterns
- OS Cache Optimization: Leverages filesystem caching for dramatic performance improvements
Intelligent Caching Performance
Guardy efficiently utilizes OS-level filesystem caching for exceptional performance:
First Scan (Cold Cache):
- Initial scan reads files from disk storage
- Typical performance: ~1,900 files/second
- OS populates filesystem cache with file data
Subsequent Scans (Warm Cache):
- Files served from RAM instead of disk
- Up to 2.7x faster performance: ~5,200 files/second
- Perfect for CI/CD and iterative development workflows
Real-World Example:
# First run (cold cache)
)
# Second run (warm cache)
)
# 🚀 63% faster!
Performance Benchmarks
Typical performance on a modern machine:
- Cold cache: ~1,900 files/second for secret scanning
- Warm cache: ~5,200 files/second (2.7x improvement)
- Memory usage: <200MB for repositories with 100k+ files
- Startup time: <100ms for git hooks
License
MIT License - see LICENSE for details.
Contributing
Contributions welcome! Please see CONTRIBUTING.md for guidelines.
Support
- 📚 Documentation
- 🐛 Issues
- 💬 Discussions