evnx
A CLI tool for managing .env files — validation, secret scanning, format conversion, and migration to cloud secret managers.
Website | Getting Started | Changelog
Why evnx?
Accidentally committing secrets to version control is one of the most common and costly developer mistakes. evnx is a local-first tool that catches misconfigurations, detects credential leaks, and converts environment files to the format each deployment target expects — before anything reaches CI or production.
Testing & playground
→ urwithajit9/evnx-test — try evnx in your browser via GitHub Actions, no installation required.
Installation
Linux / macOS
|
Homebrew (macOS and Linux)
npm
pipx (recommended for Python environments)
pipx installs CLI tools into isolated environments and wires them to your system PATH automatically. It is the correct tool for installing Python- distributed CLI binaries like evnx.
Don't have pipx?
macOS
Ubuntu / Debian (Python 3.11+)
On older Ubuntu (20.04 and below) where pipx is not in apt:
Note: pip install evnx will fail on Ubuntu 22.04+ with an "externally managed
environment" error (PEP 668). This is intentional — Ubuntu protects the system
Python. Use pipx instead.
Windows
python -m pip install --user pipx
python -m pipx ensurepath
After running ensurepath, close and reopen your terminal (a full logout/login
may be required for PATH changes to take effect), then:
pipx install evnx
After installing pipx on any platform, restart your terminal and run:
Cargo
# with all optional features
Windows
Scoop (user-local, no admin required)
scoop bucket add evnx https://github.com/urwithajit9/scoop-evnx
scoop install evnx
Winget (system-wide)
winget install urwithajit9.evnx
Cargo (Windows)
Install Rust first, then:
cargo install evnx
evnx --version
Verify
Commands
evnx init
Interactive project setup. Creates .env and .env.example files for your project through a guided TUI.
evnx init
Running evnx init launches an interactive menu with three modes:
How do you want to start?
Blank — create empty .env files
Blueprint — use a pre-configured stack (Python, Node.js, Rust, Go, PHP, and more)
Architect — build a custom stack by selecting services interactively
There are no flags required. The interactive flow handles stack and service selection inside the TUI.
evnx add
Add variables to an existing .env file interactively. Supports custom input, service blueprints, and variable templates.
evnx validate
Validates your .env file for common misconfigurations before deployment.
Detects: missing required variables, placeholder values (YOUR_KEY_HERE, CHANGE_ME), the boolean string trap (DEBUG="False" is truthy in most runtimes), weak secret keys, localhost in production, and suspicious port numbers.
evnx scan
Scans files for accidentally committed credentials using pattern matching and entropy analysis.
Detects: AWS Access Keys, Stripe keys (live and test), GitHub tokens, OpenAI and Anthropic API keys, RSA/EC/OpenSSH private keys, high-entropy strings, and generic API key patterns.
evnx diff
Compares .env and .env.example and shows what is missing, extra, or mismatched.
evnx convert
Converts your .env file to 14+ output formats for various deployment targets.
Advanced filtering and transformation:
Pipe directly to AWS Secrets Manager:
| \
evnx sync
Keeps .env and .env.example aligned, in either direction.
# Forward: .env → .env.example (document what you have)
# Reverse: .env.example → .env (generate env from template)
evnx migrate (requires --features migrate)
Migrates secrets directly to cloud secret managers.
# GitHub Actions secrets
# AWS Secrets Manager
# Doppler (with dry run)
evnx doctor
Runs a health check on your environment configuration setup.
Checks: .env exists and has secure permissions, .env is in .gitignore, .env.example is tracked by Git, and project structure detection.
evnx template
Generates configuration files from templates using .env variable substitution.
Supported inline filters:
database:
host:
port:
ssl:
name:
evnx backup / evnx restore (requires --features backup)
Creates and restores AES-256-GCM encrypted backups using Argon2 key derivation.
CI/CD Integration
GitHub Actions
name: Validate environment
on:
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install evnx
run: |
curl -sSL https://raw.githubusercontent.com/urwithajit9/evnx/main/scripts/install.sh | bash
- name: Validate configuration
run: evnx validate --strict --format github-actions
- name: Scan for secrets
run: evnx scan --format sarif > scan-results.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: scan-results.sarif
GitLab CI
validate-env:
stage: validate
image: alpine:latest
before_script:
- apk add --no-cache curl bash
- curl -sSL https://raw.githubusercontent.com/urwithajit9/evnx/main/scripts/install.sh | bash
script:
- evnx validate --strict --format json
- evnx scan --format sarif > scan.sarif
artifacts:
reports:
sast: scan.sarif
pre-commit / prek Integration
Use evnx as automatic git hooks via pre-commit or prek — no manual evnx install needed. The binary is compiled and cached automatically on first run.
Add to .pre-commit-config.yaml:
default_install_hook_types:
repos:
- repo: https://github.com/urwithajit9/evnx
rev: v0.3.6
hooks:
- id: evnx-scan # blocks commit if secrets found
- id: evnx-validate # blocks commit if .env misconfigured
- id: evnx-diff # warns on .env/.env.example drift
- id: evnx-scan-push # strict scan on push
Then install:
That's it. On your next commit, hooks will auto-compile and run.
Configuration
Store defaults in .evnx.toml at the project root:
[]
= ".env"
= ".env.example"
= false
[]
= true
= false
= "pretty"
[]
= true
= ["*.example", "*.sample", "*.template"]
= "pretty"
[]
= "json"
= false
[]
= "github-actions"
= "kubernetes"
= "terraform"
Known Limitations
Array and multiline values — evnx follows the strict .env spec where values are simple strings. The following will not parse correctly:
# Not supported
CORS_ALLOWED=["https://example.com", "https://admin.example.com"]
CONFIG=
DATABASE_HOSTS="""
host1.example.com
host2.example.com
"""
Use comma-separated strings and parse them in application code. A --lenient flag for extended syntax is under consideration — see open issues.
Windows — file permissions checking is limited (no Unix permission model). Terminal color support requires PowerShell or Windows Terminal on older systems.
Development
Feature flags:
[]
= []
= ["reqwest", "base64", "indicatif"]
= ["aes-gcm", "argon2", "rand"]
= ["migrate", "backup"]
Contributing
See CONTRIBUTING.md. Contributions are welcome in: additional format converters, secret pattern improvements, Windows enhancements, extended .env format support, and integration examples.
License
MIT — see LICENSE.
Credits
Built by Ajit Kumar.
Related projects: python-dotenv, dotenvy, direnv, git-secrets.
Website | Issues | Discussions | Email