Skip to content

Lightning 0.6.6

Choose a tag to compare

@Mizerd Mizerd released this 12 Aug 07:22
· 207 commits to main since this release

Lightning 0.6.6

A features and timeline release. Read receipts, QR device verification, and
server-side per-room notification rules are new; GIF saving was reworked so a
star means one thing everywhere; the GIF and emoji pickers became resizable and
now sit on the composer; and the room timeline was rebuilt from the ground up
without height virtualization. Platform coverage is unchanged from 0.6.5: Linux
and Windows x86_64, and every shipped build uses only the Rust Matrix backend.

Highlights

  • Read receipts on the timeline. Element-style avatar chips show who has
    read each message, with a "+N" overflow pill and a summary line for the
    tooltip and screen readers.
  • QR device verification. When the other device can scan (Element X,
    Element Web), Lightning displays an SDK-generated QR code; SAS emoji remain
    available as the fallback throughout. This closes a 0.6.5 known limitation.
  • Per-room notification modes are now real server push rules. All messages
    / Mentions & keywords / Mute are stored in your account's push rules by the
    Matrix SDK instead of only on this device. This closes a 0.6.5 known
    limitation.
  • Saved GIFs — one star, one meaning, one place. Star a GIF anywhere, from
    a provider tile or from a GIF in a chat, and it lands in the picker's
    Saved tab. Every tile is tagged with where it came from.
  • Resizable pickers. The GIF and emoji pickers sit on the composer, scale
    with the window, and can be resized by dragging the corner; both share one
    remembered size that persists between sessions.
  • The room timeline was rebuilt without height virtualization. Every loaded
    row is a real, measured item, so loading older history no longer needs the
    view to be corrected at all.
  • Find-in-timeline highlights matches. Ctrl+F now marks every occurrence in
    the message body and fills the one you are sitting on.
  • Same packages as 0.6.5: Linux .deb/.rpm/Flatpak/AppImage/Snap and Windows
    x86_64 portable ZIP, MSI, and setup EXE. Windows packages remain unsigned.

Read receipts

  • Who has read a message. Up to four 16px avatar chips in a facepile,
    plus a "+N" overflow pill, on the newest message each person has read. One
    summary line ("Read by Alice, Bob and 3 others") drives both the tooltip and
    the accessible name.
  • The strip is invisible and takes no space when nobody else has read the row,
    and it trails the message content rather than a fixed column edge, so
    chips sit beside short messages instead of floating in empty space.
  • Receipts are tracked by the Matrix SDK on live room timelines. Thread
    timelines deliberately do not show them: SDK receipts are not thread-aware,
    and enabling them there would attach unthreaded receipts to thread rows.
  • The "New messages" divider gained an explicit policy alongside this: it stays
    collapsed while you are pinned to the bottom of a room and renders only for a
    reader who is genuinely catching up.
  • Your own receipt and the sender's implicit receipt are excluded, so a message
    never reports that its own author read it.

Device verification: QR

  • Show a QR code. When the other device can scan, the verification card
    displays a QR code generated by the Matrix SDK. Scanning runs the SDK's
    reciprocate handshake, you confirm the other device's success explicitly, and
    nothing is auto-confirmed.
  • Lightning never scans — there is no camera path — and never advertises
    itself as a scanner. SAS emoji verification remains available throughout as
    the fallback, and an unscanned code times out and falls through to it.
  • All trust-affecting steps remain SDK calls. Only the QR module grid crosses
    the FFI boundary; the payload bytes never leave the SDK and are never logged
    or persisted. Signing out cancels a displayed code on the wire.

Notifications

  • Per-room modes are your account's push rules. On the Rust backend, All
    messages / Mentions & keywords / Mute are managed entirely by the Matrix SDK
    as server push rules, so a room you muted stays muted on your other clients
    and devices. Lightning never builds or inspects rule JSON itself.
  • Every surface that sets a mode — the room-menu flyout, Room Information, and
    Settings — states which behaviour you are getting: saved to your account,
    kept on this device after a server failure, or device-local on backends that
    do not support push rules.
  • Changes apply instantly and offline through a local cache, then write to the
    server. A failed write is disclosed rather than swallowed, and a
    server-resolved account default is never written over a mode you chose.
  • Modes are now stored per account, so two accounts no longer share one room's
    setting. Existing settings continue to work.

