2025 Q4 Report

Project updates from Q4 2025

I doubt anyone is reading these, but I want to apologize anyways for this progress report being late. I had mentally checked it off as “done” and so forgot about it all through January.

Applesauce

During the last three months of 2025 most of my time was spent on adding features to applesauce and simplifying it so that its easier for developer and AI agents to use. which resulted in a big V5 release

Applesauce v5

To summarize some of the changes here:

  • A new event casting system, to validate events and make them easier to work with in UI components and async backends
  • Easy negentropy syncing with multiple relays
  • A better ( simpler ) React hook for subscribing to observables
  • Encrypted content caching to make it possible to implement NIP-17 DMs without spamming the user for decryption requests
  • NIP-60 cashu wallet primitives
  • Database storage backends for caching events. mostly useful for backend apps using applesauce

I also added or expanded support for a bunch of NIPs:

  • NIP-29 relay groups and chat
  • NIP-52 calendar events
  • NIP-75 zap goals
  • NIP-C0 code snippets
  • NIP-35 torrents
  • NIP-84 highlights
  • NIP-53 streams
  • NIP-23 articles
  • NIP-88 polls
  • NIP-17 direct messages
  • NIP-78 application data
  • NIP-91 relay and filters for indexable tags
  • NIP-45 relay COUNT requests
  • NIP-77 negentropy sync
  • NIP-61 nutzaps
  • NIP-60 cashu wallet
  • NIP-87 cashu mint reviews

noStrudel

When I wasn’t working on applesauce I spent some time cleaning up noStrudel for a V1 release. The major feature was adding support for the outbox model in the main timeline. that is to say the app now connects to the relays your contacts publish to in order to get the timeline.

This was probably one of the more complicated features I’ve worked on in nostr and I’m still not sure if I got the balance right. I built an example in applesauce to test the relay selection method to visually see how it would work.

Essentially its a balancing act between the max number of web socket connections the browser can support ( either technical limit, or artificial limit to preserve battery ) and the number of relays your contacts publish to. In my case I have 400 pubkeys I follow and they publish to 300+ different relays. Obviously I cant connect to all 300 relays, so the app has to choose how to group users into popular relays and how to quickly detect offline relays.

I also did a lot of cleanup on the app for the V1 release. there where tons of old experimental views that either didn’t work anymore or felt like they didn’t fit in the app anymore. I removed them all to make the app simpler and more focused on exploring the social side of nostr.

marmoTS

In October I joined the Marmot team to start working on typescript implementation marmoTS. since then gzuuus and myself have built them project up from a rough proof of concept to a functioning MLS chat app that communicates over nostr relays.

I also want to give credit to LukaJCB for building the awesome ts-mls library that has implemented all the necessary cryptography to make MLS possible in typescript and the browser. If it weren’t for his work I think it would have take me at least 6 more months to just understand how MLS works and how it should be implemented.

Blossom

Not too much on blossom, I’ve just been slowly refining the spec with the help of everyone who has been opening issues and PRs

Changes:

  • BUD-11 that defines the blossom: URI format for more resilient links to blobs
  • Added Implementations folder for extra documents that outlines possible implementations of blossom

And other stuff

window.nostrdb (NIP-DB)

Ever since Cody built nostr-relay-tray I thought there should be a NIP like NIP-07 that outlines how local relays should be treaded and how they should be exposed to web apps.

Well in December I finally got around to writing NIP-DB and a polyfill library window.nostrdb.js that will automatically setup the window.nostrdb interface for the web app. the idea is to provide a universal event store interface for web apps that they can use as a cache and optionally can use to search locally stored events using NIP-50 if the local relay supports it.

The library will automatically connect to a local relay running on ws://localhost:4869 (nostr-relay-tray and Citrine) or fallback to storing events in an Indexeddb using nostr-idb

I’ve been using this in all my smaller web apps since and its been great to not have to think about event caching anymore and to have it automatically use my local relay.

Backyard explorer

Inspired by Gigi’s ants.sh I built a slightly faster tool for myself called backyard-explorer and to test my new window.nostrdb.js library.

Its been pretty useful even though its missing most of the good UX from gigi’s tool. but if you have nostr-relay-tray or Citrine running locally id encourage you to give it a try. here

NOTE: it only searches the local relay, so if there aren’t any events in your local relay it wont do anything. like I said missing features :)

Flower cache

A local blossom proxy server that proxies requests for blobs to other servers based on BUD-11 and caching the blobs locally for offline access.

At some point I want to integrate this into nostr-relay-tray so that noStrudel and all other nostr apps I’ve built so that if the user has a local blossom server running on their system it will use it to cache all blossom links

Github

Vertex CLI

I cant remember why I built it, but I made a CLI tool for interacting with Vertex called Vertex CLI.

Simple STL viewer

A vibe-coded embedable 3D viewer for .stl files. github live deno


No comments yet.