Skip to content

Releases

Lightning 0.10.5

Choose a tag to compare

@Mizerd Mizerd released this 08 Nov 00:19
2b63840

Lightning 0.10.5

A memory and fixes release, and the first with ARM64 Linux packages. Lightning
uses less memory again, screen sharing works again on KDE Plasma with the
packaged builds, calls reach a call service your own homeserver runs on your
local network, calls survive a dropped connection without leaving, screen
shares stay sharp on a lossy network, spoiler images and videos arrive
blurred, and the message box has an optional Vim mode. Thanks to emmkay440
and f-o-o-g-s for their contributions.

Memory and speed

  • Less memory again. On the same test rig and account as the 0.10.4 notes,
    a build from partway through this round starts a restored session at about
    525 MB of resident memory (0.10.4: about 615 MB), sits at about 685 MB after
    50 room switches (about 805 MB), and at about 1150 MB after a long fast scroll
    (about 1520 MB). Timeline rows now build their reply quote, reactions, read
    receipts, sender avatar, status line and similar parts only when the message
    has them, and Settings builds each section when you open it.
  • Link previews build only the state they show. On the test rig that is
    about 65-80 MB less memory after scrolling, measured after the figures above.
  • Audio and voice message cards are much lighter while not playing: about
    79 objects each, down from about 285 for an audio file and 364 for a voice
    message. The speed menu and volume popup are built when you use them.
  • Idle large rooms let go of their member lists' avatars (display names are
    kept), and Lightning holds 32 MiB of media in memory instead of 64; the rest
    is read back from the encrypted media store on disk, not downloaded again.
  • Name colours no longer poll the server. Lightning asked for the profiles
    of recently seen people every 20 seconds, about 70 requests a minute while
    idle. It now asks once per person, again when their membership changes, and
    refreshes names on screen every five minutes.
  • A message's menu and dialogs are released when its row leaves the screen.
  • Fewer repeated media downloads. A picture handed to the screen is kept
    until it has been drawn, so a busy image decoder no longer loses pictures to
    newer downloads and fetches them again, and speculative video downloads no
    longer push pictures out of memory.

