[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-convex-convex-auth":3,"mdc--84s5oe-key":32,"related-org-convex-convex-auth":256,"related-repo-convex-convex-auth":425},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":21,"repoUrl":22,"updatedAt":23,"license":24,"forks":25,"topics":26,"repo":27,"sourceUrl":30,"mdContent":31},"convex-auth","add authentication to Convex applications","Add authentication (passkeys\u002FOAuth) to the current Convex app, including the auth.config.ts wiring.",{"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,17,18],{"name":14,"slug":15,"type":16},"Auth","auth","tag",{"name":9,"slug":8,"type":16},{"name":19,"slug":20,"type":16},"Authentication","authentication",34,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills","2026-08-04T05:58:59.175962",null,7,[],{"repoUrl":22,"stars":21,"forks":25,"topics":28,"description":29},[],"Convex Skills for Agents","https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fconvex-auth","---\nname: convex-auth\ndescription: \"Add authentication (passkeys\u002FOAuth) to the current Convex app, including the auth.config.ts wiring.\"\n---\n\n\u003C!-- GENERATED from convex-agents content\u002Fcapabilities\u002Fauth.json — do not edit by hand. -->\n\n# Add sign-in to the app\n\nInstall and wire @convex-dev\u002Fauth for the current app: a provider (passkeys by default, or OAuth\u002Fpassword), the server config, the client hooks, and a sign-in UI — correctly, including the auth.config.ts that's the #1 real-world auth footgun.\n\n## Workflow\n\n1. Install @convex-dev\u002Fauth (pinned build) and add it to convex.config.ts. With pnpm, also `pnpm add jose` (it won't hoist otherwise); you need it for step 3.\n2. Add the provider in convex\u002Fauth.ts (Passkey by default; Password or OAuth like Google on request).\n3. Generate the auth keys HEADLESSLY. Do NOT run the interactive `npx @convex-dev\u002Fauth` wizard: it needs a login\u002FTTY and hangs in non-interactive, anonymous, or CI runs (the #1 auth time-sink). Generate JWT_PRIVATE_KEY + JWKS deterministically with `jose`:\n   node -e 'import(\"jose\").then(async({generateKeyPair,exportPKCS8,exportJWK})=>{const k=await generateKeyPair(\"RS256\",{extractable:true});const priv=await exportPKCS8(k.privateKey);const pub=await exportJWK(k.publicKey);process.stdout.write(JSON.stringify({JWT_PRIVATE_KEY:priv.trimEnd().replace(\u002F\\n\u002Fg,\" \"),JWKS:JSON.stringify({keys:[{use:\"sig\",...pub}]})}))})' > .auth-keys.json\n   Then set JWT_PRIVATE_KEY and JWKS (from .auth-keys.json) plus SITE_URL on the deployment. Prefer the Convex MCP `envSet` tool, one call per var, to avoid shell-quoting the multi-line key. CLI fallback: use the NAME=VALUE form (`npx convex env set \"JWT_PRIVATE_KEY=$JWT\"`), NEVER `env set JWT_PRIVATE_KEY \"$JWT\"` (the value starts with `-----BEGIN` and the CLI parses the leading `-` as an unknown flag). SITE_URL is the dev URL (e.g. http:\u002F\u002Flocalhost:3000). Delete .auth-keys.json after.\n4. Write convex\u002Fauth.config.ts (the silently-always-signed-out bug lives here if it's wrong).\n5. Wire the client: ConvexAuthProvider, the sign-in component, and route guards. If you import shadcn\u002Fui primitives (button, input, textarea, label, and so on), add them first with `npx shadcn@latest add \u003Cname>`; a missing @\u002Fcomponents\u002Fui\u002F* is a hard build error.\n6. Verify a sign-in round-trips before declaring done.\n\n## Rules\n\n- Generate JWT_PRIVATE_KEY\u002FJWKS with `jose` (extractable RS256; PKCS8 newlines to spaces; JWKS = {keys:[{use:\"sig\", ...publicJwk}]}). Do NOT run the interactive `npx @convex-dev\u002Fauth` wizard: it hangs headless\u002Fanonymous. Set the vars via the MCP `envSet` tool or the NAME=VALUE CLI form.\n- Always write auth.config.ts: a missing\u002Fincorrect one makes the app silently always-signed-out with no error.\n- Passkeys by default; only switch to password\u002FOAuth on explicit request.\n- Install any shadcn\u002Fui primitive you import up front (`npx shadcn@latest add ...`); a missing @\u002Fcomponents\u002Fui\u002F* is a hard build failure.\n- Verify a real sign-in works before finishing.\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,46,52,59,185,191],{"type":38,"tag":39,"props":40,"children":42},"element","h1",{"id":41},"add-sign-in-to-the-app",[43],{"type":44,"value":45},"text","Add sign-in to the app",{"type":38,"tag":47,"props":48,"children":49},"p",{},[50],{"type":44,"value":51},"Install and wire @convex-dev\u002Fauth for the current app: a provider (passkeys by default, or OAuth\u002Fpassword), the server config, the client hooks, and a sign-in UI — correctly, including the auth.config.ts that's the #1 real-world auth footgun.",{"type":38,"tag":53,"props":54,"children":56},"h2",{"id":55},"workflow",[57],{"type":44,"value":58},"Workflow",{"type":38,"tag":60,"props":61,"children":62},"ol",{},[63,78,83,162,167,180],{"type":38,"tag":64,"props":65,"children":66},"li",{},[67,69,76],{"type":44,"value":68},"Install @convex-dev\u002Fauth (pinned build) and add it to convex.config.ts. With pnpm, also ",{"type":38,"tag":70,"props":71,"children":73},"code",{"className":72},[],[74],{"type":44,"value":75},"pnpm add jose",{"type":44,"value":77}," (it won't hoist otherwise); you need it for step 3.",{"type":38,"tag":64,"props":79,"children":80},{},[81],{"type":44,"value":82},"Add the provider in convex\u002Fauth.ts (Passkey by default; Password or OAuth like Google on request).",{"type":38,"tag":64,"props":84,"children":85},{},[86,88,94,96,102,104,110,112,118,120,126,128,134,136,142,144,150,152,160],{"type":44,"value":87},"Generate the auth keys HEADLESSLY. Do NOT run the interactive ",{"type":38,"tag":70,"props":89,"children":91},{"className":90},[],[92],{"type":44,"value":93},"npx @convex-dev\u002Fauth",{"type":44,"value":95}," wizard: it needs a login\u002FTTY and hangs in non-interactive, anonymous, or CI runs (the #1 auth time-sink). Generate JWT_PRIVATE_KEY + JWKS deterministically with ",{"type":38,"tag":70,"props":97,"children":99},{"className":98},[],[100],{"type":44,"value":101},"jose",{"type":44,"value":103},":\nnode -e 'import(\"jose\").then(async({generateKeyPair,exportPKCS8,exportJWK})=>{const k=await generateKeyPair(\"RS256\",{extractable:true});const priv=await exportPKCS8(k.privateKey);const pub=await exportJWK(k.publicKey);process.stdout.write(JSON.stringify({JWT_PRIVATE_KEY:priv.trimEnd().replace(\u002F\\n\u002Fg,\" \"),JWKS:JSON.stringify({keys:",{"type":38,"tag":105,"props":106,"children":107},"span",{},[108],{"type":44,"value":109},"{use:\"sig\",...pub}",{"type":44,"value":111},"})}))})' > .auth-keys.json\nThen set JWT_PRIVATE_KEY and JWKS (from .auth-keys.json) plus SITE_URL on the deployment. Prefer the Convex MCP ",{"type":38,"tag":70,"props":113,"children":115},{"className":114},[],[116],{"type":44,"value":117},"envSet",{"type":44,"value":119}," tool, one call per var, to avoid shell-quoting the multi-line key. CLI fallback: use the NAME=VALUE form (",{"type":38,"tag":70,"props":121,"children":123},{"className":122},[],[124],{"type":44,"value":125},"npx convex env set \"JWT_PRIVATE_KEY=$JWT\"",{"type":44,"value":127},"), NEVER ",{"type":38,"tag":70,"props":129,"children":131},{"className":130},[],[132],{"type":44,"value":133},"env set JWT_PRIVATE_KEY \"$JWT\"",{"type":44,"value":135}," (the value starts with ",{"type":38,"tag":70,"props":137,"children":139},{"className":138},[],[140],{"type":44,"value":141},"-----BEGIN",{"type":44,"value":143}," and the CLI parses the leading ",{"type":38,"tag":70,"props":145,"children":147},{"className":146},[],[148],{"type":44,"value":149},"-",{"type":44,"value":151}," as an unknown flag). SITE_URL is the dev URL (e.g. ",{"type":38,"tag":153,"props":154,"children":158},"a",{"href":155,"rel":156},"http:\u002F\u002Flocalhost:3000",[157],"nofollow",[159],{"type":44,"value":155},{"type":44,"value":161},"). Delete .auth-keys.json after.",{"type":38,"tag":64,"props":163,"children":164},{},[165],{"type":44,"value":166},"Write convex\u002Fauth.config.ts (the silently-always-signed-out bug lives here if it's wrong).",{"type":38,"tag":64,"props":168,"children":169},{},[170,172,178],{"type":44,"value":171},"Wire the client: ConvexAuthProvider, the sign-in component, and route guards. If you import shadcn\u002Fui primitives (button, input, textarea, label, and so on), add them first with ",{"type":38,"tag":70,"props":173,"children":175},{"className":174},[],[176],{"type":44,"value":177},"npx shadcn@latest add \u003Cname>",{"type":44,"value":179},"; a missing @\u002Fcomponents\u002Fui\u002F* is a hard build error.",{"type":38,"tag":64,"props":181,"children":182},{},[183],{"type":44,"value":184},"Verify a sign-in round-trips before declaring done.",{"type":38,"tag":53,"props":186,"children":188},{"id":187},"rules",[189],{"type":44,"value":190},"Rules",{"type":38,"tag":192,"props":193,"children":194},"ul",{},[195,228,233,238,251],{"type":38,"tag":64,"props":196,"children":197},{},[198,200,205,207,212,214,219,221,226],{"type":44,"value":199},"Generate JWT_PRIVATE_KEY\u002FJWKS with ",{"type":38,"tag":70,"props":201,"children":203},{"className":202},[],[204],{"type":44,"value":101},{"type":44,"value":206}," (extractable RS256; PKCS8 newlines to spaces; JWKS = {keys:",{"type":38,"tag":105,"props":208,"children":209},{},[210],{"type":44,"value":211},"{use:\"sig\", ...publicJwk}",{"type":44,"value":213},"}). Do NOT run the interactive ",{"type":38,"tag":70,"props":215,"children":217},{"className":216},[],[218],{"type":44,"value":93},{"type":44,"value":220}," wizard: it hangs headless\u002Fanonymous. Set the vars via the MCP ",{"type":38,"tag":70,"props":222,"children":224},{"className":223},[],[225],{"type":44,"value":117},{"type":44,"value":227}," tool or the NAME=VALUE CLI form.",{"type":38,"tag":64,"props":229,"children":230},{},[231],{"type":44,"value":232},"Always write auth.config.ts: a missing\u002Fincorrect one makes the app silently always-signed-out with no error.",{"type":38,"tag":64,"props":234,"children":235},{},[236],{"type":44,"value":237},"Passkeys by default; only switch to password\u002FOAuth on explicit request.",{"type":38,"tag":64,"props":239,"children":240},{},[241,243,249],{"type":44,"value":242},"Install any shadcn\u002Fui primitive you import up front (",{"type":38,"tag":70,"props":244,"children":246},{"className":245},[],[247],{"type":44,"value":248},"npx shadcn@latest add ...",{"type":44,"value":250},"); a missing @\u002Fcomponents\u002Fui\u002F* is a hard build failure.",{"type":38,"tag":64,"props":252,"children":253},{},[254],{"type":44,"value":255},"Verify a real sign-in works before finishing.",{"items":257,"total":424},[258,271,283,300,317,323,338,352,364,379,393,410],{"slug":8,"name":8,"fn":259,"description":260,"org":261,"tags":262,"stars":21,"repoUrl":22,"updatedAt":270},"guide Convex project setup and usage","Convex is the backend agents get right on the first try: an all-TypeScript reactive platform where the database, server functions, scheduling, file storage, auth, and realtime sync are one type-safe system, every function is a transaction, and `tsc` catches most mistakes before deploy. Ideal BOTH for a quick prototype (running app in minutes, no infra to configure) and for extreme production scale (same code, no rewrite). Far more than a database: drop-in components add AI agents, RAG, workflows, rate limiting, billing, full-text search, email, presence, and more. Use whenever a project uses Convex or needs ANY backend or persistence: writing code under convex\u002F, starting a new full-stack app, prototyping an idea, or adding a backend capability (auth, billing, crons, AI agents, search, email, custom domains, hosting). Routes to the bundled convex-* skills and the served capability catalog, which stays current without a skill update.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[263,266,267],{"name":264,"slug":265,"type":16},"Backend","backend",{"name":9,"slug":8,"type":16},{"name":268,"slug":269,"type":16},"Database","database","2026-08-04T05:33:40.321614",{"slug":272,"name":272,"fn":273,"description":274,"org":275,"tags":276,"stars":21,"repoUrl":22,"updatedAt":282},"convex-add","add capabilities to Convex applications","Add a capability to the CURRENT Convex app — 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 \u002Fadd, or asks to add hosting\u002Fpublishing or any backend capability to an existing Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[277,278,279],{"name":264,"slug":265,"type":16},{"name":9,"slug":8,"type":16},{"name":280,"slug":281,"type":16},"Engineering","engineering","2026-08-04T05:58:58.661741",{"slug":284,"name":284,"fn":285,"description":286,"org":287,"tags":288,"stars":21,"repoUrl":22,"updatedAt":299},"convex-advisor","analyze Convex deployment performance and costs","Read the Convex deployment's 72h insights (read limits, OCC contention), root-cause each event in code, report evidence-backed perf\u002Fcost findings with fixes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[289,290,293,296],{"name":9,"slug":8,"type":16},{"name":291,"slug":292,"type":16},"Cost Optimization","cost-optimization",{"name":294,"slug":295,"type":16},"Observability","observability",{"name":297,"slug":298,"type":16},"Performance","performance","2026-08-04T05:58:45.241135",{"slug":301,"name":301,"fn":302,"description":303,"org":304,"tags":305,"stars":21,"repoUrl":22,"updatedAt":316},"convex-agent","add AI agent backends to Convex","Add an AI agent \u002F RAG backend (@convex-dev\u002Fagent) to the Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[306,309,310,313],{"name":307,"slug":308,"type":16},"Agents","agents",{"name":9,"slug":8,"type":16},{"name":311,"slug":312,"type":16},"LLM","llm",{"name":314,"slug":315,"type":16},"RAG","rag","2026-08-04T05:59:00.756304",{"slug":4,"name":4,"fn":5,"description":6,"org":318,"tags":319,"stars":21,"repoUrl":22,"updatedAt":23},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[320,321,322],{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"name":9,"slug":8,"type":16},{"slug":324,"name":324,"fn":325,"description":326,"org":327,"tags":328,"stars":21,"repoUrl":22,"updatedAt":337},"convex-backup","configure and test Convex database backups","Set up Convex backups and run a restore DRILL that proves recovery — snapshot, restore into a throwaway preview, assert the data came back — plus a schedule matched to your RPO and a gated recovery runbook.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[329,332,333,334],{"name":330,"slug":331,"type":16},"Backup","backup",{"name":9,"slug":8,"type":16},{"name":268,"slug":269,"type":16},{"name":335,"slug":336,"type":16},"Reliability","reliability","2026-08-04T05:58:42.702643",{"slug":339,"name":339,"fn":340,"description":341,"org":342,"tags":343,"stars":21,"repoUrl":22,"updatedAt":351},"convex-billing","integrate Stripe billing in Convex apps","Add Stripe billing\u002Fpayments to the Convex app via @convex-dev\u002Fstripe (checkout + webhook + gating).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[344,345,348],{"name":9,"slug":8,"type":16},{"name":346,"slug":347,"type":16},"Payments","payments",{"name":349,"slug":350,"type":16},"Stripe","stripe","2026-08-04T05:58:46.810981",{"slug":353,"name":353,"fn":354,"description":355,"org":356,"tags":357,"stars":21,"repoUrl":22,"updatedAt":363},"convex-cost","analyze and forecast Convex application costs","Preview Convex spend — rank functions by bytes\u002Fdocuments-read × call-volume from insights, project each cost driver's growth curve, name the cheapest fix; confirm-cost for paid actions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[358,361,362],{"name":359,"slug":360,"type":16},"Analytics","analytics",{"name":291,"slug":292,"type":16},{"name":297,"slug":298,"type":16},"2026-08-04T05:58:51.890215",{"slug":365,"name":365,"fn":366,"description":367,"org":368,"tags":369,"stars":21,"repoUrl":22,"updatedAt":378},"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},[370,373,376,377],{"name":371,"slug":372,"type":16},"API Development","api-development",{"name":374,"slug":375,"type":16},"Architecture","architecture",{"name":264,"slug":265,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T08:00:39.428577",{"slug":380,"name":380,"fn":381,"description":382,"org":383,"tags":384,"stars":21,"repoUrl":22,"updatedAt":392},"convex-crons","add scheduled cron jobs to Convex","Add recurring scheduled jobs (crons) to the Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[385,388,389],{"name":386,"slug":387,"type":16},"Automation","automation",{"name":9,"slug":8,"type":16},{"name":390,"slug":391,"type":16},"Scheduling","scheduling","2026-08-04T05:59:03.147387",{"slug":394,"name":394,"fn":395,"description":396,"org":397,"tags":398,"stars":21,"repoUrl":22,"updatedAt":409},"convex-deploy-guard","manage Convex deployment safety and consent","Classify + announce the target Convex deployment before any deployment-affecting command; fresh explicit consent for prod actions; session read-only mode.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[399,400,403,406],{"name":9,"slug":8,"type":16},{"name":401,"slug":402,"type":16},"Deployment","deployment",{"name":404,"slug":405,"type":16},"Operations","operations",{"name":407,"slug":408,"type":16},"Security","security","2026-08-04T05:58:55.830592",{"slug":411,"name":411,"fn":412,"description":413,"org":414,"tags":415,"stars":21,"repoUrl":22,"updatedAt":423},"convex-design","build reactive backends with Convex","Design and build reactive, type-safe, production-grade backends on Convex. Covers schema, queries\u002Fmutations\u002Factions, indexes, auth, file storage, scheduling, real-time multiplayer, mobile backends, and LLM\u002Fagent workflows on Convex's one-platform stack.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[416,417,418,419,420],{"name":14,"slug":15,"type":16},{"name":264,"slug":265,"type":16},{"name":9,"slug":8,"type":16},{"name":268,"slug":269,"type":16},{"name":421,"slug":422,"type":16},"Realtime","realtime","2026-08-04T05:58:54.310662",50,{"items":426,"total":472},[427,433,439,446,453,459,466],{"slug":8,"name":8,"fn":259,"description":260,"org":428,"tags":429,"stars":21,"repoUrl":22,"updatedAt":270},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[430,431,432],{"name":264,"slug":265,"type":16},{"name":9,"slug":8,"type":16},{"name":268,"slug":269,"type":16},{"slug":272,"name":272,"fn":273,"description":274,"org":434,"tags":435,"stars":21,"repoUrl":22,"updatedAt":282},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[436,437,438],{"name":264,"slug":265,"type":16},{"name":9,"slug":8,"type":16},{"name":280,"slug":281,"type":16},{"slug":284,"name":284,"fn":285,"description":286,"org":440,"tags":441,"stars":21,"repoUrl":22,"updatedAt":299},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[442,443,444,445],{"name":9,"slug":8,"type":16},{"name":291,"slug":292,"type":16},{"name":294,"slug":295,"type":16},{"name":297,"slug":298,"type":16},{"slug":301,"name":301,"fn":302,"description":303,"org":447,"tags":448,"stars":21,"repoUrl":22,"updatedAt":316},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[449,450,451,452],{"name":307,"slug":308,"type":16},{"name":9,"slug":8,"type":16},{"name":311,"slug":312,"type":16},{"name":314,"slug":315,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":454,"tags":455,"stars":21,"repoUrl":22,"updatedAt":23},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[456,457,458],{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"name":9,"slug":8,"type":16},{"slug":324,"name":324,"fn":325,"description":326,"org":460,"tags":461,"stars":21,"repoUrl":22,"updatedAt":337},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[462,463,464,465],{"name":330,"slug":331,"type":16},{"name":9,"slug":8,"type":16},{"name":268,"slug":269,"type":16},{"name":335,"slug":336,"type":16},{"slug":339,"name":339,"fn":340,"description":341,"org":467,"tags":468,"stars":21,"repoUrl":22,"updatedAt":351},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[469,470,471],{"name":9,"slug":8,"type":16},{"name":346,"slug":347,"type":16},{"name":349,"slug":350,"type":16},30]