The reusable logic — ten workspace libraries the services
compose into deployed workers. Each row links to that package's own README;
click through for its API and design notes. For why it's split this way,
see docs/architecture/; for the wire
standards, the table in the top-level README.
| package | role |
|---|---|
@bullmoose/jmap-core |
JMAP wire types, batched dispatch with back-references, errors, capabilities (RFC 8620) |
@bullmoose/account-do |
the per-account Durable Object: monotonic state, collection-agnostic changelog, push, alarms |
@bullmoose/mailstore |
D1 schemas + data access, the R2 blob keyspace |
@bullmoose/auth-core |
tokens, scopes, cross-account grants (token ∩ grant), vault envelope crypto |
@bullmoose/contacts-core |
vCard ⇄ JSContact translation (RFC 9555) |
@bullmoose/calendar-core |
recurrence/timezone engine + iCalendar ⇄ JSCalendar (RFC 8984) |
@bullmoose/mime |
RFC 5322 MIME builder (inline images, big-file links) |
@bullmoose/outbound |
SES relay for outbound send |
@bullmoose/cli |
the bullmoose command — login, sync, send, watch, import, admin |
@bullmoose/popcorn |
POP3S/SMTPS → JMAP shim (Go) for legacy clients |
Layering, roughly top-down: jmap-core (protocol) → account-do (state)
→ mailstore / auth-core (storage + identity) → contacts-core /
calendar-core / mime (codecs) → outbound (egress). cli and
popcorn are the client edges. Nothing here imports a service; services
import these.