[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-clerk-clerk-astro-patterns":3,"mdc--k7i5hy-key":37,"related-org-clerk-clerk-astro-patterns":1273,"related-repo-clerk-clerk-astro-patterns":1456},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"clerk-astro-patterns","implement Clerk auth in Astro apps","Astro patterns with Clerk — middleware, SSR pages, island components, API routes, static vs SSR rendering. Triggers on: astro clerk, clerk astro middleware, astro protected page, clerk island component, astro API route auth, clerk astro SSR.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"clerk","Clerk","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fclerk.png",[12,14,17,20,23],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Astro","astro",{"name":18,"slug":19,"type":13},"Authentication","authentication",{"name":21,"slug":22,"type":13},"Serverless","serverless",{"name":24,"slug":25,"type":13},"Frontend","frontend",59,"https:\u002F\u002Fgithub.com\u002Fclerk\u002Fskills","2026-04-07T04:46:14.731808","MIT",4,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"AI Skills to enhance working with Clerk","https:\u002F\u002Fgithub.com\u002Fclerk\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fframeworks\u002Fclerk-astro-patterns","---\nname: clerk-astro-patterns\ndescription: 'Astro patterns with Clerk — middleware, SSR pages, island components,\n  API routes, static vs SSR rendering. Triggers on: astro clerk, clerk astro middleware,\n  astro protected page, clerk island component, astro API route auth, clerk astro\n  SSR.'\nlicense: MIT\nallowed-tools: WebFetch\nmetadata:\n  author: clerk\n  version: 1.0.0\n---\n\n# Astro Patterns\n\nSDK: `@clerk\u002Fastro` v3+. Requires Astro 4.15+.\n\n## What Do You Need?\n\n| Task | Reference |\n|------|-----------|\n| Configure middleware | references\u002Fmiddleware.md |\n| Protect SSR pages | references\u002Fssr-pages.md |\n| Use Clerk in island components | references\u002Fisland-components.md |\n| Auth in API routes | references\u002Fapi-routes.md |\n| Use Clerk with React in Astro | references\u002Fastro-react.md |\n\n## Mental Model\n\nAstro has two rendering modes per page: **SSR** and **static prerender**. Clerk works differently in each:\n\n- **SSR pages** — use `Astro.locals.auth()` which is populated by the middleware\n- **Static pages** (`export const prerender = true`) — Clerk middleware skips them; use client-side hooks in islands\n- **Islands** — React\u002FVue\u002FSvelte components; use `useAuth()` and other hooks from `@clerk\u002Fastro\u002Freact`\n\n```\nRequest → clerkMiddleware() → SSR page → Astro.locals.auth()\n                                ↓\n                         Island (.client) → useAuth() hook\n```\n\n## Setup\n\n### astro.config.mjs\n\n```ts\nimport { defineConfig } from 'astro\u002Fconfig'\nimport clerk from '@clerk\u002Fastro'\n\nexport default defineConfig({\n  integrations: [clerk()],\n  output: 'server',\n})\n```\n\n### src\u002Fmiddleware.ts\n\n```ts\nimport { clerkMiddleware, createRouteMatcher } from '@clerk\u002Fastro\u002Fserver'\n\nconst isProtectedRoute = createRouteMatcher(['\u002Fdashboard(.*)'])\n\nexport const onRequest = clerkMiddleware((auth, context, next) => {\n  if (isProtectedRoute(context.request) && !auth().userId) {\n    return auth().redirectToSignIn()\n  }\n  return next()\n})\n```\n\n## SSR Page Auth\n\n```astro\n---\nconst { userId, orgId } = Astro.locals.auth()\nif (!userId) return Astro.redirect('\u002Fsign-in')\n---\n\n\u003Ch1>Dashboard\u003C\u002Fh1>\n```\n\n## Common Pitfalls\n\n| Symptom | Cause | Fix |\n|---------|-------|-----|\n| `Astro.locals.auth` is undefined | Missing middleware | Add `clerkMiddleware` to `src\u002Fmiddleware.ts` |\n| Auth works in dev but not production | `output: 'static'` globally | Set `output: 'server'` or `hybrid` for protected pages |\n| Static page has no auth | Prerendered pages skip middleware | Use `export const prerender = false` or move to island |\n| Island not reactive to sign-in | Missing `client:load` directive | Add `client:load` to the island component |\n\n## Import Map\n\n| What | Import From |\n|------|-------------|\n| `clerkMiddleware`, `createRouteMatcher` | `@clerk\u002Fastro\u002Fserver` |\n| `useAuth`, `useUser`, `UserButton` | `@clerk\u002Fastro\u002Freact` |\n| Astro components (`\u003CSignIn>`, etc.) | `@clerk\u002Fastro\u002Fcomponents` |\n\n## Env Variables\n\n```\n# .env\nPUBLIC_CLERK_PUBLISHABLE_KEY=pk_...\nCLERK_SECRET_KEY=sk_...\n```\n\nAstro uses `PUBLIC_` prefix for client-exposed variables (not `NEXT_PUBLIC_`).\n\n## See Also\n\n- `clerk-setup` - Initial Clerk install\n- `clerk-custom-ui` - Custom flows & appearance\n- `clerk-orgs` - B2B organizations\n\n## Docs\n\n[Astro SDK](https:\u002F\u002Fclerk.com\u002Fdocs\u002Fastro\u002Fgetting-started\u002Fquickstart)\n",{"data":38,"body":42},{"name":4,"description":6,"license":29,"allowed-tools":39,"metadata":40},"WebFetch",{"author":8,"version":41},"1.0.0",{"type":43,"children":44},"root",[45,54,69,76,169,175,195,260,272,278,285,491,497,829,835,889,895,1057,1063,1171,1177,1186,1207,1213,1249,1255,1267],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"astro-patterns",[51],{"type":52,"value":53},"text","Astro Patterns",{"type":46,"tag":55,"props":56,"children":57},"p",{},[58,60,67],{"type":52,"value":59},"SDK: ",{"type":46,"tag":61,"props":62,"children":64},"code",{"className":63},[],[65],{"type":52,"value":66},"@clerk\u002Fastro",{"type":52,"value":68}," v3+. Requires Astro 4.15+.",{"type":46,"tag":70,"props":71,"children":73},"h2",{"id":72},"what-do-you-need",[74],{"type":52,"value":75},"What Do You Need?",{"type":46,"tag":77,"props":78,"children":79},"table",{},[80,99],{"type":46,"tag":81,"props":82,"children":83},"thead",{},[84],{"type":46,"tag":85,"props":86,"children":87},"tr",{},[88,94],{"type":46,"tag":89,"props":90,"children":91},"th",{},[92],{"type":52,"value":93},"Task",{"type":46,"tag":89,"props":95,"children":96},{},[97],{"type":52,"value":98},"Reference",{"type":46,"tag":100,"props":101,"children":102},"tbody",{},[103,117,130,143,156],{"type":46,"tag":85,"props":104,"children":105},{},[106,112],{"type":46,"tag":107,"props":108,"children":109},"td",{},[110],{"type":52,"value":111},"Configure middleware",{"type":46,"tag":107,"props":113,"children":114},{},[115],{"type":52,"value":116},"references\u002Fmiddleware.md",{"type":46,"tag":85,"props":118,"children":119},{},[120,125],{"type":46,"tag":107,"props":121,"children":122},{},[123],{"type":52,"value":124},"Protect SSR pages",{"type":46,"tag":107,"props":126,"children":127},{},[128],{"type":52,"value":129},"references\u002Fssr-pages.md",{"type":46,"tag":85,"props":131,"children":132},{},[133,138],{"type":46,"tag":107,"props":134,"children":135},{},[136],{"type":52,"value":137},"Use Clerk in island components",{"type":46,"tag":107,"props":139,"children":140},{},[141],{"type":52,"value":142},"references\u002Fisland-components.md",{"type":46,"tag":85,"props":144,"children":145},{},[146,151],{"type":46,"tag":107,"props":147,"children":148},{},[149],{"type":52,"value":150},"Auth in API routes",{"type":46,"tag":107,"props":152,"children":153},{},[154],{"type":52,"value":155},"references\u002Fapi-routes.md",{"type":46,"tag":85,"props":157,"children":158},{},[159,164],{"type":46,"tag":107,"props":160,"children":161},{},[162],{"type":52,"value":163},"Use Clerk with React in Astro",{"type":46,"tag":107,"props":165,"children":166},{},[167],{"type":52,"value":168},"references\u002Fastro-react.md",{"type":46,"tag":70,"props":170,"children":172},{"id":171},"mental-model",[173],{"type":52,"value":174},"Mental Model",{"type":46,"tag":55,"props":176,"children":177},{},[178,180,186,188,193],{"type":52,"value":179},"Astro has two rendering modes per page: ",{"type":46,"tag":181,"props":182,"children":183},"strong",{},[184],{"type":52,"value":185},"SSR",{"type":52,"value":187}," and ",{"type":46,"tag":181,"props":189,"children":190},{},[191],{"type":52,"value":192},"static prerender",{"type":52,"value":194},". Clerk works differently in each:",{"type":46,"tag":196,"props":197,"children":198},"ul",{},[199,218,236],{"type":46,"tag":200,"props":201,"children":202},"li",{},[203,208,210,216],{"type":46,"tag":181,"props":204,"children":205},{},[206],{"type":52,"value":207},"SSR pages",{"type":52,"value":209}," — use ",{"type":46,"tag":61,"props":211,"children":213},{"className":212},[],[214],{"type":52,"value":215},"Astro.locals.auth()",{"type":52,"value":217}," which is populated by the middleware",{"type":46,"tag":200,"props":219,"children":220},{},[221,226,228,234],{"type":46,"tag":181,"props":222,"children":223},{},[224],{"type":52,"value":225},"Static pages",{"type":52,"value":227}," (",{"type":46,"tag":61,"props":229,"children":231},{"className":230},[],[232],{"type":52,"value":233},"export const prerender = true",{"type":52,"value":235},") — Clerk middleware skips them; use client-side hooks in islands",{"type":46,"tag":200,"props":237,"children":238},{},[239,244,246,252,254],{"type":46,"tag":181,"props":240,"children":241},{},[242],{"type":52,"value":243},"Islands",{"type":52,"value":245}," — React\u002FVue\u002FSvelte components; use ",{"type":46,"tag":61,"props":247,"children":249},{"className":248},[],[250],{"type":52,"value":251},"useAuth()",{"type":52,"value":253}," and other hooks from ",{"type":46,"tag":61,"props":255,"children":257},{"className":256},[],[258],{"type":52,"value":259},"@clerk\u002Fastro\u002Freact",{"type":46,"tag":261,"props":262,"children":266},"pre",{"className":263,"code":265,"language":52},[264],"language-text","Request → clerkMiddleware() → SSR page → Astro.locals.auth()\n                                ↓\n                         Island (.client) → useAuth() hook\n",[267],{"type":46,"tag":61,"props":268,"children":270},{"__ignoreMap":269},"",[271],{"type":52,"value":265},{"type":46,"tag":70,"props":273,"children":275},{"id":274},"setup",[276],{"type":52,"value":277},"Setup",{"type":46,"tag":279,"props":280,"children":282},"h3",{"id":281},"astroconfigmjs",[283],{"type":52,"value":284},"astro.config.mjs",{"type":46,"tag":261,"props":286,"children":290},{"className":287,"code":288,"language":289,"meta":269,"style":269},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineConfig } from 'astro\u002Fconfig'\nimport clerk from '@clerk\u002Fastro'\n\nexport default defineConfig({\n  integrations: [clerk()],\n  output: 'server',\n})\n","ts",[291],{"type":46,"tag":61,"props":292,"children":293},{"__ignoreMap":269},[294,344,374,384,412,446,477],{"type":46,"tag":295,"props":296,"children":299},"span",{"class":297,"line":298},"line",1,[300,306,312,318,323,328,333,339],{"type":46,"tag":295,"props":301,"children":303},{"style":302},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[304],{"type":52,"value":305},"import",{"type":46,"tag":295,"props":307,"children":309},{"style":308},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[310],{"type":52,"value":311}," {",{"type":46,"tag":295,"props":313,"children":315},{"style":314},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[316],{"type":52,"value":317}," defineConfig",{"type":46,"tag":295,"props":319,"children":320},{"style":308},[321],{"type":52,"value":322}," }",{"type":46,"tag":295,"props":324,"children":325},{"style":302},[326],{"type":52,"value":327}," from",{"type":46,"tag":295,"props":329,"children":330},{"style":308},[331],{"type":52,"value":332}," '",{"type":46,"tag":295,"props":334,"children":336},{"style":335},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[337],{"type":52,"value":338},"astro\u002Fconfig",{"type":46,"tag":295,"props":340,"children":341},{"style":308},[342],{"type":52,"value":343},"'\n",{"type":46,"tag":295,"props":345,"children":347},{"class":297,"line":346},2,[348,352,357,362,366,370],{"type":46,"tag":295,"props":349,"children":350},{"style":302},[351],{"type":52,"value":305},{"type":46,"tag":295,"props":353,"children":354},{"style":314},[355],{"type":52,"value":356}," clerk ",{"type":46,"tag":295,"props":358,"children":359},{"style":302},[360],{"type":52,"value":361},"from",{"type":46,"tag":295,"props":363,"children":364},{"style":308},[365],{"type":52,"value":332},{"type":46,"tag":295,"props":367,"children":368},{"style":335},[369],{"type":52,"value":66},{"type":46,"tag":295,"props":371,"children":372},{"style":308},[373],{"type":52,"value":343},{"type":46,"tag":295,"props":375,"children":377},{"class":297,"line":376},3,[378],{"type":46,"tag":295,"props":379,"children":381},{"emptyLinePlaceholder":380},true,[382],{"type":52,"value":383},"\n",{"type":46,"tag":295,"props":385,"children":386},{"class":297,"line":30},[387,392,397,402,407],{"type":46,"tag":295,"props":388,"children":389},{"style":302},[390],{"type":52,"value":391},"export",{"type":46,"tag":295,"props":393,"children":394},{"style":302},[395],{"type":52,"value":396}," default",{"type":46,"tag":295,"props":398,"children":400},{"style":399},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[401],{"type":52,"value":317},{"type":46,"tag":295,"props":403,"children":404},{"style":314},[405],{"type":52,"value":406},"(",{"type":46,"tag":295,"props":408,"children":409},{"style":308},[410],{"type":52,"value":411},"{\n",{"type":46,"tag":295,"props":413,"children":415},{"class":297,"line":414},5,[416,422,427,432,436,441],{"type":46,"tag":295,"props":417,"children":419},{"style":418},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[420],{"type":52,"value":421},"  integrations",{"type":46,"tag":295,"props":423,"children":424},{"style":308},[425],{"type":52,"value":426},":",{"type":46,"tag":295,"props":428,"children":429},{"style":314},[430],{"type":52,"value":431}," [",{"type":46,"tag":295,"props":433,"children":434},{"style":399},[435],{"type":52,"value":8},{"type":46,"tag":295,"props":437,"children":438},{"style":314},[439],{"type":52,"value":440},"()]",{"type":46,"tag":295,"props":442,"children":443},{"style":308},[444],{"type":52,"value":445},",\n",{"type":46,"tag":295,"props":447,"children":449},{"class":297,"line":448},6,[450,455,459,463,468,473],{"type":46,"tag":295,"props":451,"children":452},{"style":418},[453],{"type":52,"value":454},"  output",{"type":46,"tag":295,"props":456,"children":457},{"style":308},[458],{"type":52,"value":426},{"type":46,"tag":295,"props":460,"children":461},{"style":308},[462],{"type":52,"value":332},{"type":46,"tag":295,"props":464,"children":465},{"style":335},[466],{"type":52,"value":467},"server",{"type":46,"tag":295,"props":469,"children":470},{"style":308},[471],{"type":52,"value":472},"'",{"type":46,"tag":295,"props":474,"children":475},{"style":308},[476],{"type":52,"value":445},{"type":46,"tag":295,"props":478,"children":480},{"class":297,"line":479},7,[481,486],{"type":46,"tag":295,"props":482,"children":483},{"style":308},[484],{"type":52,"value":485},"}",{"type":46,"tag":295,"props":487,"children":488},{"style":314},[489],{"type":52,"value":490},")\n",{"type":46,"tag":279,"props":492,"children":494},{"id":493},"srcmiddlewarets",[495],{"type":52,"value":496},"src\u002Fmiddleware.ts",{"type":46,"tag":261,"props":498,"children":500},{"className":287,"code":499,"language":289,"meta":269,"style":269},"import { clerkMiddleware, createRouteMatcher } from '@clerk\u002Fastro\u002Fserver'\n\nconst isProtectedRoute = createRouteMatcher(['\u002Fdashboard(.*)'])\n\nexport const onRequest = clerkMiddleware((auth, context, next) => {\n  if (isProtectedRoute(context.request) && !auth().userId) {\n    return auth().redirectToSignIn()\n  }\n  return next()\n})\n",[501],{"type":46,"tag":61,"props":502,"children":503},{"__ignoreMap":269},[504,551,558,604,611,683,760,791,800,817],{"type":46,"tag":295,"props":505,"children":506},{"class":297,"line":298},[507,511,515,520,525,530,534,538,542,547],{"type":46,"tag":295,"props":508,"children":509},{"style":302},[510],{"type":52,"value":305},{"type":46,"tag":295,"props":512,"children":513},{"style":308},[514],{"type":52,"value":311},{"type":46,"tag":295,"props":516,"children":517},{"style":314},[518],{"type":52,"value":519}," clerkMiddleware",{"type":46,"tag":295,"props":521,"children":522},{"style":308},[523],{"type":52,"value":524},",",{"type":46,"tag":295,"props":526,"children":527},{"style":314},[528],{"type":52,"value":529}," createRouteMatcher",{"type":46,"tag":295,"props":531,"children":532},{"style":308},[533],{"type":52,"value":322},{"type":46,"tag":295,"props":535,"children":536},{"style":302},[537],{"type":52,"value":327},{"type":46,"tag":295,"props":539,"children":540},{"style":308},[541],{"type":52,"value":332},{"type":46,"tag":295,"props":543,"children":544},{"style":335},[545],{"type":52,"value":546},"@clerk\u002Fastro\u002Fserver",{"type":46,"tag":295,"props":548,"children":549},{"style":308},[550],{"type":52,"value":343},{"type":46,"tag":295,"props":552,"children":553},{"class":297,"line":346},[554],{"type":46,"tag":295,"props":555,"children":556},{"emptyLinePlaceholder":380},[557],{"type":52,"value":383},{"type":46,"tag":295,"props":559,"children":560},{"class":297,"line":376},[561,567,572,577,581,586,590,595,599],{"type":46,"tag":295,"props":562,"children":564},{"style":563},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[565],{"type":52,"value":566},"const",{"type":46,"tag":295,"props":568,"children":569},{"style":314},[570],{"type":52,"value":571}," isProtectedRoute ",{"type":46,"tag":295,"props":573,"children":574},{"style":308},[575],{"type":52,"value":576},"=",{"type":46,"tag":295,"props":578,"children":579},{"style":399},[580],{"type":52,"value":529},{"type":46,"tag":295,"props":582,"children":583},{"style":314},[584],{"type":52,"value":585},"([",{"type":46,"tag":295,"props":587,"children":588},{"style":308},[589],{"type":52,"value":472},{"type":46,"tag":295,"props":591,"children":592},{"style":335},[593],{"type":52,"value":594},"\u002Fdashboard(.*)",{"type":46,"tag":295,"props":596,"children":597},{"style":308},[598],{"type":52,"value":472},{"type":46,"tag":295,"props":600,"children":601},{"style":314},[602],{"type":52,"value":603},"])\n",{"type":46,"tag":295,"props":605,"children":606},{"class":297,"line":30},[607],{"type":46,"tag":295,"props":608,"children":609},{"emptyLinePlaceholder":380},[610],{"type":52,"value":383},{"type":46,"tag":295,"props":612,"children":613},{"class":297,"line":414},[614,618,623,628,632,636,640,644,650,654,659,663,668,673,678],{"type":46,"tag":295,"props":615,"children":616},{"style":302},[617],{"type":52,"value":391},{"type":46,"tag":295,"props":619,"children":620},{"style":563},[621],{"type":52,"value":622}," const",{"type":46,"tag":295,"props":624,"children":625},{"style":314},[626],{"type":52,"value":627}," onRequest ",{"type":46,"tag":295,"props":629,"children":630},{"style":308},[631],{"type":52,"value":576},{"type":46,"tag":295,"props":633,"children":634},{"style":399},[635],{"type":52,"value":519},{"type":46,"tag":295,"props":637,"children":638},{"style":314},[639],{"type":52,"value":406},{"type":46,"tag":295,"props":641,"children":642},{"style":308},[643],{"type":52,"value":406},{"type":46,"tag":295,"props":645,"children":647},{"style":646},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[648],{"type":52,"value":649},"auth",{"type":46,"tag":295,"props":651,"children":652},{"style":308},[653],{"type":52,"value":524},{"type":46,"tag":295,"props":655,"children":656},{"style":646},[657],{"type":52,"value":658}," context",{"type":46,"tag":295,"props":660,"children":661},{"style":308},[662],{"type":52,"value":524},{"type":46,"tag":295,"props":664,"children":665},{"style":646},[666],{"type":52,"value":667}," next",{"type":46,"tag":295,"props":669,"children":670},{"style":308},[671],{"type":52,"value":672},")",{"type":46,"tag":295,"props":674,"children":675},{"style":563},[676],{"type":52,"value":677}," =>",{"type":46,"tag":295,"props":679,"children":680},{"style":308},[681],{"type":52,"value":682}," {\n",{"type":46,"tag":295,"props":684,"children":685},{"class":297,"line":448},[686,691,695,700,704,709,714,719,724,729,734,738,743,747,752,756],{"type":46,"tag":295,"props":687,"children":688},{"style":302},[689],{"type":52,"value":690},"  if",{"type":46,"tag":295,"props":692,"children":693},{"style":418},[694],{"type":52,"value":227},{"type":46,"tag":295,"props":696,"children":697},{"style":399},[698],{"type":52,"value":699},"isProtectedRoute",{"type":46,"tag":295,"props":701,"children":702},{"style":418},[703],{"type":52,"value":406},{"type":46,"tag":295,"props":705,"children":706},{"style":314},[707],{"type":52,"value":708},"context",{"type":46,"tag":295,"props":710,"children":711},{"style":308},[712],{"type":52,"value":713},".",{"type":46,"tag":295,"props":715,"children":716},{"style":314},[717],{"type":52,"value":718},"request",{"type":46,"tag":295,"props":720,"children":721},{"style":418},[722],{"type":52,"value":723},") ",{"type":46,"tag":295,"props":725,"children":726},{"style":308},[727],{"type":52,"value":728},"&&",{"type":46,"tag":295,"props":730,"children":731},{"style":308},[732],{"type":52,"value":733}," !",{"type":46,"tag":295,"props":735,"children":736},{"style":399},[737],{"type":52,"value":649},{"type":46,"tag":295,"props":739,"children":740},{"style":418},[741],{"type":52,"value":742},"()",{"type":46,"tag":295,"props":744,"children":745},{"style":308},[746],{"type":52,"value":713},{"type":46,"tag":295,"props":748,"children":749},{"style":314},[750],{"type":52,"value":751},"userId",{"type":46,"tag":295,"props":753,"children":754},{"style":418},[755],{"type":52,"value":723},{"type":46,"tag":295,"props":757,"children":758},{"style":308},[759],{"type":52,"value":411},{"type":46,"tag":295,"props":761,"children":762},{"class":297,"line":479},[763,768,773,777,781,786],{"type":46,"tag":295,"props":764,"children":765},{"style":302},[766],{"type":52,"value":767},"    return",{"type":46,"tag":295,"props":769,"children":770},{"style":399},[771],{"type":52,"value":772}," auth",{"type":46,"tag":295,"props":774,"children":775},{"style":418},[776],{"type":52,"value":742},{"type":46,"tag":295,"props":778,"children":779},{"style":308},[780],{"type":52,"value":713},{"type":46,"tag":295,"props":782,"children":783},{"style":399},[784],{"type":52,"value":785},"redirectToSignIn",{"type":46,"tag":295,"props":787,"children":788},{"style":418},[789],{"type":52,"value":790},"()\n",{"type":46,"tag":295,"props":792,"children":794},{"class":297,"line":793},8,[795],{"type":46,"tag":295,"props":796,"children":797},{"style":308},[798],{"type":52,"value":799},"  }\n",{"type":46,"tag":295,"props":801,"children":803},{"class":297,"line":802},9,[804,809,813],{"type":46,"tag":295,"props":805,"children":806},{"style":302},[807],{"type":52,"value":808},"  return",{"type":46,"tag":295,"props":810,"children":811},{"style":399},[812],{"type":52,"value":667},{"type":46,"tag":295,"props":814,"children":815},{"style":418},[816],{"type":52,"value":790},{"type":46,"tag":295,"props":818,"children":820},{"class":297,"line":819},10,[821,825],{"type":46,"tag":295,"props":822,"children":823},{"style":308},[824],{"type":52,"value":485},{"type":46,"tag":295,"props":826,"children":827},{"style":314},[828],{"type":52,"value":490},{"type":46,"tag":70,"props":830,"children":832},{"id":831},"ssr-page-auth",[833],{"type":52,"value":834},"SSR Page Auth",{"type":46,"tag":261,"props":836,"children":839},{"className":837,"code":838,"language":16,"meta":269,"style":269},"language-astro shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nconst { userId, orgId } = Astro.locals.auth()\nif (!userId) return Astro.redirect('\u002Fsign-in')\n---\n\n\u003Ch1>Dashboard\u003C\u002Fh1>\n",[840],{"type":46,"tag":61,"props":841,"children":842},{"__ignoreMap":269},[843,851,859,867,874,881],{"type":46,"tag":295,"props":844,"children":845},{"class":297,"line":298},[846],{"type":46,"tag":295,"props":847,"children":848},{},[849],{"type":52,"value":850},"---\n",{"type":46,"tag":295,"props":852,"children":853},{"class":297,"line":346},[854],{"type":46,"tag":295,"props":855,"children":856},{},[857],{"type":52,"value":858},"const { userId, orgId } = Astro.locals.auth()\n",{"type":46,"tag":295,"props":860,"children":861},{"class":297,"line":376},[862],{"type":46,"tag":295,"props":863,"children":864},{},[865],{"type":52,"value":866},"if (!userId) return Astro.redirect('\u002Fsign-in')\n",{"type":46,"tag":295,"props":868,"children":869},{"class":297,"line":30},[870],{"type":46,"tag":295,"props":871,"children":872},{},[873],{"type":52,"value":850},{"type":46,"tag":295,"props":875,"children":876},{"class":297,"line":414},[877],{"type":46,"tag":295,"props":878,"children":879},{"emptyLinePlaceholder":380},[880],{"type":52,"value":383},{"type":46,"tag":295,"props":882,"children":883},{"class":297,"line":448},[884],{"type":46,"tag":295,"props":885,"children":886},{},[887],{"type":52,"value":888},"\u003Ch1>Dashboard\u003C\u002Fh1>\n",{"type":46,"tag":70,"props":890,"children":892},{"id":891},"common-pitfalls",[893],{"type":52,"value":894},"Common Pitfalls",{"type":46,"tag":77,"props":896,"children":897},{},[898,919],{"type":46,"tag":81,"props":899,"children":900},{},[901],{"type":46,"tag":85,"props":902,"children":903},{},[904,909,914],{"type":46,"tag":89,"props":905,"children":906},{},[907],{"type":52,"value":908},"Symptom",{"type":46,"tag":89,"props":910,"children":911},{},[912],{"type":52,"value":913},"Cause",{"type":46,"tag":89,"props":915,"children":916},{},[917],{"type":52,"value":918},"Fix",{"type":46,"tag":100,"props":920,"children":921},{},[922,959,999,1025],{"type":46,"tag":85,"props":923,"children":924},{},[925,936,941],{"type":46,"tag":107,"props":926,"children":927},{},[928,934],{"type":46,"tag":61,"props":929,"children":931},{"className":930},[],[932],{"type":52,"value":933},"Astro.locals.auth",{"type":52,"value":935}," is undefined",{"type":46,"tag":107,"props":937,"children":938},{},[939],{"type":52,"value":940},"Missing middleware",{"type":46,"tag":107,"props":942,"children":943},{},[944,946,952,954],{"type":52,"value":945},"Add ",{"type":46,"tag":61,"props":947,"children":949},{"className":948},[],[950],{"type":52,"value":951},"clerkMiddleware",{"type":52,"value":953}," to ",{"type":46,"tag":61,"props":955,"children":957},{"className":956},[],[958],{"type":52,"value":496},{"type":46,"tag":85,"props":960,"children":961},{},[962,967,978],{"type":46,"tag":107,"props":963,"children":964},{},[965],{"type":52,"value":966},"Auth works in dev but not production",{"type":46,"tag":107,"props":968,"children":969},{},[970,976],{"type":46,"tag":61,"props":971,"children":973},{"className":972},[],[974],{"type":52,"value":975},"output: 'static'",{"type":52,"value":977}," globally",{"type":46,"tag":107,"props":979,"children":980},{},[981,983,989,991,997],{"type":52,"value":982},"Set ",{"type":46,"tag":61,"props":984,"children":986},{"className":985},[],[987],{"type":52,"value":988},"output: 'server'",{"type":52,"value":990}," or ",{"type":46,"tag":61,"props":992,"children":994},{"className":993},[],[995],{"type":52,"value":996},"hybrid",{"type":52,"value":998}," for protected pages",{"type":46,"tag":85,"props":1000,"children":1001},{},[1002,1007,1012],{"type":46,"tag":107,"props":1003,"children":1004},{},[1005],{"type":52,"value":1006},"Static page has no auth",{"type":46,"tag":107,"props":1008,"children":1009},{},[1010],{"type":52,"value":1011},"Prerendered pages skip middleware",{"type":46,"tag":107,"props":1013,"children":1014},{},[1015,1017,1023],{"type":52,"value":1016},"Use ",{"type":46,"tag":61,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":52,"value":1022},"export const prerender = false",{"type":52,"value":1024}," or move to island",{"type":46,"tag":85,"props":1026,"children":1027},{},[1028,1033,1046],{"type":46,"tag":107,"props":1029,"children":1030},{},[1031],{"type":52,"value":1032},"Island not reactive to sign-in",{"type":46,"tag":107,"props":1034,"children":1035},{},[1036,1038,1044],{"type":52,"value":1037},"Missing ",{"type":46,"tag":61,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":52,"value":1043},"client:load",{"type":52,"value":1045}," directive",{"type":46,"tag":107,"props":1047,"children":1048},{},[1049,1050,1055],{"type":52,"value":945},{"type":46,"tag":61,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":52,"value":1043},{"type":52,"value":1056}," to the island component",{"type":46,"tag":70,"props":1058,"children":1060},{"id":1059},"import-map",[1061],{"type":52,"value":1062},"Import Map",{"type":46,"tag":77,"props":1064,"children":1065},{},[1066,1082],{"type":46,"tag":81,"props":1067,"children":1068},{},[1069],{"type":46,"tag":85,"props":1070,"children":1071},{},[1072,1077],{"type":46,"tag":89,"props":1073,"children":1074},{},[1075],{"type":52,"value":1076},"What",{"type":46,"tag":89,"props":1078,"children":1079},{},[1080],{"type":52,"value":1081},"Import From",{"type":46,"tag":100,"props":1083,"children":1084},{},[1085,1112,1146],{"type":46,"tag":85,"props":1086,"children":1087},{},[1088,1104],{"type":46,"tag":107,"props":1089,"children":1090},{},[1091,1096,1098],{"type":46,"tag":61,"props":1092,"children":1094},{"className":1093},[],[1095],{"type":52,"value":951},{"type":52,"value":1097},", ",{"type":46,"tag":61,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":52,"value":1103},"createRouteMatcher",{"type":46,"tag":107,"props":1105,"children":1106},{},[1107],{"type":46,"tag":61,"props":1108,"children":1110},{"className":1109},[],[1111],{"type":52,"value":546},{"type":46,"tag":85,"props":1113,"children":1114},{},[1115,1138],{"type":46,"tag":107,"props":1116,"children":1117},{},[1118,1124,1125,1131,1132],{"type":46,"tag":61,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":52,"value":1123},"useAuth",{"type":52,"value":1097},{"type":46,"tag":61,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":52,"value":1130},"useUser",{"type":52,"value":1097},{"type":46,"tag":61,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":52,"value":1137},"UserButton",{"type":46,"tag":107,"props":1139,"children":1140},{},[1141],{"type":46,"tag":61,"props":1142,"children":1144},{"className":1143},[],[1145],{"type":52,"value":259},{"type":46,"tag":85,"props":1147,"children":1148},{},[1149,1162],{"type":46,"tag":107,"props":1150,"children":1151},{},[1152,1154,1160],{"type":52,"value":1153},"Astro components (",{"type":46,"tag":61,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":52,"value":1159},"\u003CSignIn>",{"type":52,"value":1161},", etc.)",{"type":46,"tag":107,"props":1163,"children":1164},{},[1165],{"type":46,"tag":61,"props":1166,"children":1168},{"className":1167},[],[1169],{"type":52,"value":1170},"@clerk\u002Fastro\u002Fcomponents",{"type":46,"tag":70,"props":1172,"children":1174},{"id":1173},"env-variables",[1175],{"type":52,"value":1176},"Env Variables",{"type":46,"tag":261,"props":1178,"children":1181},{"className":1179,"code":1180,"language":52},[264],"# .env\nPUBLIC_CLERK_PUBLISHABLE_KEY=pk_...\nCLERK_SECRET_KEY=sk_...\n",[1182],{"type":46,"tag":61,"props":1183,"children":1184},{"__ignoreMap":269},[1185],{"type":52,"value":1180},{"type":46,"tag":55,"props":1187,"children":1188},{},[1189,1191,1197,1199,1205],{"type":52,"value":1190},"Astro uses ",{"type":46,"tag":61,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":52,"value":1196},"PUBLIC_",{"type":52,"value":1198}," prefix for client-exposed variables (not ",{"type":46,"tag":61,"props":1200,"children":1202},{"className":1201},[],[1203],{"type":52,"value":1204},"NEXT_PUBLIC_",{"type":52,"value":1206},").",{"type":46,"tag":70,"props":1208,"children":1210},{"id":1209},"see-also",[1211],{"type":52,"value":1212},"See Also",{"type":46,"tag":196,"props":1214,"children":1215},{},[1216,1227,1238],{"type":46,"tag":200,"props":1217,"children":1218},{},[1219,1225],{"type":46,"tag":61,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":52,"value":1224},"clerk-setup",{"type":52,"value":1226}," - Initial Clerk install",{"type":46,"tag":200,"props":1228,"children":1229},{},[1230,1236],{"type":46,"tag":61,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":52,"value":1235},"clerk-custom-ui",{"type":52,"value":1237}," - Custom flows & appearance",{"type":46,"tag":200,"props":1239,"children":1240},{},[1241,1247],{"type":46,"tag":61,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":52,"value":1246},"clerk-orgs",{"type":52,"value":1248}," - B2B organizations",{"type":46,"tag":70,"props":1250,"children":1252},{"id":1251},"docs",[1253],{"type":52,"value":1254},"Docs",{"type":46,"tag":55,"props":1256,"children":1257},{},[1258],{"type":46,"tag":1259,"props":1260,"children":1264},"a",{"href":1261,"rel":1262},"https:\u002F\u002Fclerk.com\u002Fdocs\u002Fastro\u002Fgetting-started\u002Fquickstart",[1263],"nofollow",[1265],{"type":52,"value":1266},"Astro SDK",{"type":46,"tag":1268,"props":1269,"children":1270},"style",{},[1271],{"type":52,"value":1272},"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":1274,"total":1455},[1275,1289,1304,1312,1330,1346,1363,1380,1395,1412,1427,1441],{"slug":8,"name":8,"fn":1276,"description":1277,"org":1278,"tags":1279,"stars":26,"repoUrl":27,"updatedAt":1288},"route Clerk authentication requests","Clerk authentication router. Use when user asks about Clerk CLI operations, adding authentication, setting up Clerk, custom sign-in flows, Swift or native iOS auth, native Android auth, Next.js patterns, React patterns, Vue patterns, Nuxt patterns, Astro patterns, TanStack Start patterns, Expo patterns, React Router patterns, Chrome Extension patterns, organizations, billing, subscriptions, payments, pricing, plans, seat-based pricing, feature entitlements, syncing users, testing, impersonating a user, or testing webhooks locally. Automatically routes to the specific skill based on their task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1280,1281,1282,1285],{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":1283,"slug":1284,"type":13},"Mobile","mobile",{"name":1286,"slug":1287,"type":13},"Web Development","web-development","2026-07-18T05:12:23.438307",{"slug":1290,"name":1290,"fn":1291,"description":1292,"org":1293,"tags":1294,"stars":26,"repoUrl":27,"updatedAt":1303},"clerk-android","implement Clerk auth for native Android apps","Implement Clerk authentication for native Android apps using Kotlin and Jetpack Compose with clerk-android source-guided patterns. Use for prebuilt AuthView\u002FUserButton or custom API-driven auth flows. Do not use for Expo or React Native projects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1295,1298,1299,1302],{"name":1296,"slug":1297,"type":13},"Android","android",{"name":9,"slug":8,"type":13},{"name":1300,"slug":1301,"type":13},"Kotlin","kotlin",{"name":1283,"slug":1284,"type":13},"2026-04-10T05:00:18.622871",{"slug":4,"name":4,"fn":5,"description":6,"org":1305,"tags":1306,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1307,1308,1309,1310,1311],{"name":15,"slug":16,"type":13},{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":21,"slug":22,"type":13},{"slug":1313,"name":1313,"fn":1314,"description":1315,"org":1316,"tags":1317,"stars":26,"repoUrl":27,"updatedAt":1329},"clerk-backend-api","execute Clerk Backend API requests","Clerk Backend REST API explorer and executor. Browse tags, inspect endpoint schemas, and execute authenticated requests. Use when listing users, managing organizations, or calling any Clerk API endpoint.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1318,1321,1322,1325,1326],{"name":1319,"slug":1320,"type":13},"API Development","api-development",{"name":18,"slug":19,"type":13},{"name":1323,"slug":1324,"type":13},"Backend","backend",{"name":9,"slug":8,"type":13},{"name":1327,"slug":1328,"type":13},"REST API","rest-api","2026-04-10T05:00:08.728072",{"slug":1331,"name":1331,"fn":1332,"description":1333,"org":1334,"tags":1335,"stars":26,"repoUrl":27,"updatedAt":1345},"clerk-billing","manage subscriptions with Clerk Billing","Clerk Billing for subscription management - render Clerk's PricingTable and in-app checkout drawer, configure subscription plans, seat-limit plans for B2B, feature entitlements with has(), and billing webhooks. Use for SaaS monetization, plan gating, checkout flows, trials, invoicing, and subscription lifecycle management.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1336,1337,1338,1339,1342],{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":1340,"slug":1341,"type":13},"Payments","payments",{"name":1343,"slug":1344,"type":13},"SaaS","saas","2026-04-29T05:37:27.130955",{"slug":1347,"name":1347,"fn":1348,"description":1349,"org":1350,"tags":1351,"stars":26,"repoUrl":27,"updatedAt":1362},"clerk-chrome-extension-patterns","implement Clerk auth in Chrome Extensions","Chrome Extension auth with @clerk\u002Fchrome-extension -- popup\u002Fsidepanel setup, syncHost for OAuth\u002FSAML via web app, createClerkClient for service workers and headless extensions, stable CRX ID. Triggers on: Chrome extension auth, Plasmo clerk, popup sign-in, syncHost, background service worker token, createClerkClient, headless extension.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1352,1354,1355,1356,1359],{"name":1353,"slug":649,"type":13},"Auth",{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":1357,"slug":1358,"type":13},"OAuth","oauth",{"name":1360,"slug":1361,"type":13},"Security","security","2026-04-07T04:46:08.489328",{"slug":1364,"name":1364,"fn":1365,"description":1366,"org":1367,"tags":1368,"stars":26,"repoUrl":27,"updatedAt":1379},"clerk-cli","manage Clerk authentication and instances via CLI","Operate the Clerk CLI (`clerk` binary) for authentication, user\u002Forg\u002Fsession management, impersonation, local webhook testing, deploy verification, instance config, env keys, feature toggles, and any Clerk Backend, Platform, or Frontend API call. Use when the user mentions Clerk management tasks, \"list clerk users\", \"impersonate a user\", \"test webhooks locally\", \"enable orgs\", \"enable billing\", \"clerk env pull\", \"clerk doctor\", \"clerk deploy\", \"clerk api\", or any ad-hoc Clerk API request. Prefer the CLI over raw HTTP: it handles auth, key resolution, app\u002Finstance targeting, and formatting automatically.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1369,1370,1371,1372,1375,1378],{"name":1319,"slug":1320,"type":13},{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":1373,"slug":1374,"type":13},"CLI","cli",{"name":1376,"slug":1377,"type":13},"Deployment","deployment",{"name":1360,"slug":1361,"type":13},"2026-07-31T05:52:40.580813",{"slug":1235,"name":1235,"fn":1381,"description":1382,"org":1383,"tags":1384,"stars":26,"repoUrl":27,"updatedAt":1394},"customize Clerk UI and auth flows","Custom authentication flows and component appearance - hooks (useSignIn, useSignUp), themes, colors, fonts, CSS. Use for custom sign-in\u002Fsign-up flows, appearance styling, visual customization, branding.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1385,1386,1389,1390,1393],{"name":18,"slug":19,"type":13},{"name":1387,"slug":1388,"type":13},"Branding","branding",{"name":9,"slug":8,"type":13},{"name":1391,"slug":1392,"type":13},"Design","design",{"name":24,"slug":25,"type":13},"2026-04-10T05:00:10.109158",{"slug":1396,"name":1396,"fn":1397,"description":1398,"org":1399,"tags":1400,"stars":26,"repoUrl":27,"updatedAt":1411},"clerk-expo","implement Clerk authentication in Expo apps","Add Clerk authentication to Expo and React Native apps using @clerk\u002Fexpo. Use for Expo setup, prebuilt native components (AuthView, UserButton), custom sign-in\u002Fsign-up flows (email, password, SMS\u002Fphone OTP, MFA), OAuth\u002FSSO, native Google\u002FApple sign-in, Expo Router protected routes, biometrics, and push notifications. Do not use for native Swift\u002FiOS, native Android\u002FKotlin, or web-only framework projects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1401,1402,1403,1406,1407,1408],{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":1404,"slug":1405,"type":13},"Expo","expo",{"name":24,"slug":25,"type":13},{"name":1283,"slug":1284,"type":13},{"name":1409,"slug":1410,"type":13},"React Native","react-native","2026-05-19T06:48:47.074181",{"slug":1413,"name":1413,"fn":1414,"description":1415,"org":1416,"tags":1417,"stars":26,"repoUrl":27,"updatedAt":1426},"clerk-nextjs-patterns","implement advanced Next.js patterns with Clerk","Advanced Next.js patterns - middleware, Server Actions, caching with Clerk.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1418,1419,1420,1423],{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":1421,"slug":1422,"type":13},"Next.js","next-js",{"name":1424,"slug":1425,"type":13},"Performance","performance","2026-04-10T05:00:15.80215",{"slug":1428,"name":1428,"fn":1429,"description":1430,"org":1431,"tags":1432,"stars":26,"repoUrl":27,"updatedAt":1440},"clerk-nuxt-patterns","implement Clerk auth in Nuxt 3 apps","Nuxt 3 auth patterns with @clerk\u002Fnuxt - middleware, composables, server API routes, SSR. Triggers on: Nuxt auth, useAuth composable, clerkMiddleware Nuxt, server API Clerk, Nuxt route protection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1433,1434,1435,1436,1437],{"name":18,"slug":19,"type":13},{"name":1323,"slug":1324,"type":13},{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":1438,"slug":1439,"type":13},"Nuxt","nuxt","2026-04-07T04:46:18.337538",{"slug":1246,"name":1246,"fn":1442,"description":1443,"org":1444,"tags":1445,"stars":26,"repoUrl":27,"updatedAt":1454},"manage Clerk Organizations for B2B SaaS","Clerk Organizations for B2B SaaS - create multi-tenant apps with org switching, role-based access, verified domains, and enterprise SSO. Use for team workspaces, RBAC, org-based routing, member management.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1446,1447,1450,1453],{"name":9,"slug":8,"type":13},{"name":1448,"slug":1449,"type":13},"Multi-Tenant","multi-tenant",{"name":1451,"slug":1452,"type":13},"RBAC","rbac",{"name":1343,"slug":1344,"type":13},"2026-04-10T05:00:14.40165",20,{"items":1457,"total":1455},[1458,1465,1472,1480,1488,1496,1504],{"slug":8,"name":8,"fn":1276,"description":1277,"org":1459,"tags":1460,"stars":26,"repoUrl":27,"updatedAt":1288},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1461,1462,1463,1464],{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":1283,"slug":1284,"type":13},{"name":1286,"slug":1287,"type":13},{"slug":1290,"name":1290,"fn":1291,"description":1292,"org":1466,"tags":1467,"stars":26,"repoUrl":27,"updatedAt":1303},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1468,1469,1470,1471],{"name":1296,"slug":1297,"type":13},{"name":9,"slug":8,"type":13},{"name":1300,"slug":1301,"type":13},{"name":1283,"slug":1284,"type":13},{"slug":4,"name":4,"fn":5,"description":6,"org":1473,"tags":1474,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1475,1476,1477,1478,1479],{"name":15,"slug":16,"type":13},{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":21,"slug":22,"type":13},{"slug":1313,"name":1313,"fn":1314,"description":1315,"org":1481,"tags":1482,"stars":26,"repoUrl":27,"updatedAt":1329},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1483,1484,1485,1486,1487],{"name":1319,"slug":1320,"type":13},{"name":18,"slug":19,"type":13},{"name":1323,"slug":1324,"type":13},{"name":9,"slug":8,"type":13},{"name":1327,"slug":1328,"type":13},{"slug":1331,"name":1331,"fn":1332,"description":1333,"org":1489,"tags":1490,"stars":26,"repoUrl":27,"updatedAt":1345},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1491,1492,1493,1494,1495],{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":1340,"slug":1341,"type":13},{"name":1343,"slug":1344,"type":13},{"slug":1347,"name":1347,"fn":1348,"description":1349,"org":1497,"tags":1498,"stars":26,"repoUrl":27,"updatedAt":1362},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1499,1500,1501,1502,1503],{"name":1353,"slug":649,"type":13},{"name":9,"slug":8,"type":13},{"name":24,"slug":25,"type":13},{"name":1357,"slug":1358,"type":13},{"name":1360,"slug":1361,"type":13},{"slug":1364,"name":1364,"fn":1365,"description":1366,"org":1505,"tags":1506,"stars":26,"repoUrl":27,"updatedAt":1379},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1507,1508,1509,1510,1511,1512],{"name":1319,"slug":1320,"type":13},{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"name":1373,"slug":1374,"type":13},{"name":1376,"slug":1377,"type":13},{"name":1360,"slug":1361,"type":13}]