Marmot Protocol Monthly Recap: April 2026

April 2026 saw Marmot get a long-term home with the new Internet Privacy Foundation, ship key spec upgrades, reach four interoperable clients, and pay down technical debt = clearing the path for multi-device support next.
Marmot Protocol Monthly Recap: April 2026

A new home

The April recap is the last one posted from the White Noise profile. Starting now, Marmot has its own Nostr identity. Future recaps and protocol news will come from there.

White Noise and Marmot have always been related but distinct: one is an app, the other is a protocol with a growing set of independent clients. Giving Marmot its own voice makes that distinction clearer and gives the protocol a place to speak for itself.

Follow the new Marmot profile if you want to stay current with the protocol side of the work.

Marmot on Nostr: @marm…r6m9

Marmot on X: <https://x.com/MarmotProtocol>

image


April was an institutional month. The Internet Privacy Foundation announced its launch with a party at Bitcoin Vegas, the Marmot team shipped disappearing messages and addressable key packages at the spec layer, Amethyst folded a pure-Kotlin Marmot stack into its Android client, and openChat pushed 67 point releases while marching through cross-client interop. White Noise work stayed heavy on the Rust core in preparation for the next mobile release.

The Internet Privacy Foundation

Internet Privacy Foundation (IPF) is a new 501(c)(3) that will serve as the long-term home and benefactor for White Noise, the Marmot Protocol, and the broader stack of tools the team works on. Its mission is to expand human agency in the digital world, and it funds that work in two ways: building privacy-preserving infrastructure directly, and funding independent builders doing the same work on non-extractive terms.

The site is live at ipf.dev , donations accept Bitcoin through BTCPay and fiat through Stripe, and the TypeScript SDK now publishes under the @internet-privacy npm scope. IPF launched publicly at Bitcoin Vegas with a meet-and-greet party for supporters, builders, and the broader Bitcoin and Nostr community.

Privacy is the ground freedom stands on. The work is to build parallel systems so good that people choose to move into them. IPF exists to carry that work for the long term.

IPF on Nostr: @ntrn…48ff

IPF on X: <https://x.com/ipf_privacy>

image

Protocol and SDK

Three spec changes will reach users in the next round of Marmot releases.

Groups now carry a retention secret. MIP-01 and MIP-03 added disappearing messages and bumped the group-context extension to version 3, so a group admin can set a message lifetime and every client expires messages on its own. The retention rule lives with the group, enforced by the protocol.

Push notification tokens grew. MIP-05 expanded the encrypted token from 280 to 1084 bytes, mostly to make room for UnifiedPush distributor endpoints. Those endpoints are long URLs, often over 280 bytes on their own, so the old token size forced Marmot pushes through APNs and FCM only. With the larger token, Android users on Google-free devices can receive Marmot pushes through whichever UnifiedPush distributor they run. iOS stays on APNs, where Apple requires it.

Departing a group got cleaner. Now any member can commit SelfRemove proposals so members can leave without waiting for an admin to come online. Admins now have to hand off their role before using SelfRemove, closing the last edge case where a group could lose its only admin by accident. A small fix to the MIP-03 minimum encrypted-content length and a thumbhash compatibility note for IMETA tags rounded out the spec work.

MDK got a path to upgrades. When a client creates a group, it now picks the feature set that everyone being invited can support, so a member on an older client still gets a clean invite. Members announce what they support on every update, and admins can raise the group’s required feature set once everyone has caught up. The upgrade path for the new group extension is in draft and lands alongside disappearing messages in clients.

The TypeScript SDK shipped @internet-privacy/marmot-ts@0.5.0 on April 22 with addressable key packages, so web clients stop relying on NIP-09 deletions to rotate their keys.

White Noise

April was a refactor month. The team made a deliberate choice to slow down on new features and fix the foundations, the kind of work that users don’t see directly but feel in everything that follows. A more stable release is coming out the other side, and the codebase is now set up to move faster on top of.

The biggest structural project was inside whitenoise-rs, the Rust library that powers the app. It was originally built for one thing: back the Flutter mobile app. Over time it grew to also power a CLI, a daemon, a TUI, and bot platforms like Botburrow. The problem was that all of those shared a single global state object, which made testing painful and made it harder to add new surfaces without things bleeding into each other. April’s refactor broke that apart: there’s now a shared database for process-wide state (keychains, settings) and a per-account database for user-specific state (messages, groups). The CLI was also pulled into its own standalone package. Phases 16, 18, and 19 of this work landed in April; the last singleton is on its way out in Phase 16b.

