Write-only by design
Env values are never returned. Not by the API, not by the dashboard, not to you. A deployment reports only the names:secret go one step further: they are stored in the encrypted envelope and omitted entirely from templateConfig — the key is absent, not blanked, so nothing in the API tells you whether a secret is set. Non-secret template config is stored in the clear so it can be displayed and edited.
Values are encrypted at rest with AES-256-GCM.
The disclosure that matters
Encryption at rest is not the whole story, and it would be dishonest to leave it there: Practical consequences:- Do not print env values from your handler. Deployment logs are streamed to the dashboard, and your own workload’s output is not filtered for your secrets.
- Prefer narrowly-scoped, rotatable credentials — a read-only token for one bucket beats an account-wide key.
- If a value leaks, rotate it at the source. Replacing it on the deployment stops the old value from being re-provisioned, but does not un-leak it.
Rules
Reserved names belong to the runtime contract between the platform and your container; setting one is refused with a
400 naming the variable. Every other name is yours.
Updating
Env changes are a rolling update: the new configuration is applied and workers pick it up as they cycle. Workers already running the old configuration are reported withstale: true on the Workers panel until they are replaced.
Two semantics are worth knowing before you edit:
- Sending
envreplaces your map exactly. Keys you omit are removed."env": {}genuinely clears every variable you set — which is what makes a compromised value removable. - Omitting
enventirely carries your variables forward unchanged, so an unrelated edit (say, a new max context length) never silently drops them.

