[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-convex-billing":3,"mdc--9ipojt-key":35,"related-repo-convex-billing":2240,"related-org-convex-billing":2341},{"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":30,"sourceUrl":33,"mdContent":34},"billing","integrate Stripe billing in Convex apps","Add Stripe billing to a Convex app via @convex-dev\u002Fstripe (checkout + auto-verified webhook + subscription gating). TRIGGER on a payments\u002Fbilling\u002Fsubscription request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"convex","Convex","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fconvex.png","get-convex",[13,15,18,21],{"name":9,"slug":8,"type":14},"tag",{"name":16,"slug":17,"type":14},"Payments","payments",{"name":19,"slug":20,"type":14},"Webhooks","webhooks",{"name":22,"slug":23,"type":14},"Stripe","stripe",2,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fconvex-codex-plugin","2026-07-12T08:00:08.123246","Apache-2.0",0,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":32},[],"Codex plugin for the hosted Convex MCP server","https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fconvex-codex-plugin\u002Ftree\u002FHEAD\u002Fplugins\u002Fconvex\u002Fskills\u002Fbilling","---\nname: \"billing\"\ndescription: \"Add Stripe billing to a Convex app via @convex-dev\u002Fstripe (checkout + auto-verified webhook + subscription gating). TRIGGER on a payments\u002Fbilling\u002Fsubscription request.\"\nlicense: \"Apache-2.0\"\n---\n\n# Add billing \u002F payments\n\nWire Stripe to Convex using @convex-dev\u002Fstripe: a checkout action, an httpAction webhook registered by the component (signature-verified automatically), subscription state stored in the component's tables, and server-side gating via a query.\n\n## Steps\n1. Install the component: `npm install @convex-dev\u002Fstripe`.\n2. Create `convex\u002Fconvex.config.ts`:\n   ```ts\n   import { defineApp } from 'convex\u002Fserver';\n   import stripe from '@convex-dev\u002Fstripe\u002Fconvex.config.js';\n   const app = defineApp();\n   app.use(stripe);\n   export default app;\n   ```\n3. Store Stripe keys in Convex env (use the `env` micro power): `STRIPE_SECRET_KEY` (sk_test_… \u002F sk_live_…) and `STRIPE_WEBHOOK_SECRET` (whsec_…).\n4. Create `convex\u002Fhttp.ts` to register the webhook route (the component handles signature verification automatically):\n   ```ts\n   import { httpRouter } from 'convex\u002Fserver';\n   import { components } from '.\u002F_generated\u002Fapi';\n   import { registerRoutes } from '@convex-dev\u002Fstripe';\n   const http = httpRouter();\n   registerRoutes(http, components.stripe, { webhookPath: '\u002Fstripe\u002Fwebhook' });\n   export default http;\n   ```\n5. Create `convex\u002Fbilling.ts` with a checkout action and a subscription-gate query:\n   ```ts\n   import { action, query } from '.\u002F_generated\u002Fserver';\n   import { components } from '.\u002F_generated\u002Fapi';\n   import { StripeSubscriptions } from '@convex-dev\u002Fstripe';\n   import { v } from 'convex\u002Fvalues';\n   const stripeClient = new StripeSubscriptions(components.stripe, {});\n   export const createSubscriptionCheckout = action({\n     args: { priceId: v.string() },\n     returns: v.object({ sessionId: v.string(), url: v.union(v.string(), v.null()) }),\n     handler: async (ctx, args) => {\n       const identity = await ctx.auth.getUserIdentity();\n       if (!identity) throw new Error('Not authenticated');\n       const customer = await stripeClient.getOrCreateCustomer(ctx, { userId: identity.subject, email: identity.email, name: identity.name });\n       return await stripeClient.createCheckoutSession(ctx, { priceId: args.priceId, customerId: customer.customerId, mode: 'subscription', successUrl: `${process.env.SITE_URL ?? 'http:\u002F\u002Flocalhost:3000'}\u002F?success=true`, cancelUrl: `${process.env.SITE_URL ?? 'http:\u002F\u002Flocalhost:3000'}\u002F?canceled=true`, subscriptionMetadata: { userId: identity.subject } });\n     },\n   });\n   export const isSubscribed = query({\n     args: {},\n     returns: v.boolean(),\n     handler: async (ctx) => {\n       const identity = await ctx.auth.getUserIdentity();\n       if (!identity) return false;\n       const subscriptions = await ctx.runQuery(components.stripe.public.listSubscriptionsByUserId, { userId: identity.subject });\n       return subscriptions.some((sub) => sub.status === 'active' || sub.status === 'trialing');\n     },\n   });\n   ```\n6. Run `npx convex dev --once` — it will install the component and push the functions. Verify output shows `✔ Installed component stripe.`\n7. In Stripe Dashboard → Webhooks: add endpoint `https:\u002F\u002F\u003Cdeployment>.convex.site\u002Fstripe\u002Fwebhook`, subscribe to `checkout.session.completed`, `customer.subscription.*`, `invoice.*`, `payment_intent.*`. Copy the signing secret as `STRIPE_WEBHOOK_SECRET`.\n\n## Rules\n- Use @convex-dev\u002Fstripe (npm: @convex-dev\u002Fstripe@^0.1.4) — it handles webhook signature verification internally via registerRoutes; do NOT write a manual constructEvent webhook.\n- Stripe keys live in Convex env (use the `env` micro power): STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET.\n- Gate on server-stored subscription state via isSubscribed query (reads component tables), not client claims.\n- convex\u002Fconvex.config.ts must import from '@convex-dev\u002Fstripe\u002Fconvex.config.js' (not .ts) — the .js extension is required by the Convex bundler.\n",{"data":36,"body":37},{"name":4,"description":6,"license":27},{"type":38,"children":39},"root",[40,49,55,62,2197,2203,2234],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"add-billing-payments",[46],{"type":47,"value":48},"text","Add billing \u002F payments",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"Wire Stripe to Convex using @convex-dev\u002Fstripe: a checkout action, an httpAction webhook registered by the component (signature-verified automatically), subscription state stored in the component's tables, and server-side gating via a query.",{"type":41,"tag":56,"props":57,"children":59},"h2",{"id":58},"steps",[60],{"type":47,"value":61},"Steps",{"type":41,"tag":63,"props":64,"children":65},"ol",{},[66,81,278,307,572,2129,2148],{"type":41,"tag":67,"props":68,"children":69},"li",{},[70,72,79],{"type":47,"value":71},"Install the component: ",{"type":41,"tag":73,"props":74,"children":76},"code",{"className":75},[],[77],{"type":47,"value":78},"npm install @convex-dev\u002Fstripe",{"type":47,"value":80},".",{"type":41,"tag":67,"props":82,"children":83},{},[84,86,92,94],{"type":47,"value":85},"Create ",{"type":41,"tag":73,"props":87,"children":89},{"className":88},[],[90],{"type":47,"value":91},"convex\u002Fconvex.config.ts",{"type":47,"value":93},":\n",{"type":41,"tag":95,"props":96,"children":101},"pre",{"className":97,"code":98,"language":99,"meta":100,"style":100},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineApp } from 'convex\u002Fserver';\nimport stripe from '@convex-dev\u002Fstripe\u002Fconvex.config.js';\nconst app = defineApp();\napp.use(stripe);\nexport default app;\n","ts","",[102],{"type":41,"tag":73,"props":103,"children":104},{"__ignoreMap":100},[105,160,194,228,255],{"type":41,"tag":106,"props":107,"children":110},"span",{"class":108,"line":109},"line",1,[111,117,123,129,134,139,144,150,155],{"type":41,"tag":106,"props":112,"children":114},{"style":113},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[115],{"type":47,"value":116},"import",{"type":41,"tag":106,"props":118,"children":120},{"style":119},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[121],{"type":47,"value":122}," {",{"type":41,"tag":106,"props":124,"children":126},{"style":125},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[127],{"type":47,"value":128}," defineApp",{"type":41,"tag":106,"props":130,"children":131},{"style":119},[132],{"type":47,"value":133}," }",{"type":41,"tag":106,"props":135,"children":136},{"style":113},[137],{"type":47,"value":138}," from",{"type":41,"tag":106,"props":140,"children":141},{"style":119},[142],{"type":47,"value":143}," '",{"type":41,"tag":106,"props":145,"children":147},{"style":146},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[148],{"type":47,"value":149},"convex\u002Fserver",{"type":41,"tag":106,"props":151,"children":152},{"style":119},[153],{"type":47,"value":154},"'",{"type":41,"tag":106,"props":156,"children":157},{"style":119},[158],{"type":47,"value":159},";\n",{"type":41,"tag":106,"props":161,"children":162},{"class":108,"line":24},[163,167,172,177,181,186,190],{"type":41,"tag":106,"props":164,"children":165},{"style":113},[166],{"type":47,"value":116},{"type":41,"tag":106,"props":168,"children":169},{"style":125},[170],{"type":47,"value":171}," stripe ",{"type":41,"tag":106,"props":173,"children":174},{"style":113},[175],{"type":47,"value":176},"from",{"type":41,"tag":106,"props":178,"children":179},{"style":119},[180],{"type":47,"value":143},{"type":41,"tag":106,"props":182,"children":183},{"style":146},[184],{"type":47,"value":185},"@convex-dev\u002Fstripe\u002Fconvex.config.js",{"type":41,"tag":106,"props":187,"children":188},{"style":119},[189],{"type":47,"value":154},{"type":41,"tag":106,"props":191,"children":192},{"style":119},[193],{"type":47,"value":159},{"type":41,"tag":106,"props":195,"children":197},{"class":108,"line":196},3,[198,204,209,214,219,224],{"type":41,"tag":106,"props":199,"children":201},{"style":200},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[202],{"type":47,"value":203},"const",{"type":41,"tag":106,"props":205,"children":206},{"style":125},[207],{"type":47,"value":208}," app ",{"type":41,"tag":106,"props":210,"children":211},{"style":119},[212],{"type":47,"value":213},"=",{"type":41,"tag":106,"props":215,"children":217},{"style":216},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[218],{"type":47,"value":128},{"type":41,"tag":106,"props":220,"children":221},{"style":125},[222],{"type":47,"value":223},"()",{"type":41,"tag":106,"props":225,"children":226},{"style":119},[227],{"type":47,"value":159},{"type":41,"tag":106,"props":229,"children":231},{"class":108,"line":230},4,[232,237,241,246,251],{"type":41,"tag":106,"props":233,"children":234},{"style":125},[235],{"type":47,"value":236},"app",{"type":41,"tag":106,"props":238,"children":239},{"style":119},[240],{"type":47,"value":80},{"type":41,"tag":106,"props":242,"children":243},{"style":216},[244],{"type":47,"value":245},"use",{"type":41,"tag":106,"props":247,"children":248},{"style":125},[249],{"type":47,"value":250},"(stripe)",{"type":41,"tag":106,"props":252,"children":253},{"style":119},[254],{"type":47,"value":159},{"type":41,"tag":106,"props":256,"children":258},{"class":108,"line":257},5,[259,264,269,274],{"type":41,"tag":106,"props":260,"children":261},{"style":113},[262],{"type":47,"value":263},"export",{"type":41,"tag":106,"props":265,"children":266},{"style":113},[267],{"type":47,"value":268}," default",{"type":41,"tag":106,"props":270,"children":271},{"style":125},[272],{"type":47,"value":273}," app",{"type":41,"tag":106,"props":275,"children":276},{"style":119},[277],{"type":47,"value":159},{"type":41,"tag":67,"props":279,"children":280},{},[281,283,289,291,297,299,305],{"type":47,"value":282},"Store Stripe keys in Convex env (use the ",{"type":41,"tag":73,"props":284,"children":286},{"className":285},[],[287],{"type":47,"value":288},"env",{"type":47,"value":290}," micro power): ",{"type":41,"tag":73,"props":292,"children":294},{"className":293},[],[295],{"type":47,"value":296},"STRIPE_SECRET_KEY",{"type":47,"value":298}," (sk_test_… \u002F sk_live_…) and ",{"type":41,"tag":73,"props":300,"children":302},{"className":301},[],[303],{"type":47,"value":304},"STRIPE_WEBHOOK_SECRET",{"type":47,"value":306}," (whsec_…).",{"type":41,"tag":67,"props":308,"children":309},{},[310,311,317,319],{"type":47,"value":85},{"type":41,"tag":73,"props":312,"children":314},{"className":313},[],[315],{"type":47,"value":316},"convex\u002Fhttp.ts",{"type":47,"value":318}," to register the webhook route (the component handles signature verification automatically):\n",{"type":41,"tag":95,"props":320,"children":322},{"className":97,"code":321,"language":99,"meta":100,"style":100},"import { httpRouter } from 'convex\u002Fserver';\nimport { components } from '.\u002F_generated\u002Fapi';\nimport { registerRoutes } from '@convex-dev\u002Fstripe';\nconst http = httpRouter();\nregisterRoutes(http, components.stripe, { webhookPath: '\u002Fstripe\u002Fwebhook' });\nexport default http;\n",[323],{"type":41,"tag":73,"props":324,"children":325},{"__ignoreMap":100},[326,366,407,448,476,551],{"type":41,"tag":106,"props":327,"children":328},{"class":108,"line":109},[329,333,337,342,346,350,354,358,362],{"type":41,"tag":106,"props":330,"children":331},{"style":113},[332],{"type":47,"value":116},{"type":41,"tag":106,"props":334,"children":335},{"style":119},[336],{"type":47,"value":122},{"type":41,"tag":106,"props":338,"children":339},{"style":125},[340],{"type":47,"value":341}," httpRouter",{"type":41,"tag":106,"props":343,"children":344},{"style":119},[345],{"type":47,"value":133},{"type":41,"tag":106,"props":347,"children":348},{"style":113},[349],{"type":47,"value":138},{"type":41,"tag":106,"props":351,"children":352},{"style":119},[353],{"type":47,"value":143},{"type":41,"tag":106,"props":355,"children":356},{"style":146},[357],{"type":47,"value":149},{"type":41,"tag":106,"props":359,"children":360},{"style":119},[361],{"type":47,"value":154},{"type":41,"tag":106,"props":363,"children":364},{"style":119},[365],{"type":47,"value":159},{"type":41,"tag":106,"props":367,"children":368},{"class":108,"line":24},[369,373,377,382,386,390,394,399,403],{"type":41,"tag":106,"props":370,"children":371},{"style":113},[372],{"type":47,"value":116},{"type":41,"tag":106,"props":374,"children":375},{"style":119},[376],{"type":47,"value":122},{"type":41,"tag":106,"props":378,"children":379},{"style":125},[380],{"type":47,"value":381}," components",{"type":41,"tag":106,"props":383,"children":384},{"style":119},[385],{"type":47,"value":133},{"type":41,"tag":106,"props":387,"children":388},{"style":113},[389],{"type":47,"value":138},{"type":41,"tag":106,"props":391,"children":392},{"style":119},[393],{"type":47,"value":143},{"type":41,"tag":106,"props":395,"children":396},{"style":146},[397],{"type":47,"value":398},".\u002F_generated\u002Fapi",{"type":41,"tag":106,"props":400,"children":401},{"style":119},[402],{"type":47,"value":154},{"type":41,"tag":106,"props":404,"children":405},{"style":119},[406],{"type":47,"value":159},{"type":41,"tag":106,"props":408,"children":409},{"class":108,"line":196},[410,414,418,423,427,431,435,440,444],{"type":41,"tag":106,"props":411,"children":412},{"style":113},[413],{"type":47,"value":116},{"type":41,"tag":106,"props":415,"children":416},{"style":119},[417],{"type":47,"value":122},{"type":41,"tag":106,"props":419,"children":420},{"style":125},[421],{"type":47,"value":422}," registerRoutes",{"type":41,"tag":106,"props":424,"children":425},{"style":119},[426],{"type":47,"value":133},{"type":41,"tag":106,"props":428,"children":429},{"style":113},[430],{"type":47,"value":138},{"type":41,"tag":106,"props":432,"children":433},{"style":119},[434],{"type":47,"value":143},{"type":41,"tag":106,"props":436,"children":437},{"style":146},[438],{"type":47,"value":439},"@convex-dev\u002Fstripe",{"type":41,"tag":106,"props":441,"children":442},{"style":119},[443],{"type":47,"value":154},{"type":41,"tag":106,"props":445,"children":446},{"style":119},[447],{"type":47,"value":159},{"type":41,"tag":106,"props":449,"children":450},{"class":108,"line":230},[451,455,460,464,468,472],{"type":41,"tag":106,"props":452,"children":453},{"style":200},[454],{"type":47,"value":203},{"type":41,"tag":106,"props":456,"children":457},{"style":125},[458],{"type":47,"value":459}," http ",{"type":41,"tag":106,"props":461,"children":462},{"style":119},[463],{"type":47,"value":213},{"type":41,"tag":106,"props":465,"children":466},{"style":216},[467],{"type":47,"value":341},{"type":41,"tag":106,"props":469,"children":470},{"style":125},[471],{"type":47,"value":223},{"type":41,"tag":106,"props":473,"children":474},{"style":119},[475],{"type":47,"value":159},{"type":41,"tag":106,"props":477,"children":478},{"class":108,"line":257},[479,484,489,494,498,502,506,510,514,520,525,529,534,538,542,547],{"type":41,"tag":106,"props":480,"children":481},{"style":216},[482],{"type":47,"value":483},"registerRoutes",{"type":41,"tag":106,"props":485,"children":486},{"style":125},[487],{"type":47,"value":488},"(http",{"type":41,"tag":106,"props":490,"children":491},{"style":119},[492],{"type":47,"value":493},",",{"type":41,"tag":106,"props":495,"children":496},{"style":125},[497],{"type":47,"value":381},{"type":41,"tag":106,"props":499,"children":500},{"style":119},[501],{"type":47,"value":80},{"type":41,"tag":106,"props":503,"children":504},{"style":125},[505],{"type":47,"value":23},{"type":41,"tag":106,"props":507,"children":508},{"style":119},[509],{"type":47,"value":493},{"type":41,"tag":106,"props":511,"children":512},{"style":119},[513],{"type":47,"value":122},{"type":41,"tag":106,"props":515,"children":517},{"style":516},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[518],{"type":47,"value":519}," webhookPath",{"type":41,"tag":106,"props":521,"children":522},{"style":119},[523],{"type":47,"value":524},":",{"type":41,"tag":106,"props":526,"children":527},{"style":119},[528],{"type":47,"value":143},{"type":41,"tag":106,"props":530,"children":531},{"style":146},[532],{"type":47,"value":533},"\u002Fstripe\u002Fwebhook",{"type":41,"tag":106,"props":535,"children":536},{"style":119},[537],{"type":47,"value":154},{"type":41,"tag":106,"props":539,"children":540},{"style":119},[541],{"type":47,"value":133},{"type":41,"tag":106,"props":543,"children":544},{"style":125},[545],{"type":47,"value":546},")",{"type":41,"tag":106,"props":548,"children":549},{"style":119},[550],{"type":47,"value":159},{"type":41,"tag":106,"props":552,"children":554},{"class":108,"line":553},6,[555,559,563,568],{"type":41,"tag":106,"props":556,"children":557},{"style":113},[558],{"type":47,"value":263},{"type":41,"tag":106,"props":560,"children":561},{"style":113},[562],{"type":47,"value":268},{"type":41,"tag":106,"props":564,"children":565},{"style":125},[566],{"type":47,"value":567}," http",{"type":41,"tag":106,"props":569,"children":570},{"style":119},[571],{"type":47,"value":159},{"type":41,"tag":67,"props":573,"children":574},{},[575,576,582,584],{"type":47,"value":85},{"type":41,"tag":73,"props":577,"children":579},{"className":578},[],[580],{"type":47,"value":581},"convex\u002Fbilling.ts",{"type":47,"value":583}," with a checkout action and a subscription-gate query:\n",{"type":41,"tag":95,"props":585,"children":587},{"className":97,"code":586,"language":99,"meta":100,"style":100},"import { action, query } from '.\u002F_generated\u002Fserver';\nimport { components } from '.\u002F_generated\u002Fapi';\nimport { StripeSubscriptions } from '@convex-dev\u002Fstripe';\nimport { v } from 'convex\u002Fvalues';\nconst stripeClient = new StripeSubscriptions(components.stripe, {});\nexport const createSubscriptionCheckout = action({\n  args: { priceId: v.string() },\n  returns: v.object({ sessionId: v.string(), url: v.union(v.string(), v.null()) }),\n  handler: async (ctx, args) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) throw new Error('Not authenticated');\n    const customer = await stripeClient.getOrCreateCustomer(ctx, { userId: identity.subject, email: identity.email, name: identity.name });\n    return await stripeClient.createCheckoutSession(ctx, { priceId: args.priceId, customerId: customer.customerId, mode: 'subscription', successUrl: `${process.env.SITE_URL ?? 'http:\u002F\u002Flocalhost:3000'}\u002F?success=true`, cancelUrl: `${process.env.SITE_URL ?? 'http:\u002F\u002Flocalhost:3000'}\u002F?canceled=true`, subscriptionMetadata: { userId: identity.subject } });\n  },\n});\nexport const isSubscribed = query({\n  args: {},\n  returns: v.boolean(),\n  handler: async (ctx) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) return false;\n    const subscriptions = await ctx.runQuery(components.stripe.public.listSubscriptionsByUserId, { userId: identity.subject });\n    return subscriptions.some((sub) => sub.status === 'active' || sub.status === 'trialing');\n  },\n});\n",[588],{"type":41,"tag":73,"props":589,"children":590},{"__ignoreMap":100},[591,641,680,720,761,816,851,900,1039,1091,1146,1213,1350,1649,1658,1674,1707,1724,1757,1793,1841,1880,1989,2105,2113],{"type":41,"tag":106,"props":592,"children":593},{"class":108,"line":109},[594,598,602,607,611,616,620,624,628,633,637],{"type":41,"tag":106,"props":595,"children":596},{"style":113},[597],{"type":47,"value":116},{"type":41,"tag":106,"props":599,"children":600},{"style":119},[601],{"type":47,"value":122},{"type":41,"tag":106,"props":603,"children":604},{"style":125},[605],{"type":47,"value":606}," action",{"type":41,"tag":106,"props":608,"children":609},{"style":119},[610],{"type":47,"value":493},{"type":41,"tag":106,"props":612,"children":613},{"style":125},[614],{"type":47,"value":615}," query",{"type":41,"tag":106,"props":617,"children":618},{"style":119},[619],{"type":47,"value":133},{"type":41,"tag":106,"props":621,"children":622},{"style":113},[623],{"type":47,"value":138},{"type":41,"tag":106,"props":625,"children":626},{"style":119},[627],{"type":47,"value":143},{"type":41,"tag":106,"props":629,"children":630},{"style":146},[631],{"type":47,"value":632},".\u002F_generated\u002Fserver",{"type":41,"tag":106,"props":634,"children":635},{"style":119},[636],{"type":47,"value":154},{"type":41,"tag":106,"props":638,"children":639},{"style":119},[640],{"type":47,"value":159},{"type":41,"tag":106,"props":642,"children":643},{"class":108,"line":24},[644,648,652,656,660,664,668,672,676],{"type":41,"tag":106,"props":645,"children":646},{"style":113},[647],{"type":47,"value":116},{"type":41,"tag":106,"props":649,"children":650},{"style":119},[651],{"type":47,"value":122},{"type":41,"tag":106,"props":653,"children":654},{"style":125},[655],{"type":47,"value":381},{"type":41,"tag":106,"props":657,"children":658},{"style":119},[659],{"type":47,"value":133},{"type":41,"tag":106,"props":661,"children":662},{"style":113},[663],{"type":47,"value":138},{"type":41,"tag":106,"props":665,"children":666},{"style":119},[667],{"type":47,"value":143},{"type":41,"tag":106,"props":669,"children":670},{"style":146},[671],{"type":47,"value":398},{"type":41,"tag":106,"props":673,"children":674},{"style":119},[675],{"type":47,"value":154},{"type":41,"tag":106,"props":677,"children":678},{"style":119},[679],{"type":47,"value":159},{"type":41,"tag":106,"props":681,"children":682},{"class":108,"line":196},[683,687,691,696,700,704,708,712,716],{"type":41,"tag":106,"props":684,"children":685},{"style":113},[686],{"type":47,"value":116},{"type":41,"tag":106,"props":688,"children":689},{"style":119},[690],{"type":47,"value":122},{"type":41,"tag":106,"props":692,"children":693},{"style":125},[694],{"type":47,"value":695}," StripeSubscriptions",{"type":41,"tag":106,"props":697,"children":698},{"style":119},[699],{"type":47,"value":133},{"type":41,"tag":106,"props":701,"children":702},{"style":113},[703],{"type":47,"value":138},{"type":41,"tag":106,"props":705,"children":706},{"style":119},[707],{"type":47,"value":143},{"type":41,"tag":106,"props":709,"children":710},{"style":146},[711],{"type":47,"value":439},{"type":41,"tag":106,"props":713,"children":714},{"style":119},[715],{"type":47,"value":154},{"type":41,"tag":106,"props":717,"children":718},{"style":119},[719],{"type":47,"value":159},{"type":41,"tag":106,"props":721,"children":722},{"class":108,"line":230},[723,727,731,736,740,744,748,753,757],{"type":41,"tag":106,"props":724,"children":725},{"style":113},[726],{"type":47,"value":116},{"type":41,"tag":106,"props":728,"children":729},{"style":119},[730],{"type":47,"value":122},{"type":41,"tag":106,"props":732,"children":733},{"style":125},[734],{"type":47,"value":735}," v",{"type":41,"tag":106,"props":737,"children":738},{"style":119},[739],{"type":47,"value":133},{"type":41,"tag":106,"props":741,"children":742},{"style":113},[743],{"type":47,"value":138},{"type":41,"tag":106,"props":745,"children":746},{"style":119},[747],{"type":47,"value":143},{"type":41,"tag":106,"props":749,"children":750},{"style":146},[751],{"type":47,"value":752},"convex\u002Fvalues",{"type":41,"tag":106,"props":754,"children":755},{"style":119},[756],{"type":47,"value":154},{"type":41,"tag":106,"props":758,"children":759},{"style":119},[760],{"type":47,"value":159},{"type":41,"tag":106,"props":762,"children":763},{"class":108,"line":257},[764,768,773,777,782,786,791,795,799,803,808,812],{"type":41,"tag":106,"props":765,"children":766},{"style":200},[767],{"type":47,"value":203},{"type":41,"tag":106,"props":769,"children":770},{"style":125},[771],{"type":47,"value":772}," stripeClient ",{"type":41,"tag":106,"props":774,"children":775},{"style":119},[776],{"type":47,"value":213},{"type":41,"tag":106,"props":778,"children":779},{"style":119},[780],{"type":47,"value":781}," new",{"type":41,"tag":106,"props":783,"children":784},{"style":216},[785],{"type":47,"value":695},{"type":41,"tag":106,"props":787,"children":788},{"style":125},[789],{"type":47,"value":790},"(components",{"type":41,"tag":106,"props":792,"children":793},{"style":119},[794],{"type":47,"value":80},{"type":41,"tag":106,"props":796,"children":797},{"style":125},[798],{"type":47,"value":23},{"type":41,"tag":106,"props":800,"children":801},{"style":119},[802],{"type":47,"value":493},{"type":41,"tag":106,"props":804,"children":805},{"style":119},[806],{"type":47,"value":807}," {}",{"type":41,"tag":106,"props":809,"children":810},{"style":125},[811],{"type":47,"value":546},{"type":41,"tag":106,"props":813,"children":814},{"style":119},[815],{"type":47,"value":159},{"type":41,"tag":106,"props":817,"children":818},{"class":108,"line":553},[819,823,828,833,837,841,846],{"type":41,"tag":106,"props":820,"children":821},{"style":113},[822],{"type":47,"value":263},{"type":41,"tag":106,"props":824,"children":825},{"style":200},[826],{"type":47,"value":827}," const",{"type":41,"tag":106,"props":829,"children":830},{"style":125},[831],{"type":47,"value":832}," createSubscriptionCheckout ",{"type":41,"tag":106,"props":834,"children":835},{"style":119},[836],{"type":47,"value":213},{"type":41,"tag":106,"props":838,"children":839},{"style":216},[840],{"type":47,"value":606},{"type":41,"tag":106,"props":842,"children":843},{"style":125},[844],{"type":47,"value":845},"(",{"type":41,"tag":106,"props":847,"children":848},{"style":119},[849],{"type":47,"value":850},"{\n",{"type":41,"tag":106,"props":852,"children":854},{"class":108,"line":853},7,[855,860,864,868,873,877,881,885,890,895],{"type":41,"tag":106,"props":856,"children":857},{"style":516},[858],{"type":47,"value":859},"  args",{"type":41,"tag":106,"props":861,"children":862},{"style":119},[863],{"type":47,"value":524},{"type":41,"tag":106,"props":865,"children":866},{"style":119},[867],{"type":47,"value":122},{"type":41,"tag":106,"props":869,"children":870},{"style":516},[871],{"type":47,"value":872}," priceId",{"type":41,"tag":106,"props":874,"children":875},{"style":119},[876],{"type":47,"value":524},{"type":41,"tag":106,"props":878,"children":879},{"style":125},[880],{"type":47,"value":735},{"type":41,"tag":106,"props":882,"children":883},{"style":119},[884],{"type":47,"value":80},{"type":41,"tag":106,"props":886,"children":887},{"style":216},[888],{"type":47,"value":889},"string",{"type":41,"tag":106,"props":891,"children":892},{"style":125},[893],{"type":47,"value":894},"() ",{"type":41,"tag":106,"props":896,"children":897},{"style":119},[898],{"type":47,"value":899},"},\n",{"type":41,"tag":106,"props":901,"children":903},{"class":108,"line":902},8,[904,909,913,917,921,926,930,935,940,944,948,952,956,960,964,969,973,977,981,986,991,995,999,1003,1007,1011,1015,1020,1025,1030,1034],{"type":41,"tag":106,"props":905,"children":906},{"style":516},[907],{"type":47,"value":908},"  returns",{"type":41,"tag":106,"props":910,"children":911},{"style":119},[912],{"type":47,"value":524},{"type":41,"tag":106,"props":914,"children":915},{"style":125},[916],{"type":47,"value":735},{"type":41,"tag":106,"props":918,"children":919},{"style":119},[920],{"type":47,"value":80},{"type":41,"tag":106,"props":922,"children":923},{"style":216},[924],{"type":47,"value":925},"object",{"type":41,"tag":106,"props":927,"children":928},{"style":125},[929],{"type":47,"value":845},{"type":41,"tag":106,"props":931,"children":932},{"style":119},[933],{"type":47,"value":934},"{",{"type":41,"tag":106,"props":936,"children":937},{"style":516},[938],{"type":47,"value":939}," sessionId",{"type":41,"tag":106,"props":941,"children":942},{"style":119},[943],{"type":47,"value":524},{"type":41,"tag":106,"props":945,"children":946},{"style":125},[947],{"type":47,"value":735},{"type":41,"tag":106,"props":949,"children":950},{"style":119},[951],{"type":47,"value":80},{"type":41,"tag":106,"props":953,"children":954},{"style":216},[955],{"type":47,"value":889},{"type":41,"tag":106,"props":957,"children":958},{"style":125},[959],{"type":47,"value":223},{"type":41,"tag":106,"props":961,"children":962},{"style":119},[963],{"type":47,"value":493},{"type":41,"tag":106,"props":965,"children":966},{"style":516},[967],{"type":47,"value":968}," url",{"type":41,"tag":106,"props":970,"children":971},{"style":119},[972],{"type":47,"value":524},{"type":41,"tag":106,"props":974,"children":975},{"style":125},[976],{"type":47,"value":735},{"type":41,"tag":106,"props":978,"children":979},{"style":119},[980],{"type":47,"value":80},{"type":41,"tag":106,"props":982,"children":983},{"style":216},[984],{"type":47,"value":985},"union",{"type":41,"tag":106,"props":987,"children":988},{"style":125},[989],{"type":47,"value":990},"(v",{"type":41,"tag":106,"props":992,"children":993},{"style":119},[994],{"type":47,"value":80},{"type":41,"tag":106,"props":996,"children":997},{"style":216},[998],{"type":47,"value":889},{"type":41,"tag":106,"props":1000,"children":1001},{"style":125},[1002],{"type":47,"value":223},{"type":41,"tag":106,"props":1004,"children":1005},{"style":119},[1006],{"type":47,"value":493},{"type":41,"tag":106,"props":1008,"children":1009},{"style":125},[1010],{"type":47,"value":735},{"type":41,"tag":106,"props":1012,"children":1013},{"style":119},[1014],{"type":47,"value":80},{"type":41,"tag":106,"props":1016,"children":1017},{"style":216},[1018],{"type":47,"value":1019},"null",{"type":41,"tag":106,"props":1021,"children":1022},{"style":125},[1023],{"type":47,"value":1024},"()) ",{"type":41,"tag":106,"props":1026,"children":1027},{"style":119},[1028],{"type":47,"value":1029},"}",{"type":41,"tag":106,"props":1031,"children":1032},{"style":125},[1033],{"type":47,"value":546},{"type":41,"tag":106,"props":1035,"children":1036},{"style":119},[1037],{"type":47,"value":1038},",\n",{"type":41,"tag":106,"props":1040,"children":1042},{"class":108,"line":1041},9,[1043,1048,1052,1057,1062,1068,1072,1077,1081,1086],{"type":41,"tag":106,"props":1044,"children":1045},{"style":216},[1046],{"type":47,"value":1047},"  handler",{"type":41,"tag":106,"props":1049,"children":1050},{"style":119},[1051],{"type":47,"value":524},{"type":41,"tag":106,"props":1053,"children":1054},{"style":200},[1055],{"type":47,"value":1056}," async",{"type":41,"tag":106,"props":1058,"children":1059},{"style":119},[1060],{"type":47,"value":1061}," (",{"type":41,"tag":106,"props":1063,"children":1065},{"style":1064},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[1066],{"type":47,"value":1067},"ctx",{"type":41,"tag":106,"props":1069,"children":1070},{"style":119},[1071],{"type":47,"value":493},{"type":41,"tag":106,"props":1073,"children":1074},{"style":1064},[1075],{"type":47,"value":1076}," args",{"type":41,"tag":106,"props":1078,"children":1079},{"style":119},[1080],{"type":47,"value":546},{"type":41,"tag":106,"props":1082,"children":1083},{"style":200},[1084],{"type":47,"value":1085}," =>",{"type":41,"tag":106,"props":1087,"children":1088},{"style":119},[1089],{"type":47,"value":1090}," {\n",{"type":41,"tag":106,"props":1092,"children":1094},{"class":108,"line":1093},10,[1095,1100,1105,1110,1115,1120,1124,1129,1133,1138,1142],{"type":41,"tag":106,"props":1096,"children":1097},{"style":200},[1098],{"type":47,"value":1099},"    const",{"type":41,"tag":106,"props":1101,"children":1102},{"style":125},[1103],{"type":47,"value":1104}," identity",{"type":41,"tag":106,"props":1106,"children":1107},{"style":119},[1108],{"type":47,"value":1109}," =",{"type":41,"tag":106,"props":1111,"children":1112},{"style":113},[1113],{"type":47,"value":1114}," await",{"type":41,"tag":106,"props":1116,"children":1117},{"style":125},[1118],{"type":47,"value":1119}," ctx",{"type":41,"tag":106,"props":1121,"children":1122},{"style":119},[1123],{"type":47,"value":80},{"type":41,"tag":106,"props":1125,"children":1126},{"style":125},[1127],{"type":47,"value":1128},"auth",{"type":41,"tag":106,"props":1130,"children":1131},{"style":119},[1132],{"type":47,"value":80},{"type":41,"tag":106,"props":1134,"children":1135},{"style":216},[1136],{"type":47,"value":1137},"getUserIdentity",{"type":41,"tag":106,"props":1139,"children":1140},{"style":516},[1141],{"type":47,"value":223},{"type":41,"tag":106,"props":1143,"children":1144},{"style":119},[1145],{"type":47,"value":159},{"type":41,"tag":106,"props":1147,"children":1149},{"class":108,"line":1148},11,[1150,1155,1159,1164,1169,1174,1179,1183,1188,1192,1196,1201,1205,1209],{"type":41,"tag":106,"props":1151,"children":1152},{"style":113},[1153],{"type":47,"value":1154},"    if",{"type":41,"tag":106,"props":1156,"children":1157},{"style":516},[1158],{"type":47,"value":1061},{"type":41,"tag":106,"props":1160,"children":1161},{"style":119},[1162],{"type":47,"value":1163},"!",{"type":41,"tag":106,"props":1165,"children":1166},{"style":125},[1167],{"type":47,"value":1168},"identity",{"type":41,"tag":106,"props":1170,"children":1171},{"style":516},[1172],{"type":47,"value":1173},") ",{"type":41,"tag":106,"props":1175,"children":1176},{"style":113},[1177],{"type":47,"value":1178},"throw",{"type":41,"tag":106,"props":1180,"children":1181},{"style":119},[1182],{"type":47,"value":781},{"type":41,"tag":106,"props":1184,"children":1185},{"style":216},[1186],{"type":47,"value":1187}," Error",{"type":41,"tag":106,"props":1189,"children":1190},{"style":516},[1191],{"type":47,"value":845},{"type":41,"tag":106,"props":1193,"children":1194},{"style":119},[1195],{"type":47,"value":154},{"type":41,"tag":106,"props":1197,"children":1198},{"style":146},[1199],{"type":47,"value":1200},"Not authenticated",{"type":41,"tag":106,"props":1202,"children":1203},{"style":119},[1204],{"type":47,"value":154},{"type":41,"tag":106,"props":1206,"children":1207},{"style":516},[1208],{"type":47,"value":546},{"type":41,"tag":106,"props":1210,"children":1211},{"style":119},[1212],{"type":47,"value":159},{"type":41,"tag":106,"props":1214,"children":1216},{"class":108,"line":1215},12,[1217,1221,1226,1230,1234,1239,1243,1248,1252,1256,1260,1264,1269,1273,1277,1281,1286,1290,1295,1299,1303,1307,1312,1316,1321,1325,1329,1333,1338,1342,1346],{"type":41,"tag":106,"props":1218,"children":1219},{"style":200},[1220],{"type":47,"value":1099},{"type":41,"tag":106,"props":1222,"children":1223},{"style":125},[1224],{"type":47,"value":1225}," customer",{"type":41,"tag":106,"props":1227,"children":1228},{"style":119},[1229],{"type":47,"value":1109},{"type":41,"tag":106,"props":1231,"children":1232},{"style":113},[1233],{"type":47,"value":1114},{"type":41,"tag":106,"props":1235,"children":1236},{"style":125},[1237],{"type":47,"value":1238}," stripeClient",{"type":41,"tag":106,"props":1240,"children":1241},{"style":119},[1242],{"type":47,"value":80},{"type":41,"tag":106,"props":1244,"children":1245},{"style":216},[1246],{"type":47,"value":1247},"getOrCreateCustomer",{"type":41,"tag":106,"props":1249,"children":1250},{"style":516},[1251],{"type":47,"value":845},{"type":41,"tag":106,"props":1253,"children":1254},{"style":125},[1255],{"type":47,"value":1067},{"type":41,"tag":106,"props":1257,"children":1258},{"style":119},[1259],{"type":47,"value":493},{"type":41,"tag":106,"props":1261,"children":1262},{"style":119},[1263],{"type":47,"value":122},{"type":41,"tag":106,"props":1265,"children":1266},{"style":516},[1267],{"type":47,"value":1268}," userId",{"type":41,"tag":106,"props":1270,"children":1271},{"style":119},[1272],{"type":47,"value":524},{"type":41,"tag":106,"props":1274,"children":1275},{"style":125},[1276],{"type":47,"value":1104},{"type":41,"tag":106,"props":1278,"children":1279},{"style":119},[1280],{"type":47,"value":80},{"type":41,"tag":106,"props":1282,"children":1283},{"style":125},[1284],{"type":47,"value":1285},"subject",{"type":41,"tag":106,"props":1287,"children":1288},{"style":119},[1289],{"type":47,"value":493},{"type":41,"tag":106,"props":1291,"children":1292},{"style":516},[1293],{"type":47,"value":1294}," email",{"type":41,"tag":106,"props":1296,"children":1297},{"style":119},[1298],{"type":47,"value":524},{"type":41,"tag":106,"props":1300,"children":1301},{"style":125},[1302],{"type":47,"value":1104},{"type":41,"tag":106,"props":1304,"children":1305},{"style":119},[1306],{"type":47,"value":80},{"type":41,"tag":106,"props":1308,"children":1309},{"style":125},[1310],{"type":47,"value":1311},"email",{"type":41,"tag":106,"props":1313,"children":1314},{"style":119},[1315],{"type":47,"value":493},{"type":41,"tag":106,"props":1317,"children":1318},{"style":516},[1319],{"type":47,"value":1320}," name",{"type":41,"tag":106,"props":1322,"children":1323},{"style":119},[1324],{"type":47,"value":524},{"type":41,"tag":106,"props":1326,"children":1327},{"style":125},[1328],{"type":47,"value":1104},{"type":41,"tag":106,"props":1330,"children":1331},{"style":119},[1332],{"type":47,"value":80},{"type":41,"tag":106,"props":1334,"children":1335},{"style":125},[1336],{"type":47,"value":1337},"name",{"type":41,"tag":106,"props":1339,"children":1340},{"style":119},[1341],{"type":47,"value":133},{"type":41,"tag":106,"props":1343,"children":1344},{"style":516},[1345],{"type":47,"value":546},{"type":41,"tag":106,"props":1347,"children":1348},{"style":119},[1349],{"type":47,"value":159},{"type":41,"tag":106,"props":1351,"children":1353},{"class":108,"line":1352},13,[1354,1359,1363,1367,1371,1376,1380,1384,1388,1392,1396,1400,1404,1408,1413,1417,1422,1426,1430,1434,1439,1443,1448,1452,1456,1461,1465,1469,1474,1478,1483,1488,1492,1496,1500,1505,1510,1514,1519,1524,1529,1534,1538,1543,1547,1551,1555,1559,1563,1567,1571,1575,1579,1583,1587,1592,1596,1600,1605,1609,1613,1617,1621,1625,1629,1633,1637,1641,1645],{"type":41,"tag":106,"props":1355,"children":1356},{"style":113},[1357],{"type":47,"value":1358},"    return",{"type":41,"tag":106,"props":1360,"children":1361},{"style":113},[1362],{"type":47,"value":1114},{"type":41,"tag":106,"props":1364,"children":1365},{"style":125},[1366],{"type":47,"value":1238},{"type":41,"tag":106,"props":1368,"children":1369},{"style":119},[1370],{"type":47,"value":80},{"type":41,"tag":106,"props":1372,"children":1373},{"style":216},[1374],{"type":47,"value":1375},"createCheckoutSession",{"type":41,"tag":106,"props":1377,"children":1378},{"style":516},[1379],{"type":47,"value":845},{"type":41,"tag":106,"props":1381,"children":1382},{"style":125},[1383],{"type":47,"value":1067},{"type":41,"tag":106,"props":1385,"children":1386},{"style":119},[1387],{"type":47,"value":493},{"type":41,"tag":106,"props":1389,"children":1390},{"style":119},[1391],{"type":47,"value":122},{"type":41,"tag":106,"props":1393,"children":1394},{"style":516},[1395],{"type":47,"value":872},{"type":41,"tag":106,"props":1397,"children":1398},{"style":119},[1399],{"type":47,"value":524},{"type":41,"tag":106,"props":1401,"children":1402},{"style":125},[1403],{"type":47,"value":1076},{"type":41,"tag":106,"props":1405,"children":1406},{"style":119},[1407],{"type":47,"value":80},{"type":41,"tag":106,"props":1409,"children":1410},{"style":125},[1411],{"type":47,"value":1412},"priceId",{"type":41,"tag":106,"props":1414,"children":1415},{"style":119},[1416],{"type":47,"value":493},{"type":41,"tag":106,"props":1418,"children":1419},{"style":516},[1420],{"type":47,"value":1421}," customerId",{"type":41,"tag":106,"props":1423,"children":1424},{"style":119},[1425],{"type":47,"value":524},{"type":41,"tag":106,"props":1427,"children":1428},{"style":125},[1429],{"type":47,"value":1225},{"type":41,"tag":106,"props":1431,"children":1432},{"style":119},[1433],{"type":47,"value":80},{"type":41,"tag":106,"props":1435,"children":1436},{"style":125},[1437],{"type":47,"value":1438},"customerId",{"type":41,"tag":106,"props":1440,"children":1441},{"style":119},[1442],{"type":47,"value":493},{"type":41,"tag":106,"props":1444,"children":1445},{"style":516},[1446],{"type":47,"value":1447}," mode",{"type":41,"tag":106,"props":1449,"children":1450},{"style":119},[1451],{"type":47,"value":524},{"type":41,"tag":106,"props":1453,"children":1454},{"style":119},[1455],{"type":47,"value":143},{"type":41,"tag":106,"props":1457,"children":1458},{"style":146},[1459],{"type":47,"value":1460},"subscription",{"type":41,"tag":106,"props":1462,"children":1463},{"style":119},[1464],{"type":47,"value":154},{"type":41,"tag":106,"props":1466,"children":1467},{"style":119},[1468],{"type":47,"value":493},{"type":41,"tag":106,"props":1470,"children":1471},{"style":516},[1472],{"type":47,"value":1473}," successUrl",{"type":41,"tag":106,"props":1475,"children":1476},{"style":119},[1477],{"type":47,"value":524},{"type":41,"tag":106,"props":1479,"children":1480},{"style":119},[1481],{"type":47,"value":1482}," `${",{"type":41,"tag":106,"props":1484,"children":1485},{"style":125},[1486],{"type":47,"value":1487},"process",{"type":41,"tag":106,"props":1489,"children":1490},{"style":119},[1491],{"type":47,"value":80},{"type":41,"tag":106,"props":1493,"children":1494},{"style":125},[1495],{"type":47,"value":288},{"type":41,"tag":106,"props":1497,"children":1498},{"style":119},[1499],{"type":47,"value":80},{"type":41,"tag":106,"props":1501,"children":1502},{"style":125},[1503],{"type":47,"value":1504},"SITE_URL ",{"type":41,"tag":106,"props":1506,"children":1507},{"style":119},[1508],{"type":47,"value":1509},"??",{"type":41,"tag":106,"props":1511,"children":1512},{"style":119},[1513],{"type":47,"value":143},{"type":41,"tag":106,"props":1515,"children":1516},{"style":146},[1517],{"type":47,"value":1518},"http:\u002F\u002Flocalhost:3000",{"type":41,"tag":106,"props":1520,"children":1521},{"style":119},[1522],{"type":47,"value":1523},"'}",{"type":41,"tag":106,"props":1525,"children":1526},{"style":146},[1527],{"type":47,"value":1528},"\u002F?success=true",{"type":41,"tag":106,"props":1530,"children":1531},{"style":119},[1532],{"type":47,"value":1533},"`",{"type":41,"tag":106,"props":1535,"children":1536},{"style":119},[1537],{"type":47,"value":493},{"type":41,"tag":106,"props":1539,"children":1540},{"style":516},[1541],{"type":47,"value":1542}," cancelUrl",{"type":41,"tag":106,"props":1544,"children":1545},{"style":119},[1546],{"type":47,"value":524},{"type":41,"tag":106,"props":1548,"children":1549},{"style":119},[1550],{"type":47,"value":1482},{"type":41,"tag":106,"props":1552,"children":1553},{"style":125},[1554],{"type":47,"value":1487},{"type":41,"tag":106,"props":1556,"children":1557},{"style":119},[1558],{"type":47,"value":80},{"type":41,"tag":106,"props":1560,"children":1561},{"style":125},[1562],{"type":47,"value":288},{"type":41,"tag":106,"props":1564,"children":1565},{"style":119},[1566],{"type":47,"value":80},{"type":41,"tag":106,"props":1568,"children":1569},{"style":125},[1570],{"type":47,"value":1504},{"type":41,"tag":106,"props":1572,"children":1573},{"style":119},[1574],{"type":47,"value":1509},{"type":41,"tag":106,"props":1576,"children":1577},{"style":119},[1578],{"type":47,"value":143},{"type":41,"tag":106,"props":1580,"children":1581},{"style":146},[1582],{"type":47,"value":1518},{"type":41,"tag":106,"props":1584,"children":1585},{"style":119},[1586],{"type":47,"value":1523},{"type":41,"tag":106,"props":1588,"children":1589},{"style":146},[1590],{"type":47,"value":1591},"\u002F?canceled=true",{"type":41,"tag":106,"props":1593,"children":1594},{"style":119},[1595],{"type":47,"value":1533},{"type":41,"tag":106,"props":1597,"children":1598},{"style":119},[1599],{"type":47,"value":493},{"type":41,"tag":106,"props":1601,"children":1602},{"style":516},[1603],{"type":47,"value":1604}," subscriptionMetadata",{"type":41,"tag":106,"props":1606,"children":1607},{"style":119},[1608],{"type":47,"value":524},{"type":41,"tag":106,"props":1610,"children":1611},{"style":119},[1612],{"type":47,"value":122},{"type":41,"tag":106,"props":1614,"children":1615},{"style":516},[1616],{"type":47,"value":1268},{"type":41,"tag":106,"props":1618,"children":1619},{"style":119},[1620],{"type":47,"value":524},{"type":41,"tag":106,"props":1622,"children":1623},{"style":125},[1624],{"type":47,"value":1104},{"type":41,"tag":106,"props":1626,"children":1627},{"style":119},[1628],{"type":47,"value":80},{"type":41,"tag":106,"props":1630,"children":1631},{"style":125},[1632],{"type":47,"value":1285},{"type":41,"tag":106,"props":1634,"children":1635},{"style":119},[1636],{"type":47,"value":133},{"type":41,"tag":106,"props":1638,"children":1639},{"style":119},[1640],{"type":47,"value":133},{"type":41,"tag":106,"props":1642,"children":1643},{"style":516},[1644],{"type":47,"value":546},{"type":41,"tag":106,"props":1646,"children":1647},{"style":119},[1648],{"type":47,"value":159},{"type":41,"tag":106,"props":1650,"children":1652},{"class":108,"line":1651},14,[1653],{"type":41,"tag":106,"props":1654,"children":1655},{"style":119},[1656],{"type":47,"value":1657},"  },\n",{"type":41,"tag":106,"props":1659,"children":1661},{"class":108,"line":1660},15,[1662,1666,1670],{"type":41,"tag":106,"props":1663,"children":1664},{"style":119},[1665],{"type":47,"value":1029},{"type":41,"tag":106,"props":1667,"children":1668},{"style":125},[1669],{"type":47,"value":546},{"type":41,"tag":106,"props":1671,"children":1672},{"style":119},[1673],{"type":47,"value":159},{"type":41,"tag":106,"props":1675,"children":1677},{"class":108,"line":1676},16,[1678,1682,1686,1691,1695,1699,1703],{"type":41,"tag":106,"props":1679,"children":1680},{"style":113},[1681],{"type":47,"value":263},{"type":41,"tag":106,"props":1683,"children":1684},{"style":200},[1685],{"type":47,"value":827},{"type":41,"tag":106,"props":1687,"children":1688},{"style":125},[1689],{"type":47,"value":1690}," isSubscribed ",{"type":41,"tag":106,"props":1692,"children":1693},{"style":119},[1694],{"type":47,"value":213},{"type":41,"tag":106,"props":1696,"children":1697},{"style":216},[1698],{"type":47,"value":615},{"type":41,"tag":106,"props":1700,"children":1701},{"style":125},[1702],{"type":47,"value":845},{"type":41,"tag":106,"props":1704,"children":1705},{"style":119},[1706],{"type":47,"value":850},{"type":41,"tag":106,"props":1708,"children":1710},{"class":108,"line":1709},17,[1711,1715,1719],{"type":41,"tag":106,"props":1712,"children":1713},{"style":516},[1714],{"type":47,"value":859},{"type":41,"tag":106,"props":1716,"children":1717},{"style":119},[1718],{"type":47,"value":524},{"type":41,"tag":106,"props":1720,"children":1721},{"style":119},[1722],{"type":47,"value":1723}," {},\n",{"type":41,"tag":106,"props":1725,"children":1727},{"class":108,"line":1726},18,[1728,1732,1736,1740,1744,1749,1753],{"type":41,"tag":106,"props":1729,"children":1730},{"style":516},[1731],{"type":47,"value":908},{"type":41,"tag":106,"props":1733,"children":1734},{"style":119},[1735],{"type":47,"value":524},{"type":41,"tag":106,"props":1737,"children":1738},{"style":125},[1739],{"type":47,"value":735},{"type":41,"tag":106,"props":1741,"children":1742},{"style":119},[1743],{"type":47,"value":80},{"type":41,"tag":106,"props":1745,"children":1746},{"style":216},[1747],{"type":47,"value":1748},"boolean",{"type":41,"tag":106,"props":1750,"children":1751},{"style":125},[1752],{"type":47,"value":223},{"type":41,"tag":106,"props":1754,"children":1755},{"style":119},[1756],{"type":47,"value":1038},{"type":41,"tag":106,"props":1758,"children":1760},{"class":108,"line":1759},19,[1761,1765,1769,1773,1777,1781,1785,1789],{"type":41,"tag":106,"props":1762,"children":1763},{"style":216},[1764],{"type":47,"value":1047},{"type":41,"tag":106,"props":1766,"children":1767},{"style":119},[1768],{"type":47,"value":524},{"type":41,"tag":106,"props":1770,"children":1771},{"style":200},[1772],{"type":47,"value":1056},{"type":41,"tag":106,"props":1774,"children":1775},{"style":119},[1776],{"type":47,"value":1061},{"type":41,"tag":106,"props":1778,"children":1779},{"style":1064},[1780],{"type":47,"value":1067},{"type":41,"tag":106,"props":1782,"children":1783},{"style":119},[1784],{"type":47,"value":546},{"type":41,"tag":106,"props":1786,"children":1787},{"style":200},[1788],{"type":47,"value":1085},{"type":41,"tag":106,"props":1790,"children":1791},{"style":119},[1792],{"type":47,"value":1090},{"type":41,"tag":106,"props":1794,"children":1796},{"class":108,"line":1795},20,[1797,1801,1805,1809,1813,1817,1821,1825,1829,1833,1837],{"type":41,"tag":106,"props":1798,"children":1799},{"style":200},[1800],{"type":47,"value":1099},{"type":41,"tag":106,"props":1802,"children":1803},{"style":125},[1804],{"type":47,"value":1104},{"type":41,"tag":106,"props":1806,"children":1807},{"style":119},[1808],{"type":47,"value":1109},{"type":41,"tag":106,"props":1810,"children":1811},{"style":113},[1812],{"type":47,"value":1114},{"type":41,"tag":106,"props":1814,"children":1815},{"style":125},[1816],{"type":47,"value":1119},{"type":41,"tag":106,"props":1818,"children":1819},{"style":119},[1820],{"type":47,"value":80},{"type":41,"tag":106,"props":1822,"children":1823},{"style":125},[1824],{"type":47,"value":1128},{"type":41,"tag":106,"props":1826,"children":1827},{"style":119},[1828],{"type":47,"value":80},{"type":41,"tag":106,"props":1830,"children":1831},{"style":216},[1832],{"type":47,"value":1137},{"type":41,"tag":106,"props":1834,"children":1835},{"style":516},[1836],{"type":47,"value":223},{"type":41,"tag":106,"props":1838,"children":1839},{"style":119},[1840],{"type":47,"value":159},{"type":41,"tag":106,"props":1842,"children":1844},{"class":108,"line":1843},21,[1845,1849,1853,1857,1861,1865,1870,1876],{"type":41,"tag":106,"props":1846,"children":1847},{"style":113},[1848],{"type":47,"value":1154},{"type":41,"tag":106,"props":1850,"children":1851},{"style":516},[1852],{"type":47,"value":1061},{"type":41,"tag":106,"props":1854,"children":1855},{"style":119},[1856],{"type":47,"value":1163},{"type":41,"tag":106,"props":1858,"children":1859},{"style":125},[1860],{"type":47,"value":1168},{"type":41,"tag":106,"props":1862,"children":1863},{"style":516},[1864],{"type":47,"value":1173},{"type":41,"tag":106,"props":1866,"children":1867},{"style":113},[1868],{"type":47,"value":1869},"return",{"type":41,"tag":106,"props":1871,"children":1873},{"style":1872},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[1874],{"type":47,"value":1875}," false",{"type":41,"tag":106,"props":1877,"children":1878},{"style":119},[1879],{"type":47,"value":159},{"type":41,"tag":106,"props":1881,"children":1883},{"class":108,"line":1882},22,[1884,1888,1893,1897,1901,1905,1909,1914,1918,1923,1927,1931,1935,1940,1944,1949,1953,1957,1961,1965,1969,1973,1977,1981,1985],{"type":41,"tag":106,"props":1885,"children":1886},{"style":200},[1887],{"type":47,"value":1099},{"type":41,"tag":106,"props":1889,"children":1890},{"style":125},[1891],{"type":47,"value":1892}," subscriptions",{"type":41,"tag":106,"props":1894,"children":1895},{"style":119},[1896],{"type":47,"value":1109},{"type":41,"tag":106,"props":1898,"children":1899},{"style":113},[1900],{"type":47,"value":1114},{"type":41,"tag":106,"props":1902,"children":1903},{"style":125},[1904],{"type":47,"value":1119},{"type":41,"tag":106,"props":1906,"children":1907},{"style":119},[1908],{"type":47,"value":80},{"type":41,"tag":106,"props":1910,"children":1911},{"style":216},[1912],{"type":47,"value":1913},"runQuery",{"type":41,"tag":106,"props":1915,"children":1916},{"style":516},[1917],{"type":47,"value":845},{"type":41,"tag":106,"props":1919,"children":1920},{"style":125},[1921],{"type":47,"value":1922},"components",{"type":41,"tag":106,"props":1924,"children":1925},{"style":119},[1926],{"type":47,"value":80},{"type":41,"tag":106,"props":1928,"children":1929},{"style":125},[1930],{"type":47,"value":23},{"type":41,"tag":106,"props":1932,"children":1933},{"style":119},[1934],{"type":47,"value":80},{"type":41,"tag":106,"props":1936,"children":1937},{"style":125},[1938],{"type":47,"value":1939},"public",{"type":41,"tag":106,"props":1941,"children":1942},{"style":119},[1943],{"type":47,"value":80},{"type":41,"tag":106,"props":1945,"children":1946},{"style":125},[1947],{"type":47,"value":1948},"listSubscriptionsByUserId",{"type":41,"tag":106,"props":1950,"children":1951},{"style":119},[1952],{"type":47,"value":493},{"type":41,"tag":106,"props":1954,"children":1955},{"style":119},[1956],{"type":47,"value":122},{"type":41,"tag":106,"props":1958,"children":1959},{"style":516},[1960],{"type":47,"value":1268},{"type":41,"tag":106,"props":1962,"children":1963},{"style":119},[1964],{"type":47,"value":524},{"type":41,"tag":106,"props":1966,"children":1967},{"style":125},[1968],{"type":47,"value":1104},{"type":41,"tag":106,"props":1970,"children":1971},{"style":119},[1972],{"type":47,"value":80},{"type":41,"tag":106,"props":1974,"children":1975},{"style":125},[1976],{"type":47,"value":1285},{"type":41,"tag":106,"props":1978,"children":1979},{"style":119},[1980],{"type":47,"value":133},{"type":41,"tag":106,"props":1982,"children":1983},{"style":516},[1984],{"type":47,"value":546},{"type":41,"tag":106,"props":1986,"children":1987},{"style":119},[1988],{"type":47,"value":159},{"type":41,"tag":106,"props":1990,"children":1992},{"class":108,"line":1991},23,[1993,1997,2001,2005,2010,2014,2018,2023,2027,2031,2036,2040,2045,2050,2054,2059,2063,2068,2072,2076,2080,2084,2088,2093,2097,2101],{"type":41,"tag":106,"props":1994,"children":1995},{"style":113},[1996],{"type":47,"value":1358},{"type":41,"tag":106,"props":1998,"children":1999},{"style":125},[2000],{"type":47,"value":1892},{"type":41,"tag":106,"props":2002,"children":2003},{"style":119},[2004],{"type":47,"value":80},{"type":41,"tag":106,"props":2006,"children":2007},{"style":216},[2008],{"type":47,"value":2009},"some",{"type":41,"tag":106,"props":2011,"children":2012},{"style":516},[2013],{"type":47,"value":845},{"type":41,"tag":106,"props":2015,"children":2016},{"style":119},[2017],{"type":47,"value":845},{"type":41,"tag":106,"props":2019,"children":2020},{"style":1064},[2021],{"type":47,"value":2022},"sub",{"type":41,"tag":106,"props":2024,"children":2025},{"style":119},[2026],{"type":47,"value":546},{"type":41,"tag":106,"props":2028,"children":2029},{"style":200},[2030],{"type":47,"value":1085},{"type":41,"tag":106,"props":2032,"children":2033},{"style":125},[2034],{"type":47,"value":2035}," sub",{"type":41,"tag":106,"props":2037,"children":2038},{"style":119},[2039],{"type":47,"value":80},{"type":41,"tag":106,"props":2041,"children":2042},{"style":125},[2043],{"type":47,"value":2044},"status",{"type":41,"tag":106,"props":2046,"children":2047},{"style":119},[2048],{"type":47,"value":2049}," ===",{"type":41,"tag":106,"props":2051,"children":2052},{"style":119},[2053],{"type":47,"value":143},{"type":41,"tag":106,"props":2055,"children":2056},{"style":146},[2057],{"type":47,"value":2058},"active",{"type":41,"tag":106,"props":2060,"children":2061},{"style":119},[2062],{"type":47,"value":154},{"type":41,"tag":106,"props":2064,"children":2065},{"style":119},[2066],{"type":47,"value":2067}," ||",{"type":41,"tag":106,"props":2069,"children":2070},{"style":125},[2071],{"type":47,"value":2035},{"type":41,"tag":106,"props":2073,"children":2074},{"style":119},[2075],{"type":47,"value":80},{"type":41,"tag":106,"props":2077,"children":2078},{"style":125},[2079],{"type":47,"value":2044},{"type":41,"tag":106,"props":2081,"children":2082},{"style":119},[2083],{"type":47,"value":2049},{"type":41,"tag":106,"props":2085,"children":2086},{"style":119},[2087],{"type":47,"value":143},{"type":41,"tag":106,"props":2089,"children":2090},{"style":146},[2091],{"type":47,"value":2092},"trialing",{"type":41,"tag":106,"props":2094,"children":2095},{"style":119},[2096],{"type":47,"value":154},{"type":41,"tag":106,"props":2098,"children":2099},{"style":516},[2100],{"type":47,"value":546},{"type":41,"tag":106,"props":2102,"children":2103},{"style":119},[2104],{"type":47,"value":159},{"type":41,"tag":106,"props":2106,"children":2108},{"class":108,"line":2107},24,[2109],{"type":41,"tag":106,"props":2110,"children":2111},{"style":119},[2112],{"type":47,"value":1657},{"type":41,"tag":106,"props":2114,"children":2116},{"class":108,"line":2115},25,[2117,2121,2125],{"type":41,"tag":106,"props":2118,"children":2119},{"style":119},[2120],{"type":47,"value":1029},{"type":41,"tag":106,"props":2122,"children":2123},{"style":125},[2124],{"type":47,"value":546},{"type":41,"tag":106,"props":2126,"children":2127},{"style":119},[2128],{"type":47,"value":159},{"type":41,"tag":67,"props":2130,"children":2131},{},[2132,2134,2140,2142],{"type":47,"value":2133},"Run ",{"type":41,"tag":73,"props":2135,"children":2137},{"className":2136},[],[2138],{"type":47,"value":2139},"npx convex dev --once",{"type":47,"value":2141}," — it will install the component and push the functions. Verify output shows ",{"type":41,"tag":73,"props":2143,"children":2145},{"className":2144},[],[2146],{"type":47,"value":2147},"✔ Installed component stripe.",{"type":41,"tag":67,"props":2149,"children":2150},{},[2151,2153,2159,2161,2167,2169,2175,2176,2182,2183,2189,2191,2196],{"type":47,"value":2152},"In Stripe Dashboard → Webhooks: add endpoint ",{"type":41,"tag":73,"props":2154,"children":2156},{"className":2155},[],[2157],{"type":47,"value":2158},"https:\u002F\u002F\u003Cdeployment>.convex.site\u002Fstripe\u002Fwebhook",{"type":47,"value":2160},", subscribe to ",{"type":41,"tag":73,"props":2162,"children":2164},{"className":2163},[],[2165],{"type":47,"value":2166},"checkout.session.completed",{"type":47,"value":2168},", ",{"type":41,"tag":73,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":47,"value":2174},"customer.subscription.*",{"type":47,"value":2168},{"type":41,"tag":73,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":47,"value":2181},"invoice.*",{"type":47,"value":2168},{"type":41,"tag":73,"props":2184,"children":2186},{"className":2185},[],[2187],{"type":47,"value":2188},"payment_intent.*",{"type":47,"value":2190},". Copy the signing secret as ",{"type":41,"tag":73,"props":2192,"children":2194},{"className":2193},[],[2195],{"type":47,"value":304},{"type":47,"value":80},{"type":41,"tag":56,"props":2198,"children":2200},{"id":2199},"rules",[2201],{"type":47,"value":2202},"Rules",{"type":41,"tag":2204,"props":2205,"children":2206},"ul",{},[2207,2212,2224,2229],{"type":41,"tag":67,"props":2208,"children":2209},{},[2210],{"type":47,"value":2211},"Use @convex-dev\u002Fstripe (npm: @convex-dev\u002Fstripe@^0.1.4) — it handles webhook signature verification internally via registerRoutes; do NOT write a manual constructEvent webhook.",{"type":41,"tag":67,"props":2213,"children":2214},{},[2215,2217,2222],{"type":47,"value":2216},"Stripe keys live in Convex env (use the ",{"type":41,"tag":73,"props":2218,"children":2220},{"className":2219},[],[2221],{"type":47,"value":288},{"type":47,"value":2223}," micro power): STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET.",{"type":41,"tag":67,"props":2225,"children":2226},{},[2227],{"type":47,"value":2228},"Gate on server-stored subscription state via isSubscribed query (reads component tables), not client claims.",{"type":41,"tag":67,"props":2230,"children":2231},{},[2232],{"type":47,"value":2233},"convex\u002Fconvex.config.ts must import from '@convex-dev\u002Fstripe\u002Fconvex.config.js' (not .ts) — the .js extension is required by the Convex bundler.",{"type":41,"tag":2235,"props":2236,"children":2237},"style",{},[2238],{"type":47,"value":2239},"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":2241,"total":1759},[2242,2256,2275,2290,2297,2311,2326],{"slug":2243,"name":2243,"fn":2244,"description":2245,"org":2246,"tags":2247,"stars":24,"repoUrl":25,"updatedAt":2255},"add","add capabilities to Convex applications","Add a capability to the CURRENT Convex + Next.js project — consults the served Convex capability catalog for always-current procedures (billing, crons, auth, agent, search, …); falls back to built-in hosting or @convex-dev component search. TRIGGER when the user runs $add, or asks to add hosting\u002Fpublishing or any backend capability to an existing Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2248,2251,2252],{"name":2249,"slug":2250,"type":14},"Backend","backend",{"name":9,"slug":8,"type":14},{"name":2253,"slug":2254,"type":14},"Next.js","next-js","2026-07-12T07:59:59.358004",{"slug":2257,"name":2257,"fn":2258,"description":2259,"org":2260,"tags":2261,"stars":24,"repoUrl":25,"updatedAt":2274},"agent","build AI agents with Convex","Build an AI agent \u002F RAG feature on Convex (@convex-dev\u002Fagent: threads, tools, vector search). TRIGGER on an AI-agent\u002Fchatbot\u002FRAG request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2262,2265,2268,2271],{"name":2263,"slug":2264,"type":14},"Agents","agents",{"name":2266,"slug":2267,"type":14},"Engineering","engineering",{"name":2269,"slug":2270,"type":14},"RAG","rag",{"name":2272,"slug":2273,"type":14},"Search","search","2026-07-12T08:00:01.921824",{"slug":1128,"name":1128,"fn":2276,"description":2277,"org":2278,"tags":2279,"stars":24,"repoUrl":25,"updatedAt":2289},"add authentication to Convex applications","Add sign-in (passkeys by default, OAuth\u002Fpassword optional) to the current Convex app, wired correctly incl. auth.config.ts. TRIGGER on a login\u002Fauth request for an existing app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2280,2282,2285,2286],{"name":2281,"slug":1128,"type":14},"Auth",{"name":2283,"slug":2284,"type":14},"Authentication","authentication",{"name":9,"slug":8,"type":14},{"name":2287,"slug":2288,"type":14},"OAuth","oauth","2026-07-18T05:12:54.443056",{"slug":4,"name":4,"fn":5,"description":6,"org":2291,"tags":2292,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2293,2294,2295,2296],{"name":9,"slug":8,"type":14},{"name":16,"slug":17,"type":14},{"name":22,"slug":23,"type":14},{"name":19,"slug":20,"type":14},{"slug":2298,"name":2298,"fn":2299,"description":2300,"org":2301,"tags":2302,"stars":24,"repoUrl":25,"updatedAt":2310},"check-updates","upgrade Convex component versions","Check the CURRENT Convex app's pinned components against the latest recommended versions and offer to upgrade them — e.g. the passkey auth component's new email-first sign-in. TRIGGER when the user runs \u002Fcheck-updates or $check-updates, asks 'are my components up to date', 'any updates', 'upgrade auth', 'upgrade my components', or wants the newest features after a quickstart. Applies each upgrade behind a build gate (verify-or-revert) with the user's consent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2303,2306,2307],{"name":2304,"slug":2305,"type":14},"Configuration","configuration",{"name":9,"slug":8,"type":14},{"name":2308,"slug":2309,"type":14},"Maintenance","maintenance","2026-07-12T08:00:03.236862",{"slug":2312,"name":2312,"fn":2313,"description":2314,"org":2315,"tags":2316,"stars":24,"repoUrl":25,"updatedAt":2325},"convex-authz","audit and harden Convex authorization","Audit and harden a Convex app's authorization: identity-from-arg impersonation, missing per-document ownership checks, and public queries leaking PII\u002Ffinancial data by a client-supplied id — the single largest real-defect cluster measured against generated Convex backends (44 of 214). Runs a deterministic scan for the 3 shapes, then applies the canonical requireIdentity\u002FrequireOwner pattern, then verifies with tsc. TRIGGER on 'secure my app', 'audit auth', 'add login', 'who can access this data', or an explicit 'audit my authz'. NOT always-on. SKIP when there is no convex\u002F directory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2317,2318,2321,2322],{"name":2281,"slug":1128,"type":14},{"name":2319,"slug":2320,"type":14},"Code Analysis","code-analysis",{"name":9,"slug":8,"type":14},{"name":2323,"slug":2324,"type":14},"Security","security","2026-07-12T08:00:04.516752",{"slug":2327,"name":2327,"fn":2328,"description":2329,"org":2330,"tags":2331,"stars":24,"repoUrl":25,"updatedAt":2340},"convex-expert","develop Convex backend applications","Convex backend rules — consult this whenever writing or editing any code inside a convex\u002F directory (schemas, queries, mutations, actions, HTTP endpoints, crons, file storage, auth, component installation). TRIGGER before touching convex\u002F functions, so the code uses the object-form syntax, validators, indexes, and component patterns that generic models get wrong.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2332,2333,2334,2337],{"name":2249,"slug":2250,"type":14},{"name":9,"slug":8,"type":14},{"name":2335,"slug":2336,"type":14},"Database","database",{"name":2338,"slug":2339,"type":14},"TypeScript","typescript","2026-07-18T05:12:50.448833",{"items":2342,"total":2471},[2343,2354,2369,2384,2401,2418,2431,2437,2444,2451,2458,2464],{"slug":8,"name":8,"fn":2344,"description":2345,"org":2346,"tags":2347,"stars":2351,"repoUrl":2352,"updatedAt":2353},"guide Convex project setup and usage","Routes general Convex requests to the right project skill. Use when the user asks which Convex skill to use or gives an underspecified Convex app task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2348,2349,2350],{"name":2249,"slug":2250,"type":14},{"name":9,"slug":8,"type":14},{"name":2335,"slug":2336,"type":14},34,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills","2026-07-12T08:00:45.091281",{"slug":2355,"name":2355,"fn":2356,"description":2357,"org":2358,"tags":2359,"stars":2351,"repoUrl":2352,"updatedAt":2368},"convex-create-component","build reusable Convex components","Builds reusable Convex components with isolated tables and app-facing APIs. Use for new components, reusable backend modules, integrations, or component boundary work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2360,2363,2366,2367],{"name":2361,"slug":2362,"type":14},"API Development","api-development",{"name":2364,"slug":2365,"type":14},"Architecture","architecture",{"name":2249,"slug":2250,"type":14},{"name":9,"slug":8,"type":14},"2026-07-12T08:00:39.428577",{"slug":2370,"name":2370,"fn":2371,"description":2372,"org":2373,"tags":2374,"stars":2351,"repoUrl":2352,"updatedAt":2383},"convex-migration-helper","plan Convex schema and data migrations","Plans Convex schema and data migrations with widen-migrate-narrow and @convex-dev\u002Fmigrations. Use for breaking schema changes, backfills, table reshaping, or zero-downtime rollouts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2375,2376,2377,2380],{"name":2249,"slug":2250,"type":14},{"name":9,"slug":8,"type":14},{"name":2378,"slug":2379,"type":14},"Data Engineering","data-engineering",{"name":2381,"slug":2382,"type":14},"Migration","migration","2026-07-12T08:00:51.27967",{"slug":2385,"name":2385,"fn":2386,"description":2387,"org":2388,"tags":2389,"stars":2351,"repoUrl":2352,"updatedAt":2400},"convex-performance-audit","audit Convex application performance","Audits Convex performance for reads, subscriptions, write contention, and function limits. Use for slow features, insights findings, OCC conflicts, or read amplification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2390,2391,2394,2397],{"name":9,"slug":8,"type":14},{"name":2392,"slug":2393,"type":14},"Debugging","debugging",{"name":2395,"slug":2396,"type":14},"Monitoring","monitoring",{"name":2398,"slug":2399,"type":14},"Performance","performance","2026-07-12T08:00:50.02928",{"slug":2402,"name":2402,"fn":2403,"description":2404,"org":2405,"tags":2406,"stars":2351,"repoUrl":2352,"updatedAt":2417},"convex-quickstart","initialize Convex in applications","Creates or adds Convex to an app. Use for new Convex projects, npm create convex@latest, frontend setup, env vars, or the first npx convex dev run.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2407,2410,2411,2414],{"name":2408,"slug":2409,"type":14},"CLI","cli",{"name":9,"slug":8,"type":14},{"name":2412,"slug":2413,"type":14},"Frontend","frontend",{"name":2415,"slug":2416,"type":14},"Onboarding","onboarding","2026-07-12T08:00:43.436152",{"slug":2419,"name":2419,"fn":2420,"description":2421,"org":2422,"tags":2423,"stars":2351,"repoUrl":2352,"updatedAt":2430},"convex-setup-auth","set up authentication and access control","Sets up Convex auth, identity mapping, and access control. Use for login, auth providers, users tables, protected functions, or roles in a Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2424,2427,2428,2429],{"name":2425,"slug":2426,"type":14},"Access Control","access-control",{"name":2281,"slug":1128,"type":14},{"name":2249,"slug":2250,"type":14},{"name":9,"slug":8,"type":14},"2026-07-12T08:00:48.652641",{"slug":2243,"name":2243,"fn":2244,"description":2245,"org":2432,"tags":2433,"stars":24,"repoUrl":25,"updatedAt":2255},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2434,2435,2436],{"name":2249,"slug":2250,"type":14},{"name":9,"slug":8,"type":14},{"name":2253,"slug":2254,"type":14},{"slug":2257,"name":2257,"fn":2258,"description":2259,"org":2438,"tags":2439,"stars":24,"repoUrl":25,"updatedAt":2274},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2440,2441,2442,2443],{"name":2263,"slug":2264,"type":14},{"name":2266,"slug":2267,"type":14},{"name":2269,"slug":2270,"type":14},{"name":2272,"slug":2273,"type":14},{"slug":1128,"name":1128,"fn":2276,"description":2277,"org":2445,"tags":2446,"stars":24,"repoUrl":25,"updatedAt":2289},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2447,2448,2449,2450],{"name":2281,"slug":1128,"type":14},{"name":2283,"slug":2284,"type":14},{"name":9,"slug":8,"type":14},{"name":2287,"slug":2288,"type":14},{"slug":4,"name":4,"fn":5,"description":6,"org":2452,"tags":2453,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2454,2455,2456,2457],{"name":9,"slug":8,"type":14},{"name":16,"slug":17,"type":14},{"name":22,"slug":23,"type":14},{"name":19,"slug":20,"type":14},{"slug":2298,"name":2298,"fn":2299,"description":2300,"org":2459,"tags":2460,"stars":24,"repoUrl":25,"updatedAt":2310},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2461,2462,2463],{"name":2304,"slug":2305,"type":14},{"name":9,"slug":8,"type":14},{"name":2308,"slug":2309,"type":14},{"slug":2312,"name":2312,"fn":2313,"description":2314,"org":2465,"tags":2466,"stars":24,"repoUrl":25,"updatedAt":2325},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2467,2468,2469,2470],{"name":2281,"slug":1128,"type":14},{"name":2319,"slug":2320,"type":14},{"name":9,"slug":8,"type":14},{"name":2323,"slug":2324,"type":14},26]