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.