Unglamorous work. It’s what makes a private messenger trustworthy over time: code that can be verified, tested, and extended without cutting corners.

Database encryption moved forward too. The master key has lived in the platform keychain for a while. What remained plaintext on disk was the SQLite database holding messages, group state, and cached metadata. The open PR adds SQLCipher encryption with a one-time migration that converts existing databases without data loss. It’s slated to land with the next release.

On Android, the foreground service now restarts automatically on boot, so the app reconnects without the user having to open it first. The notification icon was also fixed for GrapheneOS, a small fix that matters to the people who care most about what White Noise is for.

The app shipped real features too. Video attachments work end to end. Search by message content is live across the chat list. The offline notice now appears on every screen, including auth flows and settings, so there’s never a moment where the app is silently disconnected without telling you. Block and unblock landed for contacts, with the full UI. Leave group is wired on the backend; the UI follows in the next release.

The key package cleanup is worth noting separately. Now that replaceable key packages exist in the protocol, the app identifies legacy packages, surfaces the distinction to users, and deletes the old ones cleanly. Stale state from earlier versions clears out as clients upgrade.

The contact action labels were renamed to Follow and Unfollow across all locales, making the relationship model clearer. Chat list filter UX was improved. Multiple screens were brought in line with the Figma designs, covering the chat list, group views, and several detail screens.

Fastlane release scaffolding also landed, which automates the steps between a finished build and a published release. Less manual work, fewer mistakes.

The month had the shape of a team paying down debt before the next push. The release is close.

Amethyst integrates Marmot

Amethyst, the most active Android Nostr client, wrote a pure-Kotlin implementation of MLS and Marmot in April and folded it into its Quartz library. Earlier Kotlin integrations leaned on native C or Rust bindings, which ruled out Kotlin Multiplatform targets like iOS. Quartz runs the protocol on its own now.

Most of the month went into cross-client compliance. Amethyst’s internal MDK matches the reference implementation byte-for-byte, key packages are advertised through relay lists so invitees can be found through the standard flow, and a new validator checks every cryptographic step against the reference test vectors. A lingering bug that caused state divergence between co-admins is fixed.

Amethyst also shipped a dedicated interop tool. amy is a command-line harness driven from the Amethyst implementation that lets anyone create groups, generate KeyPackages, simulate welcomes, and validate commits against Amethyst’s Marmot stack from the terminal. Paired with whitenoise-cli, it gives the protocol a working way to test compliance across two independent implementations from the outside, which is how most of the cross-client bugs this month were found.

Per-recipient relay routing and per-account store isolation also landed, so one Amethyst install keeps different Nostr identities cleanly separated. Multi-device (the same identity running on several devices at once) is still open across the whole Marmot side, including Amethyst.

openChat marches through interop

David Gershony’s openChat cut 67 releases in April, averaging more than two a day, driven by a tight loop of interop testing against White Noise. The C# client moved its KeyPackages to the new addressable event format, wrapped its commit messages so other Marmot implementations could read them, and fixed the Whitenoise interop test that kept flagging edge cases in the relay list handshake.

The supporting libraries moved in lockstep. dotnet-mls, David’s pure C# MLS implementation, spent the month hammering out RFC 9420 compliance. Cross-implementation testing against the reference test vectors now passes end to end.

The meta-story is that four clients (White Noise, openChat, Amethyst, Vector) are converging on the same wire format with independent implementations. Mixed-client groups work.

Vector adds an AI agent surface

Vector became the first Marmot client that speaks MCP directly. The new vector-agent server exposes 21 tools for AI agents, alongside fresh APIs for direct messages, invites, and key packages, plus automatic key rotation. An agent can now create groups, send messages, manage invites, and rotate keys from its own scripting environment.

Botburrow starts shipping

Botburrow is a new project under the marmot-protocol org, started April 3. It is a self-hosted dashboard for running bots inside Marmot groups. Each bot has its own Nostr identity, joins MLS-encrypted groups through the standard Welcome flow, and sends and receives messages like any human would.

The dashboard is a Rails 8.1 app that talks to a single whitenoise-rs daemon over a Unix socket. Custom Ruby scripts can inspect profiles, group membership, and pending invites. Multi-arch Docker images ship for Umbrel and Start9. Botburrow is aimed at operators who want to run bots in Marmot groups, with the bots joining as regular group members and an admin UI for wiring up their behavior.

Transponder security pass