New

  • Spoiler media (#69, MSC4193). Images and videos marked as spoilers
    arrive blurred with a "Spoiler" label and are revealed with a click, Enter or
    Space; the image viewer and the room's media browser never show one you have
    not revealed. Mark an attachment as a spoiler before sending, in the room or
    in a thread; forwarding keeps the cover. Cinny and Sable use the same marker.
  • Vim-style editing in the message box, off by default (Settings › Chat).
    Esc enters Normal mode with the usual motions, operators and counts; Enter in
    Normal mode sends. Works in the thread panel too.
  • Activity search and favourites. Ctrl+F or typing searches the Activity
    dialog, Escape clears first, and a star limits it to favourite rooms. The
    "All" chip and tab explain how rooms and activity are ordered.
  • Collapse a thread's first message to one line in the thread panel; the
    choice is remembered.
  • Stream info for screen shares: codec, resolution, frame rate, packets
    lost and resent, and keyframes, for your own share and a received one.
  • Rendered stable polls: polls sent with the stable m.poll.start type now
    show and count votes like the older format.
  • A "Jump to the latest message and focus the message box" shortcut action
    (unbound by default), and Ctrl+Shift+digit shortcuts that follow the physical
    key on every keyboard layout.
  • Choose what the timeline shows. Settings has Show, On hover and Hide for
    sender avatars, reactions and read receipts, and a switch for large
    emoji-only messages. It applies to rooms, threads and jump-to-message views;
    "On hover" also shows them on the message selected with the keyboard, and
    hidden parts are not built at all. Hiding read receipts does not stop sending
    your own; that stays under Privacy.
  • The room list's unread marker reads as a button again. The thin bar
    0.10.4 introduced now carries an arrow, and opens into the labelled
    "Unread above" / "Mention below" pill under the pointer or keyboard focus.
  • Sending from up in history. A reply keeps your place, so several
    messages can be answered in a row. Whether a plain send takes you to the
    newest message is now a setting, "Go to the newest message when I send"
    under Chat · Timeline, on by default.
  • Choose where the unread dot shows. Settings → Notifications → "Unread
    dot": all rooms, only rooms with notifications on (the new default), or
    never. Muted rooms never show it; mention badges stay in every mode.
  • Mark all rooms read automatically, every 15, 30 or 60 minutes or a time
    you choose (off by default). It skips the room you have open and follows
    your read-receipt privacy setting.
  • Searchable fonts. The font pickers in Settings have a search field that
    filters the list as you type. Contributed by emmkay440 (#66).
  • Sticker search and pack chips. The sticker picker opens on a search field
    that matches shortcodes and descriptions across every visible pack, and lists
    packs as chips with their picture and name. The emoji picker uses the same
    chips to narrow custom emoji to one pack. The picker's busy indicator no
    longer covers its add button.
  • Single-key shortcuts. A global action can be bound to one key with no
    modifier: a letter, digit, symbol, F-key or numpad key. Numpad keys are
    distinct from the main keyboard (shown as "Num ."), so for example numpad
    dot can mute. A character key on its own never fires while you are typing
    in a text field. Navigation and editing keys on their own are still refused.
  • Album art is a Compact, Card or Large choice. Large fills the card's
    width, the cover is cut to the tile's rounded corners, and a file with no
    known cover no longer shows an empty square.
  • Smoother avatars. Avatars are decoded at the size they are drawn, so
    their edges no longer look stair-stepped. Contributed by f-o-o-g-s.

Calls and screen sharing

  • A dropped connection no longer kicks you out of a call (#70). Lightning
    resumes the same call session instead of rejoining, so the others no longer
    see you leave and come back.
  • Screen shares stay sharp on a lossy network (#68). Lost video packets are
    now resent, and a gap freezes the picture until a fresh frame arrives instead
    of decoding coloured blocks.
  • Screen sharing works again on KDE Plasma with the AppImage and Flatpak
    (#63). The GStreamer PipeWire plugin those packages bundle could not follow
    KWin's GPU (DMA-BUF) capture format, and the share ended with "unhandled
    format". Those packages now start a share in system memory, and a share that
    cannot negotiate its capture is retried once in the other memory type, so a
    compositor that only offers GPU capture (niri) still works.
  • A call service on your own network works (#64). When your own homeserver
    advertises a call service that resolves to a private, Tailscale or IPv6 ULA
    address (split-horizon DNS, for example), Lightning now connects to it. A
    call service named only by other room members is still held to public
    addresses. IPv6-only networks with NAT64 (64:ff9b::/96) reach public call
    services, and a refused call service now says why (private name, unresolved,
    timed out, unroutable) instead of "invalid transport".
  • The call button shows in the room restored at startup (#67), without
    switching rooms first.
  • When a call participant's media key cannot be decrypted, the log names the
    likely cause.
  • The call banner shrinks in a narrow window so Try again stays visible.

Messages and the timeline

  • Messages are sent in the order you typed them. Rapid sends in one room or
    thread could reach the server, and show locally, out of order. Each room and
    thread now has one ordered send queue.
  • Jumping to an older message opens a view that scrolls like the timeline,
    loads more in the direction you scroll, and has a bar you can close.
  • The audio and subtitle track you pick in a video's menu now sticks.
  • Repeated PageUp and PageDown extend the scroll already under way.
  • The timeline keeps your place when an older page arrives while you are
    scrolling at the top.
  • A failed /join command says so in the composer and the thread composer.
  • Switching a draft from rich text back to Markdown no longer adds blank lines
    at its end.
  • The voice message preview clock no longer shifts as its digits change.

Rooms, Spaces and invitations

  • Accepting an invitation from the room list opens the room. The Classic
    layout's invitation menu offers Accept and Reject whoever sent it.
  • The "Part of" Space banner explains itself, and dismissing it is remembered
    per account and Space.
  • A lost room membership is noticed within about 5 seconds instead of 30.
  • A room creator's profile pill reads Creator.
  • A back press that closes a menu no longer also goes back to the previous
    room.

Settings, accessibility and languages

  • Right-to-left languages mirror the main window's panes, the search field's
    padding and the room list's filter chips.
  • The recovery key card has a heading, so the Settings outline and search can
    find it.
  • When the keyring stops returning a saved sign-in, Lightning says it may be
    locked.
  • A long account ID in the account row is no longer cut off beside a large
    unread badge.
  • Translations were resynced; new strings are in English until translated.

Fixes

  • The hover toolbar no longer covers an audio, voice or video card's own
    buttons; on media it sits above the message.
  • A video's audio and subtitle choice now shows in its menu and survives a
    replay, and subtitles sit above the control bar.
  • A single-key n...
Read more

Lightning 0.10.4

Choose a tag to compare

@Mizerd Mizerd released this 02 Nov 10:47

Lightning 0.10.4

A memory, polish and bug-fix release. Lightning uses much less memory, the
doubled room list headers are gone, and a long list of reports from the last
release is fixed. Nothing here is experimental.

Memory, speed and disk

  • Much lower memory use. On a test account with about 490 rooms, a restored
    session starts at about 610 MB of resident memory, down from about 1010 MB, and
    after 50 room switches it sits at about 800 MB, down from about 1450 MB. Rooms, menus
    and panels are built when they are needed instead of all at start-up.
  • Memory is given back after a long scroll. When Lightning has been idle for
    a minute it returns the memory a long scroll left free, on a background
    thread, and never during a call.
  • Quicker start-up. A restored session's room list settles in about 5 s,
    down from about 8.5 s, on the same test rig.
  • Video in calls stays cheap while the memory settings above are in force.
  • Less work on the interface thread. Visiting a room no longer forces a disk
    sync on the interface thread for bridge labels.

Rooms, Spaces and the room list

  • The room list no longer draws doubled section headers ("Conversations",
    "Rooms", "Favourites", "Low priority").
  • The highlight on a room row holds across its avatar and title, so it no longer
    flickers as you move the mouse.
  • The filter chips keep their full names and scroll in a narrow sidebar, with a
    cue at each edge that has more.
  • Switching a filter goes back to the top of the list.
  • Unread and mention markers are thin bars at the edge of the list, so they no
    longer cover rows, badges or headers.
  • "Mark as read" appears on rooms that have unread messages, and is not offered
    on rooms that are already read. Menu icons are distinct.
  • Each account reopens the room you last had open after a restart.
  • Joining a Space from a room's "Part of" banner keeps you in the room, selects
    the Space and tells you that it joined. A failed join says why on the banner.
  • Space settings gains Leave Space, and greyed controls say why they are greyed.
  • Leaving a room or Space as its only administrator warns you first.
  • Create a Space stays reachable when the Spaces outgrow the rail.
  • Bulk actions report one short summary, with detail only for failures.

Messages and the composer

  • Bigger album art. An audio file with a cover shows it as a large tile in
    one composed card. Click it to view it full size; playback carries on.
  • The composer's expand button only appears for a multi-line message, sits in
    the corner and no longer moves your text, and a sent message collapses the box.
  • Sending a message while scrolled up returns you to the newest message.
  • Switching between Markdown and rich text keeps your line breaks, and text that
    rich text cannot hold opens as you wrote it instead of losing any of it.
  • Editing a simply formatted message keeps its bold, italic, strikethrough,
    inline code and links. Saving an edit with no change sends nothing.
  • Escape no longer leaves the room you are reading.
  • The Markdown/rich text switch stays in one place, and turning a format off
    with the caret next to it no longer adds a second pair of markers.
  • The gap between a message and its reactions in the Bubbles layout is closed,
    and read receipts share the reactions' line.
  • A tall image in the viewer no longer runs under its toolbars; the thread panel
    no longer claims a root message is unavailable while it is loading.
  • The attachment image editor keeps a JPEG a JPEG.

Calls

  • Echo cancellation can no longer stop your microphone. If it cannot start, your
    microphone carries on without it and Lightning tells you.
  • A call that cannot be checked says why and offers Try again.

Settings and appearance

  • At narrow widths Settings folds to an icon rail, labels wrap rather than cut
    off, and tooltips stay in the window.
  • The About page's picture sits behind the page instead of over it.
  • Settings search matches English terms in every language.
  • Jump links land on their section's heading, the layout preview keeps one
    height, sliders line up, and unchecked boxes are visible in Moss Light.
  • A failed sign-in shows its error once.
  • Long tooltips wrap inside the window.
  • Log lines are coloured by level in a terminal.

Fixes

  • Under the software renderer (no GPU), banners, fallback avatars and the room
    picture preview are drawn instead of left blank.
  • The banner editor shows the current banner when the page opens.
  • Qt 5 search paths in the session environment are ignored.
  • Nix source builds default to thin link-time optimisation, which takes minutes
    rather than hours (withFullLto keeps the old behaviour).
  • A typing indicator nobody refreshes expires.
  • Translations were resynced; new strings are in English until translated.

Known limits and not yet tested

  • "Media from someone here cannot be decrypted" in a call has no automatic
    recovery.
    When a peer's media key cannot be decrypted, that person stays
    silent. The cause is not known yet. Leaving and rejoining the call may help.
  • The audio and subtitle track you pick in a video's menu does not stick.
  • Hardware encoding stays opt-in (LIGHTNING_SHARE_ENCODER=hardware). Only
    use it when everyone watching runs 0.10.3 or newer.
  • macOS calls are NOT TESTED.
  • Editing a message with mentions, custom emoji, lists or spoilers opens it as
    plain text; changing the text loses that formatting. An unchanged save is safe.
  • A multi-line draft restored in rich text joins its lines, and some typed
    markup in a restored draft can come back formatted. The words are kept.
  • A long Rich text and Markdown round trip can leave the composer tall until
    the next send, and the call banner's Try again can clip in a very small window.
  • Scrolling through images used 13-20% more CPU than 0.10.3 in our software-
    rendered test, and one sample had a longer worst frame. Room opens, menus and
    scrolling frame rates were otherwise the same or better.
  • Memory after much scrolling stays well above idle: every loaded message is a
    live row. Memory was measured on a software-rendered test rig; a real GPU, a
    real large account and the packaged builds are NOT TESTED.
  • Calls in this release were checked between two Lightning instances on a local
    server. Windows, Element interoperability and real cameras are NOT TESTED
    live
    on this build. A real KDE Wayland session without EGL is NOT TESTED.
  • Windows packages are unsigned.

Lightning 0.10.4 is published here on GitHub. The release assets are
built and validated on clean systems by the project's packaging pipeline and
uploaded unchanged.

Verify any download against the SHA256SUMS asset.

Lightning's in-app updater reads a signed update manifest (published as the
update-latest release on this repository) and verifies an Ed25519 signature
made with a key that is not stored on GitHub. Every downloaded file is checked
against the SHA-256 recorded in that signed manifest before it is installed, so
replacing a file here cannot cause Lightning to install it.

Issues, source, and history: https://github.com/Mizerd/lightning

Lightning 0.10.3

Choose a tag to compare

@Mizerd Mizerd released this 01 Nov 07:57

Lightning 0.10.3

A big round on calls, the timeline and settings. Calls got video on direct
(one-to-one) calls, a choice of how a call is placed, calls with more than one
media server, a hardware H.264 option for screen sharing, and an opt-in Stream
Info overlay. The rest is a Nheko-style compact layout, inline threads, custom
emoji and image packs, a Threads and Saved messages area in Activity, bulk
actions in the room list and for moderators, an image editor for attachments,
blocking invitations on the server, per-account proxies, and a long list of
keyboard, scrolling, small-window and sign-in fixes.

Calls and screen sharing

  • Direct (legacy) calls carry video and the in-call negotiation messages
    other clients send, and a call room's signalling is no longer lost when a
    burst of call events arrives at once.
  • You choose how a call is placed: Automatic, Direct or MatrixRTC, from the
    call button's menu. The call shows which format it is running. Automatic falls
    back to a direct call only when the room's member count is known.
  • Calls through more than one media server (several MatrixRTC foci) now
    work: Lightning publishes on its own server and subscribes to each remote one,
    and keeps one participant per connection.
  • Hardware H.264 for screen sharing is available on Linux, off by
    default
    , and is switched on with the environment variable
    LIGHTNING_SHARE_ENCODER=hardware. A VP8 backup is published beside it. See
    the known limits below.
  • Stream Info is an opt-in overlay in a call (Ctrl+F9) that shows the
    encoder and codec in use, the frame rate and the bitrate. Its figures are
    sampled once a tick, so they no longer read 500 FPS or 0 kbps by mistake.
  • A new frame rate, resolution or bitrate for a running share applies at
    once
    , without restarting the share.
  • A call reaction can be any emoji from the picker, not only the presets.
  • When a direct call's media pipeline fails, the call now says so instead of
    hanging up silently. Other call failures name their reason too, and a call
    from an account that uses a proxy says why it cannot start.
  • A call button in a new direct message appears right away, not only after
    you leave the room and come back.
  • A direct message you create now lets the other person join its calls.
    Rooms Lightning creates for a direct message carry the call permission
    override that other rooms already had. See the known limits.
  • The call stage fits a narrow window: the controls no longer push the pane
    wider than the window, tiles are clipped, and the call menu is reachable from
    the overflow when the call button folds. The microphone starts without echo
    cancellation until a playback probe exists.
  • The screen-share capture works with DMA-BUF on GStreamer 1.28, and on niri.
  • The camera is closed before the direct-device fallback, and a busy device is
    retried. Fixes from outside contributors (thanks, ilker2445): macOS system
    audio capture for screen sharing, call membership expiry, macOS audio-device
    crashes, and multi-server negotiation with Element.
  • A call membership's delayed leave is reused across refreshes, and a call
    retraction that was owed is still sent.

Timeline, threads and messages

  • Threads can be shown inline (Nheko style), interleaved with the room, and
    every thread opens as its own session in the main view or the side panel.
    Following a thread keeps you on its newest reply; replies that arrive while
    you read are counted; Mark this thread read is an action.
  • Select a message with the keyboard and act on it: T thread, E edit,
    A react, P pin, V view source, plus forward, delete and copy (#51). A setting
    chooses what happens when you return to a conversation (#55).
  • Edit an image before sending it: crop, rotate and flip; the original's
    metadata is stripped and only the edited copy is sent.
  • Activity lists unread direct messages, has a Threads area, a Saved
    messages hub, a search over the loaded rows, and an adjustable cutoff for old
    read rows (default 60 days). Old read mentions from the server backlog no
    longer open it. The Reactions tab is hidden when reactions are Off.
  • Read receipts can be shown as a compact footer with faces, and a
    @room mention is highlighted as a pill when it can notify the room.
  • Custom emoji and image packs (standard Matrix packs as well as the older
    records): use them in the composer and in threads, create room packs from
    Settings, add several images at once, share a pack as a room link, hide packs
    locally, and move the older personal pack into a private room on request.
  • Bulk actions: select several rooms and mark read, favourite, set
    notifications or leave them together; moderators can delete many messages at
    once and edit a room's permissions.
  • Videos show why they are waiting (downloading, preparing, buffering),
    offer audio and subtitle menus when the file has a choice, show the time under
    the pointer on the seek bar, and tell a failed fetch from a format that cannot
    play. Long media reads as h:mm:ss, including the voice-message seek tip.
  • An audio file can show the cover another client attached to it, a Large album
    art option exists, and Markdown is the composer default.
  • Scrolling: a clearer return to the live timeline, a steadier thread view, and
    video playback that does not start from a row that is off screen. A reply's
    quote is taken from the loaded message when the server did not send the
    details.
  • A Matrix ID's double-click copy works, and an invitation can no longer spin
    for ever.
  • Unread rooms scrolled out of the list get a pill pointing to them.

Rooms, Spaces and the room list

  • The room list can shrink to a column of avatars, as in Element; a click
    or double-click on its divider works. Low-priority rooms sort and are marked
    in Channels, and the current, calling and unread rooms stay reachable in a
    collapsed Channels group.
  • A shared default room order for a Space can be saved for everyone, and
    the Space lobby's toolbar wraps in a narrow window.
  • A Favourites shortcut, bridge badges, and an explanation of how the list is
    grouped and sorted.
  • Offer to join the Space a room belongs to, and suggested people in the
    invite dialog.
  • Invitations: block incoming invitations on the server where the
    homeserver supports it, and invitation pictures are withheld, also in the room
    header, unless you allow them.

Settings and appearance

  • A Nheko compact layout preset with a Small avatars message layout and a
    denser rail; Appearance is split into Appearance, Layout and Chat with
    one-line rows. Several Settings branches can stay open, and Settings has
    configurable keyboard navigation. Dragged pane widths are remembered per
    layout preset.
  • Theme editor: select elements, link them into named colour groups and edit
    one element on its own.
  • A steady text cursor option and a setting that stops the caret blinking once
    you are idle.
  • Menus, pickers and dialogs fit a window as small as 640x360.
  • Per-account network proxies: each account keeps its own, calls through a proxy
    are refused with a reason, and a proxied account is no longer told its IP is
    at stake.
  • Translations were resynced for every new string. The call-failure notices are
    not translated yet.

Fixes

  • Switching accounts keeps the new account's picture and remembers where you
    were in each room; the newest account chosen during a switch runs.
  • A voice-message and video seek tip past an hour reads correctly.
  • On servers without thread subscriptions, the Follow button is no longer shown.
  • Settings searches land on the right row; the account row and sign-out no
    longer log errors from a torn-down pane.
  • On Wayland, message notifications no longer raise the window, and a click
    activates it (#49).
  • Lightning writes less to disk: settings are flushed once a second, the search
    index's log is bounded, and scratch media is written without waiting for the
    disk.

Known limits and not yet tested

  • The audio and subtitle track you pick in a video's menu does not stick.
    The menu lists tracks in a fixed order now, but the player returns to the
    default. The cause is not found.
  • Hardware encoding is opt-in and off by default
    (LIGHTNING_SHARE_ENCODER=hardware). If the encoder cannot run, the share
    falls back to software.
  • Old Lightning clients cannot see an H.264 share, and one can lose the call's
    media.
    A hardware share also publishes a VP8 backup, but a Lightning build
    from before this release answers every codec, so the server sends it the
    H.264 stream, its VP8-only receive chain cannot decode it, and audio and
    camera from everyone else in that call stopped in our measurement. Only turn
    hardware sharing on when everyone watching runs 0.10.3 or newer (Element Call
    and Sable decoded it).
  • macOS calls are NOT TESTED. The macOS audio-capture changes came from a
    contributor and are NOT TESTED live here.
  • Direct messages created before this release keep their old power levels,
    so the other person may still be refused when joining a MatrixRTC call in
    them. New direct messages are not affected; an existing room's levels are not
    changed.
  • Direct screen sharing in a legacy call is not available.
  • This round was checked by automated tests and scripted runs on a local
    homeserver and on a real one; real-window calls with the new hardware path,
    desktop notification popups, audible playback and Windows are NOT TESTED
    live
    . A room list that briefly showed joined rooms under Invites after a
    restart was seen once and could not be reproduced.
  • Windows packages are unsigned.

Lightning 0.10.3 is published here on GitHub. The release assets are
built and validated on clean systems by the project's packaging pipeline and
uploaded unchanged.

Verify any download against the `S...

Read more

Lightning 0.10.2

Choose a tag to compare

@Mizerd Mizerd released this 21 Oct 21:35

Lightning 0.10.2

A big release. You can now take your conversations and settings out of the app
(export a room as a web page, export your room keys, move your settings to
another device) and find an attachment by its file name. Screen sharing with
sound, notifications, files and downloads, and sign-in got a long round of
fixes, many of them from your reports. There is also a rebuilt theme editor,
read receipts as faces, a notification troubleshooter, call keys that work from
any window on Wayland, a German translation, and updates that now come from
GitHub first. Much more of the app now works from the keyboard, with a visible
focus ring and F6 to move between the main areas.

Calls and screen sharing

  • Sharing the entire system's sound no longer plays the other people in the
    call back to them.
    Lightning's own playback is never captured; if the sound
    cannot be shared, the call now says why (#26).
  • The sound choice for a screen share is remembered between restarts, and an
    empty per-application selection never silently widens to everything (#43).
  • The call's room stays at the top of your room list while the call lasts
    and does not move as other rooms get activity (#44).
  • The camera works in more places: the PipeWire camera is preferred on
    Linux, a busy camera falls back to another way of opening it, and the camera
    modes Lightning picks are safer.
  • Call sounds come back after the sound server restarts, and a stalled sound
    server can no longer freeze the window. The Flatpak plays sound through
    PulseAudio so a sound-server restart cannot spin the window.
  • Media keys are 16 bytes, as Element and Sable use, and keys are re-sent so
    they reach every device in the call. Screen-share sound follows the mute
    button.
  • Call keys work from any window on Wayland (#47): mute, deafen and leave
    the call while another app has the focus. Turn it on in Settings; your
    desktop asks before allowing it, and the keys are changed in its own settings.
    Linux only.
  • Call audio survives repeated sound-server restarts. The fifth PipeWire
    restart in a call used to leave the other people silent for the rest of it.
  • On Linux with Qt 6.10 or newer, Lightning plays sound through PulseAudio
    (pipewire-pulse) when it answers, as the Flatpak already did; set
    QT_AUDIO_BACKEND=pipewire to keep Qt's PipeWire output. Voice messages,
    videos and recordings wait for the sound server to come back instead of
    crashing the app (at most 8 seconds, then a clear message). NOT TESTED live.
  • An incoming call names the caller as the timeline does, also when the room's
    members were not loaded yet, and a narrow call header no longer cuts off its
    controls. The volume slider on a participant's tile takes the keyboard and
    the mouse wheel as soon as it opens.
  • The AppImage carries the sound mixer that per-application share audio needs
    (#37) and PipeWire's audio converter, which fixes stuttering received voices
    and a missing camera on some Arch and PipeWire systems.

Notifications

  • A sweep of every bell, toast, ring and unread count so they agree with each
    other. One unread rule is used everywhere.
  • Your account's notification rules are in Settings: keywords (with a
    confirmation before removing one), per-room defaults, and a troubleshooter
    that checks why a notification did not arrive.
  • Keyword and display-name highlights reach the bell, and its badge counts only
    what it shows.
  • The incoming call ring follows the call's own end, so it stops when the call
    is answered elsewhere or cancelled.
  • On Windows only one tray notification is shown at a time, so a click opens
    what you see. Edits from other clients now refresh a notification on Windows
    and Linux, and update reliably instead of leaving the old text.
  • A room no longer stays unread because of reactions after its newest
    message (#46).
  • On KDE Plasma 6.3 and older, clicking a notification in the history opens
    its room
    again; it did nothing once the popup had timed out. NOT TESTED
    live.

Messages and the timeline

  • Edits made in other clients update reliably and no longer leave a stale
    copy of the old text in the cache. Only the original sender's edit can change
    a message.
  • Export a room as one web page with its photos, videos and files embedded,
    or as text or JSON. Choose the latest messages, the whole history or a date
    range, and a size limit for attachments. The page makes no network requests
    and runs no script. In an encrypted room, nothing private is written unless
    you tick the box that says so. The export reports its result and counts
    messages only.
  • Read receipts are faces under the message, with a "+N" pill and a "Seen
    by" list that grows as people read. A pointer on a face's lower edge no longer
    makes it flicker.
  • The media browser has GIF and Sticker tabs and a date range, and shows an
    edited message once.
  • Search finds an attachment by its file name, also in encrypted rooms.
    Global search says where it searches, and its filters ignore accents.
  • Keyboard: PgUp/PgDn, Ctrl+Up/Down and Ctrl+G / Ctrl+Shift+G move around
    the timeline and the find results, and can be rebound (#38). Escape and
    focus no longer get stuck in the emoji picker or menus.
  • A voice message that finishes starts the next one on its own (#36), now
    also after you have left the room.
  • Messages missing in the middle of a room (#30, #48): on a homeserver
    without sliding sync, messages received before you first opened a room could
    leave a permanent gap. That no longer happens, and existing gaps are repaired
    once (rooms with unread mentions or messages are kept until you have read
    them). If a message is still missing, start Lightning with
    LIGHTNING_TIMELINE_TRACE=1 and a log file: the trace lists what is missing
    and why, with no message text. NOT TESTED live.
  • The mouse's Back and Forward buttons, and Alt+Left / Alt+Right, step
    through the rooms you visited. They never act while a menu or popup is open.
  • A code block scrolls with the wheel only after the pointer has rested on
    it
    , so scrolling past a wide or tall block no longer gets stuck in it.
  • Middle-click autoscroll keeps going over the header, the composer and the
    rest of the window, speeds up like in a browser, and keeps loading history at
    the top. A new message arriving while you read old messages no longer moves
    the view (Linux tested; Windows NOT TESTED).
  • The thread and search panels follow the "Side panel width" setting
    (default 320 px, was 340 for threads and 360 for search), sit beside the room
    from a narrower window, and share one resize handle. The Space lobby's People
    card scrolls into view when you open it.
  • Room previews, state rows ("Anna joined the room") and dates follow the app
    language
    , including after a switch, and English counts read "1 member"
    rather than "1 member(s)". Dates no longer take month names from your
    system's time format when the app language differs.
  • Message text uses the full width of the row in the Modern and Compact
    layouts instead of stopping at a fixed column in a wide window. Bubbles keep
    their readable maximum width, and cards (media, polls, previews, files, code)
    keep theirs.
  • Find, jump-to-latest and the first-unread pill land where they say. When the
    first unread message cannot be found, the pill says so.
  • Polls show plain text, long message tables stay inside the message, and the
    thread panel loads every reply.
  • Composer: commands keep their text, attachments are sent in order, and very
    large pastes stay responsive.
  • Invite people… is on a room's right-click menu. A room that is unread only
    because of a thread says so.
  • Mark as read marks the newest message, and a stuck send queue recovers
    without a restart.
  • Direct messages: you are warned before messaging someone who may not exist,
    a DM is created once and leaves no empty room behind, and DMs are named
    properly. Invite rows name the room and who invited you.
  • Rooms: long names and topics stay inside Room info and the leave dialog, room
    aliases are checked, and leaving a room from another session removes it from
    the list. Leaving warns you if you are the only member. Pin actions appear when
    you are allowed to use them.
  • Member lists and profiles update live. Forwarding a location keeps it as a
    location.

Keyboard and accessibility

  • F6 and Shift+F6 move between the Spaces rail, the room list and the chat
    (its composer when you can write). A room, invite or message row that has
    the keyboard focus shows a ring; Up, Down, Home, End, PgUp and PgDn move
    between messages; Return opens a room; images, videos and files open from
    the keyboard; and closing Settings with Escape puts the focus back where it
    was.
  • One Return is one click. Some buttons acted twice on Return: a message
    could be scheduled twice with Send later, a kick, ban or unban confirmation
    was sent twice, a shortcut could not be captured, and a voice message
    started and paused at once. A button that removes or ends something answers
    Return only while its focus ring is visible.
  • Keyboard reach, focus and screen-reader names were fixed across Settings, the
    theme editor, the composer and its pickers, Room info and the admin dialogs,
    the media viewers and media browser, search results, the call stage,
    sign-in and QR sign-in, and the verification dialogs.
  • A room row that has the keyboard focus now takes Space to open the room, so
    Space no longer plays or pauses audio while the room list has the focus.
  • The quick switcher's command search matches every word you type, in any
    order, ignoring case and accents, and its example line uses the real names
    of actions in your language.

Security

  • Tooltips show names as plain text. A room name, display name, file name
    or reaction key written to look ...
Read more

Lightning 0.10.1

Choose a tag to compare

@Mizerd Mizerd released this 11 Oct 11:06

Lightning 0.10.1

A release about sharing your screen with the right sound, chats that look the
way you set them on every device, and a long list of fixes that came from
reports: bubbles whose captions you could not read, muted rooms that were not
quiet, a Flatpak that crashed on start, and an rpm that dnf replaced with a
different program.

Calls and screen sharing

  • Choose which apps' sound goes into a screen share, on Linux and on
    Windows. A share that loses its sound server mid-way recovers instead of
    going silent, and an app that closes is removed only after its last sound has
    played.
  • Change the share's sound mode while sharing (issue #26), with options
    reachable from the compact call bar. A sound choice made during a share is
    kept for the next one.
  • Switch microphones and speakers during a 1:1 call. Browser video calls
    no longer drop Lightning's outgoing audio, and switching speakers keeps sound
    playing on the new output.
  • Switch microphones and speakers live during a group call, without
    leaving and rejoining.
  • Screen shares no longer stay gray over mobile tethering or VPN networks
    (issue #33).
  • Noise suppression is off by default, and you choose it (issue #20): Off,
    WebRTC, RNNoise or DeepFilterNet, switched live from Settings > Labs or from
    the call's microphone menu. RNNoise is the one we recommend; DeepFilterNet now
    keeps speech intact.
  • The camera asks the desktop portal first. When the portal cannot stream
    it, Lightning falls back to the camera you granted, a desktop that has turned
    the camera off is respected, and a stuck portal no longer freezes the window.
    A KDE X11 session falls back to Lightning's own screen picker, also when the
    screen-share portal never answers.
  • The call menu shows your microphone level, and Settings has a microphone
    test. A quiet microphone is warned about.
  • Call sounds are played through one output per device on Linux, and they
    come back after a sound output reconnects. Two sounds that overlapped could
    leave the app spinning. Repeated log lines are now limited, so a runaway can
    no longer fill the disk.
  • A group call recovers after a short loss of network, and a call you left
    while offline is withdrawn as soon as the network returns. Dismiss stops the
    ringer, and signing out leaves the call first.
  • The app no longer crashes on exit when a call was still set up.
  • Windows call sounds recover after a sound device changes or reconnects.

Chat appearance

  • Personal chat backgrounds follow your account. Your pictures are stored
    encrypted in your account data, behind one account-wide switch. A device never
    deletes or overwrites a picture it cannot be sure you replaced on purpose;
    when two devices disagree, you are shown the choice.
  • Chat backgrounds and gradients, set per room or per Space, and easier to
    find in Settings.
  • A compact reaction picker with its own size. The quick bar opens next to
    the message, and its resize grip no longer scrolls the room.
  • The reaction picker also shows sticker packs enabled from Spaces (issue #31).
  • Captions and status text on your own bubbles are readable (issue #25).
  • Every theme colour is editable and visible in the preview, with undo.
  • Menu labels stay fully visible when their text changes.

Security and sign-in

  • Set up cross-signing and verify with a recovery key (issue #22), from the
    app. On macOS, sign-in tokens are kept in the Keychain rather than in a plain
    file.
  • Signing out closes the account's stores first (issue #2). A leftover
    handle kept the databases open, so Windows could not delete them. Sign-out
    also removes the account's avatar.
  • A refresh token renewed just before an account switch or quit is kept.
    This is the likely cause of OAuth accounts such as matrix.org reading
    "signed out remotely"; it is not confirmed against that report.
  • The repair form for a failed account opens on that account's own server and
    sign-in method.
  • The sign-in page scrolls the account repair form into view when it appears.
  • A refused token refresh no longer parks the room list; a revoked session still
    signs out.
  • A store that is in use is reported as in use rather than as a permissions
    problem.

Rooms and notifications

  • Muted rooms are silent everywhere (issues #18, #23): no unread or mention
    state in the room list, the rail, the bell or the tray, and mutes made in
    other clients are picked up live. The tray badge is drawn at the right size.
  • The room list sort menu gains Activity, A-Z and Space order.
  • Mark as read, notification actions and thread reads now clear the bell.
  • Opening a room marked unread clears the mark.
  • Invitations offer Accept and Reject in the row menu (issue #28), and
    stale invitations rejected elsewhere disappear after reconnecting.
  • Escape closes the open room (issue #27), returning to the Space's
    overview or Home. Dialogs, the composer and search handle Escape first.
  • An open popup takes the first Escape, closing without also closing the room.
  • Retrying a direct message that timed out no longer creates a second empty
    room while the first is still pending.
  • The whole room header opens Room information, with or without a topic.
  • Windows no longer adds its own sound to a tray notification, and Lightning
    has its own notification sound.

Timeline, media and search

  • Native file dialogs and Element-style downloads. Save as keeps the name
    and extension, and risky file types are never opened. A file saved through the
    Flatpak portal names its real folder.
  • An image, file, video, voice message or GIF sent as a reply stays a reply.
  • A voice message keeps playing when you change rooms, with a floating
    mini-player you can drag to a corner.
  • A picked SVG is converted to PNG before it is uploaded.
  • Links in plain text are clickable, a sent message shows a check, and
    formatted captions on media are kept (issue #16).
  • Emotes show as actions, and double-clicking a bubble starts a reply.
  • Clicking a room makes the composer ready to type in (issue #29).
  • Seen-by and reaction lists show people's display names even when they are
    missing from the room's member list.
  • Messages with custom types from bots, bridges or other clients show their
    text instead of disappearing (issue #30).
  • An unloaded message, such as a search hit or a reply target, opens in a
    read-only view with its surroundings. A far jump stops after a few pages,
    shows progress and says when the message is too far back.
  • Scrolling stays quick in long rooms, autoscroll is steadier, and the scroll
    bar keeps loading history.
  • The "Loading older messages" indicator clears when you reach the start of
    the room's history.
  • The room media browser fills itself, offers Load more, and no longer jumps
    back to the top.
  • Search can use the local index or the server, and find in room can offer to
    search all rooms.
  • One download per file at a time, a missing file is not asked for again
    every minute, and a homeserver that answers with errors no longer holds up
    every avatar. The cached account picture opens on Windows.
  • Media is kept without a keyring for unencrypted rooms, encrypted-room videos
    up to 100 MB are kept, and Settings says what this session keeps.
  • Lightning writes far less to disk while idle.

Packaging

  • GIF search works in the Flathub build.
  • The rpm package is now lightning-matrix (issue #19), so dnf upgrade
    no longer swaps Lightning for the unrelated GNU Lightning library. It takes
    over the old lightning package. The deb keeps its name.
  • The Windows portable ships the audio mixer that per-app share audio needs.
  • Lightning is built for openSUSE and updated with zypper, and the Fedora
    COPR project is lightning-matrix.
  • The Flatpak no longer crashes at start from a font fallback.
  • Lightning says when it is drawing on the CPU and how to fix that on NixOS.
  • The macOS build no longer fails on the noise-suppression code.

Not tested

  • macOS was not tested for this release.
  • Most of the changes above are covered by automated tests; many were not yet
    tried on real accounts, other devices or other platforms. That includes
    synced chat backgrounds across devices, per-app share audio after a sound
    server restart, the portal camera, cross-signing setup, the refresh-token fix
    and muted rooms with the tray.

This is a read-only mirror. It is not a release authority.

The canonical Lightning 0.10.1 release lives on GitLab:
https://gitlab.smetonis.net/Mizerd/lightning/-/releases/v0.10.1

The files attached here are byte-identical copies of the artifacts published
there. They exist so downloads do not all have to come from one small server.
Nothing about this page decides anything: it does not determine what version
exists, what is installable, or what Lightning will accept.

Verify any download against the SHA256SUMS asset, which is itself a copy of
the published one.

Lightning's in-app updater fetches its update manifest only from GitLab and
verifies an Ed25519 signature made with a key that exists nowhere near GitHub.
Every downloaded file is checked against the SHA-256 recorded in that signed
manifest before it is installed, so replacing a file here cannot cause Lightning
to install it.

Issues, source, and history: https://gitlab.smetonis.net/Mizerd/lightning

Lightning 0.10.0

Choose a tag to compare

@Mizerd Mizerd released this 01 Oct 02:50

Lightning 0.10.0

A release about calls that hold up, a sign-in that says what it wants, and
Spaces you can actually run. Most of it came from reports: a voice call that
went quiet after every join and leave, a crash on hang-up that only slower
machines could reach, a server address that had to be typed in full, and
pictures that stayed blank until the first scroll.

Calls

  • No more gaps after someone joins or leaves. Lightning switched its media
    to a new key the moment it sent it, while the other side received that key
    seconds later, so each join or leave cost one to four seconds of silence both
    ways. The switch now waits until the key can have arrived. Measured against
    Element across 19 rejoins, not a second was lost.
  • Rejoining a call no longer leaves you hearing nobody. A key that arrived
    while you were still connecting was wiped a moment later.
  • Element's key numbers above 15 are accepted, so a busy call no longer
    loses Element for good (issue #10).
  • A long mute from someone else no longer silences everyone.
  • Hanging up while a call was still connecting could crash the app
    (issue #3). The crash is a GStreamer/libnice bug that no stable GStreamer
    release fixes yet, and Lightning now avoids the window that triggers it.
  • Every speaker keeps their ring when several people talk.
  • A camera that only offers raw YUYV frames starts.
  • Saving a log to a file can no longer freeze a call if the disk or the
    reader stalls.
  • The media engine survives a sound server restart or an unplugged device, and
    a join that is refused no longer ends the call you are already in.
  • Lightning has its own call sounds, and the ringer rings. You can silence
    it for one call.
  • --call-media-status now also checks the parts of the media stack a call
    needs but never names, so a package missing one says so instead of claiming
    calls work.

Signing in

  • The server address works however you type it: matrix.org,
    https://matrix.org, with or without a trailing slash, in any case.
  • The sign-in page was redesigned to say plainly what each choice does. A
    server's sign-in options show with their real logos, the password form
    follows the usual layout, and Create account and Forgot password links
    appear when the server offers them. A server reached over plain http is
    marked as not encrypted.
  • Browser sign-in no longer hangs in Chromium-family browsers.
  • A failed sign-in no longer leaves a half-created account behind that blocks
    the next attempt, and an account that cannot be removed completely says what
    is left and offers to try again.
  • Change your password from Settings, and choose whether your other
    sessions are signed out.

Spaces

  • Close a room or a Space for everyone, or delete it outright, from its
    settings. The dialogs say exactly whom they remove.
  • Kick, ban and unban a member from a Space, optionally from every room in it
    as well.
  • A Space's lobby is sectioned, and removing a room from a Space removes it.
  • Space tiles on the rail show an unread dot and a mention count.

Timeline and media

  • Pictures on screen load when a room opens, not after the first scroll.
  • A link to an image or a video shows as that picture or video.
  • Animated GIF and WebP avatars and banners, and animation is kept on upload.
  • Images sent from Sable as image-only messages, and MSC4274 galleries, are
    shown.
  • SVGs you send get a raster thumbnail; received SVGs are never decoded.
  • A video whose length the file does not report shows the length its sender
    declared, and a video that cannot be fetched offers Retry.
  • An edited message no longer keeps showing its old text.
  • A slow touchpad swipe no longer glides about ten times farther than a brisk
    one.

Notifications, presence and receipts

  • Notifications follow your account's own rules as the server evaluates
    them, so a room set to Mentions & keywords on another device is respected
    here too (issue #15).
  • A DM's header shows the other person's presence, and its avatar and name open
    their profile. The presence dot sits bottom-right, where other clients put
    it.
  • Opening a room from a notification keeps it at the newest message, so the
    message you were sent is marked read.

Windows

  • A microphone whose clock runs ahead no longer collapses to a few words a
    second
    on the far side; the audio stays sample-accurate.

  • Install for all users (issue #14): the installer asks Just for me or
    For all users, and the MSI accepts ALLUSERS=1. Silent installs take
    /S /ALLUSERS or /S /CURRENTUSER.

Packaging

  • The Flatpak ships ximagesrc, so an X11 session without a screen-share portal
    can share its screen, and two things the Flatpak told its users that were
    not true were corrected.
  • The Flatpak camera keeps the portal's grant when it arrives instantly, and
    its format negotiation no longer dies on a pinned frame rate.
  • The AppImage draws colour emoji everywhere.

Your media, kept — and encrypted

  • Media from encrypted rooms no longer downloads again after a restart. It
    is kept in a media store encrypted with a key held in your system keyring;
    when the keyring is locked, media is kept in memory only. Large files from
    unencrypted rooms are kept too. A setting and a Clear kept media button
    live under Privacy & security.
  • Decrypted copies of files you sent are gone. The media database the Rust
    SDK kept before this release stored them readable; it is migrated away.

Sign-in and keyring

  • A session signed out elsewhere ends honestly instead of looping.
  • A soft logout signs you back in as the same device, keys intact.
  • A keyring that is down or lost no longer costs you the account: Lightning
    says so, offers Try again, and continues as the same device when the
    keyring forgets a sign-in, instead of offering a rebuild.
  • Only one Lightning runs per profile; launching it again brings the window
    forward.

Search, rooms and composing

  • Index all rooms makes every room's history searchable in one go, paced
    so it never hammers your server; Lightning offers it once after you sign in.
  • The room list keeps still while you use it and applies the new order when
    you switch Space or tab — like Element. Opening a room never moves it. A
    setting turns this off.
  • :thumbs suggests 👍, and :thumbsup: turns into the emoji as you type.
  • Links in room topics are clickable and the text can be selected.
  • Arabic paragraphs align to the right; an edit shows its new text in the room
    list without moving the room; one invite raises one notification; banned
    members leave People in this Space.

New call sounds

A new, softer set of call sounds, chosen over three rounds of listening. They
can still be switched off under Settings › Sound & video › Call sounds.

Not tested

  • macOS was not tested for this release.
  • Known interop issue with Element Web: now and then Element cannot hear
    one participant until that participant leaves and rejoins. Measured: the
    audio Lightning sends arrives intact and Element applies its key, but
    Element's receiver doubles every packet on one subscriber slot. The fault is
    on Element's side and is being reported upstream; rejoining clears it.
  • The encrypted media store, keyring recovery and Index all rooms are covered
    by automated tests and independent review; long-running use on real
    accounts across devices is not yet tested.
  • The first automatic Flathub update pull request is opened by this release's
    pipeline; its Flathub test build is checked after publication.

This is a read-only mirror. It is not a release authority.

The canonical Lightning 0.10.0 release lives on GitLab:
https://gitlab.smetonis.net/Mizerd/lightning/-/releases/v0.10.0

The files attached here are byte-identical copies of the artifacts published
there. They exist so downloads do not all have to come from one small server.
Nothing about this page decides anything: it does not determine what version
exists, what is installable, or what Lightning will accept.

Verify any download against the SHA256SUMS asset, which is itself a copy of
the published one.

Lightning's in-app updater fetches its update manifest only from GitLab and
verifies an Ed25519 signature made with a key that exists nowhere near GitHub.
Every downloaded file is checked against the SHA-256 recorded in that signed
manifest before it is installed, so replacing a file here cannot cause Lightning
to install it.

Issues, source, and history: https://gitlab.smetonis.net/Mizerd/lightning

Lightning 0.9.9

Choose a tag to compare

@Mizerd Mizerd released this 22 Sep 18:13

Lightning 0.9.9

A release made mostly of the interface: a sustained accessibility and layout
pass that turned dozens of "needs looking at" observations into fixed defects,
a Spaces rail you can now shape to taste, and a first-class NixOS package
contributed from outside the project. Nothing in the messaging, calling or
encryption contracts changed; this is the release that makes what was already
there legible, reachable and correctly drawn.

Accessibility and layout

Several review rounds swept the interface with geometric checks rather than
source reading, and each one found collisions a source scan could not: two
affordances anchored to one edge that only overlap on a short row, ink drawn
the same colour as the fill beneath it, focus that could not reach a control
the eye could see. Cards that were the colour of the page on ten of eleven
themes now stand off it; a theme radio ring invisible in every light palette
is visible; the text selection highlight that reported "Ctrl+A doesn't work" is
drawn again; a destructive confirm that could not be clicked away can be. The
theme editor now grades the contrast of the colours you give it instead of
claiming a rating it never checked.

The Spaces rail, shaped to taste

The Channels layout's Spaces rail draws the Space hierarchy as a tinted tree —
subspaces rearrange like any other tile, deep trees dive rather than pile up,
and depth carries a second cue beyond lightness. If you preferred the flat
list it used to be, that is now a setting: the rail can be the plain,
activity-ordered list again.

Accounts, presence and the viewer

The account switcher is a clean list of rows, and every signed-in account's
last known avatar is kept on disk so it is there before the account syncs.
Presence publishing follows the server's own backoff and jitters its
keep-alive so two of your devices stop colliding. The image viewer gained
click-to-zoom, wheel-to-pan and navigation that wraps, and media and link
embeds can collapse to a single line in the timeline. A call now says out loud
when a peer is encrypting into a call the room believes is unencrypted.

Packaging

NixOS. The Nix flake package gained webp and JPEG XL image support
(qt6.qtimageformats and kdePackages.kimageformats) and resolves the
qt.multimedia PipeWire symbol load by putting PipeWire on the wrapper's
library path; the flake inputs were refreshed to a nixpkgs that no longer
SIGSEGVs after 0.9.0. Contributed by Seikm and verified on NixOS with
lightning-matrix --image-format-status.

Flathub. The Flatpak submission manifest was rewritten to the form Flathub
asks for: the cmake-ninja buildsystem, no manifest-side file renames — the
desktop, icon and metainfo files are installed under the app id by the build
itself now — and no build restricted to a single architecture, so the aarch64
builder is free to try.


This is a read-only mirror. It is not a release authority.

The canonical Lightning 0.9.9 release lives on GitLab:
https://gitlab.smetonis.net/Mizerd/lightning/-/releases/v0.9.9

The files attached here are byte-identical copies of the artifacts published
there. They exist so downloads do not all have to come from one small server.
Nothing about this page decides anything: it does not determine what version
exists, what is installable, or what Lightning will accept.

Verify any download against the SHA256SUMS asset, which is itself a copy of
the published one.

Lightning's in-app updater fetches its update manifest only from GitLab and
verifies an Ed25519 signature made with a key that exists nowhere near GitHub.
Every downloaded file is checked against the SHA-256 recorded in that signed
manifest before it is installed, so replacing a file here cannot cause Lightning
to install it.

Issues, source, and history: https://gitlab.smetonis.net/Mizerd/lightning

Lightning 0.9.8

Choose a tag to compare

@Mizerd Mizerd released this 17 Sep 12:43

Lightning 0.9.8

The release that actually delivers what 0.9.7 promised, and says plainly where
0.9.7 did not.

What 0.9.7 promised and could not keep

0.9.7's notes said Lightning "now measures what it is actually sending" and
listed three things. Two of them could not happen in any 0.9.7 package, and
this is the release that makes them true:

  • the microphone's level in the log every few seconds — the line comes from
    a GStreamer element called level, and no 0.9.7 package contained it. On
    Windows the plugin was not in the builder image; in the AppImage it was added
    to the required list one commit after the release was cut.
  • a warning in the call header when your microphone produces nothing — that
    badge is raised from the level readings, so with no element it could never
    appear, whether your microphone was live or dead.

The third promise — "if the capture never starts, the log says so" — did work
in 0.9.7 and still does. It sits on a different counter, at the last point
Lightning owns before the network, and has nothing to do with level.

Both packages carry the level meter now, and a Windows package was run in a
real call to check it
: it logged microphone level peak= every five seconds
and raised the "your microphone is capturing nothing" warning when the capture
went quiet. That is the 0.9.7 promise no shipped package could keep.

The reading it prints for a completely silent microphone is -350 dBFS, which
is not a mistake: that is the floor the underlying GStreamer element reports
for digital silence.

The microphone could pick the wrong device, or none at all

Choosing a microphone in Settings could stop capture completely on the
AppImage.
Lightning preferred PipeWire's own capture element, and the version
bundled in the AppImage mishandles the way a device is named there, so the
chain came up with nothing on it: a call that looked perfectly healthy and
carried silence. Lightning now prefers PulseAudio's element, which every
PipeWire desktop also provides.

And a chosen device could fail to bind at all. PipeWire's monitor publishes
a node name and a serial, and no device.name — the property Lightning matched
on — so a device picked from the list could never be resolved. Both halves are
fixed, and the fix was confirmed against a built package, not a source tree.

The camera takes the compressed path on Linux for the first time

The AppImage was also missing the JPEG plugin, which is what lets a camera
send its own compressed frames. Without it a USB 2.0 webcam has to send raw
frames over a link that cannot carry 720p30 of them, and the rate falls. It
ships now, so an AppImage camera takes the compressed path for the first time,
and the 0.9.8 AppImage was run on that chain to confirm it still renders.

No frame rate was measured, so this section does not claim one. What the
plugin removes is the bandwidth ceiling that forced the fallback; whether a
given camera then reaches 30 fps depends on the camera.

Windows already had that plugin and is unchanged by this.

Interoperability, and exactly how much of it was measured

Twelve legs were exercised against three other participants. The six AUDIO
legs were measured: a 440+880 Hz tone was played into one client's microphone
and detected at the far end's speaker, with pw-link proving the routing, so
those are numbers rather than impressions. The six SCREEN-SHARE legs were
WATCHED — the picture appeared at the far end — and a tone cannot measure a
screen share, so they are exactly as strong as a human looking at a screen.

  • Sable — audio both ways (measured), screen share both ways (observed).
  • Element Web, through Element Call — audio both ways (measured), screen
    share both ways (observed).
  • Lightning to Lightning across platforms, Windows to Linux — audio both
    ways (measured), screen share both ways (observed).

Those twelve legs were run on 0.9.7 packages, because they are the
packages that existed when the matrix was run. 0.9.8 changes the Linux audio
capture element and moves the whole Windows Qt stack, so the matrix does not
transfer to it unchanged and is not presented as if it does.

A 0.9.8 Windows package has since been run in a real call against a Linux
Lightning, with the tone measured in both directions — and its session was
migrated from a 0.9.7 install, so the upgrade path was exercised too. The
other ten legs have not been repeated on 0.9.8 binaries.

Calls: what reviewing this release found, rather than using it

A single undecryptable frame said somebody could not be heard. The call
header's "this person's media cannot be decrypted" badge was raised by the
FIRST frame that failed to decrypt. A live four-party call measured one such
frame in 3101 — and put a warning on screen for it. The badge is now decided
by a failure RATE over a sliding window of recent frames, raised high and
cleared low so it cannot flap, and the cryptor now names WHICH of six faults a
frame hit instead of the log guessing.

Ten of the eleven queues in the call paths were unbounded. 0.9.7 bounded
one of them, after a report of roughly one second of extra delay in one
direction. A GStreamer queue defaults to holding one second and never
dropping any of it, so one moment of anything downstream falling behind
becomes permanent latency for the rest of the call — and every other one was
left at that default: the queue feeding the video encoder, both queues on the
RECEIVE side (which is where a listener experiences the delay), the
screen-share audio path, and the whole one-to-one call lane, capture and
receive. All eleven are bounded now, and all but one drop old data rather than
hoarding it; the exception carries network packets into the video decoder,
where dropping one would corrupt the picture instead of shortening a delay.

jpegenc was never checked in the Windows package. It is not decoration
beside jpegdec: the app decides whether a camera takes the compressed path
by building a chain through it, so had it failed to register, every Windows
camera would have silently dropped to the raw path with nothing in any log to
say why. And no Linux package asked either — they checked that the plugin FILE
was present, which is not the same question. --call-media-status now reports
whether that chain actually works, on every platform.

A warning could outlive the person it was about. If someone's media could
not be decrypted and they then left the call, the warning stayed on the call
header for the rest of it, with nobody left for it to point at.

Voice delay, and a way to check it that does not need a room

0.9.7 fixed one queue after a report of about a second of extra delay in one
direction, and the only evidence for the fix was that it sounded better. This
release adds --call-queue-selftest, which measures the property itself:
it starves each queue's consumer and reports what the queue was still holding
once the consumer had caught up, with a plain unbounded queue running beside
it as a control.

It needs no call, no account, no second machine and no sound card, so it runs
from an installed package on any platform — which is the point, because the
acoustic rig that used to be the only way to ask needed all four. Measured on
every Linux package, on the development build and on a Windows 11 machine:
the shipped queues gave everything back above their limit, and the plain
queue held a full second and was still holding it. Every package's own
validation job now runs it and prints the result.

Under the hood

The Windows build toolchain moved to Qt 6.11.2, because Fedora withdrew every
6.11.1 package it pinned. Nothing in Lightning asked for a newer Qt.

Known limitations

  • What is left of the GStreamer licence gap. Every Lightning package that
    bundles GStreamer — the Windows builds, the AppImage and the snap — carried
    plugins from gst-plugins-good without that project's LGPL licence text.
    The text ships with them now. What is deliberately still open is whether
    Lightning should also publish a written offer for those plugins' source, and
    where; that is a decision about the project rather than about packaging.
  • The camera on Windows has failed once and then would not fail again. A
    session on 2026-09-16 published camera frames and drew no picture at either
    end. Every attempt to reproduce it the next day, on the same package and the
    same machine, drew a picture — on the compressed path and on the raw one,
    and the far end received and decrypted a thousand frames of it. Nothing in
    the code changed in between, so this is not a fix and is not claimed as one:
    it is an intermittent fault with no identified trigger, and until there is
    one, nobody should say the camera is reliable on Windows or that it never
    works.
  • macOS cameras have been sending uncompressed video. The macOS bundle
    never shipped the JPEG plugin, so a camera there falls back to the raw path
    — the same fallback that limits a Windows camera to 5 frames per second at
    1080p instead of 30. It ships in this release, but as an optional piece:
    nothing yet proves it is present on the machine that builds the bundle, so
    the next macOS build will report whether it took.
  • macOS remains untested for calls.

This is a read-only mirror. It is not a release authority.

The canonical Lightning 0.9.8 release lives on GitLab:
https://gitlab.smetonis.net/Mizerd/lightning/-/releases/v0.9.8

The files attached here are byte-identical copies of the artifacts published
there. They exist so downloads do not all have to come from one small server.
Nothing about this page decides anything: it does not determine what version
exists, what is installable, or what Lightning will accept.

Verify any download against the SHA256SUMS asset, which is itself a copy of
the published one.

Lightning's in-app updater fetches its update manifest only from GitLab a...

Read more

Lightning 0.9.7

Choose a tag to compare

@Mizerd Mizerd released this 16 Sep 14:00

Lightning 0.9.7

A calls release. If people could not hear you, this is the one.

People can hear you again

Lightning was sending your voice 12 dB too quiet on a multi-input audio
interface.
A USB interface — an audio box with several inputs, rather than a
plain headset — usually presents four or more capture channels with a
microphone on the first and nothing on the rest. Lightning asked the sound
system for a single channel, and it produced that single channel by averaging
all of them
. Your voice was mixed with three silences and came out at a
quarter of its strength: audible in theory, inaudible in practice, and the far
end heard nothing.

Lightning now takes the input that has your microphone on it. Measured on the
device this was reported against: the capture went from -33 dBFS to -5 dBFS.

Ordinary microphones and headsets are unchanged. A stereo microphone is still
mixed down the way it always was, because for an actual microphone that is the
right thing to do.

The delay is gone

Your audio reached the other side about a second late. The buffer between
the microphone and the encoder was allowed to hold a full second of sound and
never to let any of it go, so a single moment of the machine being busy turned
into a delay that lasted for the rest of the call — in one direction only.

That buffer is now a tenth of a second, and when it does overflow it drops the
oldest audio instead of queueing it. In a conversation a lost instant is always
better than a second of lag on everything that follows.

Lightning can tell you when your microphone is dead

This is the part that took a day to find, and the reason it took a day is that
nothing in Lightning could tell a working microphone from a silent one. An
encrypted call carrying pure silence produces exactly the same healthy-looking
counters as one carrying a conversation.

So Lightning now measures what it is actually sending:

  • the microphone's level goes into the log every few seconds, whether it is
    good news or bad;
  • if the microphone produces nothing at all while you are unmuted, you get a
    warning in the call header saying so;
  • and if the capture never starts, the log says that instead of staying quiet.

If you ever report "nobody can hear me" again, the first line of the log will
say whether your microphone was live.

Encryption in calls

A call could join an encrypted room without encryption. If Lightning had not
yet finished working out whether a room was encrypted when you pressed call, it
could publish your audio and video in the clear. It now re-checks at the moment
you join and never downgrades a room it knows to be encrypted.

Keys sent to you a moment too early were thrown away. The other person sends
their call key as soon as they see you join, which can arrive before Lightning
is ready for it — three such keys were discarded on every call, which is why the
first seconds of a call could report that someone's audio could not be
decrypted. Those keys are now kept and applied the moment the call starts.

Lightning no longer encrypts under a key that reached nobody. If a key could
not be delivered to anyone, Lightning keeps using the one the other side
actually holds.

Calling in rooms Lightning created

A room Lightning created did not let its own members join a call. Rooms were
created with the default permissions, which reserve call membership for
moderators, so an ordinary member pressing call published nothing. New rooms are
created correctly now.

Rooms created before this release still carry the old permissions and need them
changed by a room admin.

Diagnostics, for the next time

Lightning now records what a call is actually doing, because none of the above
could be found from what it used to record:

  • the microphone's level, every few seconds;
  • how many RTP packets really left the machine — the old counter was measured
    before the packetiser and said nothing about what was sent;
  • whether the call server accepted the microphone track it was offered;
  • and whether the microphone is muted, which had never been logged at all.

Still not fixed

Sending camera or screen share in an encrypted room does not carry. Receiving
works. This needs a change to how video is packetised and is not in this
release.


This is a read-only mirror. It is not a release authority.

The canonical Lightning 0.9.7 release lives on GitLab:
https://gitlab.smetonis.net/Mizerd/lightning/-/releases/v0.9.7

The files attached here are byte-identical copies of the artifacts published
there. They exist so downloads do not all have to come from one small server.
Nothing about this page decides anything: it does not determine what version
exists, what is installable, or what Lightning will accept.

Verify any download against the SHA256SUMS asset, which is itself a copy of
the published one.

Lightning's in-app updater fetches its update manifest only from GitLab and
verifies an Ed25519 signature made with a key that exists nowhere near GitHub.
Every downloaded file is checked against the SHA-256 recorded in that signed
manifest before it is installed, so replacing a file here cannot cause Lightning
to install it.

Issues, source, and history: https://gitlab.smetonis.net/Mizerd/lightning

Lightning 0.9.6

Choose a tag to compare

@Mizerd Mizerd released this 16 Sep 01:39

Lightning 0.9.6

A release of fixes.

Your messages are still there when the server is not

Lightning now starts, restores your session and shows your rooms with the
homeserver unreachable. You get your cached history, encrypted rooms included,
an honest "Offline — retrying" instead of a login form, and search still
answers from the index on your machine.

Before this, a homeserver that went down put you back on the login page and
asked you to sign in to a server that was not answering — with your account,
your messages and your keys all still on disk.

Encryption

Messages stuck on "Waiting for keys…" now recover on their own. When a
message arrives that Lightning cannot decrypt, it asks your key backup for that
message's key and tries again. Previously the only thing that could fetch a
missing key was re-entering your recovery passphrase, which is why the problem
cleared the moment you did and never cleared if you waited.

It is bounded: it only asks when an undecryptable message is actually in front
of you, it backs off if the server keeps refusing, and it never polls.

Reading a room

A reply shows the message it answers. Reply quotes read "(original message
not loaded)" even when the message was on screen a few rows up.

A room whose recent history is call activity no longer says it is empty.
Rooms that host calls accumulate thousands of hidden membership events; paging
through a run of them produced nothing to show, and "No messages here yet"
appeared over a room full of messages. The same run made those rooms take about
ten seconds to open.

The message toolbar works on short messages. On a one-line message with
read receipts, the hover actions and the receipts occupied the same pixels and
the receipts won, so Edit and the overflow menu could not be clicked at all.
Two related layout faults in the Bubbles theme are fixed with it: a sender name
that rendered outside its own bubble, and a receipt avatar clipping a bubble's
corner.

Search no longer claims it has indexed nothing while showing you results it
just returned from the index.

Forwarding is no longer confined to the Space you are in. Inside a Space,
the forward picker only offered rooms from that Space.

Calls

A call rejoined after a crash can receive media again. If Lightning exited
uncleanly during a call — a crash, a force-quit — rejoining that call left you
unable to hear or see anyone. Your own audio and screen share reached everybody
else; nothing came back, for the rest of the call, with no way to recover
short of waiting several minutes for the old session to time out. Other clients
could not tell the rejoining device from the one that had left, so they never
sent it the key their media is encrypted with.

Sharing a window with audio no longer ends the call. Choosing a screen
share source with audio disconnected you: the audio pipeline could not be
built, and the failure of that optional track tore down the whole session. An
optional track failing now costs you the track, not the call.

Joining a call no longer freezes the window while the audio devices are
enumerated.

Windows remembers your camera and microphone. Choosing a device showed it
selected and reverted to "System default" the next time you looked.

Qt Multimedia is no longer started at launch whether or not you make a
call, and a call log now says why a call has no server-side cleanup armed
rather than only that it has none.

Diagnostics

--log-file works when it follows another flag. The command a tester is
most likely to type —

Lightning --call-media-status --log-file out.txt

— exited successfully and wrote no file at all, on every platform. The
diagnostic commands also print into that file now rather than only to a
terminal, which on Windows may reach nobody. On Windows, --version > out.txt
produced an empty file because the console setup discarded the redirect.

GStreamer's device-probe warnings no longer flood the log. On some machines
GStreamer prints dozens of GstIntRange warnings while probing audio devices.
They are harmless and they are not Lightning's, but they made a log unreadable.
The first one is still reported, with an explanation; the repeats are counted.

Packaging

Screenshots appear in your software centre. 0.9.5 shipped an application
listing whose screenshot links pointed at a release that does not contain them,
so GNOME Software and KDE Discover showed none.


This is a read-only mirror. It is not a release authority.

The canonical Lightning 0.9.6 release lives on GitLab:
https://gitlab.smetonis.net/Mizerd/lightning/-/releases/v0.9.6

The files attached here are byte-identical copies of the artifacts published
there. They exist so downloads do not all have to come from one small server.
Nothing about this page decides anything: it does not determine what version
exists, what is installable, or what Lightning will accept.

Verify any download against the SHA256SUMS asset, which is itself a copy of
the published one.

Lightning's in-app updater fetches its update manifest only from GitLab and
verifies an Ed25519 signature made with a key that exists nowhere near GitHub.
Every downloaded file is checked against the SHA-256 recorded in that signed
manifest before it is installed, so replacing a file here cannot cause Lightning
to install it.

Issues, source, and history: https://gitlab.smetonis.net/Mizerd/lightning