convex-clerk-project-setup
Installation
SKILL.md
Convex + Clerk setup
Auth spans three config stores that must agree. Most breakage is one of them naming a different thing than the other two.
| Store | Holds | Set via |
|---|---|---|
| Clerk dashboard | Convex integration activated, or a JWT template named convex |
Clerk UI only |
| Convex deployment | CLERK_JWT_ISSUER_DOMAIN |
npx convex env set or Convex dashboard |
| Repo | auth.config.ts provider, .env.local |
edit + npx convex dev |
Token path: Clerk mints a JWT carrying aud: "convex", the browser sends it to Convex, Convex matches iss against CLERK_JWT_ISSUER_DOMAIN and aud against applicationID, then fetches signing keys from the issuer's JWKS endpoint.
Two ways Clerk mints that token
Establish which one you are on before diagnosing anything, because it decides what the network tab should show.
ConvexProviderWithClerk picks at runtime. From convex 1.44.0, dist/esm/react-clerk/ConvexProviderWithClerk.js: