Convex
Overview
Convex is a reactive backend platform where database queries, mutations, and actions are defined in TypeScript and data automatically syncs to connected clients in real-time. It eliminates WebSocket code, polling, and cache invalidation, providing ACID transactions and optimistic updates out of the box.
Instructions
- When defining schemas, use
defineSchema() with defineTable() and typed validators (v.string(), v.number(), v.id("tableName")), and define indexes for all filtered and sorted queries.
- When writing functions, use queries for reads (automatically reactive), mutations for writes (transactional, triggers reactive updates), and actions for external API calls (non-transactional).
- When building React UIs, use
useQuery() for reactive data subscriptions that auto-update, useMutation() for writes with optimistic updates, and usePaginatedQuery() for infinite scroll.
- When handling authentication, use
convex-auth for built-in auth or integrate Clerk/Auth0, and validate user identity at the start of every mutation with ctx.auth.getUserIdentity().
- When processing background work, use
ctx.scheduler.runAfter() for delayed execution and cron jobs for recurring tasks instead of making mutations slow.
- When storing files, use
ctx.storage.store() for upload and ctx.storage.getUrl() for serving URLs without S3 or CDN configuration.
- When implementing search, use full-text search indexes with
searchIndex() or vector search with vectorIndex() for AI/RAG applications, with metadata filtering.
Examples
Example 1: Build a real-time chat application
User request: "Create a real-time chat app with Convex and React"
Actions:
- Define
messages table with schema, author reference, and timestamp index
- Create a query function that returns messages sorted by timestamp
- Create a mutation for sending messages with auth validation
- Use
useQuery() in React to subscribe to messages with automatic real-time updates
Output: A chat application where messages appear instantly for all connected users without WebSocket code.
Example 2: Add full-text and vector search
User request: "Implement search across articles with both keyword and semantic search"
Actions:
- Define search index on article body field with
searchIndex()
- Define vector index on embedding field with
vectorIndex()
- Create query functions for text search and vector similarity search
- Combine metadata filtering with search for scoped results
Output: A dual search system supporting both keyword matching and semantic similarity queries.
Guidelines
- Use schema validation in production:
defineSchema() catches type errors at deploy time, not runtime.
- Define indexes for all filtered/sorted queries to ensure efficient data access.
- Use queries for reads, mutations for writes, actions for external APIs; never mix concerns.
- Keep mutations small and fast since they hold a database lock; move heavy processing to actions.
- Use
ctx.scheduler.runAfter() for background work instead of making mutations slow.
- Validate user identity at the start of every mutation to prevent unauthorized writes.
- Use optimistic updates for interactive UIs; the client sees the change instantly while the server confirms.
1---2name: convex3description: Assists with building real-time reactive backends using Convex. Use when creating databases with automatic client sync, reactive queries, file storage, scheduled functions, or full-text and vector search. Trigger words: convex, reactive backend, real-time database, useQuery, useMutation, convex functions, convex schema.4license: Apache-2.05---67# Convex89## Overview1011Convex is a reactive backend platform where database queries, mutations, and actions are defined in TypeScript and data automatically syncs to connected clients in real-time. It eliminates WebSocket code, polling, and cache invalidation, providing ACID transactions and optimistic updates out of the box.1213## Instructions1415- When defining schemas, use `defineSchema()` with `defineTable()` and typed validators (`v.string()`, `v.number()`, `v.id("tableName")`), and define indexes for all filtered and sorted queries.16- When writing functions, use queries for reads (automatically reactive), mutations for writes (transactional, triggers reactive updates), and actions for external API calls (non-transactional).17- When building React UIs, use `useQuery()` for reactive data subscriptions that auto-update, `useMutation()` for writes with optimistic updates, and `usePaginatedQuery()` for infinite scroll.18- When handling authentication, use `convex-auth` for built-in auth or integrate Clerk/Auth0, and validate user identity at the start of every mutation with `ctx.auth.getUserIdentity()`.19- When processing background work, use `ctx.scheduler.runAfter()` for delayed execution and cron jobs for recurring tasks instead of making mutations slow.20- When storing files, use `ctx.storage.store()` for upload and `ctx.storage.getUrl()` for serving URLs without S3 or CDN configuration.21- When implementing search, use full-text search indexes with `searchIndex()` or vector search with `vectorIndex()` for AI/RAG applications, with metadata filtering.2223## Examples2425### Example 1: Build a real-time chat application2627**User request:** "Create a real-time chat app with Convex and React"2829**Actions:**301. Define `messages` table with schema, author reference, and timestamp index312. Create a query function that returns messages sorted by timestamp323. Create a mutation for sending messages with auth validation334. Use `useQuery()` in React to subscribe to messages with automatic real-time updates3435**Output:** A chat application where messages appear instantly for all connected users without WebSocket code.3637### Example 2: Add full-text and vector search3839**User request:** "Implement search across articles with both keyword and semantic search"4041**Actions:**421. Define search index on article body field with `searchIndex()`432. Define vector index on embedding field with `vectorIndex()`443. Create query functions for text search and vector similarity search454. Combine metadata filtering with search for scoped results4647**Output:** A dual search system supporting both keyword matching and semantic similarity queries.4849## Guidelines5051- Use schema validation in production: `defineSchema()` catches type errors at deploy time, not runtime.52- Define indexes for all filtered/sorted queries to ensure efficient data access.53- Use queries for reads, mutations for writes, actions for external APIs; never mix concerns.54- Keep mutations small and fast since they hold a database lock; move heavy processing to actions.55- Use `ctx.scheduler.runAfter()` for background work instead of making mutations slow.56- Validate user identity at the start of every mutation to prevent unauthorized writes.57- Use optimistic updates for interactive UIs; the client sees the change instantly while the server confirms.