Rapid sanity checking for Vibe Coded Projects
Project description
👾 helpfulGremlin
Sanity check your vibes before you git push.
I built helpfulGremlin because I wanted a lightweight, zero-config CLI utility to scan my codebase for sensitive artifacts—API keys, secrets, tokens, and private keys—before they are accidentally exposed. It's designed for "vibe-coding" where velocity is high, acting as a friendly guardrail.
Recently, I extended it to also check for bad security practices (like eval(), pickle.load(), or disabling SSL verification), making it more than just a secret scanner.
🚀 Quick Start
Run it instantly using uv (no installation required):
# Run in the current directory
uvx helpfulGremlin
Or install it globally:
uv tool install helpfulGremlin
helpfulGremlin .
🛠 Usage
# Scan the current directory
helpfulGremlin
# Scan a specific directory or file
helpfulGremlin ./src/my_script.py
# Verbose mode (see every file checked)
helpfulGremlin . --verbose
# Run with multiple worker processes (for large repos)
helpfulGremlin . --workers 4
🏗 Architecture & Design Decisions
1. Python & uv First
I chose Python for its rich ecosystem of text processing and regex libraries. Typically, Python tools are hard to distribute, but with uv, helpfulGremlin can be run ephemerally (uvx) without messing up your system python.
2. Hybrid Detection Engine
I implemented a two-layer detection strategy:
- Layer 1: Regex Signatures: Fast pattern matching for known secrets (AWS, OpenAI, Stripe, etc.). Patterns are externalized in
src/helpfulgremlin/patterns.yaml. - Layer 2: Entropy Analysis: Uses Shannon Entropy to detect high-randomness strings (like passwords or unknown API keys) that don't match specific regexes. This catches weird custom secrets others miss.
3. Smart Context Awareness
I designed the scanner to be intelligent about where it looks:
- Context-Aware Scanning: Security checks are scoped to file types (e.g., Python-specific checks like
eval()only run on.pyfiles). This keeps performance high. - Gitignore Support: Automatically parses your
.gitignoreto avoid scanningnode_modules,venv, etc. - Binary Skipping: Detects and skips binary files to save CPU.
- Large File Protection: Skipping files > 5MB to prevent memory exhaustion.
- Remediation: It doesn't just say "Error"; it suggests how to fix it (e.g., "Move this hardcoded key to an environment variable").
4. Modern UX (textual / rich)
I used the rich library to provide beautiful, emoji-enriched terminal output, progress bars, and tables. Security tools shouldn't be boring 1990s textual walls.
🕵️ Detected Patterns
helpfulGremlin currently detects:
- Cloud Providers: AWS (Access/Secret Keys), Google Cloud API Keys, Google Cloud Service Accounts, Azure Storage Keys (opt-in).
- Databases: PostgreSQL, MySQL, MongoDB, and Redis URIs.
- AI/ML: OpenAI, Anthropic, Gemini, HuggingFace, Replicate.
- Services: Stripe, Slack, Twilio, Salesforce, Facebook.
- Security Best Practices:
- Unsafe Checks:
eval(),exec(),shell=True - Unsafe Deserialization:
pickle.load() - Insecure SSL/TLS:
verify=False, NodeNODE_TLS_REJECT_UNAUTHORIZED - Insecure Environments: Flask/Django
debug=True, DockerUSER root - Web Risks:
dangerouslySetInnerHTML(XSS), formatted SQL queries (SQLi) - Weak Hashing:
MD5 - Insecure Network Binding:
0.0.0.0
- Unsafe Checks:
- Generic: PEM Private Keys, SSH Private Keys, JWT Tokens, Generic "api_key" variable assignments.
- Unknowns: High-entropy strings (> 4.2 bits of randomness).
⚙️ Configuration
You can customize the detection rules by editing the patterns.yaml file inside the package.
📦 License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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 helpfulgremlin-0.1.4.tar.gz.
File metadata
- Download URL: helpfulgremlin-0.1.4.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e295f5b3cad8aea849b73194aa7c8f996e0ff817b87de45fde36f6c50ca97dda
|
|
| MD5 |
a083fadf4e3b601929507a0c9a3c34a0
|
|
| BLAKE2b-256 |
4c78a59ffa698b4b89892b3d44da852b74cd68da1568ffb0b94a295694cf305c
|
File details
Details for the file helpfulgremlin-0.1.4-py3-none-any.whl.
File metadata
- Download URL: helpfulgremlin-0.1.4-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef4747f0b535d65d314044c2eb74464135205f6e38f96287c1b6bd257f34c691
|
|
| MD5 |
ff8993ef0aae0901d07b4ee91a6aefb1
|
|
| BLAKE2b-256 |
9af39c4440dfddb7ac8b37eb1d3c65f2f32e48ccde4a0ecba969f4e880665f2b
|