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


                    2026-10-02 2026-09-05 2026-09-05


1 [0.15.0]
══════════

1.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.


1.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 connection; capability retries retain the advertising account
    and node.
  • Keep named resources independently selectable, preserving resource
    case.
  • Reclaim retired discovery observations when storing new
    observations, without clearing other live accounts or globally
    verified capabilities.


1.3 Extension compatibility
───────────────────────────

  • Restart Emacs disconnected before first using this version.
    Existing live global-symbol rosters and pending-room tables are not
    migrated by reloading Lisp files.
  • `jabber-jid-symbol', the roster/display/bookmark name helpers and
    `jabber-avatar-set' accept a final optional connection argument.
    Pass it when reading or writing automatic roster metadata.  Without
    it, these APIs use only supplied symbols or legacy accountless data,
    never a guessed account.
  • Presence hooks and title callbacks keep their existing arities.
    Their WHO argument is an account-scoped symbol; `jabber-jid-owner'
    returns its connection.  Direct symbol-property reads on WHO remain
    supported.
  • `jabber-read-jid-completing' accepts the connection as its seventh
    argument.  An explicitly selected empty account does not fall back
    to other rosters.
  • Activity entries now retain connection/JID pairs internally.
    Existing custom activity formatters and visibility predicates still
    receive JID strings.  Legacy JID-only navigation refuses ambiguous
    owners instead of choosing one.  Legacy JID widgets can carry their
    owner in the `:jabber-connection' property.


2 [0.14.0]
══════════

2.1 Fixes
─────────

  • Restore broadcast presence after connection.  A room-recovery check
    rejected presence without a recipient, leaving the client
    unavailable to the server: contacts appeared offline and incoming
    messages could require archive sync


3 [0.13.3]
══════════

3.1 Added
─────────

  • Automatically preview shared links locally when URL expansion is
    enabled
  …  …