Saved GIFs

  • One star, one meaning. Previously the same star did different things in
    different places — bookmarking a provider GIF in one, copying a chat GIF to
    disk in another, with a third meaning on a separate tab. A star now means
    "save this GIF", with one destination: the picker's Saved tab.
  • The picker's navigation collapsed into one row of peers: the sources (GIPHY,
    KLIPY) and, past a divider, the two lists that were always cross-provider
    (Saved, Recent). Picking a provider and then Favorites can no longer show
    another provider's list.
  • Star a GIF from a chat. A star button appears when you hover a GIF in the
    timeline, in the bottom-right corner, and fills when saved.
  • Every tile is tagged with where it came from — GIPHY, KLIPY, or Local — which
    also keeps provider credit attached to the tiles it belongs to.
  • What is stored, and where. A provider GIF is saved as a link. A GIF saved
    out of a chat is copied to your device, because that is the only way to keep
    one from an encrypted room. Those bytes live in an account-scoped store on
    this machine only — never in server-side account data — bounded at 200 items
    and 64 MiB, content-addressed and deduplicated.
  • The store records only the content hash, size, dimensions, and when you saved
    it. The room, event, sender, and media key are deliberately not kept.
  • It is deleted when you sign out of that account and when the account is
    removed; switching accounts never touches the outgoing account's files.
    Settings → Privacy & security shows the current count and size and offers a
    confirmed Clear All.
  • The cap is honest: reaching it refuses the save and says so, rather than
    silently evicting something you chose to keep.

Pickers

  • Pinned to the composer. The GIF and emoji pickers are positioned relative
    to the composer card itself, so they cannot lag, drift, or snap back when the
    window is resized. They sit just above the text box and never extend past its
    right edge.
  • Resizable. Drag the corner — marked with a quarter-arc in the accent
    colour — to resize either picker.
  • Sized as a share of the window, never a fixed pixel count, so a picker
    scales continuously as the window changes and a size chosen on one display
    stays sensible on another.
  • Both pickers share one remembered size, and it persists between sessions.
    A size stored out of range is forgotten rather than clamped, so a corrupted
    setting can never hand back a size you did not choose.
  • Saving a GIF no longer shows a banner that pushed the timeline up and let it
    drop back; the star filling in place is the feedback. Failures still say so.

Timeline and scrolling

  • Rebuilt without height virtualization. Every loaded row is now a real
    instantiated item with a measured height, in one column inside a rotated
    flickable. Older history is appended at the tail, so nothing already on
    screen can move and loading history needs no scroll correction at all.
  • This replaces a mechanism where the application computed positions from
    estimated heights while the reader saw real ones — the source of a long tail
    of scroll defects — and where a single insert anywhere in the model released
    and rebound every visible row.
  • Backward pagination arrives as one page. The SDK emits a page as many
    individual diffs; the bridge now assembles them and delivers one atomic
    range, so the view, the pagination gate, and grouping each see a page as a
    page. Overlapping and misattributed requests are gone.
  • Scrolling no longer degrades as you read back. Grouping is refreshed only
    around the change instead of across the whole model, which previously
    re-measured hundreds of unrelated rows on every page.
  • A single wheel frame is capped below one viewport, so a long frame — the
    kind a landing page of history causes — can no longer discard the row you
    were reading and guess a replacement.
  • Rows are paced as they are built so that a large page cannot freeze the
    application in one event-loop turn; live messages are exempt.
  • A 20px gutter now separates the room-list divider from the message
    avatars.

