Browse docsDevelopers
Secrets
Set the credentials a repository's verbs need, sealed on the way in and never shown again.
A verb often needs a value that must not be in the repository — an API token for the service your app runs on, for example. Rift keeps those as secrets on the repository: an admin sets one by name, it's sealed before anything stores it, and it reaches only the run of a verb that names it. This page is how to set, list and remove them, and where they go.
Set a secret
Admins only, in the app. The name is an environment variable's — letters, digits and underscores, not starting with a digit, at most 128 characters. A value is at most 64 KiB.
In the app, open Repositories and click Manage in the repository's Secrets column. Type the name and the value, then click Set. The value is one line: the page refuses a value with a line break. It goes in the form's body, never in a URL, and the page never shows it again. A name that is set already gets the new value, and the old value's key is destroyed.
Most of what an admin does has an MCP tool an agent can call. Secrets don't, because a value an agent passed would sit in the conversation for good. Set them yourself in the app; the agent's verbs get them all the same.
See what's set
The repository's secrets page in the app lists them: names, who set each, and when. Values are never shown — not here, not anywhere. Rift keeps only the sealed form, and only the run of a verb that names a secret ever sees its plaintext.
Remove one
On the secrets page, click Remove on its row and confirm. Removal is real: the secret is struck from the repository, and then the key the value was sealed under is destroyed. Every copy of the ciphertext anywhere is garbage from that moment. Replacing a value destroys the old value's key the same way.
Rift records the organization that first watched the repository or set a secret on it. If the GitHub App is later installed for another organization, nobody can see or change the repository's secrets from either organization.
Where a secret goes
A secret goes to verbs, and only to verbs. A VM keeps no secret, whether it is parked in the pool or claimed: a secret is on the VM only in the one process of a verb run that names it, for that run. The jail an agent's commands run in has no secret anywhere in it.
A verb names a secret as its credential in the repository's expression: credential = "FLY_API_TOKEN". Each run of that verb asks the control plane for the value, is recorded, and gets the value as the environment variable of that name — outside the jail, for that one run. That is how an agent reads its app's logs with a fly-logs verb and never sees the token. A verb that names a secret the repository doesn't have is refused, and the refusal says that an admin sets it on the repository's secrets page in the app.
Your GitHub token is not a secret of this kind, but it travels the same way: a VM keeps no copy of it, and a verb fetches it per run.
Because a verb fetches the value each time it runs, a changed secret reaches the next run, on a VM already running or a new one.
See Inside a VM for the jail and the verbs.