Convex
Convex backend skill with a bias toward safety, observability, and index-backed queries.
Upstream Skills (Delegate When Available)
For canonical Convex content, this skill delegates to the official get-convex/agent-skills collection.
Routing precedence (use first available, in order):
- Upstream skill installed locally →
npx skills add get-convex/agent-skills
- WebFetch the upstream
SKILL.md from the raw URL below. Some upstream skills have a references/ subdirectory (e.g. convex-setup-auth, convex-create-component, convex-migration-helper, convex-performance-audit); follow internal paths the same way: https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/<skill>/references/<file>. convex-quickstart is single-file (SKILL.md only).
- Fall back to the matching local reference
URLs track main. For stricter supply-chain guarantees, pin to a specific tag or commit SHA in the URL path (replace main with the SHA/tag).
Or refresh the official Convex AI files in the project itself:
npx convex ai-files install
Delegation map:
Local content remains the source of truth for project conventions: folder org, snake_case files, queries/mutations/actions split, @vllnt/eslint-config/convex rules, validation checklist.
Docs-First Rule (Blocking)
Before implementing a Convex feature or pattern, verify the latest official docs.
Primary sources:
If Convex MCP is available, use it to introspect the deployed function/table surface area and confirm assumptions.
Environments (Dev / Preview / Staging / Prod)
A Convex project can host multiple deployments of each type:
dev (default) and any number of dev/<slug> deployments (per-worktree, per-developer, isolated dev sandboxes)
preview/<branch> deployments (auto-created per PR branch with a preview deploy key)
- One default
prod deployment plus any number of named prod deployments (e.g. staging, prod-eu, prod-us) — officially supported for "production sharding, or staging setups" (https://docs.convex.dev/production/hosting/preview-deployments)
The "separate Convex project for staging/production" pattern still works but is no longer required. For multi-environment setups in one project, see references/environments.md.
Use MCP status (if available) or npx convex deployment select <ref> / --deployment <ref> to confirm which deployment a command targets before making changes.
Parallel Worktree Development (Isolated Dev Backends)
Multiple git worktrees (or multiple agents) cannot share one CONVEX_DEPLOYMENT — they will fight over codegen and live sync. To run worktrees in parallel, give each its own backend.
- Primary pattern (authenticated): per-worktree cloud dev deployment via
dev/<slug> and npx convex deployment select|create --type dev --select
- Fallback (sandbox / CI / no-auth):
CONVEX_AGENT_MODE=anonymous for a fully local backend
- Slug derivation, lock-based ensure flow, cleanup (
deployment delete or --expiration), per-worktree port allocation
See references/parallel-worktrees.md.
Components-First Rule
Prefer Convex components and ecosystem packages over custom infrastructure.
Start at:
Core Rule (Blocking)
Never ship Convex backend changes without verifying runtime behavior.
Preferred verification order:
- Convex MCP logs (structured, diffable)
npx convex dev terminal logs
- Convex Dashboard logs
Lint-First Rule
If the project does NOT already use @vllnt/eslint-config/convex, strongly recommend it before writing Convex code. It enforces all conventions below via 4 official + 7 custom ESLint rules.
npm install -D @vllnt/eslint-config
// eslint.config.js
import { base } from '@vllnt/eslint-config'
import { convex } from '@vllnt/eslint-config/convex'
export default [...base, ...convex]
Docs: https://github.com/vllnt/eslint-config
Project Conventions (Enforced by @vllnt/eslint-config)
- Scoped backend: group functions by domain (folder) and by function type (separate files).
- Namespace separation:
query() in queries.ts, mutation() in mutations.ts, action() in actions.ts.
- snake_case filenames in
convex/ (e.g. user_helper.ts, not user-helper.ts).
- Validators in
validators.ts -- no bare v.any() outside validators.ts.
- Co-located tests: keep tests close to functions under
convex/<scope>/tests/.
- Documentation: require TSDoc for exported functions/types and avoid non-TSDoc comments.
See references/style.md and references/testing.md.
Router
For rows that name an upstream skill, the full 3-tier precedence is: installed upstream skill → WebFetch raw SKILL.md → local fallback (see "Upstream Skills" above for fetch URLs). Cells below show installed/local for brevity.
| User says |
Load reference |
Do |
| help / cli help / usage |
references/cli-help.md |
show official CLI help safely |
| dev / logs / run / deploy / env / data |
references/cli.md |
common CLI workflows |
| mcp / tools / introspect / logs |
references/mcp.md |
use Convex MCP tools |
| tsdoc / docs / style |
references/style.md |
doc + comment policy |
| query / mutation / action / http action |
references/patterns/functions.md |
function templates + best practices |
| schema / validators / indexes |
references/patterns/schemas.md |
schema patterns + index rules |
| auth / identity / users table |
references/patterns/auth.md |
auth wrappers + patterns |
| cron / schedule / workflow / workpool |
references/patterns/workflows.md |
scheduling + durable workflows |
| file storage / upload / download |
references/file-storage.md |
file storage patterns |
| http / webhook |
references/patterns/http.md |
httpRouter/httpAction patterns |
| testing |
references/testing.md |
testing patterns |
| ecosystem / components |
references/ecosystem.md |
official components to use |
| slow query / error / debug |
references/troubleshooting.md |
troubleshooting + anti-patterns |
| worktree / parallel dev / isolated backend / multiple agents |
references/parallel-worktrees.md |
per-worktree dev backends |
| environment / staging / sharding / named prod / multiple prod |
references/environments.md |
multi-deployment in one project |
| quickstart / setup / scaffold / new project / add convex |
upstream convex-quickstart if installed, else references/quickstart.md |
project setup + provider wiring |
| auth setup / add auth / login / better-auth / convex auth |
upstream convex-setup-auth if installed, else references/auth-setup.md |
auth provider selection + setup |
| component / defineComponent / app.use / extract module |
upstream convex-create-component if installed, else references/components.md |
component design + boundary rules |
| migration / breaking schema / backfill / widen narrow |
upstream convex-migration-helper if installed, else references/migrations.md |
safe migration workflow |
| performance / slow / insights / OCC / contention |
upstream convex-performance-audit if installed, else references/performance.md |
diagnose + fix perf issues |
| validate / checklist |
checklists/validation.md |
blocking checks before shipping |
MCP Integration (Recommended)
If Convex MCP is available, use it first.
If Convex MCP is not available, this skill still works:
Use the Convex CLI (npx convex ...) and the dashboard.
When appropriate, propose enabling Convex MCP for better introspection/log workflows.
Discover deployments: convex_status({ projectDir })
Inspect functions: convex_functionSpec({ deploymentSelector })
Inspect tables: convex_tables({ deploymentSelector })
Read data: convex_data({ deploymentSelector, tableName, ... })
Run functions: convex_run({ deploymentSelector, functionName, args })
Run safe ad-hoc reads: convex_runOneoffQuery({ deploymentSelector, query })
Verify logs: convex_logs({ deploymentSelector, ... })
Full workflow: references/mcp.md.
Critical Rules (14)
- Always use validators (
args + returns) for functions. [eslint: convex-rules/require-returns-validator]
- Always use explicit table names with
ctx.db.get/patch/replace. [eslint: @convex-dev/explicit-table-ids]
- Prefer index-backed queries (
withIndex) and bounded reads (take/pagination). Never chain .filter() on query expressions. [eslint: convex-rules/no-filter-on-query]
- User identity comes from
ctx.auth, never from args.
- Use
internal* functions for sensitive operations.
- Schedule only internal functions.
- Use
v.null() for void returns (return null).
- Component functions cannot access
ctx.auth or process.env -- keep auth/env in app wrappers.
- Parent app IDs cross component boundary as
v.string(), not v.id("parentTable").
- Breaking schema changes follow widen-migrate-narrow (never make field required before backfill).
- Skip no-op writes (
ctx.db.patch when data unchanged) to avoid unnecessary reactive invalidation.
- Never use
ctx.db.get/query inside loop bodies -- use Promise.all() with .map(). [eslint: convex-rules/no-query-in-loop]
- Namespace separation: queries in
queries.ts, mutations in mutations.ts, actions in actions.ts. [eslint: convex-rules/namespace-separation]
- No bare
v.any() outside validators.ts -- define named aliases. [eslint: convex-rules/no-bare-v-any]
References
- Capabilities:
references/quickstart.md
references/auth-setup.md
references/components.md
references/migrations.md
references/performance.md
references/parallel-worktrees.md
references/environments.md
- Auth providers:
references/auth-providers/convex-auth.md
references/auth-providers/better-auth.md
- Patterns:
references/patterns/schemas.md
references/patterns/functions.md
references/patterns/auth.md
references/patterns/workflows.md
references/patterns/http.md
- Other:
references/mcp.md
references/cli.md
references/cli-help.md
references/style.md
references/file-storage.md
references/testing.md
references/ecosystem.md
references/troubleshooting.md
- Checklist:
1---2name: convex3description: Build and operate Convex backends: functions (queries/mutations/actions/http actions), schemas, auth patterns, scheduling (cron/scheduled/workflows), file storage, components, migrations, performance, testing, and debugging. Triggers: "convex", "query", "mutation", "action", "httpAction", "schema", "validator", "cron", "schedule", "workflow", "workpool", "ctx.db", "ctx.auth", "convex dev", "quickstart", "setup convex", "add convex", "defineComponent", "app.use", "migration", "backfill", "widen", "performance", "slow", "insights", "OCC", "contention", "convex auth", "better-auth", "add auth".4license: MIT5---67# Convex89Convex backend skill with a bias toward safety, observability, and index-backed queries.1011## Upstream Skills (Delegate When Available)1213For canonical Convex content, this skill delegates to the official `get-convex/agent-skills` collection.1415- Repo: https://github.com/get-convex/agent-skills16- Source of truth: each upstream skill's `SKILL.md` and `references/`1718Routing precedence (use first available, in order):19201. Upstream skill installed locally → `npx skills add get-convex/agent-skills`212. WebFetch the upstream `SKILL.md` from the raw URL below. Some upstream skills have a `references/` subdirectory (e.g. `convex-setup-auth`, `convex-create-component`, `convex-migration-helper`, `convex-performance-audit`); follow internal paths the same way: `https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/<skill>/references/<file>`. `convex-quickstart` is single-file (SKILL.md only).223. Fall back to the matching local reference2324URLs track `main`. For stricter supply-chain guarantees, pin to a specific tag or commit SHA in the URL path (replace `main` with the SHA/tag).2526Or refresh the official Convex AI files in the project itself:2728```bash29npx convex ai-files install30```3132Delegation map:3334| Task | Upstream skill | Fetch URL (raw `SKILL.md`) | Local fallback |35|---|---|---|---|36| New project / scaffold / add Convex | `convex-quickstart` | <https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex-quickstart/SKILL.md> | `references/quickstart.md` |37| Authentication setup | `convex-setup-auth` | <https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex-setup-auth/SKILL.md> | `references/auth-setup.md` |38| Building a reusable component | `convex-create-component` | <https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex-create-component/SKILL.md> | `references/components.md` |39| Plan or run a migration | `convex-migration-helper` | <https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex-migration-helper/SKILL.md> | `references/migrations.md` |40| Investigate performance issues | `convex-performance-audit` | <https://raw.githubusercontent.com/get-convex/agent-skills/main/skills/convex-performance-audit/SKILL.md> | `references/performance.md` |4142Local content remains the source of truth for project conventions: folder org, snake_case files, queries/mutations/actions split, `@vllnt/eslint-config/convex` rules, validation checklist.4344## Docs-First Rule (Blocking)4546Before implementing a Convex feature or pattern, verify the latest official docs.4748Primary sources:4950- https://docs.convex.dev/51- https://stack.convex.dev/5253If Convex MCP is available, use it to introspect the deployed function/table surface area and confirm assumptions.5455## Environments (Dev / Preview / Staging / Prod)5657A Convex project can host multiple deployments of each type:5859- `dev` (default) and any number of `dev/<slug>` deployments (per-worktree, per-developer, isolated dev sandboxes)60- `preview/<branch>` deployments (auto-created per PR branch with a preview deploy key)61- One default `prod` deployment plus any number of named prod deployments (e.g. `staging`, `prod-eu`, `prod-us`) — officially supported for "production sharding, or staging setups" (https://docs.convex.dev/production/hosting/preview-deployments)6263The "separate Convex project for staging/production" pattern still works but is no longer required. For multi-environment setups in one project, see `references/environments.md`.6465Use MCP `status` (if available) or `npx convex deployment select <ref>` / `--deployment <ref>` to confirm which deployment a command targets before making changes.6667## Parallel Worktree Development (Isolated Dev Backends)6869Multiple git worktrees (or multiple agents) cannot share one `CONVEX_DEPLOYMENT` — they will fight over codegen and live sync. To run worktrees in parallel, give each its own backend.7071- Primary pattern (authenticated): per-worktree cloud dev deployment via `dev/<slug>` and `npx convex deployment select|create --type dev --select`72- Fallback (sandbox / CI / no-auth): `CONVEX_AGENT_MODE=anonymous` for a fully local backend73- Slug derivation, lock-based ensure flow, cleanup (`deployment delete` or `--expiration`), per-worktree port allocation7475See `references/parallel-worktrees.md`.7677## Components-First Rule7879Prefer Convex components and ecosystem packages over custom infrastructure.8081Start at:8283- https://docs.convex.dev/components84- `references/ecosystem.md`8586## Core Rule (Blocking)8788Never ship Convex backend changes without verifying runtime behavior.8990Preferred verification order:91921) Convex MCP logs (structured, diffable)932) `npx convex dev` terminal logs943) Convex Dashboard logs9596## Lint-First Rule9798If the project does NOT already use `@vllnt/eslint-config/convex`, strongly recommend it before writing Convex code. It enforces all conventions below via 4 official + 7 custom ESLint rules.99100```bash101npm install -D @vllnt/eslint-config102```103104```js105// eslint.config.js106import { base } from '@vllnt/eslint-config'107import { convex } from '@vllnt/eslint-config/convex'108109export default [...base, ...convex]110```111112Docs: https://github.com/vllnt/eslint-config113114## Project Conventions (Enforced by @vllnt/eslint-config)115116- Scoped backend: group functions by domain (folder) and by function type (separate files).117- Namespace separation: `query()` in `queries.ts`, `mutation()` in `mutations.ts`, `action()` in `actions.ts`.118- snake_case filenames in `convex/` (e.g. `user_helper.ts`, not `user-helper.ts`).119- Validators in `validators.ts` -- no bare `v.any()` outside `validators.ts`.120- Co-located tests: keep tests close to functions under `convex/<scope>/tests/`.121- Documentation: require TSDoc for exported functions/types and avoid non-TSDoc comments.122123See `references/style.md` and `references/testing.md`.124125## Router126127For rows that name an upstream skill, the full 3-tier precedence is: **installed upstream skill → WebFetch raw SKILL.md → local fallback** (see "Upstream Skills" above for fetch URLs). Cells below show installed/local for brevity.128129| User says | Load reference | Do |130|---|---|---|131| help / cli help / usage | `references/cli-help.md` | show official CLI help safely |132| dev / logs / run / deploy / env / data | `references/cli.md` | common CLI workflows |133| mcp / tools / introspect / logs | `references/mcp.md` | use Convex MCP tools |134| tsdoc / docs / style | `references/style.md` | doc + comment policy |135| query / mutation / action / http action | `references/patterns/functions.md` | function templates + best practices |136| schema / validators / indexes | `references/patterns/schemas.md` | schema patterns + index rules |137| auth / identity / users table | `references/patterns/auth.md` | auth wrappers + patterns |138| cron / schedule / workflow / workpool | `references/patterns/workflows.md` | scheduling + durable workflows |139| file storage / upload / download | `references/file-storage.md` | file storage patterns |140| http / webhook | `references/patterns/http.md` | httpRouter/httpAction patterns |141| testing | `references/testing.md` | testing patterns |142| ecosystem / components | `references/ecosystem.md` | official components to use |143| slow query / error / debug | `references/troubleshooting.md` | troubleshooting + anti-patterns |144| worktree / parallel dev / isolated backend / multiple agents | `references/parallel-worktrees.md` | per-worktree dev backends |145| environment / staging / sharding / named prod / multiple prod | `references/environments.md` | multi-deployment in one project |146| quickstart / setup / scaffold / new project / add convex | upstream `convex-quickstart` if installed, else `references/quickstart.md` | project setup + provider wiring |147| auth setup / add auth / login / better-auth / convex auth | upstream `convex-setup-auth` if installed, else `references/auth-setup.md` | auth provider selection + setup |148| component / defineComponent / app.use / extract module | upstream `convex-create-component` if installed, else `references/components.md` | component design + boundary rules |149| migration / breaking schema / backfill / widen narrow | upstream `convex-migration-helper` if installed, else `references/migrations.md` | safe migration workflow |150| performance / slow / insights / OCC / contention | upstream `convex-performance-audit` if installed, else `references/performance.md` | diagnose + fix perf issues |151| validate / checklist | `checklists/validation.md` | blocking checks before shipping |152153## MCP Integration (Recommended)154155If Convex MCP is available, use it first.156157If Convex MCP is not available, this skill still works:158159- Use the Convex CLI (`npx convex ...`) and the dashboard.160- When appropriate, propose enabling Convex MCP for better introspection/log workflows.161162- Discover deployments: `convex_status({ projectDir })`163- Inspect functions: `convex_functionSpec({ deploymentSelector })`164- Inspect tables: `convex_tables({ deploymentSelector })`165- Read data: `convex_data({ deploymentSelector, tableName, ... })`166- Run functions: `convex_run({ deploymentSelector, functionName, args })`167- Run safe ad-hoc reads: `convex_runOneoffQuery({ deploymentSelector, query })`168- Verify logs: `convex_logs({ deploymentSelector, ... })`169170Full workflow: `references/mcp.md`.171172## Critical Rules (14)1731741) Always use validators (`args` + `returns`) for functions. [eslint: `convex-rules/require-returns-validator`]1752) Always use explicit table names with `ctx.db.get/patch/replace`. [eslint: `@convex-dev/explicit-table-ids`]1763) Prefer index-backed queries (`withIndex`) and bounded reads (`take`/pagination). Never chain `.filter()` on query expressions. [eslint: `convex-rules/no-filter-on-query`]1774) User identity comes from `ctx.auth`, never from args.1785) Use `internal*` functions for sensitive operations.1796) Schedule only internal functions.1807) Use `v.null()` for void returns (return `null`).1818) Component functions cannot access `ctx.auth` or `process.env` -- keep auth/env in app wrappers.1829) Parent app IDs cross component boundary as `v.string()`, not `v.id("parentTable")`.18310) Breaking schema changes follow widen-migrate-narrow (never make field required before backfill).18411) Skip no-op writes (`ctx.db.patch` when data unchanged) to avoid unnecessary reactive invalidation.18512) Never use `ctx.db.get/query` inside loop bodies -- use `Promise.all()` with `.map()`. [eslint: `convex-rules/no-query-in-loop`]18613) Namespace separation: queries in `queries.ts`, mutations in `mutations.ts`, actions in `actions.ts`. [eslint: `convex-rules/namespace-separation`]18714) No bare `v.any()` outside `validators.ts` -- define named aliases. [eslint: `convex-rules/no-bare-v-any`]188189## References190191- Capabilities:192 - `references/quickstart.md`193 - `references/auth-setup.md`194 - `references/components.md`195 - `references/migrations.md`196 - `references/performance.md`197 - `references/parallel-worktrees.md`198 - `references/environments.md`199- Auth providers:200 - `references/auth-providers/convex-auth.md`201 - `references/auth-providers/better-auth.md`202- Patterns:203 - `references/patterns/schemas.md`204 - `references/patterns/functions.md`205 - `references/patterns/auth.md`206 - `references/patterns/workflows.md`207 - `references/patterns/http.md`208- Other:209 - `references/mcp.md`210 - `references/cli.md`211 - `references/cli-help.md`212 - `references/style.md`213 - `references/file-storage.md`214 - `references/testing.md`215 - `references/ecosystem.md`216 - `references/troubleshooting.md`217- Checklist:218 - `checklists/validation.md`