██╗ ██╗███████╗██╗██╗
██║ ██║██╔════╝██║██║
██║ ██║█████╗ ██║██║
╚██╗ ██╔╝██╔══╝ ██║██║
╚████╔╝ ███████╗██║███████╗
╚═══╝ ╚══════╝╚═╝╚══════╝
A lightweight, secure CLI secrets manager for developers. Store passwords, API keys, JWT secrets, and database credentials locally with AES-256-GCM encryption.
- AES-256-GCM encryption with random nonces
- Single binary, no servers, no dependencies
- Group secrets by project/environment
- Global Search - Find secrets across all vaults
- Export to .env - Generate and export secrets directly to environment files
- Secret Generation - Generate strong passwords, API keys, and JWT secrets
- Direct .env Integration - Generate secrets straight into your .env files
# Quick install (Linux/macOS)
curl -fsSL https://raw.githubusercontent.com/ossydotpy/veil/main/install.sh | bash
# With Go
go install github.com/ossydotpy/veil/cmd/veil@latest
# Or build from source
git clone https://github.com/ossydotpy/veil.git
cd veil
go build -o veil ./cmd/veil# 1. Generate your master encryption key
veil init
# Save this key: export MASTER_KEY=<your-key>
# 2. Store a secret
veil set production DATABASE_URL "postgresql://user:pass@localhost/db"
# 3. Retrieve it
veil get production DATABASE_URL
# 4. Generate a strong password
veil generate production DB_PASSWORD --length 32
# 5. Export all secrets to .env
veil export production --to .env# Store a secret
veil set <vault> <name> <value>
# Retrieve a secret
veil get <vault> <name>
# Delete a secret
veil delete <vault> <name>
# List secrets in a vault
veil list <vault>
# List all vaults
veil vaults# Search for secrets across all vaults (case-insensitive, supports wildcards)
veil search API_KEY
veil search "DB_*"
veil search "*SECRET*"# Export vault secrets to .env file
veil export production --to .env
# Append to existing file
veil export staging --to .env --append
# Force overwrite
veil export production --to .env --force
# Preview without writing
veil export production --to .env --dry-run# Generate a strong password (default: 32 chars with symbols)
veil generate <vault> <name>
# Custom length, no symbols
veil generate production API_KEY --length 48 --no-symbols
# Generate API key (uuid, hex, or base64)
veil generate stripe-api STRIPE_KEY --type apikey --format base64 --prefix "sk_live_"
# Generate JWT secret (256 or 512 bits)
veil generate auth JWT_SECRET --type jwt --bits 256# Generate and append to .env in one command
veil generate myapp API_KEY --type apikey --to-env .env
# Overwrite existing key
veil generate myapp API_KEY --to-env .env --force| Variable | Description | Default |
|---|---|---|
MASTER_KEY |
Your 64-character hex encryption key | Required |
VEIL_DB_PATH |
Path to the SQLite database | ~/.veil.db |
VEIL_STORE_TYPE |
Storage backend | sqlite |
- AES-256-GCM encryption with cryptographically random nonces
- No server - all data stays on your machine
- Encrypted at rest - database file is useless without the master key
- File permissions - database and .env files get 0600 permissions
- No logging - secrets never appear in logs or stdout (except during generation)
# Generate local development credentials
veil generate dev DB_PASSWORD --to-env .env.local
veil generate dev JWT_SECRET --type jwt --to-env .env.local
veil generate dev STRIPE_KEY --type apikey --prefix "sk_test_" --to-env .env.local# Export production secrets for deployment
veil export production --to .env.production
# Deploy with .env.production# New team member searches for what they need
veil search "STRIPE*"
# Found 1 match:
# production/STRIPE_SECRET_KEY
# Get the key
veil get production STRIPE_SECRET_KEY# Generate new database password
veil generate production DB_PASSWORD --length 32 --to-env .env --force
# Update database, restart services- Keep your MASTER_KEY safe - If you lose it, your secrets are gone forever
- Use vaults for environments -
dev,staging,production - Never commit .env files - Add them to .gitignore
- Use descriptive names -
DB_PASSWORDnotPASS - Rotate secrets regularly - Use
veil generatewith--forceto update
- Storage: SQLite with AES-256-GCM encrypted values
- Key Derivation: Master key must be 32 bytes (64 hex characters)
- Format: Encrypted values stored as
nonce || ciphertext(hex encoded) - Search: Case-insensitive SQL LIKE queries on unencrypted vault/name fields
MIT