Skill v1.0.0
currentLLM-judged scan90/100version: "1.0.0" name: output-credentials-env-vars description: "Wire encrypted credentials to environment variables using the credential: convention. Use when setting up LLM provider keys (ANTHROPIC_API_KEY, OPENAI_API_KEY) or any env var that should come from encrypted credentials." allowed-tools: [Read, Edit, Bash, Glob]
Credentials as Environment Variables
When to Use This Skill
- Setting up
ANTHROPIC_API_KEYorOPENAI_API_KEYfrom encrypted credentials - Wiring any credential path to a
process.envvariable automatically - Migrating from plaintext
.envsecrets to encrypted credentials - Understanding why an env var is being resolved at worker startup
The credential: Convention
Any env var whose value starts with credential: is resolved from encrypted credentials at worker startup. The format is:
ENV_VAR_NAME=credential:<dot.path>
Example .env
# These are resolved automatically from the global credentialsANTHROPIC_API_KEY=credential:anthropic.api_keyOPENAI_API_KEY=credential:openai.api_key# Any credential path worksMY_SERVICE_TOKEN=credential:my_service.tokenDATABASE_URL=credential:postgres.url
Encrypted credentials (config/credentials.yml.enc)
anthropic:api_key: sk-ant-... # → resolves ANTHROPIC_API_KEYopenai:api_key: sk-... # → resolves OPENAI_API_KEYmy_service:token: tok_live_... # → resolves MY_SERVICE_TOKENpostgres:url: postgres://... # → resolves DATABASE_URL
How It Works
When the worker starts, every env var set to credential:<path> is replaced with the decrypted value at that path. By the time a workflow runs, ANTHROPIC_API_KEY holds the real key and LLM SDKs read it as usual.
Values come from the global credentials for the current environment: config/credentials/<NODE_ENV>.yml.enc when it exists, otherwise config/credentials.yml.enc. Workflow-scoped credentials are never used for env vars, so keep these paths in the global file.
Precedence Rules
Real env var values always take precedence. If ANTHROPIC_API_KEY is already set to a non-credential: value (e.g. from the shell or a CI secret), it is never overwritten:
# Real value - never replacedANTHROPIC_API_KEY=sk-ant-real-override# Placeholder — gets replaced at startupANTHROPIC_API_KEY=credential:anthropic.api_key
This means you can override any credential ref at deploy time without changing files.
Setting Up the Convention
Step 1: Initialize credentials (if not done)
npx output credentials initnpx output credentials edit # Add anthropic.api_key, openai.api_key
Step 2: Update .env
# Replace plaintext secrets with credential referencesANTHROPIC_API_KEY=credential:anthropic.api_keyOPENAI_API_KEY=credential:openai.api_key
Step 3: Verify
Start the worker and look for the log line:
[info] Credentials: Resolved credential env vars { vars: [ "ANTHROPIC_API_KEY", "OPENAI_API_KEY" ] }
If the log line lists your env vars, credentials are wired correctly.
Verification Checklist
- [ ]
config/credentials.yml.enccontains the target credential paths - [ ]
.envusescredential:<path>values for the relevant env vars - [ ] Worker startup log shows
Resolved credential env varslisting the expected env vars - [ ] First LLM workflow run succeeds (confirming
ANTHROPIC_API_KEYis set correctly) - [ ] Setting a real env var in the shell overrides the credential ref
Related Skills
output-credentials-init— Create the encrypted credentials fileoutput-credentials-edit— Add/update credential valuesoutput-dev-credentials— Full credentials system reference