Guides  /  iOS · Android · desktop

Playbook: a human account in a JMAP client (Mailtemi, etc.)

Goal: you@example.com in a modern JMAP client — Mailtemi, the bullmoose CLI, or any RFC 8620 client. This is the native face: full mailboxes/folders, threads, server-side search, live push, drafts, vacation — and it is entirely serverless and $0 (no popcorn, unlike the Apple Mail playbook).

Endpoint placeholder: jmap.<your-domain> is wherever your jmap worker answers /.well-known/jmap. On this deployment that is https://app.bullmoose.cc — Pages and the jmap Worker routes share one origin (services/jmap/wrangler.jsonc). The old bullmoose-jmap.<acct>.workers.dev fallback is not it: that URL now 404s on every path, including the session resource.

You should not have to know any of this — bullmoose login you@example.com with no --base finds it, following the /.well-known/jmap redirect the way RFC 8620 §2.2 says to.

1. Create the account

bullmoose admin account create you@example.com --tenant t_home --name "Your Name"
bullmoose admin password you@example.com          # login password (prompts)

2. Mint a device app-password

mail covers every mail verb (read/draft/send/move/…). One token per device:

bullmoose login you@example.com
bullmoose token create --name "mailtemi" --scopes mail    # → bm_… , shown once

3. Connect the client

JMAP clients authenticate with the app-password, never the login password. Two ways in:

Mailtemi: add a JMAP/email account, enter your address + the app-password; if prompted for a server, give the session URL above.

CLI (the reference client):

bullmoose login you@example.com     # autodiscovers via SRV; --base <url> to override
bullmoose watch                     # live push
echo "hi" | bullmoose send --to a@b.com --subject "sent from the CLI"

4. What to expect

Troubleshooting

Source: docs/playbooks/jmap-client.md — edit it in the repo and this page updates.