Transponder, the Rust MIP-05 push notification server, spent April 14 on a concentrated security pass. The server now wipes its private key from memory after use, bounds how much memory a single malicious event can consume, redacts the key from debug output, and tightens APNs token validation. Transponder relays push notifications between Nostr and APNs, FCM, and UnifiedPush, and its design keeps message content out of its hands. The security pass tightens the boundary where that property has to hold up.

Purser builds a Nostr-native payment daemon on MDK

Purser is a Nostr-native payment daemon positioned as a Zaprite replacement. Strike and Square sit behind it as payment providers, and the whole merchant-to-customer conversation runs over Marmot-encrypted messaging through MDK.

April landed a concentrated build-out: a catalog loader, message validation, the MDK communication layer, Strike and Square integrations, a polling engine, rate limiting, payment persistence, and the order processing pipeline (PRs #16-23). The team also swapped its mock encryption layer for the real one, so all 99 tests now run against real MDK operations and catch interop issues with other Marmot clients during development.

The architectural bet is worth naming: Purser uses Marmot as the customer conversation channel itself, making it the payment rail’s primary surface. A customer opens a Marmot group with a merchant, discusses what they want, and pays through the same encrypted thread. Past payment stacks have treated messaging as a thin notification layer. Purser treats the conversation as the transaction surface.

Nymchat ships a protocol U-turn

Nymchat had a rougher arc. The client added Marmot MLS group chats in v3.57.261 earlier this quarter, ran the feature live for a few weeks, then reverted to NIP-17 in v3.58.268 because multi-device support is still open on the Marmot side and group state was diverging across devices. Subsequent releases through v3.58.288 in late April rebuilt the NIP-17 group chat path with rotating ephemeral keys, a friend system with granular permissions, and encrypted app settings.

The reversion is informative beyond Nymchat. It pins down which part of the Marmot story is load-bearing for a client with an active multi-device user base: the protocol works well for a group with one device per member, and the missing piece for clients like Nymchat is cleanly syncing the same identity across several devices. Multi-device is the work the team picks up next.

TubeStr polishes the family-video surface

TubeStr, introduced in the December 2025 recap as the first non-chat Marmot client, shipped v1.0.3 on April 13 and v1.0.4 on April 15 with follow-on build updates through the 17th. The month went into app polish more than protocol work.

PR #3 rebuilt the onboarding screens to walk families through how the app works step by step, which is the kind of friction-reduction MDK-built apps need before they can reach the audiences they’re aimed at. PR #2 fixes a video export failure when a LUT filter is used on paths containing spaces. Separately, April added Spanish localization, accessibility semantics so screen readers announce tab bar labels and profile-switcher context, and a centralized design-token system for spacing and border radius that the team can roll through the rest of the UI over time.

In Progress

Push notifications are converging. The protocol work on token size, the notification server’s security pass, and the iOS silent push plumbing in the Rust core all point at the same endpoint. What remains is wiring and testing across the whole delivery path, including UnifiedPush.

Disappearing messages are ready everywhere except the final upgrade path in MDK, which is the last piece the client draft is waiting on.

The White Noise Rust refactor is in its final phases. The core library coming out the other side is what will let Flutter, the CLI, the daemon, the TUI, and agent surfaces like Botburrow share one codebase cleanly, each keeping its own state.

Multi-device support is the biggest open gap. Nymchat’s reversion this month underlined it. It is the work that comes next after the refactor lands.

By the Numbers

Metric Value
Tracked repositories 57
Active repositories 15
Releases across all tracked projects 68
openChat releases 67
marmot-ts releases 1 (0.5.0)
White Noise mobile releases 0 (next release imminent)
Merged PRs 138
Commits 479
Marmot spec PRs merged 5
New marmot-protocol repositories 1 (botburrow)
Clients speaking the wire format in anger 4 (White Noise, openChat, Amethyst, Vector)

Contributors

Thanks to everyone who contributed code, design, specs, issue reports, talks, and planning this month: justinmoon, erskingardner, dannym-arx, jgmontoya, mubarakcoded, josefinalliende, untreu2, leesalminen, sergey3bv, hzrd149, DavidGershony, JSKitty, sjmcnamara, vitorpamplona, Datawav, Nikita L., Max, and Vladimir Krstic.


Start with the Marmot Protocol spec, MDK, or White Noise. The TypeScript SDK ships as @internet-privacy/marmot-ts. The Internet Privacy Foundation sits at ipf.dev.


Write a comment
No comments yet.