quoting
naddr1qq…hcq5White Noise next release
Push notifications work on iOS and Android. Chat messages render markdown. You can share to other apps, add members to a group, leave a group, and manage your blocked users from inside the app. Deep links take people straight to a chat, a profile, or a settings screen. White Noise now speaks Simplified and Traditional Chinese.
If you missed the last release, you also got video, blocking that applies across the whole app, an offline notice on every screen, and database-at-rest encryption. Those keep working in this release.
Push notifications on iOS
iOS now wakes White Noise through Apple Push Notification Service, the same delivery channel every other iOS app uses. The novel part is what happens after the push arrives.
A Notification Service Extension runs on your device, decrypts the encrypted payload, and replaces the empty notification with the sender and the message preview, in your language. Apple sees that a notification was delivered to your device. Apple does not see the message, the sender, the group, or your Nostr identity. The notification server that triggers the push does not see them either: notification triggers are gift-wrapped Nostr events signed by an ephemeral key, decoy tokens hide the real recipient count, and per-group probabilistic encryption prevents anyone from correlating you across groups. The full privacy model is specified in MIP-05.
A notification settings screen is now available on iOS as well as Android. Toggle push off and the account stops receiving them.
Android stays the way it was, with FCM groundwork
Android already had push notifications: a foreground service keeps a relay subscription alive and posts the silent "White Noise connected to relays" notification you have seen since launch. That path keeps working unchanged, with no Google Play Services dependency. It is what GrapheneOS and other de-Googled installs rely on.
This release adds the rest of the FCM pipeline alongside that path. If your phone has Google Play Services available, White Noise now requests an FCM token and gossips it to your groups so other members can include it when they trigger a notification. No FCM messages are being dispatched to those tokens yet. The tokens are circulating ahead of a quick follow-up release that adds the Android settings to let you choose: stay on the foreground service, switch to FCM-based wake, or some combination. Both paths route through the same MIP-05 privacy model on the wire.
Markdown in messages
Chat bubbles now render bold, italics, lists, code blocks, block quotes, headings, tables, and links. The parser also understands the Nostr extension format for
nostr:URIs.Plain-text messages take a fast path and look exactly like they did before. Nothing changes for people who send unformatted text.
@npubmentions render as@DisplayNameand open an in-app profile shade when tapped. Other Nostr URIs (note, nevent, nprofile, naddr, nrelay) still route through your OS so external clients can handle them.Share to anywhere
Long-press a message or open a photo or video in the media viewer, and the chooser now offers Save and Share as explicit actions. Share hands the content to the OS share sheet, so you can forward a message text or a downloaded attachment to any other app on your phone.
Before this release, long-pressing media silently dumped a file into your gallery with no feedback. Now it asks.
Group changes
You can now add members to a group from the group info screen, if you are an admin. The picker filters out people who are already in the group.
Leaving a group is on by default. From the chat list, long-press a group and pick Leave. If you are the last admin, the button shows you why it is disabled and offers a path: promote another member to admin, then leave. If your group includes members on an older client that does not understand the leave flow, the app says so directly.
When someone removes you from a group, the chat-removed warning now offers an Archive button so you can clean up without losing the history.
Deep links
You can now share a link that opens White Noise directly to a profile, a chat, or a supported settings screen.
whitenoise://user/<npub>opens the start-chat or profile view for that user.whitenoise://chat/<groupId>opens that group conversation.whitenoise://settings/...opens a supported settings path.The staging build registers a separate
whitenoise-staging://scheme so the two installs do not collide. Profile QR codes now encode a deep link, while the copy button still gives you the bare npub for places that prefer it.Chinese
White Noise now supports Simplified Chinese (
zh_Hans) and Traditional Chinese (zh_Hant). The Traditional version was translated independently for Traditional Chinese readers, preserving the regional differences that a mechanical conversion would flatten.Thanks to
stupidloudfor the original contribution.Blocked users
Settings now has a Blocked users screen under Privacy & Security. It lists every account you have blocked, each row opens a profile detail with an Unblock action, and the list refreshes when you pop back out. The chat composer is hidden when you open a conversation with someone you have blocked. The existing banner stays, and the input is gated too.
Smaller things
- Tapping an
@mentioninside a chat now opens the group member view when the tagged person is in the group, and the start-chat view otherwise.- Mention text uses the accent color so it stays readable on both light and dark chat bubbles.
- The QR scanner opens the camera on the first attempt after you grant permission.
- The QR code displays fully on small screens.
- The chat list search bar dismisses on Android swipe-back and keeps the app open.
- The group info screen scrolls for long member lists.
- Archived chats render correctly from the chat list summary.
- External signer notifications recover on Android after the signer app is force-quit.
delete all datanow completes within a bounded grace window, so a stuck background task can no longer hang the wipe.Under the hood
The Rust backend completed a long-running architecture refactor. The old global
Whitenoiseobject held about 25 fields and spread its implementation across more than 37 files. Per-account state now lives in explicitAccountSessionviews, projection-owning services have clear ownership, and each account gets its own database scope. This unblocks proper multi-device support and makes the codebase testable without a full app process.A new
whitenoise-markdowncrate replaces the previous token parser. It is a hand-written CommonMark + GFM + Nostr-extension parser that emits a typed AST, so Flutter can render every block and inline variant directly.Key package relay cleanup now runs once per account on startup and resume. After the invite quiet period passes, White Noise deletes stale legacy and canonical key package events from relays, then republishes a clean pair. The cleanup covers key-package relays, NIP-65 relays, and default account relays, tolerates unreachable relays, and marks completion so it does not run again.
Product analytics infrastructure landed in the Rust crate, opt-in only, with consent stored device-local. There is no UI for it yet. Until a settings toggle ships in a future release, the system stays dormant and records zero events.
Contributors
Jeff Gardner, Pepi, Danny Morabito, Mubarak Auwal, Javier Montoya, stupidloud, Datawav.
Get the update
Download from the GitHub releases page. No phone. No email. Just keys.
Release notes: vNEXT release notes
Report issues: marmot-protocol/whitenoise
