- Where the value lives
- A .env file in the repoOn every laptop that has ever run the application, in a chat thread, and in whichever CI provider was configured last. Usually all three, usually disagreeing.
- xecretOnce, encrypted under a key belonging to that environment alone, fetched by the CLI at the moment a process starts.
- Onboarding somebody
- A .env file in the repoSomebody sends the file. Nobody is certain it is current, and there is now one more copy of production in a chat history that will outlive the job.
- xecretxecret login, then xecret run. They get the environments their role and grants allow, and nothing else.
- Rotating a leaked key
- A .env file in the repoChange it, then find every laptop, CI job, Dockerfile and deploy script holding a copy. You will miss one.
- xecretChange it once. The next run of every process picks up the new value, and the old one becomes a previous version in the history.
- Knowing who read it
- A .env file in the repoYou cannot. A file that has been copied leaves no record of the copy.
- xecretOne row per read, with the actor, the outcome and a count — including the reads that were refused.
- Somebody leaves
- A .env file in the repoRotate everything, on the assumption they kept a copy. You are right to assume it.
- xecretRemove them and every device they own stops working at once. Then rotate what actually matters, rather than all of it.
- Protecting production
- A .env file in the repoFour characters in a filename separate .env.production from .env.
- xecretProduction is deny-by-default for developers and viewers, and marked three ways in the interface so the marking survives colour blindness.
- What the provider can read
- A .env file in the repoNothing. The file never leaves machines you control. This is the one row where the file you already have wins, and it wins outright.
- xecretxecret can technically decrypt your secrets, and writes an audit row every time it does. That trade is what pays for the six rows above.