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
Applications11 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/mtaimapNode + IMAP
IMAP server (port 993) — maps IMAP4rev1 onto Convex per-user mailboxesapps/imapmail-syncNode worker
Syncs external IMAP/SMTP accounts — inbound via IMAP IDLE, relays outboundapps/mail-synccode-workerNode worker
Polls Convex for queued code tasks and runs them (GitHub task runner)apps/code-workerdesktopTauri 2 + Rust
Desktop shell — bundles the web SPA, connects to one or more deploymentsapps/desktopsetup-cliTypeScript · Bun
Self-host setup CLI — the owlat quickstart installer for a full instanceapps/setup-cliupdaterNode
Self-host update worker — applies Docker Compose updates over HTTPapps/updaterdocsNuxt + Content
Developer documentation — guides, API reference, architecture docsapps/docsmarketingNuxt
Public website — landing pages, pricing, changelogapps/marketingwebapiReal-time queries & mutations
apimtaEmail delivery
webemail-builderEditor UI
webemail-previewerPreview
webuiComponents
apiemail-rendererHTML generation
apiemail-scannerSecurity scanning
webemail-rendererLive preview
apisharedTypes
Packages9 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-previeweremail-scannerTypeScript
Email security — spam/phishing detection, file validation, ClamAV, URL reputationpackages/email-scannerchannelsTypeScript
Multi-channel adapters — email, SMS, WhatsApp, generic webhook, native chatpackages/channelsuiNuxt 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/imap | Node + IMAP | IMAP server (port 993) — translates IMAP4rev1 commands into Convex queries against per-user mailboxes |
apps/mail-sync | Node worker | Syncs users' external IMAP/SMTP accounts — inbound mail in near-real-time via IMAP IDLE, relays outbound sends |
apps/code-worker | Node worker | Polls Convex for queued code tasks and executes them (GitHub task runner) |
apps/desktop | Tauri 2 + Rust | Desktop shell — bundles the apps/web SPA, connects to one or more deployments (multi-workspace) |
apps/setup-cli | TypeScript (Bun) | Self-host setup CLI — the owlat quickstart installer that deploys a full instance |
apps/updater | Node | Self-host update worker — HTTP control surface that pulls and applies Docker Compose updates |
apps/docs | Nuxt + Content | Developer documentation — guides, API reference, architecture decisions |
apps/marketing | Nuxt | Public marketing site — landing pages, pricing, changelog |
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/email-scanner | TypeScript | Email security scanning — spam/phishing keyword detection, file magic-byte validation, ClamAV client, URL reputation (Safe Browsing) |
packages/channels | TypeScript | Multi-channel adapters — email, SMS, WhatsApp, generic webhook, native chat + inbound channel registry |
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,email-renderer,ui,shared, and the generated Convex client@owlat/api(real-time queries & mutations) - api imports
email-renderer,email-scanner,channels, andshared - docs and marketing import
ui - imap, mail-sync, and code-worker are standalone Node workers — they talk to
apiover the Convex client - 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