Marmot Protocol Monthly Recap: March 2026
Published on 1 Apr 2026

March: two White Noise releases, five clients shipping, a security audit landing in code, and a terminal client that finally cuts Flutter out of the picture.
March was a stabilization month. Two White Noise releases went out to fix the rough edges that showed up after v0.3.0, a security audit started reshaping the SDK, and a new terminal client turned the Rust backend into something you can use without Flutter. Five independent Marmot clients shipped code, and the team gathered in Florianopolis for Bitcoin++ between releases.
Stabilizing White Noise
The March 5 release broke backward compatibility deliberately, moving group messages from the old NIP-44 wrapper to ChaCha20-Poly1305 so every client could use the same encryption format. Older groups needed the clean break.
That release also fixed two problems people hit right after v0.3.0: new group members could miss messages during a brief window after joining, and slightly older group-state messages were incorrectly marked as failed even though they should have decrypted fine.
Sends stopped being invisible. White Noise now shows whether a message is still sending, has reached relays, or failed, with a reason attached, and failed sends retry automatically with an option to retry by hand.
Swipe-to-reply landed alongside clearer invitation messages, working media previews, and image-only chat summaries. The iOS startup crash from duplicate tracing initialization is gone, and debug logs from the Rust backend are now visible inside the app.
The March 25 release went after relay churn on heavier accounts, where too many connections were building up, login slowed down, reconnect loops piled up, and message delivery got flaky. Login now finishes faster, temporary connections clean up after themselves, and restored sessions recover without piling up stale state.
That release switched to the newer Nostr threading convention for replies, added an in-app bug report screen with NIP-44 encrypted reports, and added in-app support chat that reopens an existing conversation instead of starting a new one. Startup failures in the Flutter/Rust bridge now show a real error screen instead of leaving you staring at the splash screen.
Security Audit
Least Authority's audit of MDK moved from spec-level findings into code-level changes this month. By mid-March, the results were landing in the Rust core: tighter group-invite validation, media download limits, HTTPS enforcement on Blossom URLs, key-package fetch filtering, and Apple Silicon credential storage fixes. PR #634 closed the last item in a three-part group-invite validation set. MDK also added `cargo audit` to CI and bumped a crypto dependency for two March Rust security advisories.
Beyond Flutter
The Rust backend is no longer tied to Flutter. `whitenoise-rs` now ships with a CLI and a background service that lets you create identities, inspect accounts, manage groups, send messages, and script the whole thing from a terminal.
`wn-tui` turned that backend into a terminal chat client with split views, group details, user search, follows management, and a status bar for account state and pending invites. It is still early but already usable as a daily client.
`dr.marmot` widened into `nostr-doctor` as the same relay diagnostic problems showed up across Nostr. Some of the earlier White Noise relay trouble came from the app, but some came from stale or missing relay data that users had already published. When that data drifts, other clients stop knowing where to find you. `nostr-doctor` checks dead relays, relay drift, key-package relay lists, deletion support, Blossom server status, and old NIP-51 lists.
Five Clients Shipping
Five independent Marmot clients shipped code this month.
openChat, built in C#, had the busiest month with 10 releases and 148 commits. Voice messages went from zero to working with recording permissions, Opus encoding, Blossom upload, and a send/receive flow. MIP-04 encrypted media attachments, a newer cipher suite for cross-client compatibility, and a reworked startup sequence landed in the same window.
Vector reached v0.3.3 across three releases. Group management, Android notifications with inline reply, and app-level encryption came first, followed by image spoilers, mentions, emoji shortcodes, and tap-to-react. v0.3.3 shifted to hardening with a memory-hardened key vault, anti-debug protections, and SQLite memory use reportedly dropping from ~308MB to ~5MB. The Vector team also shipped [VectorPrivacy/DOOM](https://github.com/VectorPrivacy/DOOM), real-time P2P multiplayer DOOM delivered as a WebXDC chat message with no central server and proof that the transport layer works for more than text.
Pika shipped four releases focused on build infrastructure, group-membership plumbing, and OpenClaw integration, including a dashboard for customer-managed deployments. Burrow added read receipts, typing indicators, and link previews. The TypeScript reference client (marmots-web-chat) picked up encrypted media, leave-group support, a stronger mobile layout, and WebXDC mini-app support.
Shared Protocol and SDK
The spec tightened around real failure cases. Group-message encryption changed, push-token formats were cleaned up, Welcome event details got clearer, and non-admin users can now propose removing themselves from a group. Key packages moved toward a replacement model where clients publish a new one under the same stable identifier instead of trying to delete the old one everywhere.
MDK shipped twice in the first week with encrypted media support in the language bindings (Kotlin, Swift, Python, Ruby), a file-key derivation fix, and smaller Android and iOS release binaries. The TypeScript SDK published `@internet-privacy/marmot-ts@0.4.0` with graceful group leave, better state persistence, and subscription handling.
`transponder` is the Rust implementation of MIP-05, a privacy-preserving push notification server that sits between Nostr relays and Apple/Google push services. It subscribes to relays for gift-wrapped notification requests, decrypts them with ephemeral keys, and dispatches silent pushes to APNs and FCM without ever learning message content, sender identity, or group membership. In March, transponder aligned with the latest MIP-05 spec changes around token format and encoding validation, added transport retry with exponential backoff for APNs and FCM failures, switched to batch-based dispatch with proper shutdown draining, and fixed an event-loop stall that could stop relay ingestion after lagged notifications. The .NET MLS library (`dotnet-mls`) added tree-validation tests, fixed signing and parent-hash handling, and corrected a state-corruption bug.
Bitcoin++ Florianopolis
The team spent time together in Florianopolis around Bitcoin++. Max gave [*From PGP to Marmot: Three Decades of Messaging Protocol Exploits and Defenses*](https://www.youtube.com/watch?v=hQ3yfiMQ81I), which traced failures in encrypted messaging from PGP and OTR through Signal-era attacks, then closed on where Marmot fits. Danny Morabito gave [*The Vibes are Off: Foundations Matter*](https://www.youtube.com/watch?v=8l6Lah8mntQ), a case that strong foundations matter before the stack gets ambitious. Both talks fit the month well, with the protocol's case getting public airtime while the code got the fixes it needed.
In Progress
Mute/unmute support, gallery image saving, notification settings, and push-registration persistence are all active on the White Noise side. The spec-side change for replaceable key packages has landed; MDK and client follow-through is still in review. Self-remove support merged in the spec and is working through SDK and client layers. Pika's OpenClaw channel plugin work and typed voice interfaces are still in flight.
By the Numbers
| Metric | Value |
|--------|-------|
| White Noise releases | 2 |
| Marmot clients shipping code | 5 |
| openChat releases | 10 |
| Vector releases | 3 |
| Pika releases | 4 |
| New tools | CLI, TUI client, nostr-doctor |
| Conference talks | 2 (Bitcoin++ Floripa) |
Contributors
Thanks to everyone who contributed code, design, issue reports, talks, and planning this month: justinmoon, erskingardner, dannym-arx, benthecarman, futurepaul, jgmontoya, josefinalliende, mubarakcoded, hzrd149, untreu2, gzuuus, nikitawvi, DavidGershony, JSKitty, YuurinBee, selkij, Centauri, rphilbrdigits, Datawav, Awiteb, dergigi, kelaode-dev, jodobear, Max, and Vladimir Krstic.
Start with the [Marmot Protocol spec](https://github.com/marmot-protocol/marmot), [MDK](https://github.com/marmot-protocol/mdk), or [White Noise](https://github.com/marmot-protocol/whitenoise). The [TypeScript SDK](https://github.com/marmot-protocol/marmot-ts) is ready for web builds.