Environment Variables
How Runway offers Vercel-style environment configuration on Databricks secret scopes without ever putting a value in an action, event, or projection.
Runway provides an environment-variable inventory for Preview, Development, and Production on top
of Databricks secret scopes. Both sensitive credentials and ordinary runtime configuration are
handled as secret-backed values because Databricks does not provide a Vercel-style readable
environment-variable store for Apps. Runway's
secrets.sync action populates those scopes as a governed, audited action — while guaranteeing
that a secret value never lands in an action parameter, an event, or a projection.
Scope naming
Runway owns the scope name so it is predictable and per-environment:
runway-<appId>-<environment>The same variable is passed into the bundle as BUNDLE_VAR_secret_scope, so the Databricks App
resolves its secrets from the scope Runway synced. Prod scope sync is allowed — it is a governed,
audited action, not a deploy.
Values never enter the action
Instead of passing values, secrets.sync takes an opaque secretCommandId:
- The operator (or console form) writes the secret values into a one-time secret command —
encrypted at rest (AES-256-GCM), scope-bound, single-use (
consumed_at), and expiring. secrets.synccarries only{ appId, environment, secretCommandId }. The runtime redacts any other parameter before the durable invocation is recorded.- The resulting event and the
secretsprojection record only key names and the scope — never a value. - At the workspace edge, the store yields the plaintext exactly once to write the scope, then marks the command consumed.
What you can see afterwards
The console's Environment Variables view presents a cross-environment matrix for each app. It shows which keys exist in Preview, Development, and Production, plus the last sync time. A bulk editor can update several keys in one governed operation. Values are never rendered back—Databricks Secrets is intentionally write-only through this product surface, so there is nothing to leak.
Updating an existing key overwrites its value at the workspace edge. Each key also has governed
rename and delete controls. runway.secret_delete invokes the typed secrets.delete
adapter and emits completion only after Databricks succeeds. runway.secret_rename requires a new
opaque replacement-value command because Databricks Secrets cannot reveal or copy the old value;
it durably writes the new key first, deletes the old key second, then emits RunwaySecretRenamed.
The same actions are available to authorized Harness and MCP agents.
For the RAG template
The scaffolded agent expects, per environment: DATABRICKS_HOST, a service-principal
DATABRICKS_CLIENT_ID / DATABRICKS_CLIENT_SECRET, and DATABRICKS_AI_SEARCH_INDEX
(catalog.schema.index). Sync them to the app's scope before promoting.