Lightning 0.6.6
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 runLightning.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 SHA256SUMSon Linux, orCertUtil -hashfile <file> SHA256on
Windows, and compare against the published value. - All assets are built from the exact
v0.6.6application commit; the full
source commit is recorded in each binary's--build-infooutput. - No GIF provider key setup is required — configuration is embedded at build
time and never printed by--build-infoor--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-qmlandtimeline-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:
- Lightning 0.6.6 — SHA-256 checksums
- Lightning 0.6.6 — Windows x86_64 setup EXE (unsigned)
- Lightning 0.6.6 — Windows x86_64 MSI installer (unsigned)
- Lightning 0.6.6 — Windows x86_64 portable (unsigned)
- Lightning 0.6.6 — Snap amd64
- Lightning 0.6.6 — AppImage x86_64
- Lightning 0.6.6 — Flatpak amd64
- Lightning 0.6.6 — RPM x86_64
- Lightning 0.6.6 — Debian amd64