- What this book is for
- Development workflow
- Your editor — getting set up for success
- Agentic development in editor and outside of it
- Type checking and linters
- Using the dashboard while building
- Seed data and seed automation
- Sharing dev deployments with team members
- Local vs. cloud development
- The role of MCP
- Structuring your codebase
- Early: KISS. everything in one file is fine
- Later: break things up into modules and subdirectories
- How to handle node.js runtime vs. v8 runtime
- Huge codebases: break your project into components
- When push times get slower
- Reducing code redundancy with custom functions
- The
_generated directory
- Complex projects
- More than one app
- More that one backend
- Monorepo vs. seperate repos
- Examples:
- Turborepo, etc
- Organizing your tables and data
- You don’t have to type your tables, but you should
- Early: KISS. One schema.ts is fine to start
- Normalizations and JOINs
- JOIN ergonomics
- Breaking table definitions out for type sharing
- Eventually: placing table definitions near your function (and how to avoid circular import issues this often brings with it - e.g. by having dedicated table/validators-only files)
- Types and data validation
- Sharing validators
- When to use zod
- Users, orgs, and authentication/authorization
- The simplest possible thing
- Decide as early as you can if this is more than a side project
- User’s table vs. identity resolution
- Leveraging workos for identity resolution
- Authorization
- Introducing org/team concept
- Rolling out SCIM/directory sync
- Testing and CI/CD
- Convex-test
- Preview deployments
- Web apps and frameworks
- General framework recommendations
- Keeping it simple with vite
- NextJS and server-side rendering
- All in on the TanStack ecosystem
- Using non-react frameworks
- Mobile & Desktop apps
- Expo / React Native
- Swift support for iOS/MacOS
- Kotlin support for Android
- HTTP services on Convex
- Using HTTP actions
- HTTP actions vs. other convex functions
- Authenticating requests
- Streaming large request bodies
- Handling uploaded data
- Using higher-level frameworks like hono
- Relationship as webhooks to other services
- Background work
- Your deployment threads and you
- Idempotent work, at-least-once vs. at-most-once
- Workpool as the foundation for your background jobs
- Using crons for standard scheduled jobs
- Use workflow (durable functions) to provide more structure for sequences of work
- Working with AI services (agent component, etc)
- Project evolution
- Data migrations with the migration component
- Versioning your APIs
- Managing background work that spans code & data changes
- Building other services around Convex
- Support for other languages
- Authenticating server-to-server communications
- Common examples
- VPS running docker container python job
- Vercel fluid compute
- Cloudflare workers
- Computing aggregates and analytics
- When something simple is fine
- When it has to be consistent
- The aggregate component
- The lazy
- Computing inconsistent, lazy aggregates
- Utilizing convex’s analytics engine for periodic aggregates
- Common scenarios and recommendations
- Common application features & recommendations
- Object/file storage
- Full text search
- Vector search
- Payments
- Sending email
- Feature flags
- Mobile push notifications
- Collaborative editing
- Presence
- Deployment Cost & Performance Optimization
- Local-first, optimistic updates, and client performance
- Managing your Convex deployments programmatically
- Traffic management & abuse prevention
- Production readiness