Message order in Matrix: right now, we are deliberately inconsistent

Overall tension: consistency vs. decentralization

  • Many argue that all up‑to‑date clients (at least on the same homeserver) should show a single, stable message order. Different orderings across clients are seen as confusing and “gaslighting.”
  • Others say a globally consistent linear timeline is impossible or undesirable in a fully decentralized, federated system that must keep working through netsplits.
  • There’s disagreement whether eventual consistency of history is mandatory (same ordering after resync) or whether it’s acceptable for different homeservers to retain permanently different views.

User expectations and UX

  • Several commenters insist users expect:
    • Messages to appear in send order.
    • All participants (or at least all devices for one user) to see the same order.
    • History not to silently reshuffle after they’ve read it.
  • Others accept that simultaneous or delayed messages can reasonably appear in different orders per client, comparing it to phone calls or snail mail.
  • Reordering after the fact is seen by some as more confusing than per‑client differences; by others as essential for shared understanding and legal/audit use.

Failures, retries, edits, and “past” messages

  • Strong disagreement on whether a client should send later messages if an earlier one is stuck:
    • One camp: hold later messages until the earlier succeeds or is deleted, to preserve intended order.
    • Another: each message is its own unit of communication; out‑of‑order due to failures is tolerable.
  • Editing old messages is widely accepted if edits are visible and auditable; backdating new messages into old history is seen as dangerous.
  • Concern about long‑delayed messages (e.g., hours later) suddenly appearing in the “past” and confusing meaning or moderation.

Technical approaches discussed

  • Ideas raised: server‑assigned sequence IDs, server timestamps, Lamport clocks, vector clocks, CRDTs, Raft/Paxos‑like consensus.
  • Pushback:
    • True global total order is impossible without centralization or heavy consensus.
    • Vector clocks give only partial order; UX for that is hard.
    • CAP constraints mean Matrix must favor availability, making strict consistency tricky.

Matrix‑specific notes and proposals

  • Matrix’s current APIs (/sync vs /messages) can yield different orderings; this is seen as a spec/implementation bug more than a deep necessity.
  • Some homeservers already use a single internal order (arrival‑based) for everything and report that it simplifies implementation and UX.
  • Proposed UX ideas: visual indicators for “retconned” or out‑of‑order messages, per‑message sent/received timestamps, “jump to next unread inserted‑in‑the‑past” controls, or even git‑graph‑style visualizations for netsplits.