{"id":"convex","kind":"sdk","name":"Convex","slug":"convex","description":"Reactive backend platform: TypeScript database, server functions, and realtime clients.","vendor":"Convex","languages":["typescript","javascript","python"],"categories":["database","cloud"],"homepage":"https://www.convex.dev","docsUrl":"https://docs.convex.dev","githubUrl":"https://github.com/get-convex/agent-skills","packages":[{"registry":"npm","name":"convex","url":"https://www.npmjs.com/package/convex"}],"tags":["realtime","backend","typescript"],"skills":[{"name":"convex-quickstart","url":"https://github.com/get-convex/agent-skills/tree/main/skills/convex-quickstart","install":"npx skills add get-convex/agent-skills --skill convex-quickstart","sdk":"convex","key":"convex/convex-quickstart","description":"Creates or adds Convex to an app. Use for new Convex projects, npm create","hasContent":true,"content":"---\nname: convex-quickstart\ndescription:\n  Creates or adds Convex to an app. Use for new Convex projects, npm create\n  convex@latest, frontend setup, env vars, or the first npx convex dev run.\n---\n\n# Convex Quickstart\n\nSet up a working Convex project as fast as possible.\n\n## When to Use\n\n- Starting a brand new project with Convex\n- Adding Convex to an existing React, Next.js, Vue, Svelte, or other app\n- Scaffolding a Convex app for prototyping\n\n## When Not to Use\n\n- The project already has Convex installed and `convex/` exists - just start\n  building\n- You only need to add auth to an existing Convex app - use the\n  `convex-setup-auth` skill\n\n## Workflow\n\n1. Determine the starting point: new project or existing app\n2. If new project, pick a template and scaffold with `npm create convex@latest`\n3. If existing app, install `convex` and wire up the provider\n4. Run `npx convex dev --once` to provision a local anonymous deployment, push\n   the current `convex/` code, typecheck it, and regenerate types — all in one\n   shot, exiting cleanly. The output tells the agent whether the schema and\n   functions are valid.\n5. Ask the user (or, for cloud agents, start in the background) `npm run dev` —\n   Convex templates wire the watcher and the frontend into a single command. If\n   the project has no combined dev script, use `npx convex dev` for the watcher\n   and run the frontend separately.\n6. Verify the setup works\n\n## Path 1: New Project (Recommended)\n\nUse the official scaffolding tool. It creates a complete project with the\nfrontend framework, Convex backend, and all config wired together.\n\n### Pick a template\n\n| Template                   | Stack                                     |\n| -------------------------- | ----------------------------------------- |\n| `react-vite-shadcn`        | React + Vite + Tailwind + shadcn/ui       |\n| `nextjs-shadcn`            | Next.js App Router + Tailwind + shadcn/ui |\n| `react-vite-clerk-shadcn`  | React + Vite + Clerk auth + shadcn/ui     |\n| `nextjs-clerk`             | Next.js + Clerk auth                      |\n| `nextjs-convexauth-shadcn` | Next.js + Convex Auth + shadcn/ui         |\n| `nextjs-lucia-shadcn`      | Next.js + Lucia auth + shadcn/ui          |\n| `bare`                     | Convex backend only, no frontend          |\n\nIf the user has not specified a preference, default to `react-vite-shadcn` for\nsimple apps or `nextjs-shadcn` for apps that need SSR or API routes.\n\nYou can also use any GitHub repo as a template:\n\n```bash\nnpm create convex@latest my-app -- -t owner/repo\nnpm create convex@latest my-app -- -t owner/repo#branch\n```\n\n### Scaffold the project\n\nAlways pass the project name and template flag to avoid interactive prompts:\n\n```bash\nnpm create convex@latest my-app -- -t react-vite-shadcn\ncd my-app\nnpm install\n```\n\nThe scaffolding tool creates files but does not run `npm install`, so you must\nrun it yourself.\n\nTo scaffold in the current directory (if it is empty):\n\n```bash\nnpm create convex@latest . -- -t react-vite-shadcn\nnpm install\n```\n\n### Provision the deployment and push code\n\nRun this yourself — it is a one-shot command that exits cleanly:\n\n```bash\nnpx convex dev --once\n```\n\nIn a non-TTY environment (which is true for almost every agent run), this:\n\n- Provisions an _anonymous_ local Convex backend bound to `127.0.0.1`. No\n  browser login, no team/project prompts.\n- Writes `CONVEX_DEPLOYMENT` and the framework's `*_CONVEX_URL` variables to\n  `.env.local`.\n- Generates `convex/_generated/`.\n- Pushes the current `convex/` code to the deployment, **typechecks it**, and\n  **validates the schema**. The agent reads this output to find out if the code\n  it just wrote is broken.\n\nTo be explicit (recommended), set `CONVEX_AGENT_MODE=anonymous` so the behavior\ndoes not depend on TTY detection:\n\n```bash\nCONVEX_AGENT_MODE=anonymous npx convex dev --once\n```\n\nThe deployment lives under `~/.convex/` and persists across runs. Re-running\n`convex dev --once` after editing `convex/` files is the agent's main feedback\nloop while the user-launched `npm run dev` is not in use.\n\nIf the template's `package.json` defines a `predev` script (Convex Auth\ntemplates and similar do), `npm run predev` runs `convex init` plus any one-time\nsetup (e.g. minting auth keys). Use it _in addition to_ `convex dev --once` when\npresent — `predev` handles the one-time setup, `convex dev --once` pushes and\nvalidates the code.\n\n### Start the dev loop\n\nIn most Convex templates, `npm run dev` runs both the Convex watcher and the\nfrontend dev server together (typically `convex dev --start 'vite --open'` or\nthe Next.js equivalent). That is what the user should run.\n\n```bash\nnpm run dev\n```\n\nIf the project does not have a combined `dev` script — e.g. the `bare` template,\nor an existing app where you haven't wired the frontend dev server into Convex's\n`--start` flag — the user can run the Convex watcher directly:\n\n```bash\nnpx convex dev\n```\n\n`npx convex dev` is the same long-running watcher `npm run dev` invokes under\nthe hood; it just doesn't start the frontend. Use it when there is no frontend,\nor when the user prefers to run the frontend in a separate terminal.\n\nEither way, the agent should not invoke the watcher in the foreground because it\ndoes not exit. Two options:\n\n- **Local development (user is at the keyboard):** ask the user to run\n  `npm run dev` (or `npx convex dev`) in a terminal. The deployment provisioned\n  by `convex dev --once` above is already selected, so the watcher picks up\n  immediately with no prompts.\n- **Cloud or headless agents:** start `npm run dev` (or `npx convex dev`) in the\n  background.\n\nVite apps serve on `http://localhost:5173`, Next.js on `http://localhost:3000`.\n\n### What you get\n\nAfter scaffolding, the project structure looks like:\n\n```\nmy-app/\n  convex/           # Backend functions and schema\n    _generated/     # Auto-generated types (check this into git)\n    schema.ts       # Database schema (if template includes one)\n  src/              # Frontend code (or app/ for Next.js)\n  package.json\n  .env.local        # CONVEX_URL / VITE_CONVEX_URL / NEXT_PUBLIC_CONVEX_URL\n```\n\nThe template already has:\n\n- `ConvexProvider` wired into the app root\n- Correct env var names for the framework\n- Tailwind and shadcn/ui ready (for shadcn templates)\n- Auth provider configured (for auth templates)\n\nProceed to adding schema, functions, and UI.\n\n## Path 2: Add Convex to an Existing App\n\nUse this when the user already has a frontend project and wants to add Convex as\nthe backend.\n\n### Install\n\n```bash\nnpm install convex\n```\n\n### Provision and push\n\nRun `npx convex dev --once` yourself to provision a local anonymous deployment,\nwrite `.env.local`, generate types, push the current `convex/` code, and\ntypecheck it. This is one-shot and exits:\n\n```bash\nnpx convex dev --once\n```\n\nThe output tells you whether the schema and functions are valid — use it as your\nfeedback loop while iterating.\n\nThen ask the user to start the watcher (or, for cloud/headless agents, start it\nin the background). You have two options:\n\n- **Wire Convex into `npm run dev`** — change the existing app's `dev` script to\n  `convex dev --start '<existing dev command>'`. That's the standard pattern\n  Convex templates use; the user then runs a single `npm run dev` to start both.\n- **Run them separately** — leave `npm run dev` for the frontend and tell the\n  user to run `npx convex dev` in a second terminal for the Convex watcher.\n\nSee \"Start the dev loop\" above for why the agent should not run the watcher in\nthe foreground.\n\n### Wire up the provider\n\nThe Convex client must wrap the app at the root. The setup varies by framework.\n\nCreate the `ConvexReactClient` at module scope, not inside a component:\n\n```tsx\n// Bad: re-creates the client on every render\nfunction App() {\n  const convex = new ConvexReactClient(\n    import.meta.env.VITE_CONVEX_URL as string,\n  );\n  return <ConvexProvider client={convex}>...</ConvexProvider>;\n}\n\n// Good: created once at module scope\nconst convex = new ConvexReactClient(import.meta.env.VITE_CONVEX_URL as string);\nfunction App() {\n  return <ConvexProvider client={convex}>...</ConvexProvider>;\n}\n```\n\n#### React (Vite)\n\n```tsx\n// src/main.tsx\nimport { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { ConvexProvider, ConvexReactClient } from \"convex/react\";\nimport App from \"./App\";\n\nconst convex = new ConvexReactClient(import.meta.env.VITE_CONVEX_URL as string);\n\ncreateRoot(document.getElementById(\"root\")!).render(\n  <StrictMode>\n    <ConvexProvider client={convex}>\n      <App />\n    </ConvexProvider>\n  </StrictMode>,\n);\n```\n\n#### Next.js (App Router)\n\n```tsx\n// app/ConvexClientProvider.tsx\n\"use client\";\n\nimport { ConvexProvider, ConvexReactClient } from \"convex/react\";\nimport { ReactNode } from \"react\";\n\nconst convex = new ConvexReactClient(process.env.NEXT_PUBLIC_CONVEX_URL!);\n\nexport function ConvexClientProvider({ children }: { children: ReactNode }) {\n  return <ConvexProvider client={convex}>{children}</ConvexProvider>;\n}\n```\n\n```tsx\n// app/layout.tsx\nimport { ConvexClientProvider } from \"./ConvexClientProvider\";\n\nexport default function RootLayout({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  return (\n    <html lang=\"en\">\n      <body>\n        <ConvexClientProvider>{children}</ConvexClientProvider>\n      </body>\n    </html>\n  );\n}\n```\n\n#### Other frameworks\n\nFor Vue, Svelte, React Native, TanStack Start, Remix, and others, follow the\nmatching quickstart guide:\n\n- [Vue](https://docs.convex.dev/quickstart/vue)\n- [Svelte](https://docs.convex.dev/quickstart/svelte)\n- [React Native](https://docs.convex.dev/quickstart/react-native)\n- [TanStack Start](https://docs.convex.dev/quickstart/tanstack-start)\n- [Remix](https://docs.convex.dev/quickstart/remix)\n- [Node.js (no frontend)](https://docs.convex.dev/quickstart/nodejs)\n\n### Environment variables\n\nThe env var name depends on the framework:\n\n| Framework    | Variable                 |\n| ------------ | ------------------------ |\n| Vite         | `VITE_CONVEX_URL`        |\n| Next.js      | `NEXT_PUBLIC_CONVEX_URL` |\n| Remix        | `CONVEX_URL`             |\n| React Native | `EXPO_PUBLIC_CONVEX_URL` |\n\n`npx convex dev` writes the correct variable to `.env.local` automatically.\n\n## Agent Mode\n\n`CONVEX_AGENT_MODE=anonymous` forces an unauthenticated local backend. It is\nalready the implicit default for any non-TTY run of `npx convex init` or\n`npx convex dev`, but set it explicitly so the behavior does not depend on TTY\ndetection:\n\n```bash\nCONVEX_AGENT_MODE=anonymous npx convex dev --once\n```\n\nUse it for:\n\n- Any AI coding agent (local or cloud).\n- CI-like setup scripts.\n- Cases where the user is logged in but you do not want to touch their personal\n  dev deployment.\n\nThe resulting backend runs on `127.0.0.1` and is not associated with any team or\nproject until the user later claims it via `npx convex login` and the\n`npx convex deployment` commands.\n\n## Verify the Setup\n\nAfter setup, confirm everything is working:\n\n1. `npx convex dev --once` exited without errors (deployment provisioned, code\n   pushed, schema validated, typecheck clean)\n2. The `convex/_generated/` directory exists and has `api.ts` and `server.ts`\n3. `.env.local` contains a `CONVEX_DEPLOYMENT` value and the framework's\n   `*_CONVEX_URL` variable\n4. (If applicable) `npm run dev` (or `npx convex dev` for the watcher alone) is\n   running without errors in another terminal or in the background\n\n## Writing Your First Function\n\nOnce the project is set up, create a schema and a query to verify the full loop\nworks.\n\n`convex/schema.ts`:\n\n```ts\nimport { defineSchema, defineTable } from \"convex/server\";\nimport { v } from \"convex/values\";\n\nexport default defineSchema({\n  tasks: defineTable({\n    text: v.string(),\n    completed: v.boolean(),\n  }),\n});\n```\n\n`convex/tasks.ts`:\n\n```ts\nimport { query, mutation } from \"./_generated/server\";\nimport { v } from \"convex/values\";\n\nexport const list = query({\n  args: {},\n  handler: async (ctx) => {\n    return await ctx.db.query(\"tasks\").collect();\n  },\n});\n\nexport const create = mutation({\n  args: { text: v.string() },\n  handler: async (ctx, args) => {\n    await ctx.db.insert(\"tasks\", { text: args.text, completed: false });\n  },\n});\n```\n\nUse in a React component (adjust the import path based on your file location\nrelative to `convex/`):\n\n```tsx\nimport { useQuery, useMutation } from \"convex/react\";\nimport { api } from \"../convex/_generated/api\";\n\nfunction Tasks() {\n  const tasks = useQuery(api.tasks.list);\n  const create = useMutation(api.tasks.create);\n\n  return (\n    <div>\n      <button onClick={() => create({ text: \"New task\" })}>Add</button>\n      {tasks?.map((t) => (\n        <div key={t._id}>{t.text}</div>\n      ))}\n    </div>\n  );\n}\n```\n\n## Development vs Production\n\nAlways use `npx convex dev` during development. It runs against your personal\ndev deployment and syncs code on save.\n\nWhen ready to ship, deploy to production:\n\n```bash\nnpx convex deploy\n```\n\nThis pushes to the production deployment, which is separate from dev. Do not use\n`deploy` during development.\n\n## Next Steps\n\n- Add authentication: use the `convex-setup-auth` skill\n- Design your schema: see\n  [Schema docs](https://docs.convex.dev/database/schemas)\n- Build components: use the `convex-create-component` skill\n- Plan a migration: use the `convex-migration-helper` skill\n- Add file storage: see\n  [File Storage docs](https://docs.convex.dev/file-storage)\n- Set up cron jobs: see [Scheduling docs](https://docs.convex.dev/scheduling)\n\n## Checklist\n\n- [ ] Determined starting point: new project or existing app\n- [ ] If new project: scaffolded with `npm create convex@latest` using\n      appropriate template\n- [ ] If existing app: installed `convex` and wired up the provider\n- [ ] Agent ran `npx convex dev --once`: deployment provisioned, code pushed,\n      typecheck clean\n- [ ] `npm run dev` (or `npx convex dev` for the watcher alone) is running —\n      user-launched terminal, or background for cloud agents\n- [ ] `convex/_generated/` directory exists with types\n- [ ] `.env.local` has the deployment URL\n- [ ] Verified a basic query/mutation round-trip works\n","contentSource":"https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex-quickstart/SKILL.md","contentFetchedAt":"2026-07-28T23:15:38.635Z"},{"name":"convex","url":"https://github.com/get-convex/agent-skills/tree/main/skills/convex","install":"npx skills add get-convex/agent-skills --skill convex","sdk":"convex","key":"convex/convex","description":"Routes general Convex requests to the right project skill. Use when the user","hasContent":true,"content":"---\nname: convex\ndescription:\n  Routes general Convex requests to the right project skill. Use when the user\n  asks which Convex skill to use or gives an underspecified Convex app task.\n---\n\n# Convex\n\nUse this as the routing skill for Convex work in this repo.\n\nIf a more specific Convex skill clearly matches the request, use that instead.\n\n## Start Here\n\nIf the project does not already have Convex AI guidance installed, or the\nexisting guidance looks stale, strongly recommend installing it first.\n\nPreferred:\n\n```bash\nnpx convex ai-files install\n```\n\nThis installs or refreshes the managed Convex AI files. It is the recommended\nstarting point for getting the official Convex guidelines in place and following\nthe current Convex AI setup described in the docs:\n\n- [Convex AI docs](https://docs.convex.dev/ai)\n\nSimple fallback:\n\n- [convex_rules.txt](https://convex.link/convex_rules.txt)\n\nPrefer `npx convex ai-files install` over copying rules by hand when possible.\n\n## Route to the Right Skill\n\nAfter that, use the most specific Convex skill for the task:\n\n- New project or adding Convex to an app: `convex-quickstart`\n- Authentication setup: `convex-setup-auth`\n- Building a reusable Convex component: `convex-create-component`\n- Planning or running a migration: `convex-migration-helper`\n- Investigating performance issues: `convex-performance-audit`\n\nIf one of those clearly matches the user's goal, switch to it instead of staying\nin this skill.\n\n## When Not to Use\n\n- The user has already named a more specific Convex workflow\n- Another Convex skill obviously fits the request better\n","contentSource":"https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex/SKILL.md","contentFetchedAt":"2026-07-28T23:15:38.700Z"},{"name":"convex-setup-auth","url":"https://github.com/get-convex/agent-skills/tree/main/skills/convex-setup-auth","install":"npx skills add get-convex/agent-skills --skill convex-setup-auth","sdk":"convex","key":"convex/convex-setup-auth","description":"Sets up Convex auth, identity mapping, and access control. Use for login, auth","hasContent":true,"content":"---\nname: convex-setup-auth\ndescription:\n  Sets up Convex auth, identity mapping, and access control. Use for login, auth\n  providers, users tables, protected functions, or roles in a Convex app.\n---\n\n# Convex Authentication Setup\n\nImplement secure authentication in Convex with user management and access\ncontrol.\n\n## When to Use\n\n- Setting up authentication for the first time\n- Implementing user management (users table, identity mapping)\n- Creating authentication helper functions\n- Setting up auth providers (Convex Auth, Clerk, WorkOS AuthKit, Auth0, custom\n  JWT)\n\n## When Not to Use\n\n- Auth for a non-Convex backend\n- Pure OAuth/OIDC documentation without a Convex implementation\n- Debugging unrelated bugs that happen to surface near auth code\n- The auth provider is already fully configured and the user only needs a\n  one-line fix\n\n## First Step: Choose the Auth Provider\n\nConvex supports multiple authentication approaches. Do not assume a provider.\n\nBefore writing setup code:\n\n1. Ask the user which auth solution they want, unless the repository already\n   makes it obvious\n2. If the repo already uses a provider, continue with that provider unless the\n   user wants to switch\n3. If the user has not chosen a provider and the repo does not make it obvious,\n   ask before proceeding\n\nCommon options:\n\n- [Convex Auth](https://docs.convex.dev/auth/convex-auth) - good default when\n  the user wants auth handled directly in Convex\n- [Clerk](https://docs.convex.dev/auth/clerk) - use when the app already uses\n  Clerk or the user wants Clerk's hosted auth features\n- [WorkOS AuthKit](https://docs.convex.dev/auth/authkit/) - use when the app\n  already uses WorkOS or the user wants AuthKit specifically\n- [Auth0](https://docs.convex.dev/auth/auth0) - use when the app already uses\n  Auth0\n- Custom JWT provider - use when integrating an existing auth system not covered\n  above\n\nLook for signals in the repo before asking:\n\n- Dependencies such as `@clerk/*`, `@workos-inc/*`, `@auth0/*`, or Convex Auth\n  packages\n- Existing files such as `convex/auth.config.ts`, auth middleware, provider\n  wrappers, or login components\n- Environment variables that clearly point at a provider\n\n## After Choosing a Provider\n\nRead the provider's official guide and the matching local reference file:\n\n- Convex Auth: [official docs](https://docs.convex.dev/auth/convex-auth), then\n  `references/convex-auth.md`\n- Clerk: [official docs](https://docs.convex.dev/auth/clerk), then\n  `references/clerk.md`\n- WorkOS AuthKit: [official docs](https://docs.convex.dev/auth/authkit/), then\n  `references/workos-authkit.md`\n- Auth0: [official docs](https://docs.convex.dev/auth/auth0), then\n  `references/auth0.md`\n\nThe local reference files contain the concrete workflow, expected files and env\nvars, gotchas, and validation checks.\n\nUse those sources for:\n\n- package installation\n- client provider wiring\n- environment variables\n- `convex/auth.config.ts` setup\n- login and logout UI patterns\n- framework-specific setup for React, Vite, or Next.js\n\nFor shared auth behavior, use the official Convex docs as the source of truth:\n\n- [Auth in Functions](https://docs.convex.dev/auth/functions-auth) for\n  `ctx.auth.getUserIdentity()`\n- [Storing Users in the Convex Database](https://docs.convex.dev/auth/database-auth)\n  for optional app-level user storage\n- [Authentication](https://docs.convex.dev/auth) for general auth and\n  authorization guidance\n- [Convex Auth Authorization](https://labs.convex.dev/auth/authz) when the\n  provider is Convex Auth\n\nPrefer official docs over recalled steps, because provider CLIs and Convex Auth\ninternals change between versions. Inventing setup from memory risks outdated\npatterns. For third-party providers, only add app-level user storage if the app\nactually needs user documents in Convex. Not every app needs a `users` table.\nFor Convex Auth, follow the Convex Auth docs and built-in auth tables rather\nthan adding a parallel `users` table plus `storeUser` flow, because Convex Auth\nalready manages user records internally. After running provider initialization\ncommands, verify generated files and complete the post-init wiring steps the\nprovider reference calls out. Initialization commands rarely finish the entire\nintegration.\n\n## Core Pattern: Protecting Backend Functions\n\nThe most common auth task is checking identity in Convex functions.\n\n```ts\n// Bad: trusting a client-provided userId\nexport const getMyProfile = query({\n  args: { userId: v.id(\"users\") },\n  handler: async (ctx, args) => {\n    return await ctx.db.get(args.userId);\n  },\n});\n```\n\n```ts\n// Good: verifying identity server-side\nexport const getMyProfile = query({\n  args: {},\n  handler: async (ctx) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) throw new Error(\"Not authenticated\");\n\n    return await ctx.db\n      .query(\"users\")\n      .withIndex(\"by_tokenIdentifier\", (q) =>\n        q.eq(\"tokenIdentifier\", identity.tokenIdentifier),\n      )\n      .unique();\n  },\n});\n```\n\n## Workflow\n\n1. Determine the provider, either by asking the user or inferring from the repo\n2. Ask whether the user wants local-only setup or production-ready setup now\n3. Read the matching provider reference file\n4. Follow the official provider docs for current setup details\n5. Follow the official Convex docs for shared backend auth behavior, user\n   storage, and authorization patterns\n6. Only add app-level user storage if the docs and app requirements call for it\n7. Add authorization checks for ownership, roles, or team access only where the\n   app needs them\n8. Verify login state, protected queries, environment variables, and production\n   configuration if requested\n\nIf the flow blocks on interactive provider or deployment setup, ask the user\nexplicitly for the exact human step needed, then continue after they complete\nit. For UI-facing auth flows, offer to validate the real sign-up or sign-in flow\nafter setup is done. If the environment has browser automation tools, you can\nuse them. If it does not, give the user a short manual validation checklist\ninstead.\n\n## Reference Files\n\n### Provider References\n\n- `references/convex-auth.md`\n- `references/clerk.md`\n- `references/workos-authkit.md`\n- `references/auth0.md`\n\n## Checklist\n\n- [ ] Chosen the correct auth provider before writing setup code\n- [ ] Read the relevant provider reference file\n- [ ] Asked whether the user wants local-only setup or production-ready setup\n- [ ] Used the official provider docs for provider-specific wiring\n- [ ] Used the official Convex docs for shared auth behavior and authorization\n      patterns\n- [ ] Only added app-level user storage if the app actually needs it\n- [ ] Did not invent a cross-provider `users` table or `storeUser` flow for\n      Convex Auth\n- [ ] Added authentication checks in protected backend functions\n- [ ] Added authorization checks where the app actually needs them\n- [ ] Clear error messages (\"Not authenticated\", \"Unauthorized\")\n- [ ] Client auth provider configured for the chosen provider\n- [ ] If requested, production auth setup is covered too\n","contentSource":"https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex-setup-auth/SKILL.md","contentFetchedAt":"2026-07-28T23:15:38.750Z"}],"featured":true,"official":true,"generatedAt":"2026-07-28T23:15:45.680Z"}