[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-encore-encore-go-pubsub":3,"mdc-i5ayr5-key":37,"related-repo-encore-encore-go-pubsub":611,"related-org-encore-encore-go-pubsub":715},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":32,"sourceUrl":35,"mdContent":36},"encore-go-pubsub","implement pub\u002Fsub messaging in Encore Go","Asynchronous messaging in Encore Go via `pubsub.NewTopic` and `pubsub.NewSubscription` from `encore.dev\u002Fpubsub` — broadcast events, decouple producers from consumers, and run background handlers.",{"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,18,21],{"name":14,"slug":15,"type":16},"Backend","backend","tag",{"name":9,"slug":8,"type":16},{"name":19,"slug":20,"type":16},"Messaging","messaging",{"name":22,"slug":23,"type":16},"Go","go",26,"https:\u002F\u002Fgithub.com\u002Fencoredev\u002Fskills","2026-05-16T05:59:50.162055",null,5,[30,31],"claude-code","skills",{"repoUrl":25,"stars":24,"forks":28,"topics":33,"description":34},[30,31],"Agent Skills for development with Encore.","https:\u002F\u002Fgithub.com\u002Fencoredev\u002Fskills\u002Ftree\u002FHEAD\u002Fencore\u002Fgo-pubsub","---\nname: encore-go-pubsub\ndescription: Asynchronous messaging in Encore Go via `pubsub.NewTopic` and `pubsub.NewSubscription` from `encore.dev\u002Fpubsub` — broadcast events, decouple producers from consumers, and run background handlers.\nwhen_to_use: >-\n  User wants to publish\u002Fbroadcast events, fan out a single event to many handlers, fire-and-forget messages between Go services, react to something asynchronously, set up a worker that consumes events, configure delivery guarantees (at-least-once, exactly-once), or use ordering attributes. Trigger phrases: \"publish an event\", \"broadcast\", \"subscribe to\", \"topic\", \"Pub\u002FSub\", \"pubsub\", \"event bus\", \"OrderCreated event\", \"send to anyone listening\", \"background event handler\", \"queue\", \"fan out\".\n---\n\n# Encore Go Pub\u002FSub\n\n## Instructions\n\nPub\u002FSub is for asynchronous messaging between services. Producers publish events to a `Topic`; consumers attach `Subscription`s to react. Resources must be declared as package-level variables — never inside functions.\n\n## Topics\n\n```go\npackage events\n\nimport \"encore.dev\u002Fpubsub\"\n\ntype OrderCreatedEvent struct {\n    OrderID string `json:\"order_id\"`\n    UserID  string `json:\"user_id\"`\n    Total   int    `json:\"total\"`\n}\n\n\u002F\u002F Package level declaration\nvar OrderCreated = pubsub.NewTopic[*OrderCreatedEvent](\"order-created\", pubsub.TopicConfig{\n    DeliveryGuarantee: pubsub.AtLeastOnce,\n})\n```\n\n### Publishing\n\n```go\nmsgID, err := events.OrderCreated.Publish(ctx, &events.OrderCreatedEvent{\n    OrderID: \"123\",\n    UserID:  \"user-456\",\n    Total:   9999,\n})\n```\n\n### Subscriptions\n\n```go\npackage notifications\n\nimport (\n    \"context\"\n    \"myapp\u002Fevents\"\n    \"encore.dev\u002Fpubsub\"\n)\n\nvar _ = pubsub.NewSubscription(events.OrderCreated, \"send-confirmation-email\",\n    pubsub.SubscriptionConfig[*events.OrderCreatedEvent]{\n        Handler: sendConfirmationEmail,\n    },\n)\n\nfunc sendConfirmationEmail(ctx context.Context, event *events.OrderCreatedEvent) error {\n    \u002F\u002F Send email...\n    return nil\n}\n```\n\n### Topic References\n\nPass topic access to library code while maintaining static analysis:\n\n```go\n\u002F\u002F Create a reference with publish permission\nref := pubsub.TopicRef[pubsub.Publisher[*OrderCreatedEvent]](OrderCreated)\n\n\u002F\u002F Use the reference in library code\nfunc publishEvent(ref pubsub.Publisher[*OrderCreatedEvent], event *OrderCreatedEvent) error {\n    _, err := ref.Publish(ctx, event)\n    return err\n}\n```\n\n## Delivery Guarantees\n\n- `pubsub.AtLeastOnce` (default): may deliver duplicates → handlers must be idempotent.\n- `pubsub.ExactlyOnce`: stricter, capped throughput (AWS 300 msg\u002Fs\u002Ftopic, GCP 3000+ msg\u002Fs\u002Fregion). Does not deduplicate on the publish side.\n\n## Guidelines\n\n- Topics and subscriptions must be declared as package-level variables.\n- Subscription handlers must be idempotent (at-least-once delivery is the default).\n- Subscription handlers receive a `context.Context` and the event pointer; return an `error` to retry per the topic's retry policy.\n- Don't do heavy synchronous work in `Publish` callers — `Publish` returns once the message is queued.\n",{"data":38,"body":40},{"name":4,"description":6,"when_to_use":39},"User wants to publish\u002Fbroadcast events, fan out a single event to many handlers, fire-and-forget messages between Go services, react to something asynchronously, set up a worker that consumes events, configure delivery guarantees (at-least-once, exactly-once), or use ordering attributes. Trigger phrases: \"publish an event\", \"broadcast\", \"subscribe to\", \"topic\", \"Pub\u002FSub\", \"pubsub\", \"event bus\", \"OrderCreated event\", \"send to anyone listening\", \"background event handler\", \"queue\", \"fan out\".",{"type":41,"children":42},"root",[43,51,58,81,87,223,230,276,282,432,438,443,512,518,545,551,605],{"type":44,"tag":45,"props":46,"children":47},"element","h1",{"id":4},[48],{"type":49,"value":50},"text","Encore Go Pub\u002FSub",{"type":44,"tag":52,"props":53,"children":55},"h2",{"id":54},"instructions",[56],{"type":49,"value":57},"Instructions",{"type":44,"tag":59,"props":60,"children":61},"p",{},[62,64,71,73,79],{"type":49,"value":63},"Pub\u002FSub is for asynchronous messaging between services. Producers publish events to a ",{"type":44,"tag":65,"props":66,"children":68},"code",{"className":67},[],[69],{"type":49,"value":70},"Topic",{"type":49,"value":72},"; consumers attach ",{"type":44,"tag":65,"props":74,"children":76},{"className":75},[],[77],{"type":49,"value":78},"Subscription",{"type":49,"value":80},"s to react. Resources must be declared as package-level variables — never inside functions.",{"type":44,"tag":52,"props":82,"children":84},{"id":83},"topics",[85],{"type":49,"value":86},"Topics",{"type":44,"tag":88,"props":89,"children":93},"pre",{"className":90,"code":91,"language":23,"meta":92,"style":92},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package events\n\nimport \"encore.dev\u002Fpubsub\"\n\ntype OrderCreatedEvent struct {\n    OrderID string `json:\"order_id\"`\n    UserID  string `json:\"user_id\"`\n    Total   int    `json:\"total\"`\n}\n\n\u002F\u002F Package level declaration\nvar OrderCreated = pubsub.NewTopic[*OrderCreatedEvent](\"order-created\", pubsub.TopicConfig{\n    DeliveryGuarantee: pubsub.AtLeastOnce,\n})\n","",[94],{"type":44,"tag":65,"props":95,"children":96},{"__ignoreMap":92},[97,108,118,127,135,143,152,161,170,179,187,196,205,214],{"type":44,"tag":98,"props":99,"children":102},"span",{"class":100,"line":101},"line",1,[103],{"type":44,"tag":98,"props":104,"children":105},{},[106],{"type":49,"value":107},"package events\n",{"type":44,"tag":98,"props":109,"children":111},{"class":100,"line":110},2,[112],{"type":44,"tag":98,"props":113,"children":115},{"emptyLinePlaceholder":114},true,[116],{"type":49,"value":117},"\n",{"type":44,"tag":98,"props":119,"children":121},{"class":100,"line":120},3,[122],{"type":44,"tag":98,"props":123,"children":124},{},[125],{"type":49,"value":126},"import \"encore.dev\u002Fpubsub\"\n",{"type":44,"tag":98,"props":128,"children":130},{"class":100,"line":129},4,[131],{"type":44,"tag":98,"props":132,"children":133},{"emptyLinePlaceholder":114},[134],{"type":49,"value":117},{"type":44,"tag":98,"props":136,"children":137},{"class":100,"line":28},[138],{"type":44,"tag":98,"props":139,"children":140},{},[141],{"type":49,"value":142},"type OrderCreatedEvent struct {\n",{"type":44,"tag":98,"props":144,"children":146},{"class":100,"line":145},6,[147],{"type":44,"tag":98,"props":148,"children":149},{},[150],{"type":49,"value":151},"    OrderID string `json:\"order_id\"`\n",{"type":44,"tag":98,"props":153,"children":155},{"class":100,"line":154},7,[156],{"type":44,"tag":98,"props":157,"children":158},{},[159],{"type":49,"value":160},"    UserID  string `json:\"user_id\"`\n",{"type":44,"tag":98,"props":162,"children":164},{"class":100,"line":163},8,[165],{"type":44,"tag":98,"props":166,"children":167},{},[168],{"type":49,"value":169},"    Total   int    `json:\"total\"`\n",{"type":44,"tag":98,"props":171,"children":173},{"class":100,"line":172},9,[174],{"type":44,"tag":98,"props":175,"children":176},{},[177],{"type":49,"value":178},"}\n",{"type":44,"tag":98,"props":180,"children":182},{"class":100,"line":181},10,[183],{"type":44,"tag":98,"props":184,"children":185},{"emptyLinePlaceholder":114},[186],{"type":49,"value":117},{"type":44,"tag":98,"props":188,"children":190},{"class":100,"line":189},11,[191],{"type":44,"tag":98,"props":192,"children":193},{},[194],{"type":49,"value":195},"\u002F\u002F Package level declaration\n",{"type":44,"tag":98,"props":197,"children":199},{"class":100,"line":198},12,[200],{"type":44,"tag":98,"props":201,"children":202},{},[203],{"type":49,"value":204},"var OrderCreated = pubsub.NewTopic[*OrderCreatedEvent](\"order-created\", pubsub.TopicConfig{\n",{"type":44,"tag":98,"props":206,"children":208},{"class":100,"line":207},13,[209],{"type":44,"tag":98,"props":210,"children":211},{},[212],{"type":49,"value":213},"    DeliveryGuarantee: pubsub.AtLeastOnce,\n",{"type":44,"tag":98,"props":215,"children":217},{"class":100,"line":216},14,[218],{"type":44,"tag":98,"props":219,"children":220},{},[221],{"type":49,"value":222},"})\n",{"type":44,"tag":224,"props":225,"children":227},"h3",{"id":226},"publishing",[228],{"type":49,"value":229},"Publishing",{"type":44,"tag":88,"props":231,"children":233},{"className":90,"code":232,"language":23,"meta":92,"style":92},"msgID, err := events.OrderCreated.Publish(ctx, &events.OrderCreatedEvent{\n    OrderID: \"123\",\n    UserID:  \"user-456\",\n    Total:   9999,\n})\n",[234],{"type":44,"tag":65,"props":235,"children":236},{"__ignoreMap":92},[237,245,253,261,269],{"type":44,"tag":98,"props":238,"children":239},{"class":100,"line":101},[240],{"type":44,"tag":98,"props":241,"children":242},{},[243],{"type":49,"value":244},"msgID, err := events.OrderCreated.Publish(ctx, &events.OrderCreatedEvent{\n",{"type":44,"tag":98,"props":246,"children":247},{"class":100,"line":110},[248],{"type":44,"tag":98,"props":249,"children":250},{},[251],{"type":49,"value":252},"    OrderID: \"123\",\n",{"type":44,"tag":98,"props":254,"children":255},{"class":100,"line":120},[256],{"type":44,"tag":98,"props":257,"children":258},{},[259],{"type":49,"value":260},"    UserID:  \"user-456\",\n",{"type":44,"tag":98,"props":262,"children":263},{"class":100,"line":129},[264],{"type":44,"tag":98,"props":265,"children":266},{},[267],{"type":49,"value":268},"    Total:   9999,\n",{"type":44,"tag":98,"props":270,"children":271},{"class":100,"line":28},[272],{"type":44,"tag":98,"props":273,"children":274},{},[275],{"type":49,"value":222},{"type":44,"tag":224,"props":277,"children":279},{"id":278},"subscriptions",[280],{"type":49,"value":281},"Subscriptions",{"type":44,"tag":88,"props":283,"children":285},{"className":90,"code":284,"language":23,"meta":92,"style":92},"package notifications\n\nimport (\n    \"context\"\n    \"myapp\u002Fevents\"\n    \"encore.dev\u002Fpubsub\"\n)\n\nvar _ = pubsub.NewSubscription(events.OrderCreated, \"send-confirmation-email\",\n    pubsub.SubscriptionConfig[*events.OrderCreatedEvent]{\n        Handler: sendConfirmationEmail,\n    },\n)\n\nfunc sendConfirmationEmail(ctx context.Context, event *events.OrderCreatedEvent) error {\n    \u002F\u002F Send email...\n    return nil\n}\n",[286],{"type":44,"tag":65,"props":287,"children":288},{"__ignoreMap":92},[289,297,304,312,320,328,336,344,351,359,367,375,383,390,397,406,415,424],{"type":44,"tag":98,"props":290,"children":291},{"class":100,"line":101},[292],{"type":44,"tag":98,"props":293,"children":294},{},[295],{"type":49,"value":296},"package notifications\n",{"type":44,"tag":98,"props":298,"children":299},{"class":100,"line":110},[300],{"type":44,"tag":98,"props":301,"children":302},{"emptyLinePlaceholder":114},[303],{"type":49,"value":117},{"type":44,"tag":98,"props":305,"children":306},{"class":100,"line":120},[307],{"type":44,"tag":98,"props":308,"children":309},{},[310],{"type":49,"value":311},"import (\n",{"type":44,"tag":98,"props":313,"children":314},{"class":100,"line":129},[315],{"type":44,"tag":98,"props":316,"children":317},{},[318],{"type":49,"value":319},"    \"context\"\n",{"type":44,"tag":98,"props":321,"children":322},{"class":100,"line":28},[323],{"type":44,"tag":98,"props":324,"children":325},{},[326],{"type":49,"value":327},"    \"myapp\u002Fevents\"\n",{"type":44,"tag":98,"props":329,"children":330},{"class":100,"line":145},[331],{"type":44,"tag":98,"props":332,"children":333},{},[334],{"type":49,"value":335},"    \"encore.dev\u002Fpubsub\"\n",{"type":44,"tag":98,"props":337,"children":338},{"class":100,"line":154},[339],{"type":44,"tag":98,"props":340,"children":341},{},[342],{"type":49,"value":343},")\n",{"type":44,"tag":98,"props":345,"children":346},{"class":100,"line":163},[347],{"type":44,"tag":98,"props":348,"children":349},{"emptyLinePlaceholder":114},[350],{"type":49,"value":117},{"type":44,"tag":98,"props":352,"children":353},{"class":100,"line":172},[354],{"type":44,"tag":98,"props":355,"children":356},{},[357],{"type":49,"value":358},"var _ = pubsub.NewSubscription(events.OrderCreated, \"send-confirmation-email\",\n",{"type":44,"tag":98,"props":360,"children":361},{"class":100,"line":181},[362],{"type":44,"tag":98,"props":363,"children":364},{},[365],{"type":49,"value":366},"    pubsub.SubscriptionConfig[*events.OrderCreatedEvent]{\n",{"type":44,"tag":98,"props":368,"children":369},{"class":100,"line":189},[370],{"type":44,"tag":98,"props":371,"children":372},{},[373],{"type":49,"value":374},"        Handler: sendConfirmationEmail,\n",{"type":44,"tag":98,"props":376,"children":377},{"class":100,"line":198},[378],{"type":44,"tag":98,"props":379,"children":380},{},[381],{"type":49,"value":382},"    },\n",{"type":44,"tag":98,"props":384,"children":385},{"class":100,"line":207},[386],{"type":44,"tag":98,"props":387,"children":388},{},[389],{"type":49,"value":343},{"type":44,"tag":98,"props":391,"children":392},{"class":100,"line":216},[393],{"type":44,"tag":98,"props":394,"children":395},{"emptyLinePlaceholder":114},[396],{"type":49,"value":117},{"type":44,"tag":98,"props":398,"children":400},{"class":100,"line":399},15,[401],{"type":44,"tag":98,"props":402,"children":403},{},[404],{"type":49,"value":405},"func sendConfirmationEmail(ctx context.Context, event *events.OrderCreatedEvent) error {\n",{"type":44,"tag":98,"props":407,"children":409},{"class":100,"line":408},16,[410],{"type":44,"tag":98,"props":411,"children":412},{},[413],{"type":49,"value":414},"    \u002F\u002F Send email...\n",{"type":44,"tag":98,"props":416,"children":418},{"class":100,"line":417},17,[419],{"type":44,"tag":98,"props":420,"children":421},{},[422],{"type":49,"value":423},"    return nil\n",{"type":44,"tag":98,"props":425,"children":427},{"class":100,"line":426},18,[428],{"type":44,"tag":98,"props":429,"children":430},{},[431],{"type":49,"value":178},{"type":44,"tag":224,"props":433,"children":435},{"id":434},"topic-references",[436],{"type":49,"value":437},"Topic References",{"type":44,"tag":59,"props":439,"children":440},{},[441],{"type":49,"value":442},"Pass topic access to library code while maintaining static analysis:",{"type":44,"tag":88,"props":444,"children":446},{"className":90,"code":445,"language":23,"meta":92,"style":92},"\u002F\u002F Create a reference with publish permission\nref := pubsub.TopicRef[pubsub.Publisher[*OrderCreatedEvent]](OrderCreated)\n\n\u002F\u002F Use the reference in library code\nfunc publishEvent(ref pubsub.Publisher[*OrderCreatedEvent], event *OrderCreatedEvent) error {\n    _, err := ref.Publish(ctx, event)\n    return err\n}\n",[447],{"type":44,"tag":65,"props":448,"children":449},{"__ignoreMap":92},[450,458,466,473,481,489,497,505],{"type":44,"tag":98,"props":451,"children":452},{"class":100,"line":101},[453],{"type":44,"tag":98,"props":454,"children":455},{},[456],{"type":49,"value":457},"\u002F\u002F Create a reference with publish permission\n",{"type":44,"tag":98,"props":459,"children":460},{"class":100,"line":110},[461],{"type":44,"tag":98,"props":462,"children":463},{},[464],{"type":49,"value":465},"ref := pubsub.TopicRef[pubsub.Publisher[*OrderCreatedEvent]](OrderCreated)\n",{"type":44,"tag":98,"props":467,"children":468},{"class":100,"line":120},[469],{"type":44,"tag":98,"props":470,"children":471},{"emptyLinePlaceholder":114},[472],{"type":49,"value":117},{"type":44,"tag":98,"props":474,"children":475},{"class":100,"line":129},[476],{"type":44,"tag":98,"props":477,"children":478},{},[479],{"type":49,"value":480},"\u002F\u002F Use the reference in library code\n",{"type":44,"tag":98,"props":482,"children":483},{"class":100,"line":28},[484],{"type":44,"tag":98,"props":485,"children":486},{},[487],{"type":49,"value":488},"func publishEvent(ref pubsub.Publisher[*OrderCreatedEvent], event *OrderCreatedEvent) error {\n",{"type":44,"tag":98,"props":490,"children":491},{"class":100,"line":145},[492],{"type":44,"tag":98,"props":493,"children":494},{},[495],{"type":49,"value":496},"    _, err := ref.Publish(ctx, event)\n",{"type":44,"tag":98,"props":498,"children":499},{"class":100,"line":154},[500],{"type":44,"tag":98,"props":501,"children":502},{},[503],{"type":49,"value":504},"    return err\n",{"type":44,"tag":98,"props":506,"children":507},{"class":100,"line":163},[508],{"type":44,"tag":98,"props":509,"children":510},{},[511],{"type":49,"value":178},{"type":44,"tag":52,"props":513,"children":515},{"id":514},"delivery-guarantees",[516],{"type":49,"value":517},"Delivery Guarantees",{"type":44,"tag":519,"props":520,"children":521},"ul",{},[522,534],{"type":44,"tag":523,"props":524,"children":525},"li",{},[526,532],{"type":44,"tag":65,"props":527,"children":529},{"className":528},[],[530],{"type":49,"value":531},"pubsub.AtLeastOnce",{"type":49,"value":533}," (default): may deliver duplicates → handlers must be idempotent.",{"type":44,"tag":523,"props":535,"children":536},{},[537,543],{"type":44,"tag":65,"props":538,"children":540},{"className":539},[],[541],{"type":49,"value":542},"pubsub.ExactlyOnce",{"type":49,"value":544},": stricter, capped throughput (AWS 300 msg\u002Fs\u002Ftopic, GCP 3000+ msg\u002Fs\u002Fregion). Does not deduplicate on the publish side.",{"type":44,"tag":52,"props":546,"children":548},{"id":547},"guidelines",[549],{"type":49,"value":550},"Guidelines",{"type":44,"tag":519,"props":552,"children":553},{},[554,559,564,585],{"type":44,"tag":523,"props":555,"children":556},{},[557],{"type":49,"value":558},"Topics and subscriptions must be declared as package-level variables.",{"type":44,"tag":523,"props":560,"children":561},{},[562],{"type":49,"value":563},"Subscription handlers must be idempotent (at-least-once delivery is the default).",{"type":44,"tag":523,"props":565,"children":566},{},[567,569,575,577,583],{"type":49,"value":568},"Subscription handlers receive a ",{"type":44,"tag":65,"props":570,"children":572},{"className":571},[],[573],{"type":49,"value":574},"context.Context",{"type":49,"value":576}," and the event pointer; return an ",{"type":44,"tag":65,"props":578,"children":580},{"className":579},[],[581],{"type":49,"value":582},"error",{"type":49,"value":584}," to retry per the topic's retry policy.",{"type":44,"tag":523,"props":586,"children":587},{},[588,590,596,598,603],{"type":49,"value":589},"Don't do heavy synchronous work in ",{"type":44,"tag":65,"props":591,"children":593},{"className":592},[],[594],{"type":49,"value":595},"Publish",{"type":49,"value":597}," callers — ",{"type":44,"tag":65,"props":599,"children":601},{"className":600},[],[602],{"type":49,"value":595},{"type":49,"value":604}," returns once the message is queued.",{"type":44,"tag":606,"props":607,"children":608},"style",{},[609],{"type":49,"value":610},"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":612,"total":714},[613,627,639,655,671,683,699],{"slug":614,"name":614,"fn":615,"description":616,"org":617,"tags":618,"stars":24,"repoUrl":25,"updatedAt":626},"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},[619,622,623],{"name":620,"slug":621,"type":16},"API Development","api-development",{"name":9,"slug":8,"type":16},{"name":624,"slug":625,"type":16},"TypeScript","typescript","2026-04-06T18:09:46.044101",{"slug":628,"name":628,"fn":629,"description":630,"org":631,"tags":632,"stars":24,"repoUrl":25,"updatedAt":638},"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},[633,636,637],{"name":634,"slug":635,"type":16},"Auth","auth",{"name":9,"slug":8,"type":16},{"name":624,"slug":625,"type":16},"2026-04-06T18:09:47.336322",{"slug":640,"name":640,"fn":641,"description":642,"org":643,"tags":644,"stars":24,"repoUrl":25,"updatedAt":654},"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},[645,646,647,650,653],{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":648,"slug":649,"type":16},"File Storage","file-storage",{"name":651,"slug":652,"type":16},"File Uploads","file-uploads",{"name":624,"slug":625,"type":16},"2026-05-16T05:59:52.813772",{"slug":656,"name":656,"fn":657,"description":658,"org":659,"tags":660,"stars":24,"repoUrl":25,"updatedAt":670},"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},[661,662,665,666,669],{"name":14,"slug":15,"type":16},{"name":663,"slug":664,"type":16},"Caching","caching",{"name":9,"slug":8,"type":16},{"name":667,"slug":668,"type":16},"Redis","redis",{"name":624,"slug":625,"type":16},"2026-05-16T05:59:56.808328",{"slug":672,"name":672,"fn":673,"description":674,"org":675,"tags":676,"stars":24,"repoUrl":25,"updatedAt":682},"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},[677,680,681],{"name":678,"slug":679,"type":16},"Code Review","code-review",{"name":9,"slug":8,"type":16},{"name":624,"slug":625,"type":16},"2026-04-06T18:10:01.123999",{"slug":684,"name":684,"fn":685,"description":686,"org":687,"tags":688,"stars":24,"repoUrl":25,"updatedAt":698},"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},[689,692,693,694,697],{"name":690,"slug":691,"type":16},"Automation","automation",{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":695,"slug":696,"type":16},"Scheduling","scheduling",{"name":624,"slug":625,"type":16},"2026-05-16T05:59:54.146651",{"slug":700,"name":700,"fn":701,"description":702,"org":703,"tags":704,"stars":24,"repoUrl":25,"updatedAt":713},"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},[705,708,709,712],{"name":706,"slug":707,"type":16},"Database","database",{"name":9,"slug":8,"type":16},{"name":710,"slug":711,"type":16},"ORM","orm",{"name":624,"slug":625,"type":16},"2026-04-06T18:09:54.823017",28,{"items":716,"total":714},[717,723,729,737,745,751,759,766,783,800,810,821],{"slug":614,"name":614,"fn":615,"description":616,"org":718,"tags":719,"stars":24,"repoUrl":25,"updatedAt":626},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[720,721,722],{"name":620,"slug":621,"type":16},{"name":9,"slug":8,"type":16},{"name":624,"slug":625,"type":16},{"slug":628,"name":628,"fn":629,"description":630,"org":724,"tags":725,"stars":24,"repoUrl":25,"updatedAt":638},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[726,727,728],{"name":634,"slug":635,"type":16},{"name":9,"slug":8,"type":16},{"name":624,"slug":625,"type":16},{"slug":640,"name":640,"fn":641,"description":642,"org":730,"tags":731,"stars":24,"repoUrl":25,"updatedAt":654},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[732,733,734,735,736],{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":648,"slug":649,"type":16},{"name":651,"slug":652,"type":16},{"name":624,"slug":625,"type":16},{"slug":656,"name":656,"fn":657,"description":658,"org":738,"tags":739,"stars":24,"repoUrl":25,"updatedAt":670},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[740,741,742,743,744],{"name":14,"slug":15,"type":16},{"name":663,"slug":664,"type":16},{"name":9,"slug":8,"type":16},{"name":667,"slug":668,"type":16},{"name":624,"slug":625,"type":16},{"slug":672,"name":672,"fn":673,"description":674,"org":746,"tags":747,"stars":24,"repoUrl":25,"updatedAt":682},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[748,749,750],{"name":678,"slug":679,"type":16},{"name":9,"slug":8,"type":16},{"name":624,"slug":625,"type":16},{"slug":684,"name":684,"fn":685,"description":686,"org":752,"tags":753,"stars":24,"repoUrl":25,"updatedAt":698},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[754,755,756,757,758],{"name":690,"slug":691,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":695,"slug":696,"type":16},{"name":624,"slug":625,"type":16},{"slug":700,"name":700,"fn":701,"description":702,"org":760,"tags":761,"stars":24,"repoUrl":25,"updatedAt":713},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[762,763,764,765],{"name":706,"slug":707,"type":16},{"name":9,"slug":8,"type":16},{"name":710,"slug":711,"type":16},{"name":624,"slug":625,"type":16},{"slug":767,"name":767,"fn":768,"description":769,"org":770,"tags":771,"stars":24,"repoUrl":25,"updatedAt":782},"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},[772,773,776,779],{"name":9,"slug":8,"type":16},{"name":774,"slug":775,"type":16},"Frontend","frontend",{"name":777,"slug":778,"type":16},"Next.js","next-js",{"name":780,"slug":781,"type":16},"React","react","2026-04-06T18:09:56.091006",{"slug":784,"name":784,"fn":785,"description":786,"org":787,"tags":788,"stars":24,"repoUrl":25,"updatedAt":799},"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},[789,790,791,792,795,796],{"name":620,"slug":621,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":793,"slug":794,"type":16},"Local Development","local-development",{"name":624,"slug":625,"type":16},{"name":797,"slug":798,"type":16},"Web Development","web-development","2026-04-06T18:10:04.885446",{"slug":801,"name":801,"fn":802,"description":803,"org":804,"tags":805,"stars":24,"repoUrl":25,"updatedAt":809},"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},[806,807,808],{"name":620,"slug":621,"type":16},{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"2026-04-06T18:09:48.578781",{"slug":811,"name":811,"fn":812,"description":813,"org":814,"tags":815,"stars":24,"repoUrl":25,"updatedAt":820},"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},[816,817,818,819],{"name":634,"slug":635,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"2026-04-06T18:09:51.065102",{"slug":822,"name":822,"fn":823,"description":824,"org":825,"tags":826,"stars":24,"repoUrl":25,"updatedAt":834},"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},[827,828,829,830,831],{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":648,"slug":649,"type":16},{"name":22,"slug":23,"type":16},{"name":832,"slug":833,"type":16},"Storage","storage","2026-05-16T06:00:03.633918"]