Plaintext secrets. Scattered across laptops. Pasted in Slack. Committed to git that one time. You know the drill.
Fix it in 60 seconds.
You already know this. You've just been too busy to fix it.
Someone asked for the Stripe key. You sent it. It's still there, searchable, forever. Anyone who joins the channel can find it.
Not now—you're careful now. But six months ago? That .env.example that wasn't actually an example? It's in the history.
The intern has the production database URL. The designer has the payment keys. Not because they need them. Because that's how .env files work.
Encrypted by default. Scoped by role. Audit trail included.
Same process.env. Same patterns. Different security posture.
const express = require('express');
const app = express();
// These come from envv, decrypted in memory
const STRIPE_KEY = process.env.STRIPE_API_KEY;
const ANALYTICS_ID = process.env.ANALYTICS_KEY_GOOGLE;
// Your code doesn't know or care where they came from
app.get('/api/config', (req, res) => {
res.json({
analytics: ANALYTICS_ID ? 'enabled' : 'disabled',
payments: STRIPE_KEY ? 'ready' : 'not configured'
});
});
app.listen(3000);
{
"scripts": {
"start": "node server.js"
}
}
// Assumes .env exists
// Assumes it has the right values
// Assumes nobody committed it
{
"scripts": {
"start": "envv run -- node server.js"
}
}
// Decrypts at runtime
// Injects into process
// Never touches disk
This is the part that changes how you think about secrets.
Needs to debug payment flows. Deploy to production. Fix that thing at 2am.
Runs the app locally to test UI changes. Looks at analytics to understand users.
Checks campaign metrics. Never touches code. Doesn't need to.
const key = process.env.API_KEY || 'dev-key';
// Runs fine with the default
// Ships to production with the default
// You find out when Stripe emails you
const key = process.env.API_KEY;
if (!key) throw new Error('API_KEY required');
// Fails immediately
// Fails obviously
// Fails before production
console.log('Config:', process.env);
// Great for debugging
// Also great for exposing every secret
// To every log aggregator
// Forever
console.log('Config:', {
nodeEnv: process.env.NODE_ENV,
port: process.env.PORT
});
// Log what you mean to log
// Nothing more
New hire starts. How long until they're productive?
9:00 "Who has the .env file?"
9:15 Waiting for Sarah to get to her laptop
10:30 Sarah sends partial .env via Slack
10:45 "Missing DATABASE_URL"
11:00 Sarah on a call
12:00 Lunch
13:00 Finally has all secrets
13:15 App runs
Total: half a day
9:00 envv auth register
9:01 envv pull --env development
9:02 envv run -- npm start
9:03 App runs
Total: 3 minutes
(Sarah never interrupted)
What happens if you don't fix this?
Nothing. You get lucky. The .env file never leaks, nobody leaves on bad terms, git history stays buried.
Someone leaves. You spend a weekend rotating every secret because you don't know what they had access to.
Your Stripe keys are on GitHub. Hackers find them in minutes. You explain to customers why their cards were charged.
curl -fsSL https://getenvv.com/envv | sh
Windows? irm https://getenvv.com/install.ps1 | iex