Scopes
What each app and package in the Owlat monorepo is responsible for.
Each part of the monorepo has a clear scope. Apps are deployable services, packages are shared libraries consumed by one or more apps.
Scope Map
Applications6 apps
webNuxt 4 + Vue 3
Main dashboard — email builder, campaigns, audience, automations, settingsapps/webapiConvex
Serverless backend — database, auth, real-time subscriptions, cron jobsapps/apimtaHono + GroupMQ
Mail Transfer Agent — direct SMTP delivery, IP warming, bounce processingapps/mtadocsNuxt + Content
Developer documentation — guides, API reference, architecture docsapps/docsmarketingNuxt
Public website — landing pages, pricing, changelogapps/marketingadminNuxt 3
Internal admin panel — user management, abuse monitoring, billing oversightapps/adminwebapiReal-time queries & mutations
apimtaEmail delivery
adminapiAdmin operations
webemail-builderEditor UI
webemail-previewerPreview
webuiComponents
apiemail-rendererHTML generation
apisharedTypes
Packages7 packages
sharedTypeScript
Shared types — block definitions, editor types, compatibility datapackages/sharedemail-rendererTypeScript
Email HTML engine — table layouts, VML, CSS inlining, dark mode, AMPpackages/email-rendereremail-builderVue 3
Notion-like editor — drag-and-drop canvas, block settings, slash commandspackages/email-builderemail-previewerVue 3
Preview & analysis — cross-client rendering, compatibility scoring, diffspackages/email-previeweruiNuxt Layer
Component library — toast notifications, error boundaries, shared composablespackages/uisdk-jsTypeScript · npm
JavaScript SDK — contacts, transactional sends, events, topicspackages/sdk-jssdk-javaJava · Maven
Java SDK — same API surface, JVM-native clientpackages/sdk-javaAll packages import from
shared for block types, editor types, and compatibility data.Apps
| App | Stack | Scope |
|---|---|---|
apps/web | Nuxt 4 + Vue 3 | Main user dashboard — email builder, campaigns, audience management, automations, settings |
apps/api | Convex | Serverless backend — database, authentication (BetterAuth), real-time subscriptions, REST API, cron jobs |
apps/mta | Hono + GroupMQ | Custom Mail Transfer Agent — direct SMTP delivery, DKIM signing, IP warming, bounce processing, rate limiting |
apps/docs | Nuxt + Content | Developer documentation — guides, API reference, architecture decisions |
apps/marketing | Nuxt | Public marketing site — landing pages, pricing, changelog |
apps/admin | Nuxt 3 | Internal admin panel — user/org management, abuse monitoring, billing oversight |
Packages
| Package | Stack | Scope |
|---|---|---|
packages/shared | TypeScript | Shared types and data — block definitions, editor types, email client compatibility matrix |
packages/email-renderer | TypeScript | Headless email HTML engine — table-based layouts, VML for Outlook, CSS inlining, dark mode, AMP format |
packages/email-builder | Vue 3 | Notion-like email editor — document canvas, block previews, settings popover, slash commands |
packages/email-previewer | Vue 3 | Preview and analysis — cross-client rendering simulation, compatibility scoring, email diffs |
packages/ui | Nuxt Layer | Shared UI primitives — toast notifications, error boundaries, auto-imported composables |
packages/sdk-js | TypeScript | JavaScript SDK (npm) — contacts, transactional sends, events, topics |
packages/sdk-java | Java | Java SDK (Maven) — same API surface as sdk-js for JVM consumers |
Who imports what
- web imports
email-builder,email-previewer,ui, andshared - api imports
email-rendererandshared - admin imports
uiandshared - docs and marketing import
ui - mta is standalone — it receives HTTP requests from
apiand delivers mail directly - sdk-js and sdk-java are standalone — they talk to the public REST API exposed by
api