> convex
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.
curl "https://skillshub.wtf/TerminalSkills/skills/convex?format=md"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()withdefineTable()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, andusePaginatedQuery()for infinite scroll. - When handling authentication, use
convex-authfor built-in auth or integrate Clerk/Auth0, and validate user identity at the start of every mutation withctx.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 andctx.storage.getUrl()for serving URLs without S3 or CDN configuration. - When implementing search, use full-text search indexes with
searchIndex()or vector search withvectorIndex()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
messagestable 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.
> related_skills --same-repo
> zustand
You are an expert in Zustand, the small, fast, and scalable state management library for React. You help developers manage global state without boilerplate using Zustand's hook-based stores, selectors for performance, middleware (persist, devtools, immer), computed values, and async actions — replacing Redux complexity with a simple, un-opinionated API in under 1KB.
> zod
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
> xero-accounting
Integrate with the Xero accounting API to sync invoices, expenses, bank transactions, and contacts — and generate financial reports like P&L and balance sheet. Use when: connecting apps to Xero, automating bookkeeping workflows, syncing accounting data, or pulling financial reports programmatically.
> windsurf-rules
Configure Windsurf AI coding assistant with .windsurfrules and workspace rules. Use when: customizing Windsurf for a project, setting AI coding standards, creating team-shared Windsurf configurations, or tuning Cascade AI behavior.