Lightning 0.7.0
Lightning 0.7.0
The largest Lightning release to date: 40+ commits since v0.6.6 spanning a
new sign-in method, a complete moderation set, voice messages, thread
parity, and a long run of live-feedback fixes driven by real daily use.
OAuth 2.0 / OIDC browser sign-in — live validated
Lightning can now sign in through the system browser using OAuth 2.0 /
OIDC (Client::oauth() on matrix-sdk 0.18). PKCE, the CSRF state, the
code exchange and token refresh are SDK-owned; Lightning adds only the
loopback callback listener and the two-phase store lifecycle that keeps a
freshly issued device from ever adopting another device's store. Refresh
tokens rotate and persist; a revoked session surfaces honestly instead of
looping.
Validated live against matrix.org (Matrix Authentication Service):
end-to-end browser login, new-account registration through the Google
upstream identity provider, token refresh, restart restoration, and
sign-out. The homeserver field now discovers the available sign-in
methods as you type (and for the prefilled server on open) instead of
waiting for Enter.
Moderation: kick, ban, unban
The member profile popover now carries the full moderation set, gated by
SDK-derived power-level permissions (never role labels) and offered only
against members strictly below your own level:
- Remove (kick) and Ban, with an inline confirm and optional
reason. - Unban — banned members are now visible in the People list (sorted
last, with a "Banned" chip) precisely so unban is reachable. Unban
carries its own permission flag: its required level is max(ban, kick)
per the spec, asked of the SDK. - Invite back after unbanning (default on): a successful unban is
followed by a normal invite, so restoring a member is one action. - Inviting a banned user is blocked up front with guidance to unban
first, instead of an unexplained server rejection.
People list: instant and live
The Room Information People list renders instantly from the local cache
(a partial snapshot precedes the network roster under the same request)
and stays live: membership changes seen in sync refresh an open panel
without reopening it, rate-limited so busy bridged rooms cannot flood the
client.
Voice messages
MSC3245 voice messages: record with a live waveform, preview, and send —
in rooms and in threads, through the SDK's encrypting attachment path.
Sent as mono 32 kbps Opus. The thread composer gained the same mic as the
room composer, with single-owner recording semantics.
Threads
- Thread participant facepiles on summary cards, from the thread's own
events (root sender first), cached per thread. - Thread voice messages (above) — never falling back to a room send.
- Per-room notification modes gained "Follow account default", mapped
to the real absence of a server push rule, with retry on reconnect.
Timeline and media
- Outgoing videos carry a real poster thumbnail, extracted locally and
attached through the SDK (encrypted alongside the payload in encrypted
rooms); cards take the video's real shape from the first render, and
learned dimensions persist across sessions. - Software video decoding by default — VAAPI deadlocked on rotated video.
- Read receipts: Element-style chips now ride one fixed right-edge rail;
a user's receipt shows on their own message; reader avatars fall back
to the avatar the timeline itself has seen, so chips stop degrading to
letter initials. - Sender names are coloured per user (deterministic, hue-matched to the
avatar palette, WCAG AA-verified inks in both light and dark themes). - Big-emoji rendering for 1–3 emoji-only messages; images close on any
click; files can be dropped anywhere in chat.
Interface
- Space Home: double-click a Space in the rail (or click the
workspace title) to open the Space's front page with its room list —
the surface existed but was unreachable. - Room list filters: All / People / Rooms / Unreads chips, persisted
per account — rooms no longer sink under a hundred DMs. - Interface zoom: 75–150% whole-UI scale (Settings → Appearance, or
Ctrl+= / Ctrl+- / Ctrl+0 anywhere). Applies on the next launch — Qt
reads its scale factor once at startup. - One identity-colour policy everywhere: a direct-message partner gets
the same fallback colour in the room list, quick switcher, headers,
member list, receipts and message rows. - The typing indicator no longer nudges the timeline; long drafts and
edits scroll inside the composer with the caret kept visible; editing
starts at the end of the message. - The circular Lightning logo ships as SVG where vectors are supported;
upload-limit preflight uses only the server's advertised limit.
Fixed
- Composer text past ~6 lines was invisible (no scrolling existed).
- The same user could show three different fallback-avatar colours
across surfaces. - Send failures now surface in the room they happened in, not whichever
room is open. - A stale room could keep refetching mention suggestions indefinitely.
Known issues and limits
- Two timeline QML suites still assert the pre-0.6.6 virtualized
contract (timeline-pane-qml37 passed / 26 failed,
timeline-hydration-qml5 / 2) — carried, disclosed, and the
highest-value open test work. All other suites pass on both build
configurations (93/95 registered suites green). - macOS: built and validated as an unsigned arm64 test bundle on real
Apple hardware in the release pipeline, but not published — macOS
packages wait on code signing. Linux (deb, rpm, Flatpak, AppImage,
snap) and Windows (x86-64 portable + installer) packages are published
and validated on clean systems. - Interface zoom requires an app restart to take effect (Qt platform
limit). - Unban is unreachable in rooms at or over the 500-row roster snapshot
cap. - Element interoperability of provider GIF sends, sent video posters,
QR verification and voice messages has not been re-validated for this
release beyond automated coverage.