The model
Declare
| Field | Description |
|---|---|
name | Lowercase, alphanumeric with - or _. Orgo maps it to its UPPER_SNAKE_CASE form (e.g. ANTHROPIC_API_KEY) and looks that name up in your vault. Required. |
description | Shown to the launching user. |
example | Example value shape, e.g. sk-ant-.... |
docs_url | Where to obtain the secret. |
optional | If true, the template still launches when the secret is absent. Defaults to false. |
Reference
A declared secret can be referenced two ways. As an environment variable —{secret: <name>} in env:
secret://<name> in files:
/root/.env as its UPPER_SNAKE_CASE name — so anthropic_api_key becomes ANTHROPIC_API_KEY. The base shell sources /root/.env, so interactive terminals see the variable automatically.
Secrets and golden snapshots
This is the one subtlety worth understanding. A template VM boots by restoring the golden snapshot, which was built before any particular user launched it. The user’s secret is injected per-VM at create — after the snapshot was baked. So a process baked into the snapshot won’t see the secret unless it (re)reads it after injection. The fix is theon_resume hook, which runs on every restore, after /root/.env is written:
claude-code template uses to launch the CLI with the launcher’s own key. For an app service, reference the secret through the service’s env instead, and supervisord starts it with the value in place.
Managing your vault
Add and update secret values in the dashboard at orgo.ai/workspaces. The vault is per-account: store a key once and every template you launch can request it by name.Security
- Values are encrypted at rest and never returned to a client in plaintext.
- A secret is never part of the template document, its
digest, or the golden snapshot. - Build logs never print secret values.
- Only secrets a template explicitly declares are injected, and only if you have them set.
Next steps
Schema reference
env, files, and secrets in full.Examples
See the
on_resume pattern in a real template.