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


                         2026-10-30 2026-10-02


1 [0.15.1]
══════════

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).
  • Stay in rooms where we are an admin or owner on Prosody.  Its
    unavailable presence from the bare room JID, which lists absent
    affiliated members, no longer counts as our own departure; the
    room's own departure notices still come from our occupant JID and
    are still honoured.
  • Stop announcing "has left the chatroom" on join for members who were
    never in the room; Prosody lists absent members with reserved
    nicknames that way.


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
  …  …
