Nostr Compass #27
Deze week draaide veel om signer-werk, P2P-handelsprotocollen en releases van belangrijke clients. Amethyst v1.12.0 levert ruim 170 PR’s met NIP-60-Cashu-wallets, NIP-61-nutzaps, NIP-82-feeds voor software-apps, NIP-F4-podcastondersteuning, CLINK-verificatie van on-chain zaps, fase 1 en 2 van de KMP-migratie naar iOS en een zelfherstellende Tor-driver. Clave v1.0.0 (build 102) werd ingediend bij de App Store en brengt door pushmeldingen gewekte ondertekening op de achtergrond en verificatie van binnenkomende signatures naar iOS. Mostro Core v0.13.0 levert Protocol v2, dat ordercommunicatie via relays vervangt door met NIP-44 gift-wrapped directe berichten, en Mostro v0.17.5 maakte de anti-misbruikborg aan de kant van de operator optioneel en configureerbaar. Signet v1.11.0 dicht een signature-bypass in NIP-17 (gift-wrapped privé-DM’s) voor beheerderscommando’s, waarmee iedereen met openbare informatie kill-switchcommando’s kon vervalsen. Chama bracht in zes dagen zeven escrow-releases uit en veranderde de handelsruimte van een muur aan bedieningselementen in een gesprek per deelnemer. Aan de signer-kant implementeren Amber v6.2.1, Clave (builds 100, 101 en 102) en Nostur 1.29.0 allemaal de nieuwe NIP-46-logout-methode die deze week werd samengevoegd (PR #2373). Zeus v13.1.0-rc1 en Amethyst leveren beide ondersteuning voor CLINK-noffers, de voorgestelde gemeenschappelijke Lightning-interface voor Nostr-sleutels. Voor NIP-29-relaygroepen verschenen vijf open voorstellen voor bannertags, uitnodigingscodes, vastgezette berichten, groepsrapportage via NIP-17-DM’s en rolgebaseerde toegangscontrole.
Topverhalen
Amethyst v1.12.0 levert Cashu-wallets, nutzaps, een CLINK-driver en zelfherstellend Tor
Amethyst is de dominante Android-client voor Nostr van Vitor Pamplona. v1.12.0 bundelt de 93 PR’s die in Nieuwsbrief #25 als nog niet uitgebracht werk werden behandeld (NIP-32-hashtaglabels, een NIP-F4-podcastscherm, muziektracks, tijdelijke signers en on-chain zaps met NIP-05-filter) en in Nieuwsbrief #26 (vervolgwerk aan NIP-F4 en de basis voor een Tor-watchdog), plus een flinke nieuwe reeks van deze week. Het nieuwe werk concentreert zich op Cashu en nutzaps, een CLINK-driver voor on-chain zaps, een zelfherstellend Tor-cluster en de KMP-migratie naar iOS.
Ondersteuning voor NIP-60-Cashu-wallets en weergave van NIP-61-nutzaps komen binnen via PR #3075, samen met een saldo-overzicht per mint (PR #3115) en een uniforme UI voor betaalkaarten (PR #3191) die Lightning-adressen, on-chain zaps, Cashu-mints en NWC samenbrengt op één profielbetaalscherm (PR #3185). Een CLINK-driver voor verificatie van on-chain zaps verschijnt in PR #3039, PR #3177 en PR #3182. CLINK staat voor Common Lightning Interface for Nostr Keys, dezelfde noffer-interface die Zeus v13.1.0-rc1 deze week levert. Amethyst voegt een verificatiestatusmachine, een driver voor herverificatie en een minimumbedrag voor on-chain zaps toe (PR #3030). PR #3201 introduceert privénotes door kind-1-antwoorden aan gebruikers met een p-tag volgens NIP-17 te gift-wrappen, zodat de composer afhankelijk van de geadresseerden een openbare note of een verzegeld groepsantwoord produceert.
Een cluster voor Tor-betrouwbaarheid vormt een volledige zelfherstellende stack: PR #3053 verhoogt Arti naar v2.3.0 met een watchdog en integratietests, PR #3223 houdt via Tor geroute relayverbindingen tegen totdat Tor gereed is, PR #3224 begrenst het opstarten van Arti met een timeout van 60 seconden zodat een vijandig netwerk de lus niet kan blokkeren, en PR #3231 herstelt automatisch wanneer Tor Active is maar alle circuits dood zijn. Het resultaat is een Tor-stack die zonder handmatig ingrijpen herstelt van netwerkwijzigingen en slaap-hervatcycli. Fase 1 en fase 2 van de KMP-migratie naar iOS verschijnen in PR #3047 en PR #3050. Daarmee wordt iOS-CI voor de modules quartz en commons gedeblokkeerd en de basis gelegd voor een iOS-build van Amethyst.
Mostro Core v0.13.0 haalt met Protocol v2 de relay als tussenpersoon weg
Mostro is een via Lightning afgewikkelde P2P-Bitcoinbeurs die Nostr gebruikt als orderboek en communicatielaag voor transacties. v0.13.0 van mostro-core, de Rust-library die het wire-protocol definieert, vervangt het via relays geroute berichtenmodel door wat de changelog Protocol v2 noemt: direct NIP-44-transport over kind 14-events. Handelsspecifieke acties reizen nu als kind 14-berichten, verpakt volgens NIP-44 en gebonden aan de sleutel per transactie die de deelnemer bij het aanmaken van de order genereerde, zonder dat het handelsgesprek via openbare adresseerbare events heen en weer hoeft.
In het vorige model lekte het hele handelsgesprek naar elke relay die de events vervoerde. Direct kind 14-transport houdt het opzetten van orders, geschillen en afwikkelingsmetadata tussen de twee partijen en de Mostro-daemon; de relays zien alleen versleutelde envelopes. Naast de transportwijziging bindt v0.13.0 ook het v2-identiteitsbewijs aan de handelssleutel (commitlog), wat een categorie replayrisico’s tegen het nieuwe protocol sluit. Aan de daemon-kant maakte Mostro v0.17.5 de anti-misbruikborg optioneel en configureerbaar door de operator: voordat bepaalde transacties beginnen, kan elke partij een kleine borg moeten vastzetten die bij normale voltooiing terugkomt en bij traineren, niet opdagen of tegenwerken vervalt. De borg wordt op het niveau van de node-operator ingeschakeld en niet netwerkbreed opgelegd. Mostro blijft daardoor non-custodial en elke operator kiest zelf de afweging tussen marktwrijving en weerstand tegen misbruik. Aan de client-kant leverde Mostro Mobile v1.2.8 zeventien functies voor het nieuwe pad, waaronder ontdekking van bootstrap-relays in plaats van vast ingestelde standaardrelays (PR #610), de anti-misbruikborg voor makers bij het aanmaken van een order als fase 5 van de borguitrol (PR #608) en opslag van orderannuleringen met context in de meldingsgeschiedenis (PR #602). v1.2.9 volgde twee dagen later en toont het anti-misbruikborgbeleid uit het node-info-event, zodat een gebruiker de borgregels van de Mostro-instance kan zien voordat die een order opent (PR #617).
Signet v1.11.0 dicht een NIP-17-signature-bypass voor beheerderscommando’s
Signet is een remote bunker-signer met een kill-switch waarmee een beheerder de signer via Nostr in paniekstand kan zetten, kan heractiveren of kan controleren zonder de hostmachine aan te raken. v1.11.0 verhelpt een beveiligingsfout waarbij het pad voor gift-wrapped beheerderscommando’s volgens NIP-17 alleen de geclaimde auteur van de onondertekende inner rumor controleerde en nooit de ondertekende seal verifieerde. Omdat conversatiesleutels van NIP-44 symmetrisch zijn, kon een aanvaller met alleen openbare informatie, de pubkey van de signer, de npub van de beheerder en een beheerrelay, van buitenaf een gift wrap vervalsen en elk kill-switchcommando uitvoeren, waaronder panic, resumeall en alive. De reparatie roept verifyEvent aan op de seal en bindt de auteur van de rumor aan de signature van de seal, zodat onondertekende vervalsingen nu bij de poort worden geweigerd. Signet-operators moeten snel upgraden; de specificatie en het gerepareerde codepad geven een aanvaller samen een duidelijk reproductierecept.
Chama v3.2.0 tot en met v3.5.0 tekent de handelsruimte opnieuw en verhardt het geldpad
Chama is een Nostr-native P2P-escrowclient die Fedimint-ecash combineert met 2-uit-3 Shamir secret sharing voor handelsafwikkeling zonder server. Nieuwsbrief #26 behandelde de reeks van v2.0.0 tot en met v3.1.0, waarmee Chama een zelfstandige app werd en winkels per verkoper toevoegde. De zes vervolgreleases van deze week beginnen bij v3.2.0 en eindigen op 15 juni bij v3.5.0. Ze tekenen de UI van de handelsruimte opnieuw rond één vraag per rol, wat moet ik nu doen?, en beschermen het geldpad beter tegen gedeeltelijke fouten. v3.2.0 gaf koper, verkoper en arbiter ieder eigen kleurgecodeerde actieprompts, zodat elke rol in iedere handelsstatus zijn volgende stap ziet. v3.3.0 scherpte twee consensusregels in de handelsengine aan en vereiste gecoördineerde clientadoptie om ze van kracht te laten worden. v3.3.1 lokaliseerde prijzen en betaalmethoden naar de communityvaluta van de handelaar. v3.4.0 voegde vijf verhardingen aan het geldpad toe, zodat een hapering, race of gesloten tabblad een gebruiker niet ongemerkt sats kan kosten. v3.5.0 voegde twee client-side guardrails toe rond de arbiterrol, de enige rol die anders ongemerkt een transactie kon kantelen.
Clave 1.0 gaat naar de App Store met door push gewekte ondertekening op de achtergrond
Clave is een iOS-NIP-46-remote signer die de Nostr-privésleutel van de gebruiker in de iPhone Keychain bewaart. Apps vragen signatures aan via een end-to-end versleuteld kanaal en ontvangen nooit de sleutel zelf. v1.0.0 build 102 werd deze week bij de App Store ingediend en markeert na acht maanden TestFlight-bèta’s de 1.0-mijlpaal. De release levert door push gewekte ondertekening op de achtergrond: Clave kan met de app gesloten een verzoek ontsleutelen, permissies controleren, ondertekenen en antwoorden. De iOS-eis dat de app op de voorgrond moest staan en die de reactiesnelheid van de signer eerder beperkte, is daarmee verdwenen. Binnenkomende signatures worden geverifieerd met BIP-340 Schnorr over het canonieke eventserialisatieformaat van NIP-01, de basisspecificatie die bepaalt hoe elk ondertekend Nostr-event wordt gehasht, plus een guard tegen oude replayberichten, zodat een kwaadaardige app geen opnieuw ondertekend event via het antwoordkanaal kan binnensmokkelen.
De release levert ook de bijgewerkte NIP-44-versleutelingslaag met een permissiemodel per kind en drie gevoeligheidsniveaus, repareert het randgeval bij ondertekening met weinig vertrouwen waarbij een verzoek van het type “elke keer vragen” al een fout teruggaf voordat de gebruiker toestemming kon geven, en voegt koppeling van meerdere accounts toe zodat één app-koppeling via meerdere identiteiten kan lopen. Bunker-koppelingen tonen nu de echte app-identiteit via de uitbreiding met connect-metadata voor NIP-46 die Clave voorstelde in PR #2381. De nette ontkoppelingsstroom gebruikt de nieuwe NIP-46-logout-methode die in PR #2373 werd samengevoegd, zodat een gekoppelde app zijn sessie netjes kan beëindigen zonder handmatig ontkoppelen. Vertrouwensniveaus per app (Full, Medium, Low) met overrides per eventkind, een activiteitenlogboek voor elke signature en een zelf mee te brengen pushproxy maken het geheel af; de proxystack heeft een MIT-licentie en de interoperabiliteitsmatrix per client wordt bijgehouden in docs/nip46-compatibility.md.
Releases
Amber v6.2.1 voegt NIP-46-logout toe en verlaagt het batterijverbruik van de signer
Amber is de dominante Android-signer voor Nostr. v6.2.1 verlaagt het batterijverbruik door opnieuw verbinden met relays en websocket-pings, verwijdert dode relays uit de subscriptionpool en wekt het apparaat niet langer bij het bijwerken van de relaymelding. De release voegt ook ondersteuning voor de logout-methode van NIP-46 toe, zodat clients remote signer-sessies netjes kunnen beëindigen, dezelfde methode werd deze week als PR #2373 in de specificatie samengevoegd, en kan event kind 39701 (openbare webbookmark) parsen, zodat gebruikers bookmarkevents rechtstreeks vanuit Amber kunnen ondertekenen. De instellingen zijn opnieuw opgebouwd met gegroepeerde Material 3-kaarten en afzonderlijke iconen, een navigatiecrash op het scherm voor applicatiepermissies is verholpen en een databaseverbindingslek per account is gesloten door databases atomair op te bouwen.
Nostur 1.29.0 levert anonieme antwoorden en logout voor remote signers
Nostur is een iOS-client voor Nostr van Fabian. 1.29.0-desktop voegt ondersteuning toe voor antwoorden op zap receipts en voor anonieme antwoorden. Aan de signer-kant verbetert de release de verbinding met een remote bunker, stuurt hij een NIP-46-logout naar de remote signer wanneer de gebruiker uitlogt bij een account en repareert hij een vastgelopen spinner wanneer verbinding met een remote signer mislukt. De release verhelpt ook problemen met het laden van DM’s doordat DM-relays botsten met app-relays, dubbele posts na navigatie naar een antwoord en terug, en toont een mediathumbnail in meldingsregels.
Citrine v3.0.0 levert Negentropy, NIP-42 AUTH en filtering van onion-relays
Citrine is een lokale relayaggregator voor Android. v3.0.0 is een grote versiesprong die ondersteuning toevoegt voor NIP-77-Negentropy voor set-reconciliation-syncs, externe signers en NIP-42-AUTH in de relayaggregator, en die bij het ophalen via de aggregator mute-lijsten van NIP-51 respecteert. De aggregator begrenst het ophalen op drie relays per auteur met configureerbare bron- en indexerrelays, hergebruikt gecachete volg-, mute- en metadata na herstart en netwerkwijziging, pauzeert op beperkte netwerken en filtert URL’s van onion-relays wanneer de uitgaande proxy is uitgeschakeld. Reposts waarin beschermde events zijn ingebed worden geweigerd en mute-lijsten zijn standaard uitgezonderd van verwijdering op basis van leeftijd.
FIPS v0.4.0-rc1 voegt een Nym-mixnettransport en mDNS-ontdekking op het LAN toe
FIPS is de implementatie van het FIPS-protocol voor mesh-synchronisatie. v0.4.0-rc1 is wire-compatibel met v0.3.0, zodat gemengde meshes interoperabel zijn en geen gelijktijdige upgrade nodig is. De release voegt twee nieuwe manieren toe waarop nodes elkaar kunnen vinden en bereiken: uitgaand transport via het Nym-mixnet met een demo in één container en een mixnet-relayvoorbeeld, en optionele mDNS-/DNS-SD-ontdekking op het lokale netwerk. Een nieuwe, uitsluitend tellende show_metrics-query maakt een Prometheus-scraper mogelijk zonder kosten op het hot path, en rekeying voor FMP en FSP is zo verhard dat pakketverlies in beide richtingen geen onderbreking veroorzaakt.
Calendar by Formstr v1.6.1 en v1.6.2 voegen meldingen per event toe
Calendar by Formstr is een NIP-52-kalenderclient. v1.6.1 voegt meldingsvoorkeuren per event toe (PR #109), zodat een gebruiker voor elk afzonderlijk kalenderevent herinneringen kan in- of uitschakelen. v1.6.2 repareert inloggen met Amber (PR #185), zodat de nieuwe NIP-46-handshake van Amber 6.2.x van begin tot eind werkt.
Bitchat v1.5.2 en v1.5.3 verharden het Nostr- en BLE-transport
Bitchat is een meshchatclient voor Bluetooth en Nostr. v1.5.2 begrenst de snelheid van iOS-peerberichten om floods te voorkomen (PR #972) en verhardt Nostr-validatie en controle van BLE-announcements (PR #1012), zodat het Nostr-invoerpad aan de relaykant misvormde berichten afwijst voordat ze de lokale mesh-handler bereiken. v1.5.3 is een hotfix voor een crash bij het starten door een recursieve dispatch_once tussen NostrRelayManager en NetworkActivationService (PR #1343).
Keep v1.0.5 verplaatst het signer-beleid naar de geaudite Rust-core
Keep is een Android-signer rond de Rust-core keep. v1.0.5 zet keep v0.4.8 vast en levert een reparatie voor een race bij het initialiseren van de bunker (PR #296), zodat de handshake onder belasting niet langer het eerste event laat vallen. Verder vult de release het scherm Authorized Clients vanuit de bunker-callback onConnect (PR #291) en brengt hij de kill-switch samen in één bron van waarheid in keep-mobile (PR #284). De upstream Rust-core bracht op 13 juni v0.4.9 uit. Die versie verplaatst het signer-beleid voor NIP-55 en NIP-46, permissiebeslissingen, begrenzing van de duur voor gevoelige kinds, verloop, een keyed-HMAC-auditketen die manipulatie zichtbaar maakt, trust-on-first-use voor aanroepers en een persistente snelheidsbegrenzer voor ondertekening, naar de geaudite Rust-core die eerder logica in Kotlin dupliceerde, en voegt een implementatie van de NIP-44-v3-cipher toe. Die core verschijnt in de volgende keep-mobile-update.
ants v0.4.5 voegt links naar artikelportalen toe en herstelt Habla in de portalset
ants is dergigi’s zoek- en leesgereedschap voor Nostr. v0.4.5 voegt acties aan artikelkaarten voor long-form posts toe, waaronder links naar artikelportalen, artikelspecifiek delen via naddr, nevent kopiëren en toegang tot ruwe JSON. De set artikelportalen is vernieuwd door Habla te herstellen, niet meer werkende bestemmingen te vervangen en het imwald-portaal te verwijderen. De release herstelt ook de weergave van voetnoten in artikelen met behoud van ankernavigatie binnen het artikel, en wacht bij het herstellen van een login op een relayverbinding voordat het profiel wordt opgehaald, zodat de avatar in de header correct verschijnt.
Morganite v0.0.3 levert een lokale Blossom-cache voor Android met Tor op aanvraag
Morganite is een nieuwe lokale Blossom-cache voor Android van greenart7c3, de maker van Amber en Citrine. De cache fungeert als lokale BUD-08-mirror en verwijdert de minst gebruikte blobs zodra hij groter wordt dan 1 GB. v0.0.3 start Tor op aanvraag en stopt het wanneer het inactief is om de batterij te sparen, verbreekt na het opzoeken van de auteur de verbinding met de Nostr-relay om verbruik op de achtergrond te stoppen, repareert batterijverbruik door een ongefilterde logcat-stream en gelekte HTTP-clients, en geeft vervangen OkHttp-clients buiten de main thread vrij. De release haalt ook de inboxrelays van de gebruiker op voordat de lijst Blossom-servers wordt bevraagd, zodat blobontdekking het outboxmodel volgt, en downloadt een blob bij HEAD-verzoeken wanneer die nog niet lokaal is gecachet, waardoor het opwarmen van de cache aan echte clientvraag gekoppeld blijft.
Coracle 0.6.34 en 0.6.35 repareren NIP-46-login, verouderde feeds en het wisselen van antwoorden
Coracle is een Nostr-webclient van hodlbod. 0.6.34 repareert inloggen via NIP-46, een verouderde feedstatus waardoor de home-tijdlijn na het wisselen van weergave niet vernieuwde, en een antwoordschakelaar die na inschakeling alles wegfilterde. De release bouwt ook de feed- en lijstweergaven opnieuw op, repareert een probleem met de safe-area-inset van toastmeldingen en verbetert het laden van afbeeldingen. 0.6.35 is een kleine vervolgupdate die voorkomt dat reposts worden verborgen wanneer antwoorden zijn uitgeschakeld, zodat het repostfilter niet langer ten onrechte ook als antwoordfilter werkt.
Zeus v13.1.0-rc1 levert CLINK-noffers en NWC zonder wachtrij
Zeus is een self-custody Bitcoin- en Lightning-wallet met Nostr-functionaliteit voor wallet-connect en noffer-betalingen. v13.1.0-rc1 voegt op iOS betalingen zonder wachtrij toe via NIP-47 Nostr Wallet Connect, in samenwerking met Primal, zodat een betaalde NWC-factuur niet langer in een achtergrondwachtrij wacht. De release levert CLINK-nofferbetalingen waarbij Zeus Pay voor elk account een CLINK-noffer genereert, zodat een afzender elke Zeus-gebruiker alleen met diens Nostr-sleutel kan betalen. Ook kan een gebruiker Nostr Zaps in Zeus Pay uitschakelen, zodat een ontvanger het pad voor kind 9735-receipts kan uitzetten zonder NWC uit te schakelen.
Alby Extension v3.14.3 migreert de noble/scure-cryptostacks van de NIP-07-signer
Alby Extension is de browserextensie die naast Lightning NIP-07-ondertekening en Nostr Wallet Connect biedt. v3.14.3 migreert de stacks @noble/curves, @noble/hashes, @noble/ciphers, @noble/secp256k1, @scure/bip32 en @scure/base naar hoofdversies v2 en v3. Dit zijn de cryptografische libraries waarop het signer-pad van NIP-07 vertrouwt voor het ondertekenen van events en de versleuteling van NIP-44. Een sprong van hoofdversie raakt daardoor het wire-formaat dat de extensie produceert voor elk verzoek om een event te ondertekenen vanuit een Nostr-webclient.
Mostro Mobile v1.2.8 en v1.2.9 ondersteunen Protocol v2 en tonen het borgbeleid
Mostro Mobile is de mobiele client voor Mostro. v1.2.8 levert clientondersteuning voor mostro-core v0.13.0 Protocol v2, behandeld in het topverhaal hierboven, en voegt in totaal zeventien functies toe. Daaronder vallen de anti-misbruikborg voor makers uit PR #608, ontdekking van bootstrap-relays uit PR #610, opslag van orderannuleringen in de meldingsgeschiedenis uit PR #602 en limieten voor fiatbedragen in het scherm om een order aan te maken uit PR #605. v1.2.9 toont het anti-misbruikborgbeleid uit het node-info-event (PR #617), zodat een gebruiker de borgregels van de Mostro-instance kan zien voordat die een order opent.
ZapBook-builds 4 tot en met 27 leveren meerdere accounts, Marmot-sleutelpublicatie en nieuwe uitnodigingen voor kringen
ZapBook is een Nostr-native sociale leesapp van codeswot voor iOS en Android, opgebouwd rond leeskringen van 1 tot 100 mensen die mijlpalen delen en elkaar ter aanmoediging sats zappen. Tussen build 4 op 11 juni en build 27 op 15 juni bracht het project zeventien getagde builds uit en voegde het zeven PR’s samen. Ondersteuning voor meerdere accounts met vloeiend wisselen tussen accounts verscheen in PR #25, zodat een gebruiker meerdere Nostr-identiteiten in de app kan bewaren en sessies ertussen kan verplaatsen. De eerste publicatie van een Marmot-key package (kind 443) wordt nu automatisch geactiveerd wanneer onboarding is voltooid (PR #20); dit is de voorwaarde voor groepsberichten op uitnodiging in de leeskringen. De afhandeling van verwijderde kringleden verwerkt nieuwe uitnodigingen nu correct (PR #24), waarmee een categorie fouten wordt gesloten waarbij opnieuw toegevoegde leden na verwijdering geen nieuwe uitnodiging ontvingen. De releasereeks verplaatst ONNX-embedding-inference ook naar een isolate op de achtergrond (PR #19) voor semantisch zoeken in de reader, en integreert de NWC-service met een APP_ID_SUFFIX voor omgevingsspecifieke configuraties, zodat één hub meerdere ZapBook-builds kan bedienen.
Alby Hub v1.23.0 repareert NIP-47-publicatie voor verwijderde apps en zet Bitrefill over op NWC
Alby Hub is een zelfgehoste Lightning- en Nostr-hub. De niet-Nostr-kant van v1.23.0 is omvangrijk, Just-in-Time-kanalen, een Cards-pagina voor het opwaarderen van debetkaarten, een experimentele Ark-betaalbackend en een homepagina met verhalen, en valt buiten de scope van Compass. Aan de kant van NIP-47 stopt de release met opnieuw proberen NIP-47-info voor verwijderde apps te publiceren, zodat een verwijderde verbinding niet langer zijn kind 13194-info-event blijft publiceren (PR #2391). Ook verwijdert hij de aangepaste Bitrefill-appvermelding ten gunste van een standaard NWC-verbinding (PR #2420). De read-only-optie voor apps uit de appstore (PR #2415) beperkt de permissiescopes voor NWC-apps die via de winkel in de hub worden gepubliceerd.
Ook uitgebracht
Kleinere releases met Nostr-relevante inhoud maar weinig afzonderlijke substantie: Nostria v3.1.48 tot en met v3.1.50, met een vervolg op de uitrol van Web Bookmarks en in v3.1.50 betrouwbaardere meldingen en optimalisatie van de event-threaddatabase; Deepmarks v0.7.0 tot en met v0.7.5, met iteraties aan de NIP-B0-client voor sociale bookmarks, het project kreeg deze week via PR #96 ook zijn websitelink; Keep v1.1.1 tot en met v1.1.4, met vier reparaties voor reproduceerbare F-Droid-builds boven op de hierboven behandelde signer-release v1.0.5; NoorNote v0.11.1, v0.12.0, v0.13.0 en v0.13.1 voor de desktopnoteclient; Boris v0.12.2 voor de Boris-reader; Nostr Mail Client v0.13.0; Feeder 2.21.1; nak v0.19.13 als lege onderhoudsupdate van de Nostr-CLI; Hashtree v0.2.68 tot en met v0.2.71, die de caches met veranderlijke roots van gateways vernieuwen voor de via hashtrees geadresseerde releasepublisher; NYM v3.72.501 en v3.72.502, met updates van de op Nostrify gebaseerde relayimplementatie; swift-nostr-client 0.3.0, 0.4.0 en 0.5.0, drie kleine releases op basis van 85 samengevoegde PR’s voor de iOS-Nostr-client; lawallet-nwc v0.11.0, met achttien samengevoegde PR’s voor de LaWallet-Nostr Wallet Connect-bridge; Astraea v5.35.59 tot en met v5.35.62, met iteraties aan de Astraea-Nostr-client; en de NIP-05-geverifieerde Nostr-DM-bots BTC Recharge en giftcardshop, toegevoegd aan de projectdirectory onder de nieuwe categorie Shops.
Nog niet uitgebrachte wijzigingen
diVine voegt 119 PR’s samen op weg naar de volgende short-form videorelease
diVine is een Nostr-native client voor korte, herhalende video’s die het Vine-archief op een Nostr-ruggengraat herstelt. Het project voegde deze week 119 PR’s samen zonder een getagde release uit te brengen. Het wezenlijke werk aan de Nostr-kant omvat een REST-first publicatiepad voor video’s, zodat een ontbrekende relay-OK niet langer als fout wordt getoond (PR #5221 en PR #5220); het opnieuw filteren van gecureerde en gelikete grids wanneer de algemene blocklist verandert (PR #5208); herstel van de DM-gesprekkenlijst na een regressie bij herinstallatie (PR #5202); herstel van de weergave van Nostr-badges op profielen (PR #5218); en aanklikbare nostr:-verwijzingen in citaten uit commentaren (PR #5225). De video-editorstack voegde samenvoegen of verwijderen van meerdere geselecteerde clips toe, een pinch-to-zoom-canvas met een letterbox-scrim die het zoomniveau volgt, en transformaties om clips bij te snijden, te draaien en te spiegelen.
Pollerama voegt vijftien PR’s samen met een signer-herwerking en een golf aan functies
Pollerama (repository formstr-hq/nostr-polls) is de Nostr-native client voor peilingen en feeds uit de Form*-familie, verwant aan Calendar by Form*, dat deze week v1.6.2 uitbracht. De nieuwste getagde release van nostr-polls is v1.6.4 uit maart. Het werk in dit venster staat dus klaar voor de volgende tag en is nog niet uitgebracht, maar de samenvoegstroom is fors: vijftien pull requests verschenen tussen 9 en 16 juni, met bijdragen van abh3po, geralt-debugs en SIDDHANTCOOKIE. Aan de signer-kant verving het project het bestaande ondertekeningsoppervlak in PR #198 en werkte de vervanging bij in PR #201. PR #200 voorkomt dat kind-0-metadata-updates bij het inloggen worden verstuurd, zodat een nieuwe login niet langer een profiel-event publiceert waar de gebruiker niet om heeft gevraagd. De functiegolf omvat een profieleditor met publiceren vanuit de profielweergave (PR #205), een verbeterde repoststroom (PR #209) en een eenvoudiger pad om onderwerpen te ontdekken (PR #202). De volgende getagde release neemt dit allemaal mee.
Werk aan libraries en gereedschappen
NDK PR #375 en het samengevoegde werk in de repositories rust-nostr en nostr-tools waren deze week rustig, met elk één of twee samengevoegde PR’s en zonder getagde releases. Het werk aan ContextVM SDK (één samengevoegde PR), mesh-llm (37 samengevoegde en acht open PR’s), Zap Cooking (26 samengevoegde PR’s) en Routstrd (twee samengevoegde PR’s) ging in het venster zonder releasetag door.
NIP-updates en werk aan protocolspecificaties
Het protocolwerk van deze week concentreert zich op twee gebieden: signer-verharding en groepsgovernance via NIP-29.
Deze week samengevoegd:
- NIP-46 (Nostr Connect). PR #2373 voegt een
logout-methode toe waarmee een client een remote signer-sessie netjes kan beëindigen. Amber, Clave en Nostur leverden er in dezelfde week ondersteuning voor. - NIP-CC (Community Chat). PR #2365 werkt NIP-CC bij om voor het client-side mechanisme naar de moderne specificatie NIP-GC (Group Chat) te verwijzen, waarmee de specificatie voor communityruimtes aansluit op het canonieke groepschatprimitief.
Open NIP-29-cluster (relaygebaseerde groepsgovernance):
- Bannertags. PR #2383 voegt een
banner-tag toe aan het kind 39000-event met groepsmetadata. - Achtervoegsel voor uitnodigingscodes. PR #2380 introduceert een achtervoegsel voor uitnodigingscodes in de groepsidentifier, zodat een eenmalige uitnodiging in het groeps-id zelf kan worden gecodeerd.
- Berichten vastzetten. PR #2379 voegt een moderatieactie
update-pin-listen een kind 39005-event toe om de vastgezette set te publiceren. - Groepsrapportage via NIP-17-DM’s. PR #2377 definieert een rapportagestroom waarin leden groepsmisbruik via gift-wrapped NIP-17-DM’s melden bij het administratieve contact van de relay, zodat moderatieverkeer buiten de openbare eventstream van de groep blijft.
- Rolgebaseerde toegangscontrole. PR #2376 voegt een RBAC-oppervlak met rollen toe boven op de bestaande scheiding tussen beheerder en lid.
Open vervolgstappen voor NIP-46:
- Clientmetadata in het connect-verzoek. PR #2381 laat de verbindende client optionele velden
name,urleniconin het connect-verzoek sturen, zodat de signer op het koppelingsscherm de identiteit van de applicatie kan tonen. Clave build 101 implementeert het voorstel. - Stille timeouts vermijden. PR #2375 scherpt de specificatie aan, zodat een signer die invoer van de gebruiker nodig heeft het verzoek openhoudt totdat de gebruiker beslist. Dit verhelpt de foutmodus die Clave build 100 aan de implementatiekant repareerde.
Overig open werk:
- NIP-100 Sovereign Agent Identity Network (SNIN). PR #2378 stelt een agent-to-agentprotocol voor identiteit en ontdekking van mogelijkheden van autonome agents voor. Het voorstel is breed en wordt tijdens de beoordeling waarschijnlijk opgesplitst in kleinere onderdelen.
Blossom-specificatie. BUD-00 PR #108 werd op 15 juni samengevoegd en verbreedt de BUD-definitie naar client-side conventies en dataformaten die op Blossom-blobs zijn gebouwd maar die servers niet implementeren. De wijziging brengt BUD’s als BUD-10, het blossom:-URI-schema, en BUD-08, de conventies voor lokale caches die Morganite deze week implementeert, binnen de canonieke nummering. Voorheen werden ze als uitbreidingen buiten de specificatie behandeld.
NIP Deep Dive: NIP-77 (Negentropy)
NIP-77 definieert een set-reconciliationprotocol voor Nostr-relays. Twee partijen, een client en een relay, of twee relays in een bridge, hebben elk een set events die aan een filter voldoet en willen convergeren naar de unie zonder alles opnieuw te versturen. De naïeve aanpak is alle event-id’s over de verbinding te sturen en het verschil te berekenen; bij een druk filter groeien de kosten mee met de grootste set, ongeacht hoeveel de sets werkelijk verschillen. NIP-77 verlaagt die kosten tot een verhouding met het symmetrische verschil.
De specificatie bouwt op twee relayberichten, NEG-OPEN en NEG-MSG. Een client opent een reconciliatiesessie met ["NEG-OPEN", <subscription_id>, <filter>, <initial_message>], waarbij <initial_message> een hex-gecode Negentropy-payload is die het beeld van de client op de set beschrijft. Antwoorden komen als NEG-MSG-frames en beide kanten wisselen berichten uit totdat ze een vast punt bereiken. Elke NEG-MSG verkleint het verschil, door een bereik op te splitsen in subbereiken met eigen fingerprints, of beëindigt een leaf door de id’s in een klein bereik op te sommen, zodat de ontvanger het verschil rechtstreeks kan berekenen. Wanneer één kant besluit dat de andere events heeft die hij mist, stuurt hij een gewone REQ voor die id’s. Wanneer hij events heeft die de andere mist, laat de specificatie het uploadpad over aan een normale publicatie van een EVENT aan de andere kant.
De onderliggende datastructuur is een geordende Merkle-treevariant. Elk event in de lokale set krijgt de sleutel (created_at, id) en wordt in bereiken verdeeld; elk bereik draagt een kleine fingerprint die uit de id’s erin wordt berekend. Wanneer een fingerprint tussen client en relay overeenkomt, is dat bereik geconvergeerd en wordt het overgeslagen. Wanneer hij afwijkt, splitst de antwoordende kant het bereik in helften of subbereiken en stuurt hij voor elk een fingerprint, waarna het proces recursief in het verschil duikt. Leaf-bereiken onder een lage eventdrempel worden letterlijk verzonden. De centrale eigenschap is dat het bijna niets kost om geconvergeerde bereiken te bevestigen, ongeacht hoeveel events erin staan.
De volgorde op created_at is om twee redenen belangrijk. Ten eerste gebruikt de bestaande paginering van Nostr until en since met dezelfde tijdstempel, zodat een reconciler tussen sessies kan hervatten zonder het hele archief opnieuw te synchroniseren: hij cached de bovengrens en begint de volgende synchronisatie daar. Ten tweede zijn splitsingen van bereiken bij een gesorteerde sleutel deterministisch, zodat client en relay altijd dezelfde volgende grens kiezen zonder apart onderhandelingsbericht. De kosten van een synchronisatie zijn ongeveer O(d log n), waarbij d de omvang van het symmetrische verschil is en n de grootste set. Dat ligt ver onder de O(n)-kosten van een naïeve dump van id’s en ver onder de O(n)-roundtrips van N afzonderlijke REQ’s.
Drie implementatieafwegingen springen eruit. De grootte van de fingerprint, de specificatie gebruikt 32 bytes per bereik, weegt botsingskans af tegen bandbreedte: kleinere fingerprints besparen bytes maar vergroten de kans op een onterechte match waardoor events verloren gaan. De leaf-drempel, wanneer het splitsen stopt en id’s letterlijk worden verzonden, weegt roundtrips af tegen bandbreedte per bericht: kleinere drempels betekenen meer rondes, grotere drempels grotere leaf-berichten. Het protocol veronderstelt bovendien dat beide partijen dezelfde fingerprint over hetzelfde bereik kunnen berekenen. Daarvoor is een stabiele serialisatie van (created_at, id)-paren nodig waar beide implementaties het over eens zijn; daarom is de specificatie nauwgezet over de bytevolgorde bij de constructie van de fingerprint.
Een relay die NIP-77 in zijn NIP-11-veld supported_nips adverteert, laat clients reconciliëren in plaats van of naast een gewone synchronisatie op basis van REQ. De client kiest het protocol op basis van zijn behoefte: een verse subscription die nieuw verkeer wil ontvangen gebruikt REQ, omdat er nog geen eerdere toestand te reconciliëren is; een langlopende mirror die na uitval wil inhalen gebruikt NEG-OPEN, omdat het symmetrische verschil klein is ten opzichte van het archief. De twee paden vullen elkaar aan in verschillende implementatieomgevingen.
Voorbeeld van een NEG-OPEN-uitwisseling:
→ ["NEG-OPEN", "sync-1", {"kinds":[1],"authors":["abc..."]}, "<hex initial Negentropy message>"]
← ["NEG-MSG", "sync-1", "<hex relay response>"]
→ ["NEG-MSG", "sync-1", "<hex client refinement>"]
← ["NEG-MSG", "sync-1", "<hex leaf with IDs the relay has and client lacks>"]
→ ["REQ", "fetch-1", {"ids":[...]}]
← [...EVENT messages...]
← ["EOSE", "fetch-1"]
→ ["CLOSE", "sync-1"]
Citrine v3.0.0 levert deze week ondersteuning voor NIP-77 in de relayaggregator. Daarmee kan de lokale Android-relay voor het eerst met externe relays reconciliëren in plaats van grote hoeveelheden via REQ op te halen.
NIP Deep Dive: NIP-61 (Nutzaps)
NIP-61 definieert peer-to-peer Cashu-ecashbetalingen die als Nostr-events worden bezorgd. Een afzender publiceert een Cashu-token dat aan de van Nostr afgeleide publieke sleutel van de ontvanger is vergrendeld, waarna de ontvanger het op een geschikt moment bij de mint inwisselt. Anders dan NIP-57-zaps, waarvoor de ontvanger op het betaalmoment via Lightning bereikbaar moet zijn, is een nutzap een zelfstandig ecash-token dat de ontvanger volgens zijn eigen planning kan inwisselen.
De specificatie combineert drie eventkinds met Cashu’s P2PK-lockprimitief. Kind 10019 is de mintaanbeveling van de ontvanger: een vervangbaar event met één of meer mints waarvan de ontvanger nutzaps accepteert, plus de publieke Cashu-sleutel waarmee proofs voor de ontvanger worden vergrendeld. Deze sleutel verschilt van de Nostr-identiteitssleutel van de ontvanger; het is een sleutel binnen de wallet die voor ontvangst van nutzaps is afgeleid, zodat de identiteitssleutel nooit ecash-geheimen hoeft aan te raken. Afzenders lezen kind 10019 voordat ze betalen, zodat ze een token maken dat de ontvanger bij een al vertrouwde mint kan inwisselen.
Kind 9321 is het betalingsevent. Het bevat één of meer Cashu-proof-tags, elk met een P2PK-vergrendelde proof die is gebonden aan de nutzap-pubkey van de ontvanger uit kind 10019, een u-tag met de mint-URL, optionele e- en a-tags die een gezapte note identificeren en een p-tag voor de ontvanger. De ontvanger krijgt kind 9321 via zijn gewone Nostr-subscription, valideert dat de proofs zijn vergrendeld aan zijn nutzap-pubkey bij een mint die in zijn eigen kind 10019 staat, ontgrendelt de proofs met de bijbehorende privésleutel en bewaart ze in zijn NIP-60-wallet of melt ze naar Lightning. Kind 7375 registreert de ingewisselde proofs in de eventketen van de wallet van de ontvanger, zodat een wallet die opnieuw met relays synchroniseert nutzap-proofs uit dezelfde bron niet dubbel telt.
Het vertrouwensmodel is de expliciete prijs van het ontwerp. Cashu-mints houden de onderliggende waarde vast; een kwaadaardige of in beslag genomen mint kan weigeren in te wisselen. NIP-61 erft dat custodial risico van NIP-60 en probeert het niet weg te nemen. Daarvoor in de plaats biedt het ontwerp offline werkende microbetalingen met onmiddellijke finaliteit: het token is de betaling, de ontvanger hoeft geen Lightning-node te draaien of in realtime inkomende HTLC’s te accepteren, en een afzender met proofs bij dezelfde mint kan betalen zonder één netwerkstap naar een bewaarder. De kind 10019-advertentie is de poort op de sociale laag: afzenders die een mint buiten de vertrouwde set van de ontvanger kiezen riskeren een niet-inwisselbaar token, waardoor het inwisseloppervlak voor de ontvanger voorspelbaar blijft.
Vergeleken met NIP-57 is ook het verificatiepad eenvoudiger. Een NIP-57-zap receipt is een kind 9735 dat door de LNURL-service van de ontvanger wordt gepubliceerd. De verifier moet het LNURL-endpoint ophalen en bevestigen dat de ondertekeningssleutel van het receipt overeenkomt met wat dat endpoint heeft opgegeven. Een nutzap draagt het cryptografische betalingsbewijs inline, de P2PK-vergrendelde proofs zelf, zodat elke verifier met de publieke sleutels van de mint de geldigheid van de proofs kan bevestigen zonder een roundtrip naar een derde. De afweging is dat nutzap-verificatie begrip van de keysets van de mint vereist, terwijl NIP-57-verificatie alleen standaard-LNURL-infrastructuur nodig heeft.
De twee zapformaten bestaan naast elkaar en vullen elkaar aan. NIP-57-zaps blijven geschikt voor ontvangers met Lightning-routing en voor afzenders die bedragen in sats willen met de afwikkelingssemantiek van Lightning. NIP-61-zaps passen bij offline ontvangers, stromen met veel microbetalingen waarin Lightning-kosten de overgedragen waarde overschaduwen en clients voor gebruikers zonder Lightning-infrastructuur.
Voorbeeld van een nutzap-event:
{
"id": "a5f87fe2d4c8b9a0e3f1c4d5e6a7b8c9d0e1f2a3b4c5d6e7f8091a2b3c4d5e6f",
"pubkey": "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
"created_at": 1750162800,
"kind": 9321,
"tags": [
["proof", "{\"amount\":21,\"secret\":\"...\",\"C\":\"...\",\"id\":\"...\"}"],
["u", "https://mint.example.com"],
["e", "8b39f4e5d6c7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3"],
["p", "c5d8a4e3b2a1f0e9d8c7b6a5949382716050403020100ffeeddccbbaa99887766"]
],
"content": "Great post!",
"sig": "f1e2d3c4b5a6978869504132c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5d6e7f80192a3b4c5"
}
Amethyst v1.12.0 levert deze week NIP-61-nutzapweergave als volwaardig onderdeel naast zijn NIP-60-wallet (PR #3075). Daarmee is Amethyst de eerste dominante Android-client die ontvangen nutzaps in de tijdlijn toont en saldo-overzichten per mint in de wallet aanbiedt.