Loading...
Loading...
A Turborepo monorepo with four apps and thirteen shared packages. Everything is typed, everything is connected.
Three primary flows handle authentication, background work, and billing.
Each app imports only the packages it needs. No app depends on another app directly.
apps/webauth, db, payments, jobs, mail, ui, utils, i18n, analytics, typesapps/adminauth, db, ui, utils, i18n, analytics, typesapps/marketingui, utils, i18n, cms, analytics, typesapps/expoauth, db, ui, utils, typesEvery package lives in packages/ and is imported via the @workspace/* convention.
authBetterAuth integration with OAuth, email/password, 2FA, and organization support.
dbSupabase client wrappers for browser, server, and admin contexts. Typed queries.
paymentsPolar billing integration — checkout, subscriptions, webhook handling.
jobsTrigger.dev background tasks for emails, webhooks, and scheduled work.
mailResend email delivery with React Email templates for transactional mail.
uiShared shadcn/ui component library with Tailwind v4 styling.
utilsConstants, helper functions, and shared configuration values.
i18nnext-intl configuration with routing, middleware, and message loading.
analyticsAnalytics provider and event tracking abstraction layer.
cmsContent management utilities for blog posts and changelog entries.
messagingNotification and broadcast messaging system.
typesShared TypeScript type definitions used across all apps.
typescript-configShared TypeScript configuration presets for Next.js and React libraries.
Apps never import from each other directly. They communicate through shared packages and environment variables.
All business logic lives in packages/. Apps import via @workspace/auth, @workspace/db, etc. Changes to a package are available to every app that uses it.
NEXT_PUBLIC_APP_URL, NEXT_PUBLIC_ADMIN_URL, and NEXT_PUBLIC_MARKETING_URL let apps link to each other without hard-coded paths. Set them per environment.
All apps connect to the same Supabase instance. Auth state, org data, and subscriptions are accessible from any app through @workspace/db.