Verification Summary
Compliance is measured, not asserted. Each row below carries its verification lane: the Smack SINT interop framework, the slixmpp end-to-end suites, or unit-level tests.
360/367SINT RFC 6121
10/10SINT XEP-0198
25XEPs
7 suitese2e, 2 worker modes
full server-side implementation
relayed transparent pass-through (spec requires none)
partial subset implemented, remainder tracked
planned scheduled on the roadmap
Core RFCs
| Spec | Name | Status | Notes |
|---|---|---|---|
| RFC 6120 | XMPP Core | full | Streams, STARTTLS, SASL (PLAIN, SCRAM-SHA-256, EXTERNAL, OAUTHBEARER), resource bindingVerified: SINT full-spec run; dedicated e2e streams suite |
| RFC 6121 | XMPP IM | full | Roster, presence, subscription state machine, 360/367 Smack SINT (1 remaining failure is an upstream Smack test bug)Verified: SINT 360/367; e2e-subscription 29/29 |
| RFC 6122 | Address Format (XMPP JID) | full | JID parsing and normalization in the shared protocol libraryVerified: unit tests (jid round-trips, edge cases) |
| RFC 5802 / 7677 | SCRAM / SCRAM-SHA-256 | full | Server-side verification with credential cache; channel binding supportedVerified: unit + e2e SASL exchanges |
| RFC 6698 / 7671 | DANE TLSA (EE / TA) | full | DANE-first federation: TLSA is the primary S2S trust path; PKIX is the fallbackVerified: s2s federation suite with live DANE |
| RFC 8446 | TLS 1.3 | full | Via OpenSSL, with FreeBSD KTLS kernel offload enabledVerified: all suites run over STARTTLS |
| RFC 7395 | XMPP over WebSocket | planned | xmppd-ws supervised bridge process — v0.10.0 |
XEPs — Implemented
| XEP | Name | Status | Notes |
|---|---|---|---|
| XEP-0030 | Service Discovery | full | disco#info / disco#items; feature list iterated from a single source of truth (audit-fixed)Verified: e2e-quick-wins |
| XEP-0004 | Data Forms | full | jabber:x:data — MUC room configuration forms and in-band registration formsVerified: muc-test + e2e-register-invite |
| XEP-0203 | Delayed Delivery | full | urn:xmpp:delay stamps on archived (MAM replay) and offline-delivered stanzasVerified: e2e-mam / offline suites |
| XEP-0045 | Multi-User Chat | full | Rooms (transient + persistent), admin ops, sharded across workersVerified: muc-test 12/12 at workers=1 and workers=4 |
| XEP-0054 | vcard-temp | full | Incl. anti-harvesting: other-user misses are indistinguishable (§3.3 v1.3.0)Verified: e2e suites |
| XEP-0077 | In-Band Registration | full | Optional invite-gated registration (codes with max-uses), change-password, account deletion cascadeVerified: e2e-register-invite 6/6; SINT IBR provisioning |
| XEP-0084 | User Avatar (PEP) | full | Data + metadata nodes, Gravatar fallbackVerified: unit + e2e |
| XEP-0085 | Chat State Notifications | full | Routed; typing-only states honour Client State Indication suppressionVerified: e2e-chat |
| XEP-0092 | Software Version | full | Answers with the release version (single source in build.zig)Verified: e2e-quick-wins |
| XEP-0115 | Entity Capabilities | full | Pre-built caps hash (SHA-1) injected into presence; node-based disco verification; hash self-consistency fixed in v0.8.9 auditVerified: e2e + audit |
| XEP-0160 | Offline Message Storage | full | Queued on delivery miss, drained on presenceVerified: e2e-chat (offline path) |
| XEP-0163 | Personal Eventing Protocol | full | PEP subset powering avatars (XEP-0084) and bookmarks (XEP-0402), incl. contact notificationsVerified: e2e suites |
| XEP-0191 | Blocking Command | full | Blocklists enforced at routingVerified: unit + e2e |
| XEP-0198 | Stream Management | full | Enable/ack/resume with detached-session replay; ack requests before queue overflow; session failed loudly (resource-constraint) rather than silently losing stanzas. Cross-worker resume (state handoff between threads) on master, ships with v0.9.0Verified: SINT 10/10; e2e-sm-resume 29/29 at workers=1 and workers=4 |
| XEP-0199 | XMPP Ping | full | C2S ping answered; kept dead connections cleanVerified: e2e-quick-wins |
| XEP-0220 | Server Dialback | full | Fallback federated auth where SASL EXTERNAL/DANE is unavailable; Prosody interop-testedVerified: s2s-federation suite vs Prosody |
| XEP-0280 | Message Carbons | full | Multi-resource sync incl. cross-worker deliveryVerified: e2e-chat at workers=4 |
| XEP-0313 | Message Archive Management | partial | C2S archives (1:1 + MUC participant view) with RocksDB-backed store, paging. Remaining: MUC room-archive query routing (T112)Verified: e2e-mam 7/7 |
| XEP-0333 | Chat Markers | full | Routed with stanza-id stampingVerified: e2e-chat |
| XEP-0334 | Message Processing Hints | full | store/no-store honoured at archive decisionVerified: unit tests |
| XEP-0352 | Client State Indication | full | Active/inactive queue suppression for mobile clientsVerified: e2e suites |
| XEP-0359 | Unique Stanza IDs | full | Server assigns stanza-id on delivery (origin ID preserved)Verified: e2e-chat stanza-id assertions |
| XEP-0402 | PEP Native Bookmarks | full | Bookmarks over PEP notificationsVerified: e2e suites |
| XEP-0440 | SASL Channel-Binding Type Capability | full | Channel binding announcement over tls-server-end-pointVerified: unit tests |
| XEP-0012 | Last Activity | partial | Implemented since v0.8.0; full per-user last_online store + offline elapsed tracking pending (T164) |
XEPs — Relayed (Pass-Through)
These specs need no server-side state: stanzas route end-to-end unchanged.
| XEP | Name | Status | Notes |
|---|---|---|---|
| XEP-0184 | Message Delivery Receipts | relayed | Receipts pass through routing untouchedVerified: e2e-chat |
| XEP-0308 | Last Message Correction | relayed | replace payloads routed (archival stores latest)Verified: e2e-chat |
Planned
| Spec | Name | Status | Target |
|---|---|---|---|
| XEP-0363 | HTTP File Upload | planned | v0.10.0 — xmppd-httpupload daemon |
| RFC 7395 | XMPP over WebSocket | planned | v0.10.0 — xmppd-ws supervised bridge |
| XEP-0060 | Publish-Subscribe | planned | v0.10.0 — real pubsub service (service identity is deliberately not advertised before this lands) |
| XEP-0049 | Private XML Storage | planned | v0.10.0 |
| XEP-0357 | Push Notifications | planned | Post-v1.0 — mobile background delivery (T41) |
| XEP-0124 / 0206 | BOSH | planned | Post-v1.0 — legacy web clients (only if asked) |
| XEP-0166 | Jingle (A/V) | planned | Post-v1.0 — with TURN/STUN relaying |
Not Implemented
Notably absent and not currently scheduled. Stanzas for unknown extensions route end-to-end unchanged, so most client-side extensions work anyway; the rows here are things that would require server behavior.
| Spec | Name | Why not |
|---|---|---|
| XEP-0136 | Message Archiving | Superseded by XEP-0313; deliberately skipped rather than dual-implemented |
| XEP-0050 | Ad-Hoc Commands | Administration lives in the xmppctl CLI and the supervisor, not in-band |
| XEP-0065 / 0231 / 0265 | SOCKS5 Bytestreams / BoB / Out-of-Band | Server-mediated file/P2P transfer — superseded by planned XEP-0363 (v0.10.0) |
| XEP-0380 | Explicit Message Encryption | Markers relay unmodified; encryption claims per provider not tracked server-side |
| XEP-0369 / 0376 | MIX | MUC successor spec; no implementation planned — investment stays on XEP-0045 |
| XEP-0055 | Jabber Search | No user directory/presence browsing by design (anti-harvesting posture) |
OMEMO (XEP-0384) key distribution over PEP is in the post-v1.0 backlog; the PEP plumbing it needs is already implemented.
Method
Numbers on this page come from the test lanes that gate every release:
zig build test— all unit suites (currently 800+ tests across 100+ build steps)- Seven slixmpp end-to-end suites against a throwaway instance, at workers=1 and again in the workers=4 cross-worker lane
- Smack SINT (smack-sint-server-extensions jar) — 360/367 for RFC 6121, 10/10 for XEP-0198
- Interop runs against Prosody, Gajim, Dino, Conversations, and profanity