Stalwart · Fastmail · any JMAP server

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.

Mail + calendar Multi-account Keyboard-driven Offline
webjmail — All inboxes
All inboxes7
phimlawi@kirz
Re: DCI STT Bangkok → Telehouse
Yesterday
Attestation Service
Devices failed to attest within 72h
14:01
NTT Com
IP transit quote — 1G handover
Jul 30
AMS-IX
Peering LAN maintenance window
Jul 28
DMARC
Weekly aggregate report
Jul 27
Assistantdeepseek-v4-flash
Ask about your mail — it searches, reads, and drafts for you.
What you get

Six things it does well.

Reads render from an on-device index first, then sync in the background — that's why it feels instant.

Local-first

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.

Private by design

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.

Mail

Every account, one inbox

Add all your JMAP accounts and read them together in “All inboxes,” with per-account unread, search, and bulk triage.

Calendar

Day, week, month

A real calendar built in: drag to move and resize, click to create, and secondary-timezone rails for scheduling across regions.

Keyboard-first

Hands on the keys

Navigate, triage, and schedule without the mouse. Actions apply optimistically and roll back only if the server disagrees.

Assistant

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.

Calendar

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.

Bring your own server

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.

1

Enter your email

webjmail autodiscovers /.well-known/jmap from your domain — Stalwart, Fastmail, and standard JMAP servers just work.

2

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.

3

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
}

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.

Get it

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.

Enterprise

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.

The domain of the server you'll run webjmail against.
Roughly how many accounts you'll serve.
We'll email your trial license to this address.

Sent straight to Rotko Networks over our own mail server — no third party involved. Prefer email? Write to hq@rotko.net.

FAQ

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.