Setting a secret
Open your project’s Forge area, pick an environment, and find the Secrets section. Each secret your workloads declare appears there with its current state:
Press Set value on any row, type the value, and save. That is the whole flow.
You can set secrets before your first deploy
You do not have to deploy first. An environment that has never been deployed still accepts secrets — Reliant creates the environment record on your first write, and the values sit waiting until a deploy asks for them. This matters because the alternative is a deadlock: your first deploy needsSTRIPE_SECRET_KEY, but you cannot set STRIPE_SECRET_KEY until you have deployed. Set your secrets first, then deploy, and the deploy has everything it needs.
Setting a secret on a never-deployed environment creates the environment record but does not deploy anything and does not start any billable infrastructure. Nothing runs until you deploy.
You cannot read a secret back
Reliant will tell you that a secret exists, when it was last written, and how many versions it has. It will never show you the value — not in the UI, not through the API, not to support staff. This is enforced by the storage engine rather than by our UI being careful. The credential Reliant’s servers hold can list and read secret metadata and has no permission to read secret data at all; the storage layer refuses the request. There is no “reveal” button to find because there is no API call that could serve one. The practical consequence: keep your own copy of anything you cannot regenerate. If you lose a value, you rotate it at the source (issue a new Stripe key, for instance) and set the new one here.How secrets reach your workloads
You declare which secrets a workload needs in your forge configuration, as environment variables backed by a managed secret. At deploy time the platform resolves each declared name against your environment’s store and delivers the values to your workload as ordinary environment variables. Your code just readsprocess.env.STRIPE_SECRET_KEY (or your language’s equivalent) and does not know or care where the value came from.
Two consequences worth knowing:
- A secret nothing declares is never delivered anywhere. It sits in the store unused. The UI marks these so you can clean them up.
- Changing a secret does not change a running workload. Environment variables are set when a container starts, so a new version reaches your code on the next deploy or restart.
Versions, delete, and destroy
Every write creates a new version rather than overwriting the last one, so a bad value can be rolled back by setting the previous one again. Delete and Destroy are deliberately different operations:- Delete is reversible. It soft-deletes a version — nothing can read it, but the data is still there and Undelete restores it. This is what you want when retiring a secret you might need back.
- Destroy is permanent. The bytes are erased and no one, including us, can recover them. The version’s history row survives so the audit trail stays honest.
Scope and isolation
Secrets are scoped to a single environment, not shared across your project. Yourstaging and prod environments have entirely separate stores, so a value set in one is invisible to the other.
This is why you set the same secret name once per environment, and it is deliberate: it means a preview or staging workload cannot read your production database password, even if someone deploys the wrong code to the wrong place.