C
ConvexCompose
Modules
A contract, a proving ground, and 31 components in production

Drop-in business modules for Convex.

LMS, mail, tasks, inventory, and more. Each ships a Convex Component, headless hooks, and an optional reference UI. Use our UI, or bring your own. The backend is yours either way. Compose them into any app.

Built with and on top of Convex.dev Components (the get-convex project). An extension one layer up, not a competitor; not Chef, not Templates.

How every module ships

Every module is the same shape: an agnostic core you always get, plus a reference UI you take or replace. There is no single reference app; you build whatever consumer you want.

1 · a Convex Component

The backend

convex.config.ts, schema, and functions as an isolated, app.use()-installable Component. Real-time and transactional by construction. Same everywhere.

2 · headless hooks

The logic

useX() over Convex hooks: no router, no styling system, navigation passed in as callbacks. Works in any React framework, on web or React Native.

3 · an OPTIONAL reference UI

Take it or replace it

Each module ships its own optional reference UI. Drop it in for batteries included, or take the Component and hooks and build your own surface.

Opinionated about the module contract. Unopinionated about your stack.

Works with your framework

The hard part, the real-time backend, is yours on any framework Convex supports. The ready-made hooks and the optional UI are React.

React: Next, Remix, TanStack Start, Expo

Everything out of the box: the backend, ready-made data hooks, and an optional UI. Web and React Native from the same module.

Svelte, Vue, or anything else

The Convex backend works the same way (those clients are first-class). The hooks and UI are React, so you connect the backend with a little glue of your own. The expensive part is still done for you.

Prescribe the shape, not the stack

One module serves the web-only majority and the cross-platform minority, without forcing either into the other's toolchain.

🧱

A Convex Component

Layer 1 is the Convex-native unit of value: convex.config.ts, schema, functions, isolated and app.use()-installable, transactional by construction.

🪝

Headless hooks

Layer 2 is useX() over Convex hooks: no router import, no styling system, navigation passed in as callbacks. It runs under any React renderer, DOM or React Native.

📐

Optional reference UI

Want batteries included? Drop in the optional RN + NativeWind kit. Want your own surface? Take the Component and hooks and write ~5-line route wrappers.

The three-layer model

Most-portable at the bottom, most-consumer-specific at the top. You only write the top.

beside Layer 2/3, OPTIONAL: a reference UI package (RN + NativeWind), drop in or ignore
L3
Layer 3: Thin route wrappers (you write this)
~5 lines each · binds Layer 2 into your router + chrome · TanStack / Next / Expo
consumer
L2
Layer 2: Headless React hooks
useX() over Convex hooks · no router · no styling · navigation as callbacks · any renderer
MUST
L1
Layer 1: Convex Component
convex.config.ts + schema + functions · app.use()-installable · isolated · transactional
MUST
C
Convex infra Components
Rate Limiter · Aggregate · Agent · Workpool · the first-wave primitives this builds on
get-convex

A real proving ground

The contract was extracted from a system in production. Here is what is verified, stated plainly.

50+ portals, one deployment

A production deployment runs 50+ portals on one Convex deployment, used daily by a working college professor for real classes (LMS, bookings, mail). Not a demo. 31 authored components run in production on one deployment; 6 flagships in packaging.

Live federated portal

A live federated portal runs on its own subdomain (valid cert), consuming the shared deployment by name via anyApi. Separate repos, shared data by construction.

One source, two platforms

One shared component renders on web (react-native-web) and mobile (Expo) from a single source. The two apps symlink the same file; nothing is copied.

Components in production

app.use(betterAuth) and app.use(posthog) are live. Entity linking already goes through a canonical Better Auth userId passed explicitly into each Component, so cross-Component mutations stay atomic.

Modules in flight

Every module below already exists as an authored Convex Component running in the production deployment. None are published, installable packages yet; packaging is in progress, led by convex-diary and convex-audio-analyzer.

G
In production

Garden

A worked example of the module contract, mid-extraction

Personal View →
D
Component in production

Diary

Daily notes with a federated standalone SPA

Personal View →
A
Component in production

Audio Analyzer

Waveform, annotation, and transient analysis for audio tracks

Content View →
M
In production

Mail

Inbox, helpdesk, and transactional email

Communication View →
T
Component in production

Tasks

Issues, projects, and bug reports, composed

Project Mgmt View →
L
In production

LMS

Courses, students, grades, and attendance

Education View →
B
In production

Booking

Resource scheduling without the conflicts

Operations View →
I
Extraction pending

Inventory

Asset tracking, checkouts, and maintenance

Operations View →
A
Extraction pending

Access

Granular per-resource sharing

Utility View →
C
Roadmap

Content

Articles, MDX, and Obsidian vault sync

Content View →
Q
Component in production

Quiz

Subject-agnostic question packs and sessions

Education View →
C
Component in production

Clipper

Save anything from the web

Personal View →
R
Component in production

Reader

PDF library with bookmarks and highlights

Personal View →
C
Component in production

Commander

A bash AST visualizer registry

Utility View →
S
Component in production

Shortcuts

DAW keyboard shortcut reference

Education View →
R
Component in production

Recommendations

Family movie and music recommendations

Personal View →
A
Component in production

Annotations

Generic target-scoped annotations with replies

Utility View →

Author a module to the contract.

ConvexCompose is the second wave of Convex Components: business domains above the infra primitives. If you build to the contract, your domain travels across stacks.