encore-secret — Claude Code skill: what it does, how to install
This skill manages API keys and other private values in Encore.ts. It helps agents declare, read, and set secrets for separate environments.
npx skills add encoredev/skills --skill encore-secret -a claude-code
npx skills add encoredev/skills --skill secret -a claude-codeWhat encore-secret does
The skill uses secret(...) from encore.dev/config. It places a declaration at package scope, then reads the value by calling the returned function. The pattern fits Stripe keys, GitHub tokens, webhook signatures, database passwords, and other credentials. Secret names resolve to one shared value across the application.
Values can be assigned with encore secret set for prod, dev, preview, or local. For local work, a .secrets.local.cue file at the repository root can provide overrides; keep that file in .gitignore so its contents stay out of the repository.
Declaring secret(...) inside a function breaks the skill’s rule. The value must be read as stripeKey(), not as the variable itself.
What it helps with
- declare an API key in Encore.ts
- read a credential inside a handler
- assign separate values by environment
- add local overrides with
.secrets.local.cue - pass a secret to a third-party SDK
Example prompts for the agent
- Set up the Stripe credential in Encore.ts and show how the handler should read it.
- Configure
OpenAIKeyfordevwithencore secret set, then pass it to the SDK. - Create a local
GitHubAPITokenoverride in.secrets.local.cueand show the required Git ignore entry.
How to install encore-secret
1Skills CLI (Vercel)
npx skills add encoredev/skills --skill encore-secret -a claude-codenpx skills add encoredev/skills --skill secret -a claude-code2Manually: put the files in place
~/.claude/skills/secret/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/secret/
1Skills CLI (Vercel)
npx skills add encoredev/skills --skill secret -a codex2Manually: put the files in place
.agents/skills/secret/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add encoredev/skills --skill secret -a cursor2Manually: put the files in place
.cursor/skills/secret/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install encoredev/skills secret2Manually: put the files in place
.github/skills/secret/SKILL.md1Skills CLI (Vercel)
npx skills add encoredev/skills --skill secret -a gemini-cli2Platform CLI
gemini skills install https://github.com/encoredev/skills --path encore/secretManually: put the files in place
.devin/skills/secret/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add encoredev/skills --skill secret -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about encore-secret
How do I install encore-secret in Claude Code?
Run these steps in order: npx skills add encoredev/skills --skill encore-secret -a claude-code, then npx skills add encoredev/skills --skill secret -a claude-code. The skill file is at ~/.claude/skills/secret/SKILL.md.
What does encore-secret do?
It guides Encore.ts secret declarations, function-based reads, environment-specific values through encore secret set, and local overrides stored in .secrets.local.cue.
How should I provide secrets during local development?
Put local values in .secrets.local.cue at the repository root and add that file to .gitignore. Use encore secret set for the other environment types.
Source text
SKILL.md · Apache-2.0
---
name: encore-secret
description: Manage API keys, credentials, and other secrets in Encore.ts using `secret(...)` from `encore.dev/config`.
when_to_use: >-
User wants to load a private credential into the service without committing it to the repo — third-party API keys (Stripe, OpenAI, Twilio, SendGrid), database passwords, signing keys, OAuth client secrets, JWT signing keys, webhook signing secrets. Covers `secret()` declarations, calling the secret as a function to read its value, setting values via `encore secret set`, and `.secrets.local.cue` for local overrides. Trigger phrases: "API key", "third-party token", "credentials", "without committing", "private key", "signing secret", "secret manager", ".env replacement", "encore secret set".
---
# Encore Secrets
## Instructions
Secrets are encrypted, environment-scoped values managed by Encore. Declare them at package level by calling `secret(name)` and read them by calling the returned function.
```typescript
import { secret } from "encore.dev/config";
// Package-level declaration
const stripeKey = secret("StripeSecretKey");
// Read inside a handler
async function chargeCustomer() {
const key = stripeKey(); // <-- function call returns the value
const stripe = new Stripe(key);
// ...
}
```
Secret names are globally unique across the application (the same name resolves to the same value everywhere).
## Setting values
```bash
# Set per environment type
encore secret set --type prod StripeSecretKey
encore secret set --type dev StripeSecretKey
encore secret set --type local StripeSecretKey
```
Environment types: `production` (alias `prod`), `development` (alias `dev`), `preview` (alias `pr`), `local`.
## Local overrides
For local development without going through `encore secret set`, create a `.secrets.local.cue` file at the repo root (gitignore it):
```cue
StripeSecretKey: "sk_test_local_..."
GitHubAPIToken: "ghp_local_..."
```
## Common usage patterns
```typescript
// HTTP headers
const githubToken = secret("GitHubAPIToken");
const resp = await fetch("https://api.github.com/user", {
headers: { Authorization: `token ${githubToken()}` },
});
// Webhook signature verification
const stripeWebhookSecret = secret("StripeWebhookSecret");
stripe.webhooks.constructEvent(rawBody, sig, stripeWebhookSecret());
// Connecting to a third-party SDK
const openaiKey = secret("OpenAIKey");
const openai = new OpenAI({ apiKey: openaiKey() });
```
## Guidelines
- Always declare `secret(...)` at package level, never inside functions.
- Read with a function call: `stripeKey()` not `stripeKey`.
- Set distinct values per environment via `encore secret set --type <env>`.
- Never commit secret values; use `.secrets.local.cue` for local overrides and gitignore it.
- For webhook signature secrets specifically, see also the `encore-webhook` skill.
© encoredev · Apache-2.0 · encoredev/skills