2026 Q1 Report
Another three months of frantic building on nostr and blossom. Time goes by so quickly and the only way I’ve been able to remember all the stuff I’ve worked on is by looking back into my commit history on github.
Blossom
I finally merged BUD-11 Authorization into the blossom spec which organizes all the authorization details into a single document instead of leaving them spread out across the repo. It also clarifies a lot of details around how nostr authorization is supposed to work and adds a new server tag to the authorization event that will allow clients to scope an authorization token to a few servers.
Thanks to @Pip the WoT guy for helping and pushing me to get authorization cleaned up.
On the code side of things, I completely rewrote my blossom-server in Deno to make it faster and to fix a ton of bugs. I didn’t realize it but that project is two years old at this point… two years of bad code that I hacked together for the original demo in SEC-01.
Well with the help of codex its all stream based now, no buffering files in-memory. I didn’t realize how big of a deal this was. the server went from crashing or freezing if it received more than 2 uploads at a time to being able to handle 20+ concurrent uploads. I probably should have known this when I wrote it initially, but that was two years ago and I had to get something working for a demo :D
I also built flower-cache, a blossom cache server. It runs locally caches requests to other blossom servers, which helps with performance and reliability.
Static sites on nostr
This is probably the most exciting thing I worked on this year. The concept of publishing static sites using blossom servers and nostr relays was initially built by @Lez in SEC-02 more than a year ago. I opened a PR to the nips repo and built nsite-gateway after I saw the idea. but it never really worked well, or never well enough to be stable enough to host noStrudel and other apps on it.
Well after I fixed the major performance issues with my blossom server my nsite gateway magically become a lot more stable… so I decided to completely rewrite it in Deno too. This was also a great success and resulted in nsite.lol finally being stable enough to host large web apps like noStrudel.
Then something magical happened, the NIP was merged as NIP-5A. so this officially makes me a contributor to nostr.
I also helped @Sandwhich update the nsyte CLI tool to support the new NIP-5A spec. I added get and put commands, a snapshot command for nsite manifests, batched blossom authorization tokens, and a bunch of other improvements.
Another fun experiment was passwd-nsite, which allows users to publish password encrypted static sites. The idea is simple: encrypt the site archive before publishing it to blossom, and decrypt it in the browser when the user provides the password. You can see a demo (password: syncing) and try the app itself.
This is just the start though, there is so much unexplored potential for hosting static sites on top of blossom and nostr relays. hopefully it does not take up all my attention for next quarter.
I also want to thank @Sandwhich for continuing to push me to fix my broken code.
Marmot
As if I didn’t already have enough cool projects to work on, I decided to help the White Noise team with building the marmot-ts library for MLS messaging in TypeScript. Its built on top of the fantastic ts-mls library by Luka Jacobowitz.
@Gzuuus and I made a lot of progress and built marmots-web-chat, a web reference implementation that can send and receive messages and media with the White Noise android app that is built using MDK ( rust ) and flutter. We got MIP-04 encrypted media working with Blossom uploads, added invite flows, leave group, and a mobile layout.
There is still a ton of work left to do including proper documentation and support for newer additions to the Marmot protocol.
Nostr Protocol
I opened a few new NIP proposals this quarter. The first is NIP-DB, which defines a standard window.nostrdb interface for browsers. The idea is to give web apps a shared local database of nostr events, similar to how window.nostr gives them access to keys. I also built nostr-idb as a reference implementation of the spec using IndexedDB.
The second is NIP-91, which adds an AND operator for relay filters and is a continuation of the first PR.
Applesauce
I have been slowly working on a V6 release for applesauce. There is a lot of small improvements and bugs I’ve found while using it. You can see all the pending changes on the PR
The most exciting change is adding support for request completion conditions to the applesauce-relay package. This allowed me to make it so that requests to multiple relays would complete five seconds after the fastest relay returned EOSE ( request complete ).
Doing this prevents requests from hanging or taking 30+ seconds because it’s waiting to connect to an offline relay.
This doesn’t sound like much but it cuts down the request time to less than 6s compared to 30+ seconds it used to take when there is an offline relay, and there is always an offline relay.
Another breaking change is the introduction of event factories. Which are specialized classes that provide a simple interface for building and modifying common event types from almost all of the NIPs.
I still have to finish updating the documentation, but once that’s done I hope to have a V6 release out for all the applesauce packages.
I also added an MCP server for applesauce that greatly improved my agents ability to use the library and get the import statements right. check it out if you are using agents and applesauce to build something.
noStrudel
I haven’t done much on noStrudel since December. besides fixing a few bugs, updating dependencies, and improving the UX of smaller views.
I hope to have a V1.2.0 release out in the next month, but it won’t be very exciting. mostly bug fixes.