zorath-env
Package: zorath-env | Binary: zenv
Built by Zorath -- infrastructure for builders.
A tiny, fast CLI that makes .env sane.
zenv validates environment variables from a schema, generates docs, and helps keep config consistent across dev/staging/prod.
Why
.env files drift. Teams copy/paste secrets. CI fails late. Docs go stale.
zenv makes your schema the source of truth.
Schema is the source of truth. Docs and examples should be generated from it.
Privacy
zenv runs locally. No uploads, no secrets fetching, no phoning home.
Works with any stack
zenv is language-agnostic. Use it with Node.js, Python, Go, Ruby, Rust, Java, PHP, or any project that uses .env files. It's a single-binary CLI with no runtime dependencies.
Install
Via cargo (recommended)
From source
Run locally
Quick start
- Create a schema:
- Validate your
.env:
- Generate docs:
Commands
zenv check
Validates .env against env.schema.json.
- exits
0if valid - exits
1if invalid (CI-friendly)
JSON Output (--format json):
Machine-readable output for CI/CD pipelines:
Secret Detection (--detect-secrets):
Scans for potential secrets that shouldn't be committed:
- AWS Access Keys and Secret Keys
- Stripe, GitHub, GitLab, Slack tokens
- Google, Heroku, SendGrid, Twilio, Mailchimp API keys
- npm tokens
- Private key headers (RSA, SSH, PGP)
- JWT tokens
- URLs with embedded passwords
- High-entropy strings
Watch Mode (--watch):
Watches for file changes and re-validates automatically:
Features:
- Delta detection: shows exactly which variable changed
- Targeted validation: only validates changed keys
- Content-hash skip: ignores saves without changes
- Local timestamps
- Terminal bell on errors
zenv docs
Generates documentation for all env vars in the schema.
zenv init
Creates env.schema.json from .env.example (best-effort inference, you refine types after).
zenv version
Shows installed version and optionally checks for updates.
zenv completions
Generates shell completions for bash, zsh, fish, and PowerShell.
# Or evaluate directly
zenv example
Generates .env.example from schema (reverse of init).
zenv diff
Compares two .env files and shows differences.
Shows:
- Variables only in first file
- Variables only in second file
- Variables with different values
- Optional schema compliance check for both files
zenv fix
Auto-fix common .env issues with backup.
What it fixes:
- Missing optional variables (adds with schema defaults)
- Unknown keys (with
--remove-unknown)
What it reports but doesn't fix:
- Invalid types (needs human input)
- Missing required variables (needs human input)
zenv scan
Scan source code for environment variable usage.
Supported languages: JavaScript/TypeScript, Python, Go, Rust, PHP, Ruby, Java, C#, Kotlin
zenv cache
Manage remote schema cache.
zenv export
Export .env to various formats for deployment.
zenv doctor
Run health check and diagnostics.
Checks:
- Schema file exists and is valid
- .env file exists and parses correctly
- Config file (.zenvrc) is valid JSON
- Remote schema cache is accessible
- Validation passes (if schema and env exist)
Output shows [OK], [WARN], or [ERROR] with actionable suggestions.
Files
By default, zenv looks for:
.env(optional).env.example(optional)env.schema.json(preferred)
Env file fallback
If .env doesn't exist, zenv check will automatically try:
.env.local.env.development.env.development.local
This is useful for Next.js and other frameworks that use .env.local for secrets.
You can override paths:
Schema format (v0.3)
Schemas can be written in JSON or YAML (auto-detected by file extension).
JSON schema
env.schema.json is a JSON object where each key is an env var name.
YAML schema
Use .yaml or .yml extension for YAML schemas:
# env.schema.yaml - more readable, supports comments
DATABASE_URL:
type: url
required: true
description: Primary database connection string
NODE_ENV:
type: enum
values:
- development
- staging
- production
default: development
description: Runtime environment
SERVER_PORT:
type: port
default: 3000
description: HTTP port
Supported types
| Type | Description | Example |
|---|---|---|
string |
Any string value | "hello" |
int |
Integer number | 42 |
float |
Floating point number | 3.14 |
bool |
Boolean (true/false/1/0/yes/no) | true |
url |
Valid URL | https://example.com |
enum |
One of specified values | "development" |
uuid |
UUID format | 550e8400-e29b-41d4-a716-446655440000 |
email |
Email address | user@example.com |
ipv4 |
IPv4 address | 192.168.1.1 |
ipv6 |
IPv6 address | 2001:0db8:85a3::8a2e:0370:7334 |
semver |
Semantic version | 1.2.3-beta.1 |
port |
Port number (1-65535) | 8080 |
date |
ISO 8601 date | 2024-06-15 |
hostname |
RFC 1123 hostname | api.example.com |
Validation rules
Add constraints with the validate field:
Severity levels
Mark non-critical validations as warnings (don't cause exit code 1):
Default severity is "error". Warnings are reported but don't fail validation.
Schema inheritance
Schemas can extend other schemas:
Inheritance supports up to 10 levels of depth. Circular references are detected and will cause an error.
Remote schemas
Fetch schemas from HTTPS URLs for shared team configurations:
# Validate against remote schema
# Generate docs from remote schema
# Force fresh fetch (skip cache)
Features:
- HTTPS only (HTTP rejected for security)
- Automatic caching with 1-hour TTL
--no-cacheflag to bypass cache- Remote schemas can extend other schemas (URLs resolved relative to parent)
Remote schema security
Hash verification - Verify schema integrity with SHA-256:
# Verify schema hasn't been tampered with
# Hash prefix matching supported (first 16+ chars)
Custom CA certificates - For enterprise internal servers:
Rate limiting - Prevents excessive fetching:
- Default: 60 seconds between fetches per URL
- Bypassed by
--no-cache - Configure in
.zenvrc:"rate_limit_seconds": 120
.env features
Comments and Blank Lines
Full-line comments, inline comments, and blank lines are supported:
# This is a full-line comment
DATABASE_URL=postgres://localhost/db # inline comment
# Blank lines are ignored
PORT=3000
Export prefix
Shell-style export prefix is supported for compatibility:
export DATABASE_URL=postgres://localhost/db
export NODE_ENV=development
Variable interpolation
Reference other variables with ${VAR} or $VAR:
BASE_URL=https://api.example.com
API_ENDPOINT=${BASE_URL}/v2
Multiline values
Use quoted strings for multiline:
SSH_KEY="-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA...
-----END RSA PRIVATE KEY-----"
Escape sequences
Double-quoted strings support \n, \t, \r, \\, \"
Example output
Success
Validation errors
)
When unknown variables are found in your .env that are not in the schema, zenv will show a helpful tip suggesting you update your schema.
Pre-commit hook
# .git/hooks/pre-commit (make executable)
#!/usr/bin/env bash
if [; then
if ; then
||
else
||
fi
fi
GitHub Action
Validate .env files in your CI/CD pipeline:
- name: Validate .env
uses: zorl-engine/zorath-env/.github/actions/zenv-action@main
with:
schema: env.schema.json
env-file: .env.example
Inputs:
schema- Path to schema file (default:env.schema.json)env-file- Path to .env file (default:.env)allow-missing-env- Allow missing .env (default:true)version- zenv version to use (default:latest)
Outputs:
valid-trueif validation passederrors- JSON array of error messages
Connect
- Official site: zorl.cloud
- Documentation: zorl.cloud/zenv/docs
- GitHub: github.com/zorl-engine/zorath-env
- crates.io: crates.io/crates/zorath-env
- All links: edgeurl.io/p/zorl-engine
License
MIT