White Noise v2026.3.23
Published on 25 Mar 2026

Read the notes. Max doesn't hold back on what broke and why.
This release starts with the problem people felt most. The previous release was rough on heavier accounts. If you followed a lot of people, White Noise could accumulate too many relay connections, spend too long logging in, and fall into reconnect churn, with message flow turning unreliable in the worst cases. This release fixes that first.
Between `2026-03-05` and `2026-03-23`, the mobile app merged 31 pull requests across 214 changed files. Six separate `whitenoise-rs` repins pulled in the backend work that made most of this release possible. There is no migration here. You update and keep your data.
Relay work first
The relay layer had been doing too much in one place.
Long-lived session relays, one-off discovery relays, query relays, and publish relays were all leaning on the same machinery too often. New relays tended to stick around. Subscription refreshes fired too eagerly. The backend tracking issue for this work describes it plainly: too many failed relay connections, repeated reconnect attempts, and unstable behavior caused by relay lifecycle problems in the app itself (`whitenoise-rs#569`).
This release cuts that down in a few ways.
Login no longer waits on every relay list publish before moving on. Relay-list publishing now uses quorum logic, then retries the rest in the background (`whitenoise-rs#669`). One-off fetches and publishes now use scoped ephemeral relay sessions, so temporary work does not keep bloating the long-lived pool (`whitenoise-rs#592`, `whitenoise-rs#600`). Relay lists repair themselves when a transient failure leaves them missing from the network (`whitenoise-rs#673`). Restored sessions also recover their group refresh path after startup instead of quietly going stale (`whitenoise-rs#682`).
The app side exposes more of this work. `The great relay restoration` added relay diagnostics, relay state inspection, and key-package management. The follow-up screen work made those tools easier to use and easier to trust (`#495`, `#502`).
If the last release felt unstable on an account with a large follow list, this is the fix.
Conversations read better now
Replies now follow NIP-C7. White Noise writes a single `q` tag and a `nostr:nevent` reference, which gives other Marmot clients a clean way to resolve the target message (`#468`, `whitenoise-rs#581`).
Deleted messages also stay visible as deleted. Earlier builds simply removed them from view, which made conversations look damaged. Now the chat keeps a placeholder, adjusts bubble grouping around it, and drops the interactions that no longer make sense on deleted content (`#471`, `#512`).
User metadata now updates in place across chat lists, profiles, invites, and search results. No remount needed. No second visit to the screen. `#522` brought that into the app, and `whitenoise-rs#676` added the per-user stream behind it.
The start-chat flow also stopped fighting the user. Self-actions are gone. Missing DM metadata can use a blocking sync when needed. The screen shows the avatar while key-package checks finish instead of covering the whole slate with a loading state (`#517`, `#443`).
Support lives in the app now
Two additions close the distance between hitting a problem and doing something about it.
White Noise now has an in-app bug report flow. Reports are NIP-44 encrypted and sent from an ephemeral key by default. You can include your public identity if you want to. You do not have to.
Support chat is now part of the app too. If a support conversation already exists, White Noise opens it directly. If not, it starts one without sending you through user search first (`#478`, `#486`, `#517`).
Failure paths are clearer
If the Flutter/Rust bridge failed during startup before, White Noise could leave you parked on the splash screen with no useful signal. This release replaces that with a real fatal error screen. Staging builds show the details. Production keeps the message brief and user-facing (`#477`).
The log screens also became worth using. You can pause live scrolling, resume it, keep far more history in memory, filter logs by level, and copy everything at once (`#474`, `#502`, `#517`).
The visible parts got another pass
Login, signup, slate, and settings all got another round of design work. The onboarding carousel sits more cleanly in the login flow. Settings and slate screens have tighter navigation and spacing. Signup got a fuller pass, including the callout and button work needed to match the design source more closely (`#459`, `#504`, `#519`).
There are smaller pieces around the edges too: a Zapstore update prompt on Android, translation fixes, a cheaper group list query path, and the usual dependency work that keeps the next release from getting worse before it gets better (`#481`, `#506`).
The crate bumps were the story too
The short app changelog does not say enough here because six pull requests in this release window were some variation of `update rust crate`.
Between `6aff825` and `60770fd`, those repins pulled in relay cleanup, NIP-C7 reply support, `visible_groups_with_info`, Zapstore version fetching, media integrity fixes, relay-list maintenance, and the per-user metadata stream. A line item that says `update rust crate` can carry most of the release on its back. This one did.
Contributors
This release window includes work from Jeff, Pepi, Javier, Danny, Emir, Max and Nikita L. Nikita made a first contribution with the self-profile guard that removed invalid self-actions from search and start-chat flows.
Get the update
If you use White Noise today, update to `v2026.3.23`.
If the last release felt rough on a heavier account, start here. White Noise still asks for no phone, no email, just keys.

Download: GitHub releases page for `marmot-protocol/whitenoise`
Read the release notes: `v2026.3.23-release-notes.md`
Report issues: GitHub issue tracker for `marmot-protocol/whitenoise`