                              ━━━━━━━━━━━
                               CHANGELOG
                              ━━━━━━━━━━━


                               2026-10-02


1 Unreleased
════════════

1.1 Fixes
─────────

  • Leave the published OMEMO device list and bundles unchanged when
    fetching our own device list fails; distinguish authoritative empty
    lists from errors.
  • Preserve binary OMEMO module inputs on Neomacs runtimes that reject
    unibyte strings through the native string-copy API; keep GNU Emacs
    behavior unchanged.
  • Load the OMEMO module into any Emacs 28+ module interface, not only
    the one it was compiled against; disable OMEMO with a warning when
    the module cannot be loaded instead of failing to open chats.
  • Add `MBED_STATIC=1' to link Mbed TLS into the module; the Nix
    development shell uses it so modules survive store garbage
    collection.
  • Store a sender's reaction timestamp and reactions as one database
    change.  A storage error or quit no longer leaves a partial snapshot
    whose newer timestamp makes the same live or archived update look
    stale on retry.
  • Look up reply and reaction targets through the identity indexes
    instead of scanning a conversation's history, keeping room-ID
    precedence, the historical server-ID fallback and ambiguity checks
    unchanged.
  • Stop exact archive replays from rewriting stored messages and their
    search index; thread views read only the messages they display.
  • Let historical room archive messages stored without a room stanza ID
    be replied to and reacted to again: upgrading copies their room
    archive ID into the message when that ID is unambiguous within the
    room (#81).
  • Keep that upgrade fast on large histories: identity changes no
    longer rewrite the search index, and Emacs reports when it upgrades
    the database.
  • Store each archived message in its own short database transaction
    instead of holding one open across archive page requests, so a
    failed page no longer rolls back unrelated live messages or OMEMO
    state, and a retry decrypts from the restored state (#87).


2 [0.15.0]
══════════

2.1 Changed
───────────

  • Synchronize server blocklists before fetching peer OMEMO keys;
    ignore stale blocklist replies and recheck blocked recipients before
    sending.
  • Verify received OpenPGP messages against the expected sender's
    signing key.
  • Test the declared minimum Emacs, pinned upstream Emacs and Thanos
    Emacs fork.


2.2 Fixes
─────────

  • Preserve chat drafts, undo history and reply navigation while
    updating the transcript; failed sends cannot restore stale text over
    a newer draft.
  • Keep popup help bindings and user keymap customizations across Lisp
    reloads.
  • Preserve encrypted attachment bytes under compressed filename
    suffixes.
  • Keep connection attempts, transport callbacks and queued stanza
    order attached to the session that owns them.
  • Retain archive query outcomes and pagination progress until storage
    commits; preserve unfetched history and reject conflicting message
    identities.
  • Preserve OMEMO trust and sessions on identity conflicts; keep
    encrypted room recipients attached to the current membership
    snapshot.
  • Preserve reply targets, retractions, reactions and receipt
    boundaries during live-message and archive replay.
  • Stop link-preview scanning from revisiting rejected URLs.
  • Exclude development administration files from ELPA archives.
  • Speed up archive duplicate lookup with indexed message identities
    instead of scanning a contact's history; preserve ambiguous-message
    and archive-UID checks.
  • Upgrade existing message databases non-destructively with origin-ID
    and room-ID indexes while retaining message, archive and encryption
    state.
  • Drop rejected incoming message corrections silently, including
    missing or ambiguous archive targets, instead of flooding
    `*Messages*'.
  • Keep contact names, presence, subscriptions, avatars and resource
    capabilities separate for each connection, including completion and
    background chat alerts.
  • Keep unread activity and subscription prompts attached to their
    originating account when several accounts share a contact or room.
  • Scope service-discovery observations and pending room errors to
    their
  …  …
