[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-encore-encore-go-secret":3,"mdc-9kidgj-key":40,"related-org-encore-encore-go-secret":752,"related-repo-encore-encore-go-secret":925},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":35,"sourceUrl":38,"mdContent":39},"encore-go-secret","manage secrets in Encore Go applications","Manage API keys, credentials, and other secrets in Encore Go using a package-level `secrets` struct.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"encore","Encore","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fencore.png","encoredev",[13,17,20,23,24],{"name":14,"slug":15,"type":16},"Security","security","tag",{"name":18,"slug":19,"type":16},"Configuration","configuration",{"name":21,"slug":22,"type":16},"Backend","backend",{"name":9,"slug":8,"type":16},{"name":25,"slug":26,"type":16},"Go","go",26,"https:\u002F\u002Fgithub.com\u002Fencoredev\u002Fskills","2026-05-16T05:59:48.802194",null,5,[33,34],"claude-code","skills",{"repoUrl":28,"stars":27,"forks":31,"topics":36,"description":37},[33,34],"Agent Skills for development with Encore.","https:\u002F\u002Fgithub.com\u002Fencoredev\u002Fskills\u002Ftree\u002FHEAD\u002Fencore\u002Fgo-secret","---\nname: encore-go-secret\ndescription: Manage API keys, credentials, and other secrets in Encore Go using a package-level `secrets` struct.\nwhen_to_use: >-\n  User wants to load a private credential into a Go 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 the `var secrets struct{...}` declaration, accessing secrets as struct fields, setting values via `encore secret set`, and `.secrets.local.cue` overrides. Trigger phrases: \"API key\", \"third-party token\", \"credentials\", \"without committing\", \"private key\", \"signing secret\", \"secret manager\", \"encore secret set\".\n---\n\n# Encore Go Secrets\n\n## Instructions\n\nSecrets are encrypted, environment-scoped values managed by Encore. Declare them as a package-level `secrets` struct — Encore reads the field names and resolves each to the right value at runtime.\n\n```go\npackage email\n\nvar secrets struct {\n    SendGridAPIKey string\n    SMTPPassword   string\n}\n\nfunc sendEmail() error {\n    apiKey := secrets.SendGridAPIKey\n    \u002F\u002F Use the secret...\n    return nil\n}\n```\n\nSecret keys are globally unique across the application — `SendGridAPIKey` resolves to the same value regardless of which package declares it.\n\n## Setting values\n\n```bash\n# Set per environment type\nencore secret set --type prod SendGridAPIKey\nencore secret set --type dev  SendGridAPIKey\nencore secret set --type local SendGridAPIKey\n```\n\nEnvironment types: `production` (alias `prod`), `development` (alias `dev`), `preview` (alias `pr`), `local`.\n\n## Local overrides\n\nFor local development without going through `encore secret set`, create a `.secrets.local.cue` file at the repo root (gitignore it):\n\n```cue\nSendGridAPIKey: \"SG.local-test-key\"\nGitHubAPIToken: \"ghp_local_...\"\n```\n\n## Common usage patterns\n\n```go\npackage github\n\nimport (\n    \"context\"\n    \"net\u002Fhttp\"\n)\n\nvar secrets struct {\n    GitHubAPIToken string\n}\n\nfunc callGitHub(ctx context.Context) error {\n    req, _ := http.NewRequestWithContext(ctx, \"GET\", \"https:\u002F\u002Fapi.github.com\u002Fuser\", nil)\n    req.Header.Set(\"Authorization\", \"token \"+secrets.GitHubAPIToken)\n    resp, err := http.DefaultClient.Do(req)\n    if err != nil {\n        return err\n    }\n    defer resp.Body.Close()\n    return nil\n}\n```\n\n```go\npackage webhooks\n\nvar secrets struct {\n    StripeWebhookSecret string\n}\n\u002F\u002F Verify Stripe signature using secrets.StripeWebhookSecret in a raw endpoint.\n```\n\n## Guidelines\n\n- Declare secrets as a package-level `secrets` struct, not as individual `secret(...)` calls.\n- Field names must exactly match the secret name set via `encore secret set`.\n- Set distinct values per environment via `encore secret set --type \u003Cenv>`.\n- Never commit secret values; use `.secrets.local.cue` for local overrides and gitignore it.\n- For webhook signature secrets specifically, see also the `encore-go-webhook` skill.\n",{"data":41,"body":43},{"name":4,"description":6,"when_to_use":42},"User wants to load a private credential into a Go 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 the `var secrets struct{...}` declaration, accessing secrets as struct fields, setting values via `encore secret set`, and `.secrets.local.cue` overrides. Trigger phrases: \"API key\", \"third-party token\", \"credentials\", \"without committing\", \"private key\", \"signing secret\", \"secret manager\", \"encore secret set\".",{"type":44,"children":45},"root",[46,55,62,77,195,208,214,323,380,386,407,432,438,615,667,673,746],{"type":47,"tag":48,"props":49,"children":51},"element","h1",{"id":50},"encore-go-secrets",[52],{"type":53,"value":54},"text","Encore Go Secrets",{"type":47,"tag":56,"props":57,"children":59},"h2",{"id":58},"instructions",[60],{"type":53,"value":61},"Instructions",{"type":47,"tag":63,"props":64,"children":65},"p",{},[66,68,75],{"type":53,"value":67},"Secrets are encrypted, environment-scoped values managed by Encore. Declare them as a package-level ",{"type":47,"tag":69,"props":70,"children":72},"code",{"className":71},[],[73],{"type":53,"value":74},"secrets",{"type":53,"value":76}," struct — Encore reads the field names and resolves each to the right value at runtime.",{"type":47,"tag":78,"props":79,"children":83},"pre",{"className":80,"code":81,"language":26,"meta":82,"style":82},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package email\n\nvar secrets struct {\n    SendGridAPIKey string\n    SMTPPassword   string\n}\n\nfunc sendEmail() error {\n    apiKey := secrets.SendGridAPIKey\n    \u002F\u002F Use the secret...\n    return nil\n}\n","",[84],{"type":47,"tag":69,"props":85,"children":86},{"__ignoreMap":82},[87,98,108,117,126,134,143,151,160,169,178,187],{"type":47,"tag":88,"props":89,"children":92},"span",{"class":90,"line":91},"line",1,[93],{"type":47,"tag":88,"props":94,"children":95},{},[96],{"type":53,"value":97},"package email\n",{"type":47,"tag":88,"props":99,"children":101},{"class":90,"line":100},2,[102],{"type":47,"tag":88,"props":103,"children":105},{"emptyLinePlaceholder":104},true,[106],{"type":53,"value":107},"\n",{"type":47,"tag":88,"props":109,"children":111},{"class":90,"line":110},3,[112],{"type":47,"tag":88,"props":113,"children":114},{},[115],{"type":53,"value":116},"var secrets struct {\n",{"type":47,"tag":88,"props":118,"children":120},{"class":90,"line":119},4,[121],{"type":47,"tag":88,"props":122,"children":123},{},[124],{"type":53,"value":125},"    SendGridAPIKey string\n",{"type":47,"tag":88,"props":127,"children":128},{"class":90,"line":31},[129],{"type":47,"tag":88,"props":130,"children":131},{},[132],{"type":53,"value":133},"    SMTPPassword   string\n",{"type":47,"tag":88,"props":135,"children":137},{"class":90,"line":136},6,[138],{"type":47,"tag":88,"props":139,"children":140},{},[141],{"type":53,"value":142},"}\n",{"type":47,"tag":88,"props":144,"children":146},{"class":90,"line":145},7,[147],{"type":47,"tag":88,"props":148,"children":149},{"emptyLinePlaceholder":104},[150],{"type":53,"value":107},{"type":47,"tag":88,"props":152,"children":154},{"class":90,"line":153},8,[155],{"type":47,"tag":88,"props":156,"children":157},{},[158],{"type":53,"value":159},"func sendEmail() error {\n",{"type":47,"tag":88,"props":161,"children":163},{"class":90,"line":162},9,[164],{"type":47,"tag":88,"props":165,"children":166},{},[167],{"type":53,"value":168},"    apiKey := secrets.SendGridAPIKey\n",{"type":47,"tag":88,"props":170,"children":172},{"class":90,"line":171},10,[173],{"type":47,"tag":88,"props":174,"children":175},{},[176],{"type":53,"value":177},"    \u002F\u002F Use the secret...\n",{"type":47,"tag":88,"props":179,"children":181},{"class":90,"line":180},11,[182],{"type":47,"tag":88,"props":183,"children":184},{},[185],{"type":53,"value":186},"    return nil\n",{"type":47,"tag":88,"props":188,"children":190},{"class":90,"line":189},12,[191],{"type":47,"tag":88,"props":192,"children":193},{},[194],{"type":53,"value":142},{"type":47,"tag":63,"props":196,"children":197},{},[198,200,206],{"type":53,"value":199},"Secret keys are globally unique across the application — ",{"type":47,"tag":69,"props":201,"children":203},{"className":202},[],[204],{"type":53,"value":205},"SendGridAPIKey",{"type":53,"value":207}," resolves to the same value regardless of which package declares it.",{"type":47,"tag":56,"props":209,"children":211},{"id":210},"setting-values",[212],{"type":53,"value":213},"Setting values",{"type":47,"tag":78,"props":215,"children":219},{"className":216,"code":217,"language":218,"meta":82,"style":82},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Set per environment type\nencore secret set --type prod SendGridAPIKey\nencore secret set --type dev  SendGridAPIKey\nencore secret set --type local SendGridAPIKey\n","bash",[220],{"type":47,"tag":69,"props":221,"children":222},{"__ignoreMap":82},[223,232,266,295],{"type":47,"tag":88,"props":224,"children":225},{"class":90,"line":91},[226],{"type":47,"tag":88,"props":227,"children":229},{"style":228},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[230],{"type":53,"value":231},"# Set per environment type\n",{"type":47,"tag":88,"props":233,"children":234},{"class":90,"line":100},[235,240,246,251,256,261],{"type":47,"tag":88,"props":236,"children":238},{"style":237},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[239],{"type":53,"value":8},{"type":47,"tag":88,"props":241,"children":243},{"style":242},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[244],{"type":53,"value":245}," secret",{"type":47,"tag":88,"props":247,"children":248},{"style":242},[249],{"type":53,"value":250}," set",{"type":47,"tag":88,"props":252,"children":253},{"style":242},[254],{"type":53,"value":255}," --type",{"type":47,"tag":88,"props":257,"children":258},{"style":242},[259],{"type":53,"value":260}," prod",{"type":47,"tag":88,"props":262,"children":263},{"style":242},[264],{"type":53,"value":265}," SendGridAPIKey\n",{"type":47,"tag":88,"props":267,"children":268},{"class":90,"line":110},[269,273,277,281,285,290],{"type":47,"tag":88,"props":270,"children":271},{"style":237},[272],{"type":53,"value":8},{"type":47,"tag":88,"props":274,"children":275},{"style":242},[276],{"type":53,"value":245},{"type":47,"tag":88,"props":278,"children":279},{"style":242},[280],{"type":53,"value":250},{"type":47,"tag":88,"props":282,"children":283},{"style":242},[284],{"type":53,"value":255},{"type":47,"tag":88,"props":286,"children":287},{"style":242},[288],{"type":53,"value":289}," dev",{"type":47,"tag":88,"props":291,"children":292},{"style":242},[293],{"type":53,"value":294},"  SendGridAPIKey\n",{"type":47,"tag":88,"props":296,"children":297},{"class":90,"line":119},[298,302,306,310,314,319],{"type":47,"tag":88,"props":299,"children":300},{"style":237},[301],{"type":53,"value":8},{"type":47,"tag":88,"props":303,"children":304},{"style":242},[305],{"type":53,"value":245},{"type":47,"tag":88,"props":307,"children":308},{"style":242},[309],{"type":53,"value":250},{"type":47,"tag":88,"props":311,"children":312},{"style":242},[313],{"type":53,"value":255},{"type":47,"tag":88,"props":315,"children":316},{"style":242},[317],{"type":53,"value":318}," local",{"type":47,"tag":88,"props":320,"children":321},{"style":242},[322],{"type":53,"value":265},{"type":47,"tag":63,"props":324,"children":325},{},[326,328,334,336,342,344,350,351,357,358,364,365,371,372,378],{"type":53,"value":327},"Environment types: ",{"type":47,"tag":69,"props":329,"children":331},{"className":330},[],[332],{"type":53,"value":333},"production",{"type":53,"value":335}," (alias ",{"type":47,"tag":69,"props":337,"children":339},{"className":338},[],[340],{"type":53,"value":341},"prod",{"type":53,"value":343},"), ",{"type":47,"tag":69,"props":345,"children":347},{"className":346},[],[348],{"type":53,"value":349},"development",{"type":53,"value":335},{"type":47,"tag":69,"props":352,"children":354},{"className":353},[],[355],{"type":53,"value":356},"dev",{"type":53,"value":343},{"type":47,"tag":69,"props":359,"children":361},{"className":360},[],[362],{"type":53,"value":363},"preview",{"type":53,"value":335},{"type":47,"tag":69,"props":366,"children":368},{"className":367},[],[369],{"type":53,"value":370},"pr",{"type":53,"value":343},{"type":47,"tag":69,"props":373,"children":375},{"className":374},[],[376],{"type":53,"value":377},"local",{"type":53,"value":379},".",{"type":47,"tag":56,"props":381,"children":383},{"id":382},"local-overrides",[384],{"type":53,"value":385},"Local overrides",{"type":47,"tag":63,"props":387,"children":388},{},[389,391,397,399,405],{"type":53,"value":390},"For local development without going through ",{"type":47,"tag":69,"props":392,"children":394},{"className":393},[],[395],{"type":53,"value":396},"encore secret set",{"type":53,"value":398},", create a ",{"type":47,"tag":69,"props":400,"children":402},{"className":401},[],[403],{"type":53,"value":404},".secrets.local.cue",{"type":53,"value":406}," file at the repo root (gitignore it):",{"type":47,"tag":78,"props":408,"children":412},{"className":409,"code":410,"language":411,"meta":82,"style":82},"language-cue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SendGridAPIKey: \"SG.local-test-key\"\nGitHubAPIToken: \"ghp_local_...\"\n","cue",[413],{"type":47,"tag":69,"props":414,"children":415},{"__ignoreMap":82},[416,424],{"type":47,"tag":88,"props":417,"children":418},{"class":90,"line":91},[419],{"type":47,"tag":88,"props":420,"children":421},{},[422],{"type":53,"value":423},"SendGridAPIKey: \"SG.local-test-key\"\n",{"type":47,"tag":88,"props":425,"children":426},{"class":90,"line":100},[427],{"type":47,"tag":88,"props":428,"children":429},{},[430],{"type":53,"value":431},"GitHubAPIToken: \"ghp_local_...\"\n",{"type":47,"tag":56,"props":433,"children":435},{"id":434},"common-usage-patterns",[436],{"type":53,"value":437},"Common usage patterns",{"type":47,"tag":78,"props":439,"children":441},{"className":80,"code":440,"language":26,"meta":82,"style":82},"package github\n\nimport (\n    \"context\"\n    \"net\u002Fhttp\"\n)\n\nvar secrets struct {\n    GitHubAPIToken string\n}\n\nfunc callGitHub(ctx context.Context) error {\n    req, _ := http.NewRequestWithContext(ctx, \"GET\", \"https:\u002F\u002Fapi.github.com\u002Fuser\", nil)\n    req.Header.Set(\"Authorization\", \"token \"+secrets.GitHubAPIToken)\n    resp, err := http.DefaultClient.Do(req)\n    if err != nil {\n        return err\n    }\n    defer resp.Body.Close()\n    return nil\n}\n",[442],{"type":47,"tag":69,"props":443,"children":444},{"__ignoreMap":82},[445,453,460,468,476,484,492,499,506,514,521,528,536,545,554,563,572,581,590,599,607],{"type":47,"tag":88,"props":446,"children":447},{"class":90,"line":91},[448],{"type":47,"tag":88,"props":449,"children":450},{},[451],{"type":53,"value":452},"package github\n",{"type":47,"tag":88,"props":454,"children":455},{"class":90,"line":100},[456],{"type":47,"tag":88,"props":457,"children":458},{"emptyLinePlaceholder":104},[459],{"type":53,"value":107},{"type":47,"tag":88,"props":461,"children":462},{"class":90,"line":110},[463],{"type":47,"tag":88,"props":464,"children":465},{},[466],{"type":53,"value":467},"import (\n",{"type":47,"tag":88,"props":469,"children":470},{"class":90,"line":119},[471],{"type":47,"tag":88,"props":472,"children":473},{},[474],{"type":53,"value":475},"    \"context\"\n",{"type":47,"tag":88,"props":477,"children":478},{"class":90,"line":31},[479],{"type":47,"tag":88,"props":480,"children":481},{},[482],{"type":53,"value":483},"    \"net\u002Fhttp\"\n",{"type":47,"tag":88,"props":485,"children":486},{"class":90,"line":136},[487],{"type":47,"tag":88,"props":488,"children":489},{},[490],{"type":53,"value":491},")\n",{"type":47,"tag":88,"props":493,"children":494},{"class":90,"line":145},[495],{"type":47,"tag":88,"props":496,"children":497},{"emptyLinePlaceholder":104},[498],{"type":53,"value":107},{"type":47,"tag":88,"props":500,"children":501},{"class":90,"line":153},[502],{"type":47,"tag":88,"props":503,"children":504},{},[505],{"type":53,"value":116},{"type":47,"tag":88,"props":507,"children":508},{"class":90,"line":162},[509],{"type":47,"tag":88,"props":510,"children":511},{},[512],{"type":53,"value":513},"    GitHubAPIToken string\n",{"type":47,"tag":88,"props":515,"children":516},{"class":90,"line":171},[517],{"type":47,"tag":88,"props":518,"children":519},{},[520],{"type":53,"value":142},{"type":47,"tag":88,"props":522,"children":523},{"class":90,"line":180},[524],{"type":47,"tag":88,"props":525,"children":526},{"emptyLinePlaceholder":104},[527],{"type":53,"value":107},{"type":47,"tag":88,"props":529,"children":530},{"class":90,"line":189},[531],{"type":47,"tag":88,"props":532,"children":533},{},[534],{"type":53,"value":535},"func callGitHub(ctx context.Context) error {\n",{"type":47,"tag":88,"props":537,"children":539},{"class":90,"line":538},13,[540],{"type":47,"tag":88,"props":541,"children":542},{},[543],{"type":53,"value":544},"    req, _ := http.NewRequestWithContext(ctx, \"GET\", \"https:\u002F\u002Fapi.github.com\u002Fuser\", nil)\n",{"type":47,"tag":88,"props":546,"children":548},{"class":90,"line":547},14,[549],{"type":47,"tag":88,"props":550,"children":551},{},[552],{"type":53,"value":553},"    req.Header.Set(\"Authorization\", \"token \"+secrets.GitHubAPIToken)\n",{"type":47,"tag":88,"props":555,"children":557},{"class":90,"line":556},15,[558],{"type":47,"tag":88,"props":559,"children":560},{},[561],{"type":53,"value":562},"    resp, err := http.DefaultClient.Do(req)\n",{"type":47,"tag":88,"props":564,"children":566},{"class":90,"line":565},16,[567],{"type":47,"tag":88,"props":568,"children":569},{},[570],{"type":53,"value":571},"    if err != nil {\n",{"type":47,"tag":88,"props":573,"children":575},{"class":90,"line":574},17,[576],{"type":47,"tag":88,"props":577,"children":578},{},[579],{"type":53,"value":580},"        return err\n",{"type":47,"tag":88,"props":582,"children":584},{"class":90,"line":583},18,[585],{"type":47,"tag":88,"props":586,"children":587},{},[588],{"type":53,"value":589},"    }\n",{"type":47,"tag":88,"props":591,"children":593},{"class":90,"line":592},19,[594],{"type":47,"tag":88,"props":595,"children":596},{},[597],{"type":53,"value":598},"    defer resp.Body.Close()\n",{"type":47,"tag":88,"props":600,"children":602},{"class":90,"line":601},20,[603],{"type":47,"tag":88,"props":604,"children":605},{},[606],{"type":53,"value":186},{"type":47,"tag":88,"props":608,"children":610},{"class":90,"line":609},21,[611],{"type":47,"tag":88,"props":612,"children":613},{},[614],{"type":53,"value":142},{"type":47,"tag":78,"props":616,"children":618},{"className":80,"code":617,"language":26,"meta":82,"style":82},"package webhooks\n\nvar secrets struct {\n    StripeWebhookSecret string\n}\n\u002F\u002F Verify Stripe signature using secrets.StripeWebhookSecret in a raw endpoint.\n",[619],{"type":47,"tag":69,"props":620,"children":621},{"__ignoreMap":82},[622,630,637,644,652,659],{"type":47,"tag":88,"props":623,"children":624},{"class":90,"line":91},[625],{"type":47,"tag":88,"props":626,"children":627},{},[628],{"type":53,"value":629},"package webhooks\n",{"type":47,"tag":88,"props":631,"children":632},{"class":90,"line":100},[633],{"type":47,"tag":88,"props":634,"children":635},{"emptyLinePlaceholder":104},[636],{"type":53,"value":107},{"type":47,"tag":88,"props":638,"children":639},{"class":90,"line":110},[640],{"type":47,"tag":88,"props":641,"children":642},{},[643],{"type":53,"value":116},{"type":47,"tag":88,"props":645,"children":646},{"class":90,"line":119},[647],{"type":47,"tag":88,"props":648,"children":649},{},[650],{"type":53,"value":651},"    StripeWebhookSecret string\n",{"type":47,"tag":88,"props":653,"children":654},{"class":90,"line":31},[655],{"type":47,"tag":88,"props":656,"children":657},{},[658],{"type":53,"value":142},{"type":47,"tag":88,"props":660,"children":661},{"class":90,"line":136},[662],{"type":47,"tag":88,"props":663,"children":664},{},[665],{"type":53,"value":666},"\u002F\u002F Verify Stripe signature using secrets.StripeWebhookSecret in a raw endpoint.\n",{"type":47,"tag":56,"props":668,"children":670},{"id":669},"guidelines",[671],{"type":53,"value":672},"Guidelines",{"type":47,"tag":674,"props":675,"children":676},"ul",{},[677,698,709,721,733],{"type":47,"tag":678,"props":679,"children":680},"li",{},[681,683,688,690,696],{"type":53,"value":682},"Declare secrets as a package-level ",{"type":47,"tag":69,"props":684,"children":686},{"className":685},[],[687],{"type":53,"value":74},{"type":53,"value":689}," struct, not as individual ",{"type":47,"tag":69,"props":691,"children":693},{"className":692},[],[694],{"type":53,"value":695},"secret(...)",{"type":53,"value":697}," calls.",{"type":47,"tag":678,"props":699,"children":700},{},[701,703,708],{"type":53,"value":702},"Field names must exactly match the secret name set via ",{"type":47,"tag":69,"props":704,"children":706},{"className":705},[],[707],{"type":53,"value":396},{"type":53,"value":379},{"type":47,"tag":678,"props":710,"children":711},{},[712,714,720],{"type":53,"value":713},"Set distinct values per environment via ",{"type":47,"tag":69,"props":715,"children":717},{"className":716},[],[718],{"type":53,"value":719},"encore secret set --type \u003Cenv>",{"type":53,"value":379},{"type":47,"tag":678,"props":722,"children":723},{},[724,726,731],{"type":53,"value":725},"Never commit secret values; use ",{"type":47,"tag":69,"props":727,"children":729},{"className":728},[],[730],{"type":53,"value":404},{"type":53,"value":732}," for local overrides and gitignore it.",{"type":47,"tag":678,"props":734,"children":735},{},[736,738,744],{"type":53,"value":737},"For webhook signature secrets specifically, see also the ",{"type":47,"tag":69,"props":739,"children":741},{"className":740},[],[742],{"type":53,"value":743},"encore-go-webhook",{"type":53,"value":745}," skill.",{"type":47,"tag":747,"props":748,"children":749},"style",{},[750],{"type":53,"value":751},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":753,"total":924},[754,768,780,796,812,824,840,855,872,889,899,910],{"slug":755,"name":755,"fn":756,"description":757,"org":758,"tags":759,"stars":27,"repoUrl":28,"updatedAt":767},"encore-api","build type-safe APIs with Encore","Define typed API endpoints in Encore.ts using `api(...)` from `encore.dev\u002Fapi`. Covers typed request\u002Fresponse interfaces, path\u002Fquery\u002Fheader\u002Fcookie params, request validation, and `APIError`. For raw endpoints (`api.raw()`) and inbound webhooks, use `encore-webhook` instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[760,763,764],{"name":761,"slug":762,"type":16},"API Development","api-development",{"name":9,"slug":8,"type":16},{"name":765,"slug":766,"type":16},"TypeScript","typescript","2026-04-06T18:09:46.044101",{"slug":769,"name":769,"fn":770,"description":771,"org":772,"tags":773,"stars":27,"repoUrl":28,"updatedAt":779},"encore-auth","implement Encore.ts authentication","Protect Encore.ts endpoints with authentication and authorize callers. Covers `authHandler`, `Gateway`, `getAuthData`, and `auth: true`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[774,777,778],{"name":775,"slug":776,"type":16},"Auth","auth",{"name":9,"slug":8,"type":16},{"name":765,"slug":766,"type":16},"2026-04-06T18:09:47.336322",{"slug":781,"name":781,"fn":782,"description":783,"org":784,"tags":785,"stars":27,"repoUrl":28,"updatedAt":795},"encore-bucket","store files in Encore.ts buckets","Store unstructured files in Encore.ts using `Bucket` from `encore.dev\u002Fstorage\u002Fobjects` — uploads, images, documents, blobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[786,787,788,791,794],{"name":21,"slug":22,"type":16},{"name":9,"slug":8,"type":16},{"name":789,"slug":790,"type":16},"File Storage","file-storage",{"name":792,"slug":793,"type":16},"File Uploads","file-uploads",{"name":765,"slug":766,"type":16},"2026-05-16T05:59:52.813772",{"slug":797,"name":797,"fn":798,"description":799,"org":800,"tags":801,"stars":27,"repoUrl":28,"updatedAt":811},"encore-cache","cache data in Redis with Encore.ts","Cache data in Redis from Encore.ts using `CacheCluster` and typed keyspaces from `encore.dev\u002Fstorage\u002Fcache`. Type-safe key\u002Fvalue access with TTLs, atomic increments, and per-keyspace data shapes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[802,803,806,807,810],{"name":21,"slug":22,"type":16},{"name":804,"slug":805,"type":16},"Caching","caching",{"name":9,"slug":8,"type":16},{"name":808,"slug":809,"type":16},"Redis","redis",{"name":765,"slug":766,"type":16},"2026-05-16T05:59:56.808328",{"slug":813,"name":813,"fn":814,"description":815,"org":816,"tags":817,"stars":27,"repoUrl":28,"updatedAt":823},"encore-code-review","review Encore.ts code","Review existing Encore.ts code for best practices and common anti-patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[818,821,822],{"name":819,"slug":820,"type":16},"Code Review","code-review",{"name":9,"slug":8,"type":16},{"name":765,"slug":766,"type":16},"2026-04-06T18:10:01.123999",{"slug":825,"name":825,"fn":826,"description":827,"org":828,"tags":829,"stars":27,"repoUrl":28,"updatedAt":839},"encore-cron","schedule recurring jobs in Encore.ts","Schedule periodic \u002F recurring work in Encore.ts using `CronJob` from `encore.dev\u002Fcron`. Covers `every: \"1h\"` interval syntax and `schedule: \"0 9 * * 1\"` cron expressions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[830,833,834,835,838],{"name":831,"slug":832,"type":16},"Automation","automation",{"name":21,"slug":22,"type":16},{"name":9,"slug":8,"type":16},{"name":836,"slug":837,"type":16},"Scheduling","scheduling",{"name":765,"slug":766,"type":16},"2026-05-16T05:59:54.146651",{"slug":841,"name":841,"fn":842,"description":843,"org":844,"tags":845,"stars":27,"repoUrl":28,"updatedAt":854},"encore-database","build Encore databases","Work with PostgreSQL in Encore.ts using `SQLDatabase` from `encore.dev\u002Fstorage\u002Fsqldb` — schema migrations and SQL queries.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[846,849,850,853],{"name":847,"slug":848,"type":16},"Database","database",{"name":9,"slug":8,"type":16},{"name":851,"slug":852,"type":16},"ORM","orm",{"name":765,"slug":766,"type":16},"2026-04-06T18:09:54.823017",{"slug":856,"name":856,"fn":857,"description":858,"org":859,"tags":860,"stars":27,"repoUrl":28,"updatedAt":871},"encore-frontend","connect frontend to Encore backend","Connect a frontend application (React, Next.js, Vue, Svelte, etc.) to an Encore.ts backend.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[861,862,865,868],{"name":9,"slug":8,"type":16},{"name":863,"slug":864,"type":16},"Frontend","frontend",{"name":866,"slug":867,"type":16},"Next.js","next-js",{"name":869,"slug":870,"type":16},"React","react","2026-04-06T18:09:56.091006",{"slug":873,"name":873,"fn":874,"description":875,"org":876,"tags":877,"stars":27,"repoUrl":28,"updatedAt":888},"encore-getting-started","build and run applications with Encore.ts","Bootstrap a brand-new Encore.ts project from zero. Only for first-time CLI install and `encore app create` — not for architecture or feature questions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[878,879,880,881,884,885],{"name":761,"slug":762,"type":16},{"name":21,"slug":22,"type":16},{"name":9,"slug":8,"type":16},{"name":882,"slug":883,"type":16},"Local Development","local-development",{"name":765,"slug":766,"type":16},{"name":886,"slug":887,"type":16},"Web Development","web-development","2026-04-06T18:10:04.885446",{"slug":890,"name":890,"fn":891,"description":892,"org":893,"tags":894,"stars":27,"repoUrl":28,"updatedAt":898},"encore-go-api","build APIs with Encore Go","Define typed API endpoints in Encore Go using `\u002F\u002Fencore:api` annotations. Covers typed request\u002Fresponse structs, path\u002Fquery\u002Fheader\u002Fcookie params, and error returns. For raw endpoints (`\u002F\u002Fencore:api raw`) and inbound webhooks, use `encore-go-webhook` instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[895,896,897],{"name":761,"slug":762,"type":16},{"name":9,"slug":8,"type":16},{"name":25,"slug":26,"type":16},"2026-04-06T18:09:48.578781",{"slug":900,"name":900,"fn":901,"description":902,"org":903,"tags":904,"stars":27,"repoUrl":28,"updatedAt":909},"encore-go-auth","implement authentication with Encore Go","Protect Encore Go endpoints with authentication and authorize callers. Covers `auth.AuthHandler`, `auth.UserID`, the `Authorization` header, and `\u002F\u002Fencore:api auth`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[905,906,907,908],{"name":775,"slug":776,"type":16},{"name":21,"slug":22,"type":16},{"name":9,"slug":8,"type":16},{"name":25,"slug":26,"type":16},"2026-04-06T18:09:51.065102",{"slug":911,"name":911,"fn":912,"description":913,"org":914,"tags":915,"stars":27,"repoUrl":28,"updatedAt":923},"encore-go-bucket","store files in Encore Go buckets","Store unstructured files in Encore Go using `objects.NewBucket` from `encore.dev\u002Fstorage\u002Fobjects` — uploads, images, documents, blobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[916,917,918,919,920],{"name":21,"slug":22,"type":16},{"name":9,"slug":8,"type":16},{"name":789,"slug":790,"type":16},{"name":25,"slug":26,"type":16},{"name":921,"slug":922,"type":16},"Storage","storage","2026-05-16T06:00:03.633918",28,{"items":926,"total":924},[927,933,939,947,955,961,969],{"slug":755,"name":755,"fn":756,"description":757,"org":928,"tags":929,"stars":27,"repoUrl":28,"updatedAt":767},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[930,931,932],{"name":761,"slug":762,"type":16},{"name":9,"slug":8,"type":16},{"name":765,"slug":766,"type":16},{"slug":769,"name":769,"fn":770,"description":771,"org":934,"tags":935,"stars":27,"repoUrl":28,"updatedAt":779},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[936,937,938],{"name":775,"slug":776,"type":16},{"name":9,"slug":8,"type":16},{"name":765,"slug":766,"type":16},{"slug":781,"name":781,"fn":782,"description":783,"org":940,"tags":941,"stars":27,"repoUrl":28,"updatedAt":795},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[942,943,944,945,946],{"name":21,"slug":22,"type":16},{"name":9,"slug":8,"type":16},{"name":789,"slug":790,"type":16},{"name":792,"slug":793,"type":16},{"name":765,"slug":766,"type":16},{"slug":797,"name":797,"fn":798,"description":799,"org":948,"tags":949,"stars":27,"repoUrl":28,"updatedAt":811},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[950,951,952,953,954],{"name":21,"slug":22,"type":16},{"name":804,"slug":805,"type":16},{"name":9,"slug":8,"type":16},{"name":808,"slug":809,"type":16},{"name":765,"slug":766,"type":16},{"slug":813,"name":813,"fn":814,"description":815,"org":956,"tags":957,"stars":27,"repoUrl":28,"updatedAt":823},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[958,959,960],{"name":819,"slug":820,"type":16},{"name":9,"slug":8,"type":16},{"name":765,"slug":766,"type":16},{"slug":825,"name":825,"fn":826,"description":827,"org":962,"tags":963,"stars":27,"repoUrl":28,"updatedAt":839},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[964,965,966,967,968],{"name":831,"slug":832,"type":16},{"name":21,"slug":22,"type":16},{"name":9,"slug":8,"type":16},{"name":836,"slug":837,"type":16},{"name":765,"slug":766,"type":16},{"slug":841,"name":841,"fn":842,"description":843,"org":970,"tags":971,"stars":27,"repoUrl":28,"updatedAt":854},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[972,973,974,975],{"name":847,"slug":848,"type":16},{"name":9,"slug":8,"type":16},{"name":851,"slug":852,"type":16},{"name":765,"slug":766,"type":16}]