Feature coverage
What yarilo implements, feature by feature, so that planning a migration is a matter of reading a list rather than of trying things out.
Three values are used, and no is as legitimate an answer as yes:
| meaning | |
|---|---|
| yes | implemented and exercised by tests; a configuration that uses it has an equivalent here |
| partial | usable, with a stated limit — read the note before relying on it |
| no | not implemented. Where an issue exists it is linked, and that issue is where the plan lives |
This page is maintained in the same change that alters coverage: a row is updated by the PR that moves it, not by a later sweep. A matrix that lags is worse than none, because every row here is a promise somebody may migrate on.
The IMAP extension table below is exhaustive for what is advertised: every capability in the server's CAPABILITY reply has a row here, and the rows marked no name the notable extensions that are not advertised. Where this page and a protocol page disagree, this one is the one kept current — the disagreement is a bug in the other, and both are fixed together.
Version: 2.4.x line (stable), from 2.4.1. Last reviewed 2026-10-04.
Protocols
| Feature | yarilo | Notes |
|---|---|---|
| IMAP4rev1 / IMAP4rev2 | yes | RFC 3501 / RFC 9051 |
| POP3 | yes | including TOP, UIDL |
| LMTP | yes | delivery, proxying to backends, a synthesised Message-ID when one is missing |
| Submission (MSA) | yes | separate service, relay to an external MTA |
| ManageSieve | yes | RFC 5804 |
| JMAP | partial | reads, writes and submits; no push. Mailbox/{get,query,set,changes}, Email/{get,query,set,import,changes} (Email/set creates, updates keywords and mailboxIds, and destroys), Thread/{get,changes}, SearchSnippet/get, blob upload and download, back-references and creation ids across calls, real state strings. Quota/{get,changes,query,queryChanges} (RFC 9425, read-only). SieveScript/{get,set,query,validate} (RFC 9661) over the ManageSieve store; VacationResponse/{get,set} as the managed Sieve script ManageSieve also sees. EmailSubmission/{get,set,query,queryChanges,changes} and Identity/{get,changes,set} when a Submission relay is configured; identities are read-only and come from the login address and identity_aliases. Push (EventSource, WebSocket RFC 8887, PushSubscription) is not implemented (#714). Email/queryChanges and Mailbox/queryChanges answer cannotCalculateChanges by design — a query result depends on its filter and sort, and this server keeps no per-client result set, so canCalculateChanges is advertised as false. See JMAP |
IMAP extensions
| Extension | yarilo | Notes |
|---|---|---|
| IDLE, UNSELECT, LITERAL+, ENABLE, SASL-IR | yes | |
| UIDPLUS, MOVE, NAMESPACE | yes | |
| CONDSTORE / QRESYNC | yes | RFC 7162 |
| ESEARCH, SEARCHRES | yes | RFC 4731 |
| LIST-EXTENDED, LIST-STATUS, STATUS=SIZE | yes | |
| SPECIAL-USE, CREATE-SPECIAL-USE | yes | RFC 6154 |
| SORT | yes | RFC 5256, all keys; SORT=DISPLAY (RFC 5957) is not implemented |
| THREAD | yes | RFC 5256, REFERENCES and ORDEREDSUBJECT |
| OBJECTID | yes | RFC 8474 — MAILBOXID, EMAILID, THREADID |
| BINARY | yes | RFC 3516 |
| NOTIFY | partial | RFC 5465; annotation/metadata events are not reported |
| METADATA | yes | RFC 5464, when a metadata dict is configured |
| ACL | yes | RFC 4314, enforced on every path — off by default (acl.enabled); a configuration with a shared, public or other users namespace and ACL off is refused at startup. See Namespaces |
| QUOTA | yes | RFC 9208 |
| ID | yes | RFC 2971; always offered before login, after login only while imap_id_send is non-empty |
| COMPRESS | no | |
| URLAUTH, CATENATE, BURL | no | RFC 4467 / RFC 4469 / RFC 4468. Until 2026-08-25 the IMAP page listed URLAUTH as supported; it never was, and the claim is removed rather than kept |
| SEARCH=FUZZY, CONTEXT=SEARCH, CONTEXT=SORT, ESORT | no | |
| REPLACE, SAVEDATE, PREVIEW | no | |
| I18NLEVEL | no | collation follows i;unicode-casemap in SORT/THREAD, but the extension is not advertised |
Storage
| Format | yarilo | Notes |
|---|---|---|
| Maildir | yes | Maildir++, filename and flag conventions match |
| sdbox | yes | |
| mdbox | yes | including the map, alt storage, and purge |
| mbox | no | no plan; the format is legacy everywhere it still appears |
| obox / object storage | no | #247 |
| Index format | yes | the established on-disk index layout, byte-compatible where documented |
Authentication
| Feature | yarilo | Notes |
|---|---|---|
| SASL PLAIN / LOGIN | yes | |
| SASL SCRAM-SHA-1 / SHA-1-PLUS / SHA-256 / SHA-256-PLUS | yes | IMAP, POP3 and submission, channel binding included |
| SASL XOAUTH2 / OAUTHBEARER | yes | IMAP, POP3 and submission, run by yarilo-auth with token introspection; RFC 7628 failure with the client's acknowledgement |
| SASL CRAM-MD5, DIGEST-MD5 | no | #245 |
| SASL EXTERNAL (client certificates) | no | #615 |
| SASL GSSAPI / Kerberos | no | #245 |
| passdb/userdb: SQL (MySQL, PostgreSQL, SQLite) | yes | |
| passdb/userdb: passwd-file, static | yes | |
| passdb/userdb: LDAP, PAM, Lua, IMAP | no | #558 |
| Password schemes | partial | PLAIN, CLEARTEXT, CRYPT, BCRYPT/BLF-CRYPT, SHA512-CRYPT, SCRAM-SHA-1, SCRAM-SHA-256. The older MD5 and SHA1 scheme families are not implemented |
| Master users | yes | |
| Auth policy / penalty (weakforced-style) | yes |
Filtering and delivery
| Feature | yarilo | Notes |
|---|---|---|
| Sieve (RFC 5228) | yes | |
| Sieve extensions | yes | 43 extensions, including imap4flags, editheader, enotify, imapsieve, mailboxid, spamtest/virustest and the RFC 5703 MIME set. The full list is on the Sieve page rather than repeated here — one list cannot disagree with itself |
Sieve pipe / external programs | yes | with a configured binary directory |
| Local delivery agent | partial | delivery is via LMTP; there is no standalone local-delivery binary |
| Recipient rate limiting | yes | cluster-wide, per (sender IP, recipient) |
Search
| Feature | yarilo | Notes |
|---|---|---|
| FTS with Xapian (flatcurve) | yes | separate yarilo-fts service |
| FTS: Solr, Elasticsearch | no | the engine is pluggable, no other engine is implemented |
| Language handling, stemming | yes | per-language filters, tokeniser knobs |
Quota
| Feature | yarilo | Notes |
|---|---|---|
| Storage and message-count quotas | yes | counted from the index, no dict drift |
quota_rule / per-user overrides | yes | |
| Quota warnings | yes | |
quota-status policy service for MTAs | yes | separate service |
Clustering and operations
| Feature | yarilo | Notes |
|---|---|---|
| Director (per-user backend affinity) | yes | own ring and peer sync, plus a per-user flush hook (flush_program) — see Director |
| Replication (dsync) | no | #249 |
| Shared and public namespaces | partial | namespaces and ACLs work; cross-user delivery and some enforcement gaps remain (#544) |
| Virtual mailboxes | partial | a namespace whose mailboxes are defined by a configuration file of folders and SEARCH rules; kept in sync while open, with FETCH, SEARCH, SORT, THREAD, STORE, EXPUNGE, COPY and MOVE acting on the real message, APPEND/COPY/MOVE into one storing to its save folder, and annotation lines filtering the folders. + has no effect, as \Recent is not tracked. See Virtual Mailboxes |
| imap-hibernate | no | idle IMAP sessions are not parked into a separate process; each holds its own. No issue open yet — this row is the record |
| Prometheus metrics, health endpoints | yes | per-command latencies, storage and index counters, /healthz and /readyz |
| Command-line administration | yes | yarctl covers the operations the services expose — routing, storage, index, quota, ACL, metadata, sessions, auth — and each family is documented on the administration page. The command set is not a one-to-one map of any other server's, so a migrated runbook is translated rather than copied |
What migration involves
Configuration keys keep their established names where the setting means the same thing, so translating an existing configuration into yarilo.yaml is mechanical for the covered surface. The on-disk formats — Maildir, dbox, the index — are the same layouts, which is what makes a migration a matter of pointing yarilo at existing mail rather than converting it.
Where a row above says no, a configuration that relies on that feature has no equivalent here yet, and the linked issue is the honest state of the plan.