Skip to main content

Secrets & Credentials

Eve provides multi-scope secret management for deployments, agent harnesses, and local development. Secrets are encrypted at rest and never returned in plaintext by the API.

Secret scopes

Secrets cascade through four levels. When the same key exists at multiple scopes, the most specific scope wins:

Resolution order (highest priority first): project > user > org > system.

API scope resolution takes precedence. Local files are a fallback for convenience in local development.

For example, if GITHUB_TOKEN is set at both the org and project level, the project value is used. System secrets provide a baseline for all orgs and projects.

Setting secrets

Individual secrets

# Set a project-level secret
eve secrets set API_KEY "your-api-key" --project proj_xxx

# Set an org-level secret (shared across projects)
eve secrets set GITHUB_TOKEN "ghp_xxx" --scope org --org org_xxx

# List keys (values are never shown)
eve secrets list --project proj_xxx

# Show a masked value (first/last characters only)
eve secrets show API_KEY --project proj_xxx

# Delete a secret
eve secrets delete API_KEY --project proj_xxx

Importing from a file

Batch-import secrets from an env-style file (KEY=VALUE per line):

# Import into an org
eve secrets import --org org_xxx --file ./secrets.env

# Import into a project
eve secrets import --project proj_xxx --file .env

Lines starting with # are ignored. Values are read verbatim after the = sign — quotes are not stripped. Imports upsert each key.

Supported scope flags: --project, --org, --user, --system (admin only).

Manifest secret interpolation

Reference secrets in .eve/manifest.yaml using ${secret.KEY} syntax. At deploy time, Eve resolves each reference against the secret scope chain and injects the values:

services:
api:
environment:
DATABASE_URL: postgres://app:${secret.DB_PASSWORD}@db:5432/mydb
API_KEY: ${secret.EXTERNAL_API_KEY}
db:
environment:
POSTGRES_PASSWORD: ${secret.DB_PASSWORD}

Other interpolation variables are also available in manifests:

VariableReplaced withExample
${ENV_NAME}Environment nametest, staging, production
${PROJECT_ID}Project IDproj_01kfew...
${ORG_ID}Organization IDorg_Example...
${ORG_SLUG}Organization slugacme
${COMPONENT_NAME}Current service nameapi, web
${secret.KEY}Secret value${secret.DB_PASSWORD}
${managed.<svc>.<field>}Managed DB value${managed.db.url}

Local dev secrets

For local development, create .eve/dev-secrets.yaml in your project root (gitignored):

# .eve/dev-secrets.yaml
secrets:
# Default secrets (fallback for any environment)
default:
DB_PASSWORD: dev_password
API_KEY: local-dev-key

# Environment-specific overrides
test:
DB_PASSWORD: test_password
staging:
DB_PASSWORD: staging_password
production:
DB_PASSWORD: ${REQUIRE_REAL_SECRET} # Placeholder — set via API

For local work, .env and system-secrets.env.local are available in addition to .eve/dev-secrets.yaml:

  • .env for process-level values used by local tooling and docker-compose services
  • system-secrets.env.local for host-level system secret defaults (local stacks)
  • .eve/dev-secrets.yaml for manifest interpolation overrides

.eve/dev-secrets.yaml is usually sufficient for most local interpolation cases. The local files are read for local/runtime convenience and do not replace platform-managed resolution order.

note

For k8s deployments, .eve/dev-secrets.yaml only works when the project uses a file:// repo URL and the worker has filesystem access to that path. For production k8s deployments, set secrets via the API instead.

Harness credentials

Agent runtimes require provider secrets from this same project/org scope:

HarnessRequired secret
mclaude, claude, zaiANTHROPIC_API_KEY
code, coderOPENAI_API_KEY + CODEX_AUTH_JSON_B64
geminiGEMINI_API_KEY or GOOGLE_API_KEY
zaiZ_AI_API_KEY

These keys are expected by the platform bridges when those models are selected for jobs.

Secret validation

Manifests can declare required secrets via x-eve.requires.secrets. Validate that all required secrets are present before deploying:

# Validate secret references
eve secrets validate --project proj_xxx

# Validate during project sync
eve project sync --validate-secrets

# Strict mode — fail on any missing secret
eve project sync --strict

Validation reports missing secrets with scope-aware remediation hints, such as eve secrets set KEY value --scope project --project proj_xxx.

Safe secrets (ensure and export)

Certain secrets can be auto-generated and exported for configuring external systems. Currently allowlisted: GITHUB_WEBHOOK_SECRET.

# Generate if missing
eve secrets ensure --project proj_xxx --keys GITHUB_WEBHOOK_SECRET

# Export plaintext value (for webhook setup)
eve secrets export --project proj_xxx --keys GITHUB_WEBHOOK_SECRET
caution

eve secrets export returns the plaintext value. Treat it as sensitive.

Worker secret injection

At job execution time, resolved secrets are injected as environment variables into the worker container. The allowlisted set of secrets is available to the agent process.

For Git authentication:

  • HTTPS clone: github_token secrets are injected into the clone URL for private repo access.
  • SSH clone: ssh_key secrets are written to a temp key and wired via GIT_SSH_COMMAND.

Missing auth surfaces explicit errors with remediation hints.

Troubleshooting

ProblemFix
Secret missing at deployConfirm with eve secrets list and set the key
Interpolation errorVerify ${secret.KEY} spelling; run eve secrets validate
Git clone failedCheck that github_token or ssh_key is set

What's next?