Tech Stack

Doc Status: Good | ✓ Clear summary | ✓ Easy to read | ✓ Matches code | ✓ Good structure | ✓ Professional look | ✓ Visual components

Core Stack

LayerTechnologyNotes
Website / AdminNext.js 16 (App Router) + Tailwind CSS v4Static export → CF Workers
MobileExpo + Expo Router + NativeWindAuth via Convex Auth + expo-secure-store
UIshadcn/ui + class-variance-authority (cva)Type-safe component variants
App backendConvex (queries / mutations / actions)End-to-end TS, realtime, transactional
External APIsVendor SDK or fetch from a Convex actionLark, Meta CAPI, ZNS — no shared contract
Webhook workersCloudflare Workers + HonoHTTP entry points only — verify + forward
DatabaseConvex DB (managed schema diff)No Drizzle, no D1, no Postgres
AuthConvex Auth (@convex-dev/auth)Replaced Clerk on 2026-05-08
Marketing CMSSanityBlog, hero, FAQ, instructor bios
File storageConvex (small) + R2 (heavy) + Sanity CDN (mktg)CI guard blocks wrong folder
Deploy (web)Cloudflare Workers Static AssetsVercel deprecated

Frontend (Website / Admin)

CategoryChoiceRationale
FrameworkNext.js 16 (App Router)RSC, static export friendly
StylingTailwind CSS v4CSS variables via @theme inline
UI Componentsshadcn/ui + cvaType-safe component variants
Class mergingcn helper (clsx + twMerge)Mandatory — never concatenate classNames
DeploymentCloudflare Workers Static AssetsStatic export + Workers

Mobile

CategoryChoiceRationale
FrameworkExpo + Expo RouterFaster dev, better tooling
StylingNativeWindTailwind for React Native
AuthConvexAuthProvider + expo-secure-storeTokens in Keychain / EncryptedSharedPreferences

Client State

CategoryChoiceRationale
Immutable stateimmerMandatory — paired with Zustand / useState
Custom hooksusehooks-tsUse library instead of re-implementing
URL param statenuqsType-safe ?key=value state
FormsReact Hook Form + ZodSchema-validated forms
Global stateZustand + Immer middlewareCart, auth flags, modal

Backend

CategoryChoiceRationale
App dataConvexEnd-to-end TS types, realtime
External APIsVendor SDK or fetch from a Convex actionLark, Meta CAPI, ZNS
Webhook workersCloudflare Workers + Honoapps/lark-sync, apps/meta-conversions-worker only
RealtimeConvex subscriptions (useQuery)Auto-subscribes to data changes

Auth

CategoryChoiceRationale
ProviderConvex Auth (@convex-dev/auth)First-party, runs inside Convex deployment
Replaced Clerk on 2026-05-08.

Content

CategoryChoiceRationale
Marketing CMSSanityBlog, hero, FAQ, instructor bios, product content
OperationalConvexStudents, courses, sessions, attendance, payments, product operational

Storage

CategoryChoiceRationale
Small admin uploadsConvex storageAuth-gated, transactional with the row
Heavy mediaCloudflare R2Bandwidth + CDN reach
Marketing assetsSanity CDNPM/marketing edits via Studio
UI primitivespublic/images/{logos,icons,branding}Cache-friendly, version-controlled

Forbidden Technologies

CategoryBANNED
FrontendAngular, Vue, Svelte
State (Web)Redux, MobX, Recoil
App data APIfetch/axios, tRPC, OpenAPI/generated SDKs, Hono for new app data
BackendExpress, NestJS standalone, Drizzle / D1 / Postgres for app data
Database ORMPrisma, TypeORM, Drizzle
Schema Valid.Yup, Joi, class-validator (use convex/values for Convex; Zod for forms)
StylingCSS-in-JS, inline styles
Deploy (web)Vercel (deprecated for this project)