JMAP Proxy

May 11, 2026 · View on GitHub

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

What it does

  • 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)

Quick start

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:latest

Then open http://localhost:8080 to add accounts via the management dashboard.

Documentation

DocumentDescription
SETUP.mdDeployment guide: Docker, TLS, env vars, OAuth2, encryption
API.mdManagement API reference (accounts, health, metrics)
ARCHITECTURE.mdInternal architecture: process model, data flow, worker protocol
ROADMAP.mdFeature status and spec compliance notes

Requirements

  • 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

JMAP compliance

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.

License

See LICENSE.