Conformance checklist
The module contract made actionable. Copy this into your module's README and check every box before claiming conformance. ConvexCompose is opinionated about the module and unopinionated about the host; this is the contract that makes a domain travel across stacks.
This is a manual checklist verified by review and targeted greps; there is no automated gate yet. Until one exists, describe a module as "verified against the checklist," not "conformance-tested."
Structure
The three required parts: a Component, headless hooks, and a manifest.
- Ships convex.config.ts exporting a defineComponent(...) (M1)
- Ships schema and functions as part of that Component (M1)
- The Component installs via app.use(...) in a host with no edits to the module (M1)
- Ships headless useX() hooks in a renderer-agnostic React entry point (M2)
- Ships a portal.config.ts manifest declaring consumes / exposes entity-link points (M3)
Prohibitions (grep your core; Layers 1 and 2 only)
What the core must not pull in, so it forces nothing on the host.
- No router import anywhere in the core (Layers 1 and 2): no react-router, next/navigation, next/router, expo-router, or @tanstack/router (N1)
- No styling-system import in the core: no nativewind, tailwind, shadcn, class-variance-authority, or tailwind-merge outside the OPTIONAL UI package (N2)
- No server-only or platform-only API in Layer 2: hooks run under any React renderer (N3)
- Navigation in hooks is only caller-supplied callbacks, never imported router calls (M2)
Identity and linking
Authorization comes from ctx; cross-module links come from a passed-in ID.
- Authorization uses ctx (requireAuth / requireRole) inside handlers (allowed and expected)
- Every cross-module relationship is a canonical ID passed in as an explicit argument, not derived from ctx for linking (M4)
- No cross-Component table join anywhere (M4)
Optional UI (only if you ship one)
The reference UI is a drop-in convenience, kept out of the core.
- The reference UI is a separate package from the core, not bundled into Layers 1 or 2 (O1)
- The reference UI is documented as optional and the module is fully usable without it (O1)
Submit your module
Checked every box? Tell us what you built. ConvexCompose is curated around the contract: a conforming Convex Component, headless hooks, a manifest, explicit-ID linking, and a clearly optional reference UI.