A JMAP client for mail and calendar.
Point it at your Stalwart box, or any JMAP server. No account, no relay, no tracking. A local index keeps it fast; your password stays in native code, not the browser. Runs in a browser tab or as a desktop app for Linux, macOS, and Windows.
Six things it does well.
Reads render from an on-device index first, then sync in the background — that's why it feels instant.
Instant, and offline
Mail renders from an on-device index the moment you open it. A quiet background sync keeps it current — no spinners, no reloads.
Passwords never reach JS
Credentials live in a Rust-side, age-encrypted vault. The web view never sees them, and the page makes no third-party requests.
Every account, one inbox
Add all your JMAP accounts and read them together in “All inboxes,” with per-account unread, search, and bulk triage.
Day, week, month
A real calendar built in: drag to move and resize, click to create, and secondary-timezone rails for scheduling across regions.
Hands on the keys
Navigate, triage, and schedule without the mouse. Actions apply optimistically and roll back only if the server disagrees.
Bring your own model
Optional. Point it at OpenRouter, a local Ollama, or any OpenAI-compatible endpoint. It searches and drafts in your inbox — the model only decides, your browser does the work, and nothing sends without you.
The calendar is part of the client.
webjmail speaks JMAP Calendars (JSCalendar, RFC 8984) straight to Stalwart — no CalDAV bridge, no sync add-on, no second login. Your events sit on the same server as your mail, and open in the same window.
Day, week, and month
Week view is the default — Monday-first, 24-hour, with a live now-line. Press d / w / m to switch, t for today, arrows to page.
Drag to create, move, resize
Drag across empty time to book a slot, drag an event to reschedule, or grab its edge to change the duration. Right-click for edit and delete.
Secondary timezone rails
Pin extra timezones alongside your own so scheduling across regions is a glance, not mental math — useful when your day spans continents.
Recurring events, handled correctly
Repeating events render in place and edit against their real identities on the server — no phantom copies, no drift between webjmail and other JSCalendar clients.
Made for self-hosted Stalwart.
No account to create, no middleman. Type your email, webjmail finds your JMAP endpoint, and your mail stays between you and your server.
Enter your email
webjmail autodiscovers /.well-known/jmap from your domain — Stalwart, Fastmail, and standard JMAP servers just work.
Desktop app: nothing to configure
The native app talks to your server through a Rust layer, so there’s no CORS to deal with. Best choice for a self-hosted box.
Web app: allow the origin once
Browsers enforce CORS, so your server (or the proxy in front of it) needs to allow https://app.webjmail.com. One-time config, shown here →
# In front of Stalwart (JMAP on :8080) mail.example.com { @webjmail header Origin https://app.webjmail.com header @webjmail { Access-Control-Allow-Origin "https://app.webjmail.com" Access-Control-Allow-Credentials "true" Access-Control-Allow-Methods "GET, POST, OPTIONS" Access-Control-Allow-Headers "Authorization, Content-Type, Accept" } @preflight method OPTIONS respond @preflight 204 reverse_proxy 127.0.0.1:8080 }
# server { ... } fronting Stalwart location / { set $cors https://app.webjmail.com; if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin $cors always; add_header Access-Control-Allow-Credentials "true" always; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always; add_header Access-Control-Allow-Headers "Authorization, Content-Type, Accept" always; return 204; } add_header Access-Control-Allow-Origin $cors always; add_header Access-Control-Allow-Credentials "true" always; proxy_pass http://127.0.0.1:8080; }
With credentials you must echo the exact origin — * is rejected. Apply the
same headers to the /.well-known/jmap path so discovery isn’t blocked.
Run it in the browser, or install the desktop app.
The web app needs nothing but a link. The desktop build adds the encrypted vault and works fully offline.
$ paru -S webjmail
$ yay -S webjmail
Prefer a binary? Grab the AppImage, .deb, .rpm, or tarball from GitHub Releases.
Request an Enterprise trial license.
webjmail is free under the AGPL-3.0. If you'd rather use it without the AGPL's source-sharing obligations — embedded in a product, or offered as a managed service — request a trial of the commercial Enterprise License. We'll email it to you.
JMAP client questions, answered.
What is a JMAP client?
A mail app that speaks JMAP (RFC 8620/8621) — a modern JSON API that replaces IMAP and SMTP on the client side. webjmail talks JMAP directly, with no IMAP bridge, so it batches requests, syncs precisely, and stays fast.
Does webjmail work with Stalwart?
Yes — it's built for self-hosted Stalwart, and works with Fastmail and any standards-compliant JMAP server. Enter your email address and webjmail autodiscovers /.well-known/jmap; there's nothing to configure by hand.
Is webjmail free and open source?
Yes. It's free and open source under the AGPL-3.0 — full source on GitHub (the mirror may trail the hosted build). Fork it, self-host it, send patches. If you modify it and run it as a service, the AGPL asks you to share your source. A commercial Enterprise License is available from Rotko Networks if you'd rather not — email hq@rotko.net.
Can I self-host webjmail?
Yes. Run the container — docker run -p 8080:80 ghcr.io/rotkonetworks/webjmail — or build the static site and serve it from any web server. The desktop app needs no server at all.
Does webjmail have a calendar?
Yes — a full calendar over JMAP Calendars (JSCalendar) sits next to your mail: day, week, and month views, secondary-timezone rails, and drag-to-schedule.
How is it different from IMAP webmail like Roundcube?
Roundcube and SquirrelMail speak IMAP; webjmail speaks JMAP, which is faster, batches operations, and supports precise push. It's also local-first (works offline) and keeps your password in a native, age-encrypted vault instead of the browser.
What platforms does it run on?
Any modern browser, plus native desktop apps for Linux (AppImage, .deb, .rpm, AUR), macOS (Apple silicon & Intel), and Windows.