Overview
Every webapp ships with two always-on features — dashboard and settings — plus any subset of 12 optional features chosen at scaffold time (default: all). Each feature is a FeatureModule: a folder under src/features/ that exports {id, title, pages:[{path, component, nav}]} and is registered with one line in src/features/index.tsx. Nav and routes wire themselves.
The feature pool
convex: example, records, activity, api-keys, team, billing, admin, inbox, feedback, ai, uploads, mcp
supabase: example, records, api-keys, team, billing, admin, inbox, feedback, ai, uploads, mcp
activity is convex-only. mcp implies api-keys (MCP dev-tool auth uses API keys), so requesting mcp adds api-keys automatically.
How markers strip features
The templates in _template/ always compile with ALL features on. Scaffolding never adds code — it only removes. Feature code is wrapped in marker blocks that work in every comment syntax the templates use (//, {/* */}, <!-- -->, and -- SQL comments):
// @feature:activity -- start
import { activityFeature } from "./activity";
// @feature:activity -- end
When a feature is excluded, the scaffolder strips its marker blocks from every text file and deletes the whole files that feature owns (the per-db lists in tools/lib/features.mjs — e.g. excluding ai on convex deletes src/features/ai, convex/ai.ts, and convex/aiNode.ts). Site types use the same mechanism with @site:<id> markers. A final scan guarantees no token or marker survives; if one does, the broken app is deleted and the scaffold errors.
Feature summaries
- example — the minimal CRUD pattern (an Items list); the reference for building from scratch
- records — the generic multi-view data point (9 views from one config); the base pattern demos generate from, and the preferred base to clone by hand
- activity — per-user activity feed (convex only)
- api-keys — hashed API keys for programmatic access
- team — members + invites
- billing — Stripe-ready plans
- admin — users list + audit log, role-gated
- inbox — in-app notifications
- feedback — user feedback capture
- ai — Claude chat, API key server-side
- uploads — file storage
- mcp — your app becomes an MCP server (OAuth 2.1 for chat apps, API keys for dev tools)
Fastest path to a real domain: start from a demo app (--demo crm|tasks|catalog) — the codegen writes the records-style schema, backend, and page for you. See Demo apps.