Inbox, sent, archive, search, rich compose, attachments, PDF/image/text previews, and mailbox scoping.
OmniDock
A self-hosted Cloudflare Workers email operations dashboard that turns domain mail into a compact Linux-style work dock.
Receive through Email Routing, send with Email Sending, keep metadata in D1, put raw mail and attachments in R2, then manage mailboxes, contacts, signatures, rules, and bucket files from one focused console.
- Runtime
- Worker
- Storage
- D1 + R2
- Mode
- Self-hosted
$ omnidock modules --list
Mail ops, not another giant mailbox.
OmniDock is built for private support inboxes, project domains, catch-all workflows, and lightweight operations that already live on Cloudflare.
Rules
Sync zones, Email Sending, Email Routing, catch-all state, and mailbox routing rules from one settings surface.
Contacts
Manual entries, CSV/TXT/VCF imports, phone, company, tags, notes, edit flow, and import reports.
Signatures
Mailbox-specific rich signatures with style, links, colors, preview, and automatic compose insertion.
R2 Files
Manage the configured R2 bucket like a file dock: browse folders, upload files, preview supported objects, download, and delete.
Profiles
Document Gmail, Outlook, Yahoo, iCloud, or custom IMAP/SMTP metadata while credentials stay in Worker secrets.
$ wrangler bindings inspect
A Worker-first architecture with room to grow.
The current landing is served by a Worker with static assets, and the product itself uses the same edge-native vocabulary: bindings, secrets, D1, R2 storage, file previews, and email handlers.
{
"main": "src/worker.ts",
"assets": { "binding": "ASSETS" },
"d1_databases": [{ "binding": "DB" }],
"r2_buckets": [{ "binding": "MAIL_BUCKET" }],
"send_email": [{ "name": "EMAIL" }]
}
$ install --fork-first --preserve-bindings
Fork first, bind deliberately, then ship.
The upstream README is explicit: fork OmniDock before deploying so your Cloudflare settings, bindings, and future updates stay under your control.
-
1
Fork the repository
Keep a copy you control for deploy settings and future changes.
-
2
Create Cloudflare resources
Add D1 for metadata, R2 for raw mail, attachments and manual files, plus Email Sending and Routing.
-
3
Set build variables
Use
OMNIDOCK_D1_DATABASE_IDandOMNIDOCK_R2_BUCKET_NAMEso updates do not remove bindings. -
4
Finish setup in the app
Add admin password, primary domain, API token, mailboxes, routing rules, and the R2 bucket display name.
npm run build
node tools/deploy-preserving-bindings.mjs
Avoid bare `npx wrangler deploy` for normal Git updates. OmniDock generates deploy config from build variables so D1 and R2 stay attached for mail, attachments, and the file browser.
$ security notes --self-hosted
Private by default, honest about the edges.
OmniDock stores secrets in Worker secrets, keeps passwords hashed in D1, and avoids baking personal domains, account IDs, bucket names, or API tokens into the public template.
$ worker extend --next
The landing is static today. The Worker is ready for more.
This site already has a Worker entry point, `/api/health`, and `/api/project`. Later, it can grow into release metadata, install checks, docs search, deployment diagnostics, or a hosted project status surface without changing hosting platforms.
Run your domain mail from the edge.
OmniDock is MIT-licensed, TypeScript-based, and built around Cloudflare Workers, D1, R2, Email Routing, and Email Sending.