A proxy server that bridges IMAP/CalDAV/CardDAV mail backends to the JMAP protocol (RFC 8620/8621, JMAP Calendars, JMAP Contacts). It also supports direct JMAP-to-JMAP passthrough for backends that already speak JMAP.
Live demo: proxy.jmap.io
- Syncs email from any IMAP server and exposes it over JMAP (RFC 8621)
- Syncs calendars and contacts via CalDAV/CardDAV (JSCalendar, JSContact)
- Passes JMAP requests through unchanged to native JMAP backends (Cyrus, Fastmail, etc.)
- Handles OAuth2 sign-up for Gmail and Fastmail
- Multi-account: one proxy instance can serve many users, each with their own backend
- Cross-account copy (
Blob/copy,Email/copy,CalendarEvent/copy,ContactCard/copy) - Push notifications via Server-Sent Events (RFC 8620 §7.3)
- Prometheus metrics, credential encryption (AES-256-GCM or OpenBao Transit)
docker run -d \
--name jmap-proxy \
--restart unless-stopped \
-p 9000:9000 \
-p 127.0.0.1:8080:8080 \
-v /data/jmap-proxy:/data \
-e BASEURL=https://jmap.example.com \
ghcr.io/jmapio/jmap-proxy:latestThen open http://localhost:8080 to add accounts via the management dashboard.
| Document | Description |
|---|---|
| SETUP.md | Deployment guide: Docker, TLS, env vars, OAuth2, encryption |
| API.md | Management API reference (accounts, health, metrics) |
| ARCHITECTURE.md | Internal architecture: process model, data flow, worker protocol |
| ROADMAP.md | Feature status and spec compliance notes |
- Perl 5.20+ (source) or Docker (recommended)
- IMAP server with CONDSTORE support (RFC 4551/7162) for email sync
- CalDAV/CardDAV server for calendar and contacts sync
132/132 JMAP TestSuite tests passing against Cyrus IMAP, covering: RFC 8620 core, RFC 8621 mail, JMAP Calendars, JMAP Contacts (RFC 9610), Quota (RFC 9425), Principal, MDN (RFC 9007), and EmailSubmission.
See LICENSE.