Other improvements

  • Find-in-timeline highlighting. Ctrl+F marks every occurrence in the
    message body and fills the current match in the accent colour, so stepping
    through with the arrows shows which one the view landed on. Message bodies
    are rich text, and the highlighting only ever substitutes inside text runs —
    markup and HTML entities are never split.
  • Read-receipt avatars load correctly rather than falling back to initials
    permanently.
  • Reply and search navigation can address any loaded row, including rows still
    being paced onto the screen.
  • Screenshot-demo mode (development only) can now photograph the GIF picker
    from bundled fixtures, defaults to the Storm theme, and has fuller fictional
    conversations. The README screenshots were recaptured from it.

Downloads

Linux

  • Debian/Ubuntu package (.deb)
  • Fedora/RHEL package (.rpm)
  • Flatpak bundle (.flatpak)
  • AppImage (.AppImage)
  • Snap package (.snap)

Windows x86_64

  • Portable package (.zip) — extract and run Lightning.exe; no installation.
  • MSI installer (.msi) — per-user install.
  • Setup EXE installer (-setup.exe) — per-user install.

macOS is not supported.

Rust-only backend

Release builds compile only the official Matrix Rust SDK backend. The HTTP and
mock development backends are excluded from the shipped binary, --backend=http
and --mock are rejected, and there is no silent fallback. matrix-client --build-info reports the backend and build invariants for verification.

Dependency change

This release adds the Matrix Rust SDK's qrcode feature for QR verification,
which brings in exactly matrix-sdk-qrcode 0.18.0 and qrcode 0.14.1. No
existing dependency pin moved. The matrix-sdk family remains pinned at
0.18.0.

Windows signing notice

The Windows packages are currently unsigned.

  • Windows may show an "Unknown publisher" prompt, and Microsoft Defender
    SmartScreen may warn before running the installer or executable.
  • The warning does not by itself mean the file is unsafe. Download Lightning
    only from the official GitLab release, and verify the SHA-256 checksum below.
  • Do not disable SmartScreen, antivirus, or Windows security to run Lightning.
  • Code signing is not yet configured; these packages are provided unsigned.

Verification

  • Every asset is listed in SHA256SUMS. Verify a download with
    sha256sum -c SHA256SUMS on Linux, or CertUtil -hashfile <file> SHA256 on
    Windows, and compare against the published value.
  • All assets are built from the exact v0.6.6 application commit; the full
    source commit is recorded in each binary's --build-info output.
  • No GIF provider key setup is required — configuration is embedded at build
    time and never printed by --build-info or --gif-status.
  • The bundled Windows FFmpeg is an LGPL build (native decoders, no GPL or
    nonfree components).

Known limitations

  • The Windows packages are unsigned (see above).
  • The rebuilt timeline has not been validated by physical scrolling on a real
    desktop for this build.
    It is a large change to the surface users touch
    most, and the automated suites for the timeline pane are not fully green at
    this commit — see below. Scrolling behaviour is the thing to watch in this
    release.
  • Two automated suites carry known failing cases against the rebuilt timeline:
    timeline-pane-qml and timeline-hydration-qml. These are tests written
    against the previous virtualized timeline's contract that have not yet been
    ported, not separately observed application defects — but they mean the
    timeline's regression net is incomplete for this release.
  • Live Element / Element X interoperability has never been tested and remains
    untested. This covers QR verification, the push rules written for per-room
    notification modes, and read-receipt exchange.
  • The QR reciprocate handshake, real phone scanning, and camera readability
    have no automated coverage — the SDK's constructors are crate-private, the
    same honest limitation SAS already carries.
  • A pre-existing issue not introduced by this release: reopening the GIF picker
    after choosing a favorite can crash the client in some sequences. This is
    known, is not a 0.6.6 regression, and needs a backtrace from a real crash to
    fix.
  • Saving a GIF from a chat is a pointer and touch action only; there is
    deliberately no keyboard path to the resize grip, and touch users cannot
    reach the hover star.
  • Per-room notification modes have no "follow account default" choice yet, and
    a failed server write is not retried automatically on reconnect.
  • End-to-end encryption cannot recover historical messages whose keys were
    never backed up or shared.

Mirrored from the canonical release: https://gitlab.smetonis.net/Mizerd/lightning/-/releases/v0.6.6 — installation packages are hosted on GitLab: