Your .env.local works…
until it doesn't.
A local-first CLI that makes environment configuration deterministic. No cloud dependency. No guessing which value won.
It works on your machine.
It fails in CI.
Your teammate asks: “what's DATABASE_URL?”
Onboarding depends on tribal knowledge.
.env.local gets copied around until nobody trusts it.
That is not a secret-storage problem.
It is an environment-consistency problem.
envctl fixes this.
From contract to projection
Every step has a clear responsibility. No hidden source of truth.
Contract
What the project requires
Vault
What each machine stores locally
Profiles
Which local value set is active
Resolution
What is actually true at runtime
Projection
How the resolved environment reaches your tools
A deterministic CLI flow
From install to runtime — every command has a clear purpose.
Get running in 60 seconds
config init— creates your user-level configinit— prepares the repo and installs Git hooksfill— asks only for missing required valuescheck— validates the resolved environmentrun— executes with resolved env injected
Share requirements, not secrets
add— adds a variable to the shared contract- Commit the contract to Git — teammates pull it
- Each dev runs
fillto provide their own local values - Real values never leave the machine
Guard secrets automatically
- Managed Git hooks run
guard secretsbefore commit and push - No secrets in the contract — ever
- Local values stay on the machine
- Sensitive output is masked
- Optional encryption at rest
Choose your path
Without losing the bigger picture.
I just want it working
Install, init, fill, check, run. Done in 60 seconds.
I need to understand the model
Contract, vault, profiles, resolution, projection — the full mental model.
I need exact commands
Every CLI command, every flag, every option documented.
I have a specific scenario
Docker, CI, profiles, teams, hooks — practical guides.
Something broke
Common errors, recovery steps, debugging tips.
I want to understand the internals
Architecture layers, boundaries, and design decisions.