evnx — blazing-fast environment variable manager and inspector built in Rust
Project description
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.
Installation
Linux / macOS
curl -sSL https://raw.githubusercontent.com/urwithajit9/evnx/main/scripts/install.sh | bash
npm
npm install -g @evnx/cli
pipx (recommended for Python environments)
pipx install evnx
pip install evnxalso works but places the binary inside the active virtualenv'sbin/directory. Usepipxto makeevnxavailable system-wide without managing a virtualenv manually.
Cargo
cargo install evnx
# with all optional features
cargo install evnx --all-features
Windows
Install Rust first, then:
cargo install evnx
evnx --version
Verify
evnx --version
evnx --help
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 add
evnx validate
Validates your .env file for common misconfigurations before deployment.
evnx validate # pretty output
evnx validate --strict # exit non-zero on warnings
evnx validate --format json # machine-readable output
evnx validate --format github-actions # inline GitHub annotations
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.
evnx scan # scan current directory
evnx scan --path src/ # specific path
evnx scan --format sarif # SARIF output for GitHub Security tab
evnx scan --exit-zero # warn but do not fail CI
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 diff # compare .env vs .env.example
evnx diff --show-values # include actual values
evnx diff --reverse # swap comparison direction
evnx diff --format json # JSON output
evnx convert
Converts your .env file to 14+ output formats for various deployment targets.
evnx convert --to json
evnx convert --to yaml
evnx convert --to shell
evnx convert --to docker-compose
evnx convert --to kubernetes
evnx convert --to terraform
evnx convert --to github-actions
evnx convert --to aws-secrets
evnx convert --to gcp-secrets
evnx convert --to azure-keyvault
evnx convert --to heroku
evnx convert --to vercel
evnx convert --to railway
evnx convert --to doppler
Advanced filtering and transformation:
evnx convert --to json \
--output secrets.json \
--include "AWS_*" \
--exclude "*_LOCAL" \
--prefix "APP_" \
--transform uppercase \
--base64
Pipe directly to AWS Secrets Manager:
evnx convert --to aws-secrets | \
aws secretsmanager create-secret \
--name prod/myapp/config \
--secret-string file:///dev/stdin
evnx sync
Keeps .env and .env.example aligned, in either direction.
# Forward: .env → .env.example (document what you have)
evnx sync --direction forward --placeholder
# Reverse: .env.example → .env (generate env from template)
evnx sync --direction reverse
evnx migrate (requires --features migrate)
Migrates secrets directly to cloud secret managers.
# GitHub Actions secrets
evnx migrate --from env-file --to github-actions \
--repo owner/repo --github-token $GITHUB_TOKEN
# AWS Secrets Manager
evnx migrate --to aws-secrets-manager --secret-name prod/myapp/config
# Doppler (with dry run)
evnx migrate --to doppler --dry-run
evnx doctor
Runs a health check on your environment configuration setup.
evnx doctor # check current directory
evnx doctor --path /path/to/project
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.
evnx template \
--input config.template.yml \
--output config.yml \
--env .env
Supported inline filters:
database:
host: {{DB_HOST}}
port: {{DB_PORT|int}}
ssl: {{DB_SSL|bool}}
name: {{DB_NAME|upper}}
evnx backup / evnx restore (requires --features backup)
Creates and restores AES-256-GCM encrypted backups using Argon2 key derivation.
evnx backup .env --output .env.backup
evnx restore .env.backup --output .env
CI/CD Integration
GitHub Actions
name: Validate environment
on: [push, pull_request]
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 hook
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: evnx-validate
name: Validate .env files
entry: evnx validate --strict
language: system
pass_filenames: false
- id: evnx-scan
name: Scan for secrets
entry: evnx scan --exit-zero
language: system
pass_filenames: false
Configuration
Store defaults in .evnx.toml at the project root:
[defaults]
env_file = ".env"
example_file = ".env.example"
verbose = false
[validate]
strict = true
auto_fix = false
format = "pretty"
[scan]
ignore_placeholders = true
exclude_patterns = ["*.example", "*.sample", "*.template"]
format = "pretty"
[convert]
default_format = "json"
base64 = false
[aliases]
gh = "github-actions"
k8s = "kubernetes"
tf = "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={"key": "value"}
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
git clone https://github.com/urwithajit9/evnx.git
cd evnx
cargo build # core features only
cargo build --all-features
cargo test
cargo clippy --all-features -- -D warnings
cargo fmt
Feature flags:
[features]
default = []
migrate = ["reqwest", "base64", "indicatif"]
backup = ["aes-gcm", "argon2", "rand"]
full = ["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
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 Distributions
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 evnx-0.3.0.tar.gz.
File metadata
- Download URL: evnx-0.3.0.tar.gz
- Upload date:
- Size: 190.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49eae5a25827394ad1e98420298cb5897e178b3c050aadfb737dbd860efb8e93
|
|
| MD5 |
bed1b3cdaa0c8239bb50e70998dd1b26
|
|
| BLAKE2b-256 |
8e42799bd00dc5a475d48bff3c48075ca2fa9bbb15a01587aa23a526da60caf4
|
File details
Details for the file evnx-0.3.0-py3-none-win_amd64.whl.
File metadata
- Download URL: evnx-0.3.0-py3-none-win_amd64.whl
- Upload date:
- Size: 1.9 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48b3204a89036af6c670b68caa988daa961892cab69cee699d010e9447585b47
|
|
| MD5 |
154f58bb639de78b13feb858a6b03340
|
|
| BLAKE2b-256 |
4e8d01bd157f6efa4f2f4bebbbfb4e09d3bd4c41d7f6d6a01b451932775b9cdb
|
File details
Details for the file evnx-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: evnx-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.9 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6741f4861e28c4ade5622044a24f3ccab85c37a3ddd12b070bf606535a1a232
|
|
| MD5 |
6a4f2309937e7c139174ee27730096ff
|
|
| BLAKE2b-256 |
cd9aef6fb65963931c34c2154eecc2e5c0bc8289252ab0b21f7544148ba5481f
|
File details
Details for the file evnx-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.
File metadata
- Download URL: evnx-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
- Upload date:
- Size: 1.8 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARMv7l
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ba40184cadf59202b1c9e42c7340dfbbb9dbe953c17cb708088626e9582e5bc
|
|
| MD5 |
0345a374e457d8aed62cf06aefa1fc2e
|
|
| BLAKE2b-256 |
b4a51ea0a2e080b697418e42b9abab0aebd49adf12eb6334cdd2a2a2176dc395
|
File details
Details for the file evnx-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: evnx-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.8 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6134bbe41b17eda72332eb605d7ec51f6e1e50ca7a049d82b8ebac58e5b5c61
|
|
| MD5 |
bc9c638dbd65f72b1b23c37c593845d4
|
|
| BLAKE2b-256 |
6c6deed4a11c80e4cbddc127df02f8dc70cc86ea55eb9c6c31f8e2fbc2c8abd0
|
File details
Details for the file evnx-0.3.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: evnx-0.3.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.7 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9fb5e1c14892a7a963fcac4a6a5d8df9fcdbf4bda0bf7362434d885b8e42993
|
|
| MD5 |
af8b0a8e877573e3fed700a4dd079149
|
|
| BLAKE2b-256 |
e473946221db5b229e8f6d968bfe43f94ef81bb735718d945cd35713bed2fd0a
|
File details
Details for the file evnx-0.3.0-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: evnx-0.3.0-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.8 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b5a13d9ec21b5a393010de28bfe027bb2d57cf3343c5da114280609766e3ee7
|
|
| MD5 |
f1ddba95ef8ea3e76ab3ac2ec1fdf4ac
|
|
| BLAKE2b-256 |
45413af2df6700eef41d2c5ab1de4923370ead909d18371a440cd4e4c81002a7
|