npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dotvet

v0.1.8

Published

Zero-config environment variable security scanner and quality gate CLI. Validates presence, bans placeholders, and enforces secret strength (e.g. JWT >= 32 chars).

Readme

dotvet 🛡️

Zero-config environment variable security scanner & quality gate.

Validate presence, ban dangerous placeholders, and enforce secret entropy before deploying to production.

GitHub Marketplace dotvet: secure License: MIT Zero Dependencies


⚡ Why dotvet? (The Comparison)

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 | ❌ | ❌ | ⚠️ (Manual hook) | | Generates Machine-Readable .env.schema.json Contract | ✅ Yes | ❌ | ❌ | ❌ | | Native GitHub Action (uses: EthicCodeTech/dotvet@v1) | ✅ Yes | ❌ | ⚠️ | ⚠️ | | Runtime Dependencies | 0 | Multiple | Multiple | Go binary |


🛡️ Repository Security Badge

Show your team and users that your repository is protected from insecure environment variables. Add this badge to your README:

[![dotvet: secure](https://ethiccode.in/dotvet/badge.svg)](https://ethiccode.in/dotvet)

🚀 Quickstart

In Node.js / TypeScript Projects

Run immediately without installing:

npx dotvet

Or install as a dev dependency:

npm install --save-dev dotvet
# or
pnpm add -D dotvet
# or
yarn add -D dotvet

In Python Projects

pip install dotvet
dotvet

📜 Your Team's Env Contract (.env.schema.json)

Onboarding new engineers shouldn't require sending unencrypted .env files over Slack.

Run dotvet generate once:

npx dotvet generate

This derives your project's canonical environment contract:

  1. .env.example: Clean documentation of all required variables without exposing production secrets.
  2. .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.


💻 CLI Commands

1. dotvet / dotvet check (Default)

Audits .env against variables referenced in your code:

npx dotvet
# or target a specific subfolder / monorepo package
npx dotvet check backend/
# or specify an alternate env file
dotvet check --env .env.production

Example Output:

dotvet v0.1.8 — 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.

2. dotvet init

Initializes dotvet in your project by scaffolding a clean .dotvetignore template and verifying .gitignore safely excludes .env:

npx dotvet init

3. dotvet scan

Inspects your entire codebase and maps out where every environment variable is used:

npx dotvet scan

Output:

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

🛡️ Security Rules

| 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). |


⚙️ Options & Flags

| Flag | Default | Description | | :--- | :--- | :--- | | --env <path> | .env | Path to environment file to audit | | --dir, -d <path> | . | Target directory to scan (or pass positional path: npx dotvet check backend/) | | --ignore, -i <vars> | | Ignore specific variables or rules (comma-separated, e.g. -i LEGACY_KEY,API_KEY:WEAK_SECRET_LENGTH) | | --include-cgi | false | Include standard CGI/PHP web server variables (RFC 3875) in scan | | --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 |


🛡️ Ignoring Variables & Configuration

Need to exempt a legacy variable or specific rule without compromising the entire security check? dotvet supports multiple flexible ways:

1. .dotvetignore file (Repo root)

Run dotvet init to generate .dotvetignore:

# Exempt an entire variable from all checks
LEGACY_CLIENT_TOKEN

# Exempt a variable from a specific rule only
CUSTOM_KEY:WEAK_SECRET_LENGTH

2. Configuration file (dotvet.config.json or .dotvetrc.json)

You can configure global rules and ignores in dotvet.config.json or package.json:

{
  "ignore": [
    "LEGACY_API_KEY",
    "CUSTOM_TOKEN:WEAK_SECRET_LENGTH"
  ],
  "rules": {
    "JWT_UNDERSIZED": { "severity": "warn" }
  }
}

3. Inline # dotvet-ignore comments in .env

# Ignore all checks for this line
LEGACY_KEY=short # dotvet-ignore

# Or ignore a specific rule
DEV_SECRET=short # dotvet-ignore:WEAK_SECRET_LENGTH

4. CLI flag (--ignore, -i)

npx dotvet check --strict --ignore "LEGACY_KEY,DEV_KEY:WEAK_SECRET_LENGTH"

🤖 CI / CD Integration: GitHub Action

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"

🔒 Why Zero Dependencies?

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.

🏢 Created by EthicCode Technologies

dotvet is an open-source initiative designed, built, and maintained by EthicCode Technologies.


📄 License

MIT © 2026 EthicCode Technologies