Zero-config environment variable security scanner & quality gate.
Validate presence, ban dangerous placeholders, and enforce secret entropy before deploying to production.
Most environment linters (dotenv-safe, envalid) only check if a key exists. They don't care if its value is "changeme" or a 6-character toy secret that can be cracked in 2 seconds.
| Capability | dotvet π‘οΈ |
dotenv-safe |
dotenvx |
gitleaks / trufflehog |
|---|---|---|---|---|
| Code-aware Scanning (derives required vars from AST/regex) | β Zero-config | β (Manual .env.example) |
β | β |
Bans Dummy Placeholders (changeme, dummy, test) |
β Yes | β (Passes them) | β | β |
| Enforces JWT Minimum Strength (>= 32 chars / 256-bit) | β Hard Fail | β | β | β |
Detects Unconfigured Template URLs (postgres://localhost...) |
β Hard Fail | β | β | β |
Entropy & Repeating Pattern Detector (abcdefgh*4) |
β Yes | β | β | β (Git history only) |
Auto-Heals Secrets & .gitignore (dotvet fix) |
β Yes | β | β | β |
| Passive Git History Leak Reconnaissance | β Yes (Instant) | β | β | β (Git commits only) |
Dual Git Hooks (pre-commit & pre-push) |
β Yes | β | β | |
Generates Machine-Readable .env.schema.json Contract |
β Yes | β | β | β |
Native GitHub Action (uses: EthicCodeTech/dotvet@v1) |
β Yes | β | ||
| Runtime Dependencies | 0 | Multiple | Multiple | Go binary |
Show your team and users that your repository is protected from insecure environment variables. Add this badge to your README:
[](https://ethiccode.in/dotvet)Run immediately without installing:
npx dotvetOr install as a dev dependency:
npm install --save-dev dotvet
# or
pnpm add -D dotvet
# or
yarn add -D dotvetpip install dotvet
dotvetOnboarding new engineers shouldn't require sending unencrypted .env files over Slack.
Run dotvet generate once:
npx dotvet generateThis derives your project's canonical environment contract:
.env.example: Clean documentation of all required variables without exposing production secrets..env.schema.json: Strict JSON Schema defining types (integer,string,secret), constraints, and descriptions.
Commit .env.schema.json to Git. Whenever a teammate pulls the repository or runs dotvet check, they immediately know which variables their branch depends on and why.
Audits .env against variables referenced in your code:
npx dotvet
# or
dotvet check --env .env.productionExample Output:
dotvet v0.1.7 β Auditing environment variables in /projects/my-app
Environment file: .env (found) | Found 4 vars in code
WARN .env (GITIGNORE_MISSING)
.env is present but not explicitly listed in .gitignore. Risk of committing secrets to Git!
Fix: Add ".env" to your .gitignore file.
FAIL JWT_SECRET (JWT_UNDERSIZED)
JWT secret JWT_SECRET length is only 18 chars (minimum 32 characters required for HMAC-SHA256). Weak JWT secrets can be forged in seconds!
Referenced at:
β’ src/auth.ts:12 β const token = jwt.sign(payload, process.env.JWT_SECRET);
Fix: Generate a 32+ char secret: "openssl rand -base64 32"
FAIL DATABASE_URL (PLACEHOLDER_SECRET)
Variable DATABASE_URL is set to placeholder "changeme". This is dangerous for production!
Referenced at:
β’ src/db.ts:4 β const pool = new Pool({ connectionString: process.env.DATABASE_URL });
Fix: Replace the placeholder with a secure, generated value.
PASSED CHECKS (2):
β PORT
β REDIS_URL
FAILURE Found 2 errors and 1 warning.
Inspects your entire codebase and maps out where every environment variable is used:
npx dotvet scanOutput:
dotvet scan β Discovered 3 environment variables:
DATABASE_URL (2 usages)
β³ src/db.ts:4
β³ src/migrate.ts:10
JWT_SECRET (1 usage)
β³ src/auth.ts:12
PORT (1 usage)
β³ src/server.ts:8
| Rule | Severity | Description |
|---|---|---|
MISSING_ENV_VAR |
FAIL | Variable referenced in code is absent from .env and environment. |
EMPTY_ENV_VAR |
FAIL | Variable is defined in .env but has an empty string value. |
PLACEHOLDER_SECRET |
FAIL | Value matches known placeholder strings ("changeme", "your-secret-here", "dummy"). |
JWT_UNDERSIZED |
FAIL | JWT secret is under 32 characters (violates minimum 256-bit requirement for HS256). |
LOW_ENTROPY_SECRET |
WARN / FAIL | Sensitive key has Shannon entropy < 2.5 bits/char (repeating or sequential keys). |
GITIGNORE_MISSING |
WARN | .env exists in directory but is not tracked in .gitignore. |
HISTORICAL_ENV_LEAK |
WARN / FAIL | A .env file was committed in past Git history (even if deleted now, it is stored in Git objects). |
TEMPLATE_URL_UNCONFIGURED |
FAIL | Unconfigured mock connection URL (postgresql://user:password@localhost...). |
VENDOR_SECRET_EXPOSED |
WARN | Live production API key pattern detected (e.g. Stripe sk_live). |
| Flag | Default | Description |
|---|---|---|
--env <path> |
.env |
Path to environment file to audit |
--ignore, -i <vars> |
Ignore specific variables or rules (comma-separated, e.g. -i LEGACY_KEY,API_KEY:WEAK_SECRET_LENGTH) |
|
--strict |
false |
Treat warnings as hard errors (non-zero exit) |
--ci |
false |
Emits GitHub Actions annotations (::error file=...) |
--json |
false |
Emits machine-readable JSON output |
-h, --help |
Show usage help | |
-v, --version |
Display version |
Need to exempt a legacy variable or specific rule without compromising the entire security check? dotvet supports multiple flexible ways:
Create a .dotvetignore file:
# Exempt an entire variable from all checks
LEGACY_CLIENT_TOKEN
# Exempt a variable from a specific rule only
CUSTOM_KEY:WEAK_SECRET_LENGTH
# Ignore all checks for this line
LEGACY_KEY=short # dotvet-ignore
# Or ignore a specific rule
DEV_SECRET=short # dotvet-ignore:WEAK_SECRET_LENGTHnpx dotvet check --strict --ignore "LEGACY_KEY,DEV_KEY:WEAK_SECRET_LENGTH"The fastest way to guard pull requests in GitHub Actions is the official dotvet action (3 lines):
name: Env Security Gate
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Verify Environment Variable Security
uses: EthicCodeTech/dotvet@main
with:
strict: 'true'
env:
JWT_SECRET: "ci_valid_32_character_long_secret_key_12345"
DATABASE_URL: "postgresql://ci:ci@localhost:5432/test"
PORT: "3000"Recent attacks on the open-source supply chain demonstrated how deeply nested dependencies can introduce backdoors into developer tooling.
dotvet is designed from the ground up with 0 runtime dependencies in both Node.js and Python. It runs exclusively using native standard libraries, guaranteeing:
- Sub-200ms cold startup in CI.
- Zero transitive supply chain attack surface.
- Full immunity to third-party package vulnerabilities.
dotvet is an open-source initiative designed, built, and maintained by EthicCode Technologies.
- Website: ethiccode.in/dotvet
- Contact: [email protected]
MIT Β© 2026 EthicCode Technologies