Nostr Compass #36
Welkom terug bij Nostr Compass, je wekelijkse gids voor Nostr.
Deze week: Amber verhardt relay-authenticatie en versleutelt opgeslagen geheimen, Cambium tekent voor websites onder relay-auth-belasting, Citrine host groepen en statische sites op een telefoonrelay, Vector zet moderatie in de wachtrij onder spam en synchroniseert dempingen tussen apparaten, Sonar voegt antwoorden in threads toe aan meshberichten, Nostria publiceert podcasts, en Nail overbrugt e-mail als gift-wrap-events. Releases omvatten MDK-groepsstatus, badge-uitgifte, QR-signer-koppeling, browserondertekening op Android en gedeelde wallet-connect. Protocolwerk bereikt commentaarpatches, versleutelde bestandsmetadata, threadopmaak, Marmot-herstartgaranties en Concord-lidmaatschapslijsten. Deep dives: badges en commentaren.
Topverhalen
Amber 6.5.0 sluit een relay-auth-confused deputy en versleutelt opgeslagen geheimen
Amber is een Android-NIP-55- en NIP-46-signer. Versie 6.5.0 sluit vier openbaar gemaakte hiaten: een confused deputy bij relay-authenticatie waardoor elke aanroeper een kind-22242-NIP-42-event kon verkrijgen voor relays die de gebruiker nooit had goedgekeurd; een NIP-46-replay-hiaat; plaintext-verbindingsgeheimen en lokale sleutels die nu in rust envelope-versleuteld zijn; en een achtpunten-verhardingspakket met aanroeperautorisatie vóór decryptie, fail-closed-permissieparsing, waarschuwingen bij plain ws://, beveiligde QR-schermen, logredactie, lazy key zeroing bij uitloggen en optioneel Keystore-gebruik op een ontgrendeld apparaat.
Versie 6.5.1 versleutelt opgeslagen NIP-46-geheimen opnieuw wanneer de Keystore-sleutel roteert na het omschakelen van de ontgrendelingsvereiste en lost een crash in de permissie-editor op. Versie 6.5.2 ontsleutelt geen kolommen meer die de applicatielijst nooit rendert, cached de Keystore-handle, warmt de accountcache op bij opstarten en debounced relay-statusmeldingen.
De 6.4.0 van vorige week maakte gegroepeerde ondertekeningsbeslissingen expliciet; 6.5.x verandert wat Amber in het algemeen nog mag autoriseren.
Cambium 0.4.0 tekent voor websites en ontlast relay-auth-bursts
Cambium is een Android-NIP-55-proxy naar een Heartwood-hardwaresigner over NIP-46. Zes releases verschenen in twee dagen.
Versie 0.4.0 breidt ondertekening uit naar websites. Een pagina kan via een gevalideerde nostrsigner:-callback een handtekening aanvragen zonder de aan native applicaties verleende permissies te erven, zodat een browsertab de goedkeuring van een andere app niet kan lenen. Dezelfde release corrigeert de minimale eventvorm van de specificatie: een event met alleen kind en content tekent nu correct; Cambium levert de gekoppelde NIP-46-identiteit, de huidige tijdstempel en een lege tag-array aan voordat het event aan rust-nostr wordt overgedragen. Native rust-nostr-instrumentatie werd in dezelfde wijziging een verplichte continuous-integration-gate.
Versie 0.3.6 herstelt koppeling tegen spec-conforme signers. Cambiums oudere rust-nostr-build accepteerde als resultaat van een NIP-46-connect-aanroep alleen de letterlijke string ack, waardoor een signer die antwoordt door het geheim uit de bunker-URI terug te geven — zoals de huidige specificatie vraagt en Heartwoods firmware doet — koppeling beëindigde met een unexpected-response-fout. De sprong van rust-nostr 0.44.2 naar 0.44.8 accepteert beide vormen, geverifieerd tegen live hardware en tegen nak bunker, dat nog steeds ack antwoordt.
De releases 0.4.1 tot 0.4.3 gaan over toelatingscontrole onder belasting. Versie 0.4.1 geeft reacties, posts, verwijderingen en versleuteling een gereserveerde wachtrijplek vóór relay-authenticatie en achtergronddecryptie, begrenst wachtende aanroepen, gooit ze weg zodra de aanroeper is getimed out en levert bij overbelasting een terminaal unavailable-resultaat in plaats van een voorgrondondertekeningsscherm te openen. Versie 0.4.2 gooit verlopen of lang inactieve NIP-46-sessies weg vóór het volgende verzoek en laat gelijktijdige kopieën van hetzelfde kind-22242-authenticatie-event één hardwarehandtekening delen. Versie 0.4.3 laat hoogstens één distinct authenticatie-uitdaging per identiteit in de hardwareworker toe, herhaalt authenticatie intern nooit en opent een zestigseconden cooldown per identiteit na een timeout terwijl exacte cache-duplicaten nog steeds worden beantwoord. De metingen in de release notes komen van een GrapheneOS-telefoon met Amethyst: een cold-start-burst leverde drieëndertig onmiddellijke overload-antwoorden en dertien voltooide verzoeken zonder signer-timeouts; een verse login tijdens een authenticatieburst keerde terug na 1,254 seconden na goedkeuring.
Citrine 3.1.0 maakt van een telefoonrelay een groeps- en sitehost
Citrine is een on-device Android-relay. Versie 3.1.0 voegt drie mogelijkheden toe die veranderen wat de relay kan hosten.
Ondersteuning voor NIP-29, de relay-gebaseerde groepsspecificatie waarbij de relay zelf lidmaatschap en moderatiestatus bijhoudt, betekent dat een telefoon een groep kan hosten in plaats van er een te joinen. Ondersteuning voor NIP-86, de relaybeheer-API die administratieve acties via geauthenticeerde JSON-RPC blootstelt, komt met een instellingenscherm, zodat allowlists en bans zowel vanuit de API als vanuit de app kunnen worden aangestuurd. Ondersteuning voor NIP-5A statische websites laat het relay nsites aan webclients serveren, met een gemoderniseerde browselijst met iconen, zoeken, sorteren op laatste update, installatievoortgang, beschrijvingen en een configureerbare set relays om ze op te halen, standaard nsite.run, nos.lol en nostr.land.
Het moderatie-oppervlak groeide mee in dezelfde release. Lokaal bannen van een public key biedt nu aan de opgeslagen events van die auteur te wissen; een configureerbare REJECTED_KINDS-lijst blokkeert kinds die de operator niet wil opslaan; toegangscontrole kan bestaande lijsten importeren. Een rebroadcast-tool duwt opgeslagen events terug naar geselecteerde relays, zodat een telefoonarchief het netwerk opnieuw kan zaaien. De release verwijdert ook de WebSocket-extensie permessage-deflate, versnelt het query-hotpath, lost Tor-start-/stopfouten op wanneer de expose-via-Tor-instelling wijzigt, en verplaatst logs naar een lokale database terwijl logcat beperkt blijft tot debug-builds.
Vector 0.4.2 laat community-moderatie een spamgolf overleven
Vector is een desktop- en Android-Concord-messenger. Versie 0.4.2 richt zich op moderatie onder belasting.
Snelle bans overschreven elkaar voorheen. Ze worden nu in de wachtrij gezet, gestapeld en als één operatie afgerond, zodat het bannen van een golf accounts één key-rotatie kost in plaats van één per account. Het accepteren van een uitnodiging voor een community die intussen is ontbonden legt nu uit waarom en verwijdert de uitnodiging van elk apparaat van de gebruiker; het ontbinden van een eigen community ruimt die overal uit de communitylijst — een fix die arriveerde in versie 0.4.3. Communityberichten die binnenkomen tijdens een achtergrond-catch-up geven geen meldingen meer alsof ze net zijn verzonden, en de typindicator verloopt vanaf het verzendmoment zodat een vertraagd signaal niet in een kanaal kan blijven hangen.
De door Concord gedefinieerde gesplitste communitylijst kreeg een cross-client review met Armada, de andere Concord-client. Hernoemingen blazen de lijst niet meer op, gelijke standen worden in beide clients identiek opgelost, en ongewijzigde data wordt niet meer naar relays gepubliceerd. Dempen verliet het DM-pad: een gebruiker kan iemand nu rechtstreeks uit een community dempen zonder eerdere berichtgeschiedenis, en de demping geldt voor meldingen en badges over kanalen en DM’s heen terwijl de berichten zelf zichtbaar blijven. Vastgezette berichten werden een gedeeld kanaaloppervlak met klikbare links, en bewerkingen aan een pin volgen die overal waar die verschijnt. Blocklists, dempingen en bijnamen synchroniseren nu tussen de apparaten van een gebruiker, evenals vastgezette chats. Versie 0.4.3 meldt ook niet meer dat de gebruiker typt wanneer een andere Nostr-client is ingelogd onder dezelfde identiteit, en deblokkeert Tor-bootstrap op Windows, dat op x64 en ARM64 bij vijftien procent bevroor.
Sonar brengt antwoorden in threads naar een mesh-messenger met NIP-C7
Sonar is een Bluetooth-mesh- en Nostr-messenger. Versie 0.1-alpha.13.1 voegt Signal-achtige antwoorden toe in NIP-C7 kind-9-chat, plus vermeldingen, begrensde Bluetooth-reassembly, backup-limieten, mesh-pad-handtekeningverificatie en FCM-push-fallback. Versies 0.1-alpha.13.2 en 0.1-alpha.13.3 lossen chat-open-crashes en iOS-toetsenbordoverlap op.
Nostria begint podcasts te publiceren en vraagt relays om te tellen
Nostria is een webclient. Versie 4.1.70 en 4.1.71 voegen podcastpublicatie toe voor premiumabonnees, met afleveringen als ondertekende Nostr-events. Versie 4.1.69 gebruikt NIP-45 COUNT voor reactie-, antwoord- en zap-totalen in feeds en rondt lokalisatie af. De 4.1.67 van vorige week breidde versleutelde community-administratie uit.
Releases
MDK 0.9.14: fail-closed groepsgeschiedenis via snellere groepscreatie
MDK is de Rust-ontwikkelkit voor Marmot, een versleuteld groepsberichtenprotocol over Nostr. Versie 0.9.12 maakt meerdere groepsstatuspaden fail-closed in plaats van gissend. Een ontbrekend fork-anker is nu een harde fout (PR #1329); een leave-voorstel wordt atomisch opgeslagen zodat een crash geen half toegepast vertrek achterlaat (PR #1360); incident-replay weigert een formaat te raden op manifestloze newline-delimited JSON-streams (PR #1140). Convergentietests verbreedden tegelijk, met retained-history cross-route recovery (PR #1350), cross-adapter convergentie-assurance (PR #1372) en gegeneraliseerde geïsoleerde convergentiecampagnes (PR #1357). Relay-afwijzingsdiagnostiek blijft behouden in plaats van in een generieke fout te worden samengevouwen (PR #1361).
Versie 0.9.13 landde op 18 augustus met opslagformaat v2 (PR #1421), migratierails en delta-writes in plaats van live accountsnapshots (PR #1435), plus snellere invite-catch-up (PR #1444) en macOS-bindings (PR #1402). Versie 0.9.14 volgde op 19 augustus met groepscreatie-polish: vooraf geüploade oprichtingsafbeeldingen (PR #1498), KeyPackage-batching (PR #1494), atomische initiële berichtretentie (PR #1497), en profielpublicatie met account-eigen relays (PR #1495). MarmotKit 0.9.14 en wn-agent 0.9.14 shippen met de core crate.
Divine Mobile 1.0.20: een badge minten zonder de app te verlaten
Divine Mobile is een kortvideo-client die video publiceert en ophaalt via Nostr. Versie 1.0.20 laat een gebruiker een NIP-58-badge minten, de ondertekende award-events uit de eerste deep dive van dit nummer, en die aan iemand toekennen zonder de app te verlaten. Tikken op een badge in een profiel legt uit wat het verdienen ervan vereiste — het deel van de specificatie dat meestal ongeïmplementeerd blijft omdat het definitie-event en het award-event apart worden opgeslagen.
De rest van de release is clientwerk: een licht thema, crop, rotate en flip in de stop-motion-editor, concepten één tik van de recorder, caption-timing tegen de video, een feed die reeds bekeken materiaal deprioriteert, screenreader-ondersteuning in editor, recorder en profieltabs, reduced-motion-afhandeling, en accountinstellingen die een Divine-e-mail en wachtwoord beheren en accounts koppelen of ontkoppelen. Verwijderde video’s verlaten nu lokale status, en bladwijzers blijven behouden. De 1.0.19 van vorige week verhardde accountisolatie en DM-validatie; badge-uitgifte is een nieuw publicatie-oppervlak daar bovenop.
ClipRelay 0.2.0: een signer koppelen met een camera
ClipRelay synchroniseert een klembord tussen apparaten over Nostr. Android-versie 0.2.0 voegt nostrconnect://-QR-login toe, zodat een gebruiker kan inloggen met een signer-app op een andere telefoon, en camerascannen van bunker-URL’s, waardoor de gewoonte vervalt een geheimdragende string via een messenger te plakken. Bunkerverbinding loopt nu na zestig seconden af in plaats van te blijven hangen, en de retry-knop na mislukte Amber-login werkt. Desktop-versie 0.2.0 neemt de timeout- en login-tab-fixes over.
Versie 0.1.4 voegde gevoelige-klembordsync toe met korte relay-vervaltijd, vastgepinde signer-sessierelays en een liveness-probe die een echte roundtrip vereist in plaats van lokaal gesynthetiseerde EOSE. De 0.1.3 van vorige week herstelde verbindingen na idle-periodes.
Bark 1.3.9: een browsersigner die op Android draait
Bark is een browserextensie die de NIP-07 window.nostr-interface levert, het object dat een webpagina aanroept om een handtekening of versleutelingsoperatie aan te vragen. Versie 1.3.9 declareert Android-ondersteuning voor de Firefox-build, zodat de add-ons-lijst op een telefoon installeert. Firefox op Android implementeert geen windows-API, dus elke goedkeuring die een popupvenster opende zou ronduit zijn geweigerd; het goedkeuringsscherm valt nu terug op een voorgrondtab waarbij sluiten weigert, een review-actie het naar voren brengt en de achtergrond sluit zodra het verzoek is afgehandeld. De release notes documenteren verificatie op een Pixel 10 Pro XL met GrapheneOS en Firefox 153.0.4, en stellen duidelijk dat Chromium op Android het extensiesubsysteem compileert weg, zodat geen Chromium-afgeleide Android-browser Bark kan draaien.
Versie 1.3.8 loste een NIP-46-interoperabiliteitsdefect in de andere richting op. Bark testte op een compact Heartwood-ondertekendialect door het event als JSON-object te sturen, wat strikt getypeerde signers inclusief nak en rust-nostr-bunkers niet kunnen parsen en stilletjes negeren, waardoor ondertekenen hing. De probe gaat nu alleen naar signers die zich als Heartwood identificeerden; elke andere signer ontvangt vanaf de eerste handtekening een standaard sign_event-aanroep.
Bray 3.0.0 en Toll Booth 6.0.0 stappen over op een gedeelde wallet-connect-bibliotheek
Bray en Toll Booth betalen beide via NIP-47 Nostr Wallet Connect, de specificatie waarmee een applicatie betalingen kan aanvragen van een wallet over versleutelde Nostr-events. Bray 3.0.0 en Toll Booth 6.0.0 declareren elk een breaking change door nwc-kit voor walletbetalingen over te nemen, en Toll Booth verwijdert in dezelfde wijziging zijn payer-credential-flow. Beide publiceren reproduceerbare builds waarvan de output byte-identiek was over twee onafhankelijke runners, met de tarball-hash in de release notes zodat een lezer het registry-artefact kan verifiëren.
Drie Toll Booth-patches volgden: 6.0.1 pind de onderhandelde deploy-hostkey, 6.1.1 pind cashu-ts op de versie waar zijn patch op mikt, en 6.1.2 herstelt een image-build.
NoorNote 1.3.4: versleutelde communities joinen via een uitnodigingslink
NoorNote is een Nostr-client voor desktop, web en Android. Versie 1.3.4 voegt versleutelde Armada- en Concord-communities toe als addon: een gebruiker joint via een uitnodigingslink, ziet gejoinde communities in instellingen en ontvangt activiteitsmeldingen. Dezelfde release voegt een control toe om externe quote-posts te verbergen, de highlight-notities die een alinea van een webartikel citeren, globaal of per auteur, met reposts daarvan ook verborgen en de eigen highlights zichtbaar gelaten. Profielresolutie werd ook hersteld, zodat profielen niet meer renderen als een afgekorte public key of anonieme placeholder.
Versie 1.3.5 voegt een expander toe voor lange notes en corrigeert de layout van het Armada-uitnodigingslink-invoerveld. De 1.3.2 van vorige week verplaatste artikeldiscovery naar de social graph; communitylidmaatschap is een apart oppervlak.
Mostro verplaatst disputchat weg van gift wrap
Mostro is een peer-to-peer-handelsdaemon waarvan orders en berichten als Nostr-events lopen, met mostro-core als gedeelde bibliotheek en Mostro Mobile als client. Mobile 1.3.2 migreert disputchat van NIP-59 gift wrap naar een kind-14-chatenvelope en ondersteunt de backlog met duurzame per-gesprek-cursors. mostro-core 0.14.5 serialiseert de rumor-identificatie binnen de gift wrap (PR #164), 0.14.4 lost een ratings-gemiddeldebug op (PR #163), en Mobile 1.3.1 schakelt over naar Blossom-servers die versleutelde chatbijlagen behouden. Gebruik daemon 0.18.2 of 0.18.4.
NYM 3.73.522: versleutelde groepschats en een versleutelde lokale store
NYM is een Nostr-client met eigen assistant-integratie. Versie 3.73.522 versleutelt de lokale SQLite-store nadat 3.73.521 versleutelde groepschat verfijnde, en 3.73.520 een content-security-policy-breuk en dubbele nieuwe-berichtpresentatie oplost.
Morganite 0.0.4: een blob verifiëren vóór caching
Morganite is een Android-Blossom-server, het mediaprotocol waarbij een bestand wordt geadresseerd door de SHA-256-hash van de inhoud en wordt geserveerd vanaf elke host die het bewaart. Versie 0.0.4 verifieert de hash van een blob tijdens download in één pass vóór caching — de controle die content addressing aan de ontvangende kant betekenisvol maakt. De release volgt cachegrootte incrementeel in plaats van de directory bij elke save opnieuw te scannen, verplaatst blokkerende netwerkcalls naar I/O-threads, hergebruikt Tika-instanties voor MIME-detectie en slaat logs op in een lokale database.
Nieuw ontdekt
Nail brengt e-mail naar Nostr als gift-wrap-events
Nail is een MIT-gelicentieerde mailbridge en webclient van het Formstr-team, de groep achter Formstr en nostr-calendar. Het ging live op 18 augustus met PR #7, een 22-bestandswijziging die k-tags aan mailevents toevoegde, sleutelherstel in instellingen en een welkomstbericht. De deployment draait op mailstr.app, dat het eigen _smtp-NIP-05-record van de bridge serveert, het DNS-schema dat een naam op een domein koppelt aan een Nostr-public key.
De mail zelf is een Nostr-event. De constants van de client definiëren een kind-1301 mailrumor binnen een kind-1059 NIP-59-gift wrap, zodat een bericht de ontvanger bereikt via dezelfde metadata-verbergende envelope als privé-DM’s. Delivery-relays komen uit een kind-10050 NIP-17-inboxlijst met een kind-10002 NIP-65-relaylijst erachter; mappen zijn kind-1985 NIP-32-labels onder een mail-namespace, en clientinstellingen leven in een kind-30078 NIP-78-application-data-event. Bijlagen groter dan 60.000 bytes gaan naar Blossom in plaats van in het event, omdat NIP-44 versleutelde plaintext begrenst op 65.535 bytes. Een adres is een npub op een domein, en een lokaal domein zonder NIP-05-record wordt behandeld als een mailbox die niet bestaat.
De bridge-halve is een Node-LMTP-server die naast een mailcow-deployment draait zonder die te patchen: Postfix routeert passende domeinen naar de bridge, en de bridge injecteert antwoorden terug via SMTP. Dat ontwerp dwingt een eerlijk antwoord op de moeilijkste vraag in een e-mailbridge: wat bewijst een From-header? Nails receive path classificeert elk bericht in een van vier provenance-states: de geconfigureerde bridge verzegelde het en weigert een afzender te relayen die upstream niet is geverifieerd; de gebruiker verzegelde het zelf; het NIP-05-record van het adres resolveert naar de verzegelende sleutel; of niets bevestigt de header. In dat laatste geval valt de interface terug op de verzegelende public key, de enige identiteit die het event daadwerkelijk kan bewijzen. Bridge-API-aanroepen authenticeren met NIP-98-ondertekende HTTP-events.
Glow slaat walletlabels op relays op onder een passkey-afgeleide identiteit
Glow is een Breez-self-custodial Lightning-wallet. Passkey-login leidt een Nostr-identiteit af, en walletlabels worden onder die identiteit van relays geladen en opgeslagen, met byte-identieke duplicaten samengevouwen over partiële relay-dekking.
In ontwikkeling
Amethyst herbouwt de relay-auth-beslissingsflow
Amethyst is een Android-Nostr-client. Een blok gemergd werk herstructureert hoe het NIP-42-client-naar-relay-authenticatie afhandelt. De permissie-interface en de beslissingsflow werden herontworpen (PR #3899), authenticatie wacht nu op het oplossen van een challenge in plaats van te timeouten (PR #3905), nieuwe accounts authenticeren standaard altijd met relays (PR #3931), en een keuze “altijd inloggen” wordt geëerd voor relays die het account zelf niet gebruikt (PR #3937). Authenticatie herkent ook NIP-29-groepen en Concord-communities als gejoinde venues (PR #3906), wat voorkomt dat een relay-gehoste groep er bij elke opening uitziet als een onbekend relay.
Twee andere wijzigingen raken protocoloppervlakken. Proof-of-work-mining onder NIP-13 ververst created_at tijdens het minen en krijgt GPU-padanalyse (PR #3911), en full-screen napplet-hosts handelen input-method-insets af (PR #3932). Een begeleide first-run-sleutelback-up met instellingen-ingang merge ook (PR #3909), naast het kunnen dempen van publieke chats (PR #3939).
nostrord implementeert een ongemergd versleutelingssleutelvoorstel
nostrord is een Nostr-chatclient georganiseerd rond relay-scoped groepen. Het mergeerde een implementatie van NIP-4e, een ongemergd voorstel om berichtversleuteling los te koppelen van de identiteitssleutel dat Compass laatst beschreef in het nummer van 15 juli. Het account kondigt zijn eigen kind-10044-versleutelingssleutel aan, houdt de private helft lokaal en decrypteert binnenkomende DM’s in-process, waardoor een bunker of browserextensie volledig uit het leespad valt (PR #261). Apparaatkoppeling over kinds 4454 en 4455 verplaatst die sleutel naar een tweede apparaat, en een self-archive republiceert geschiedenis geadresseerd aan de nieuwe sleutel. Verzenden richtte zich eerst op de aangekondigde sleutel (PR #247), en een follow-up loste koppeling op die succesvol onderhandelde zonder de sleutel over te dragen (PR #271). De pull request stelt dat het wire-formaat de deployed Jumble-implementatie volgt waar die afwijkt van het open voorstel, waardoor de werkdefinitie van deze specificatie in shipped code ligt in plaats van in het document.
Groepsidentiteit werd in dezelfde batch aangescherpt. Een groepsidentificatie is nu alleen uniek binnen zijn relay (PR #269), dus dezelfde identificatie op twee relays wordt behandeld als twee groepen (PR #272), en threadposts renderen als forumposts (PR #274). Verbindingschurn die herhaalde kind-22242-ondertekenprompts produceerde werd ook gestopt (PR #268) — dezelfde klasse signer-druk waar Cambium deze week drie releases aan besteedde.
nostream voegt een relaymonitor toe en mint invite codes
nostream is een TypeScript-relayimplementatie. Het mergeerde een clusterworker en probe-scheduler die NIP-66-relaymonitoring-events publiceren, de discovery-specificatie waarmee een monitor liveness- en capability-data over andere relays kan aankondigen (PR #724), met een settings-schema en defaults (PR #689) en integratietests (PR #733). Een command-line tool mint nu NIP-43-invite codes, het relay-toegangsmetadataschema dat toelating regelt (PR #732), en het relay adverteert eindelijk NIP-13 proof of work in zijn supported-lijst (PR #680), terwijl het PoW al had geïmplementeerd zonder het aan te kondigen. Data-vending-machine-jobs kregen ook een persistentiemigratie en repository (PR #727), en het relay vangt NIP-90 (data-vending-machine job requests) af en registreert ze via de jobrepository (PR #729).
rust-nostr lost een gift-wrap-identificatie op en weigert beschermde reposts
rust-nostr is de Rust-bibliotheek en SDK achter een groot deel van het Rust- en mobile-clientwerk in dit nummer. Het zorgt ervoor dat de rumor-identificatie wordt berekend vóór de gift-wrap-seal wordt versleuteld (PR #1444), dezelfde defectklasse die Mostro deze week in de eigen bibliotheek oploste. Het lokale relay weigert een repost van een NIP-70-beschermd event (PR #1445), de bescherming waarvoor die specificatie bestaat, en NIP-47-responseparsing tolereert ontbrekende en null bedragen (PR #1450) in plaats van te falen op een wallet die ze weglaat. Relay-URL-parsing werd verhard (PR #1451).
NDK voegt post-quantum-DM’s toe en laat een GPL-afhankelijkheid vallen
NDK is een Dart-ontwikkelkit voor Nostr. Het mergeerde hybride post-quantumversleuteling voor directe berichten met ML-KEM-1024, het als FIPS 203 gestandaardiseerde lattice key-encapsulation mechanism (PR #713), naast de klassieke key agreement in plaats van die te vervangen. Een aparte wijziging verving een GPL-3.0-only Dilithium-implementatie door fips204, de ML-DSA-handtekeningstandaard (PR #712), waardoor een licentiebeperking voor applicaties die de kit embedden vervalt. Verbindingen gebruiken nu één identiteit elk (PR #710).
Nostter voegt bookmarklijsten, profielbadges en Blossom-uploads toe
Nostter is een webclient. Het mergeerde ondersteuning voor zowel de standaard- als legacyvormen van NIP-51-bookmarklijsten (PR #2311), werkte de afhandeling van NIP-58-profielbadges bij (PR #2281), voegde een Blossom-media-uploader toe (PR #2298), en toont nu een NIP-05-identificatie, de DNS-gebaseerde verificatienaam, in de mention-autocomplete (PR #2303).
Zap Cooking bindt adminroutes aan ondertekende requests en versleutelt opgeslagen walletverbindingen
Zap Cooking is een receptensite gebouwd op Nostr-longform-events. Een securitybatch versleutelt opgeslagen Nostr Wallet Connect-verbindingsstrings in rust in een NIP-44-envelope (PR #622), vervangt een spoofbare public-key-vergelijking op administratieve routes door NIP-98-HTTP-authenticatie, het schema dat een event ondertekent om een HTTP-request te autoriseren (PR #626), en wist accountdata bij uitloggen terwijl pending NIP-46-records worden begrensd (PR #627).
Protocol- en specificatiewerk
NIPs
Geen pull request mergeerde in nostr-protocol/nips in dit venster. Zes voorstellen openden na sluiting van het vorige nummer, drie daarvan op 18 augustus nadat de draft voor het eerst circuleerde.
NIPs PR #2438 stelt NIP-9A voor, commentaargebaseerd patchen. Een patch is een kind-1111-commentaar dat het gepatchte event als parent refereert en waarvan content begint met het letterlijke label PATCH, gevolgd door patchregels. Een regel die begint met een cijfer bewerkt de content van het doel als <index> -<deleted> +<inserted> <ingevoegde tekens>, geteld in Unicode-tekens in plaats van bytes; een regel die begint met t vervangt een mensleesbare tag zoals title, description, subject of picture. Het ontwerp is bewust backwards compatible: een client die het formaat niet begrijpt toont de patch als een gewoon gelabeld commentaar, en een client die het wel begrijpt past toe en verbergt het commentaar. Het voorstel noemt kinds 1, 11, 1111, 24 en 1621 als patchbaar en vraagt zowel schrijvers als lezers patches te weigeren die te groot, te talrijk of lang na het originele event zijn gepubliceerd — een expliciete poging te voorkomen dat de functie een algemeen bewerkingskanaal voor immutable events wordt.
NIPs PR #2437 stelt bestandsversleuteling voor NIP-94 voor, de bestandsmetadataspecificatie die een geüpload bestand beschrijft in een kind-1063-event. Het voegt drie optionele tags toe: encryption-algorithm, met aes-gcm als enige genoemde waarde, plus een hex-gecodeerde decryption-key en decryption-nonce. De tagsemantiek verschuift dienovereenkomstig, met m die het MIME-type vóór versleuteling beschrijft, x die de hash van het versleutelde bestand bevat, en ox die de hash van het origineel bevat; eventuele thumb-, image- en fallback-bronnen worden onder dezelfde sleutel en nonce versleuteld. Het verklaarde doel is dat een publieke Blossom-operator die de bytes host niet kan zien wat ze zijn, en de auteur kadert de wijziging als het kopiëren van NIP-17-DM-versleutelingseigenschappen naar bestandsmetadata zodat dezelfde behandeling binnen een imeta-tag werkt.
NIPs PR #2436 wijzigt NIP-7D, de forumthreadspecificatie gebouwd op kind-11-threadevents met NIP-22-kind-1111-commentaren als antwoorden. Het voegt een opmaaksectie toe die stelt dat een threadpost kan worden opgemaakt zoals een kind-1-note, met inline afbeeldingen, links en NIP-27-referenties, en ook Djot zou kunnen ondersteunen, een lichte markuptaal met een eenduidige grammatica. Het argument van de auteur is dat het ongespecificeerd laten van opmaak uitnodigt tot een uiteindelijke Markdown-implementatie by default, en de pull request wijst naar squalk als bestaande Djot-implementatie.
NIPs PR #2439 voegt assign- en unassign-methoden toe aan NIP-86 (relaybeheercommando’s), zodat een relaybeheerder adminpermissies aan een andere pubkey kan verlenen zonder de master key te delen.
NIPs PR #2442 volgt op het audiotrackvoorstel dat Compass in januari behandelde terwijl die draft open bleef; de eerdere pull request is inmiddels gesloten en deze shipt in productie op lightning.fm als kind-31337-trackevents, met kind-31339-releaseobjecten, bandprofielen, per-track contributors en optionele NIP-57-zap-splits terwijl verkoop in NIP-99 blijft. Het interopcontract staat op lightning.fm/interop, en de desktoppublisher en self-hosted seller daemon zijn open source.
Marmot
Marmot PR #416 mergeerde op 13 augustus en voegt een durability- en restartcontract toe aan de protocolcore. De geadopteerde documenten definieerden al deterministische convergentie, retained candidate-parent material, publish-before-apply ordering en fail-closed gedrag bij ontbrekende geschiedenis, zonder één ondubbelzinnige regel voor wat gebeurt wanneer een proces wordt onderbroken op de naden daartussen. De wijziging definieert recoverable logical facts, restart equivalence, publish- en convergentie-onderbrekingsgrenzen, observer-atomische transities, omgang met ontbrekend of corrupt materiaal, en application-effect recovery, en voegt crash- en restart-conformiteitsscenario’s toe voor elk punt. Het laat transacties, journals, snapshots, replaystrategie, schedulers en opslagformaten implementatiegedefinieerd, en stelt dat geen wire-encodingwijziging nodig is. De specifieke fout die het uitsluit is een publicatie extern geaccepteerd maar lokaal niet bevestigd, of een gedeeltelijk toegepaste selected branch, die implementatieafhankelijke protocolresultaten produceert na een restart.
Concord en CORDs
Concord PR #18, vorige week behandeld als open voorstel, is nu gemerged op 15 augustus. Het splitst de versleutelde communitylijst over kind-33302-events, verwijdert de limiet van vijftig lidmaatschappen en snoeit retired entries zodat de lijst binnen relay-groottelimieten blijft. Vectors release notes deze week registreren de clienthelft van die wijziging, inclusief tie resolution en de beslissing ongewijzigde data niet meer te republishen.
Concord PR #22 stelt community-eigen audio- en videobrokers voor. De CORD-02-metadata-entiteit zou een optionele av_brokers-lijst naast zijn relays dragen, evoluerend per edition zoals de rest van die entiteit, en het CORD-07-rendezvous zou uit die lijst putten, of uit de broker van het lid wanneer de community geen publiceert, gesorteerd op de bestaande room-keyed tie-break. De broker-tag op presence blijft leesbaar en nuttig om een resterende split te rapporteren, en het argument van het voorstel om die van routing te degraderen is direct: routeren erop laat untrusted input van een medelid de instructie van de community zelf overrulen.
Concord PR #23 maakt bestaand implementatiegedrag normatief in CORD-05. Vóór het persisteren van een join moet de genesis-metadata-edition van de owner openen onder de geleverde sleutels, met geroteerde planes verankerd op het compaction pair. De pull request stelt vooraf dat dit nooit een live kwetsbaarheid was: Vectors bundle acceptance weigert al een bundle waarvan de geleverde root de genesis van de owner niet kan openen en parkeert nooit een uitnodiging voor een community die al wordt vastgehouden, en Armada laat elke bundle vallen die de base van een vastgehouden community zou verplaatsen. Het hiaat was dat geen van beide gedrag verplicht was in de specificatie, zodat een spec-conforme client de kwetsbare versie had kunnen shippen.
Blossom-upgrade-documenten, Napplet-applicatie voorstellen en de Gamma Markets-specificatie registreerden geen wijzigingen in dit venster.
NIP Deep Dive
Badges (NIP-58)
NIP-58, gedefinieerd door de primaire specificatie, geeft één Nostr-identiteit een manier om een andere een benoemd token toe te kennen, en geeft de ontvanger controle over of het op het profiel verschijnt. Het probleem dat het adresseert is dat elke uitspraak over een persoon op Nostr anders slechts een note is: er is geen structuur die zegt wie een claim uitgaf, hoe de claim heet, hoe die eruitziet, en of het subject accepteerde. Badges geven die claim drie aparte ondertekende events met drie aparte auteursintenties erin gecodeerd.
De mechanica zijn gebouwd uit een adresseerbare definitie, een award en een displaylijst. Een badgedefinitie is een kind-30009-event gepubliceerd door de issuer, adresseerbaar via zijn d-tag, zodat de issuer de name-, description-, image- en thumb-tags later kan reviseren zonder de identifier te wijzigen waar alles anders naar wijst. De award is een kind-8-event gepubliceerd door dezelfde issuer, met een a-tag met de 30009:<issuer-pubkey>:<d-identifier>-coördinaat van de definitie en een of meer p-tags die ontvangers benoemen. De displaylijst is een kind-30008-event gepubliceerd door de ontvanger met de vaste d-waarde profile_badges, met a- en e-tagparen waarbij de a-tag de definitiecoördinaat is en de e-tag het specifieke award-event. Die paren zijn geordend en worden als paren gelezen: een a-tag zonder bijbehorende award, of een e-tag zonder bijbehorende definitie, wordt genegeerd, dus een half-gerefereerde badge rendert stilletjes niet.
De design tradeoffs zijn zichtbaar in wat de specificatie weigert te doen. Er is geen revocatiemechanisme en geen vervaldatum, dus een award is een permanente uitspraak van de issuer over een moment in de tijd, en een issuer die van gedachten verandert kan alleen de definitie wijzigen waar de award naar wijst. Er is geen transfer, dus een badge kan niet als token circuleren. Er is geen trusted-issuer-register, wat de hele vertrouwensvraag naar client en lezer duwt: een badge is precies zoveel waard als de public key van de issuer voor de kijker. De specificatie geeft clients ook ruimte om minder badges te tonen dan de ontvanger heeft vermeld en om te kiezen welke afbeeldingsgrootte te renderen, zodat een profiel geen muur van graphics wordt die volledig door derden zijn gekozen.
De dichtstbijzijnde adjacent specificatie is NIP-51, de lijstspecificatie, en het vergelijken van de twee toont waarom badges drie events nodig hebben in plaats van één. Een lijst is één auteur die referenties cureert; de auteur van de lijst is de auteur van de claim. Een badge splitst het auteurschap: de issuer tekent dat de award gebeurde en de ontvanger tekent dat die de weergave accepteert. Geen van beide partijen kan het zichtbare resultaat alleen produceren, wat een badge scheidt van een zelf toegepast label.
Een live kind-8-award opgehaald van nos.lol en relay.primal.net deze week:
{
"id": "08504dec368939bd63849a349cab83dea0ac199a852129dbf68cf35fe5c64e96",
"pubkey": "bef514bd58c8ceea4beb9e6b84a8d983935f7be26f49e14df68098f1ba64156e",
"created_at": 1787051248,
"kind": 8,
"tags": [
["a", "30009:bef514bd58c8ceea4beb9e6b84a8d983935f7be26f49e14df68098f1ba64156e:blocks_orange_league"],
["p", "92dfa05d915196a7a09152fa3f57871debfd422e1d278ac5af266a70c3350b1f", "wss://relay.damus.io"]
],
"content": "Badge awarded!",
"sig": "5bf0218dfec5e56b47339b0b4b992cceedd2e18798fb3d47cafea51850c00827f66251e4a3e08190370e04a5e1d4d092eeb441141b7219acdd18b80290a022f8"
}
Huidige implementaties dekken uitgifte, weergave en lezen. Divine Mobile 1.0.20 mint en kent een badge toe in de app en legt een verdiende badge uit wanneer een lezer erop tikt, Nostter PR #2281 werkt profielbadge-afhandeling bij in een webclient, en Amethyst publiceert award-events met zijn eigen clienttag, waarvan één in relaydata verschijnt naast het voorbeeld hierboven.
Comments (NIP-22)
NIP-22, gedefinieerd door de primaire specificatie, levert een algemeen commentaarevent om te antwoorden op dingen die geen korte tekstnotes zijn. Korte-note-threading had al NIP-10, waarvan de tagconventies rond kind 1 en reply chains groeiden. NIP-22 bestaat omdat een video, artikel, kalender-event, wikipagina of URL een antwoordstructuur nodig heeft die identificeert welk soort ding wordt beantwoord, en die werkt wanneer het doel adresseerbaar is, of een externe resource zonder Nostr-event.
De mechanica draaien om een onderscheid tussen hoofd- en kleine letters. Een commentaar is een kind-1111-event dat twee tagsets draagt: hoofdlettertags beschrijven de root van de discussie en kleine-lettertags beschrijven de directe parent. E, A en I benoemen een root-event, een root-adrescoördinaat of een root-externe identifier, K benoemt het kind van de root, en P benoemt de root-auteur. De kleine e, a, i, k en p benoemen dezelfde feiten over de parent — bij een top-level commentaar is dat de root zelf, bij een genest antwoord een ander kind-1111-commentaar. Die splitsing betekent dat een client een hele discussie kan ophalen met één filter op de hoofdletter-root-tags, zonder de reply chain te lopen, terwijl nesting correct wordt gerenderd uit de kleine-letter-parent-tags. De I- en i-varianten dragen externe identifiers in het NIP-73-formaat, wat een commentaardraad aan een webpagina, podcastaflevering of boek laat hangen.
De tradeoffs gaan vooral over wat NIP-22 niet absorbeert. De specificatie stelt dat commentaren niet mogen worden gebruikt om te antwoorden op kind-1-notes, wat twee threadingmodellen uit dezelfde objecten houdt en NIP-10 op zijn plek laat waar het al werkt. Nesting is toegestaan maar de root blijft vast, dus een diepe thread verliest nooit zijn anker zelfs wanneer tussenevents ontbreken. De kind-tags zijn het dragende deel: een client die een commentaar ophaalt zonder het doel kan nog steeds zien waar het naar kijkt uit K en k, en beslissen of het dat kind kan renderen. Wat de specificatie niet biedt is enig ordering- of moderatiemodel, dus weergavevolgorde, collapsing en verbergen zijn volledig clientbeleid.
Vergeleken met NIP-10 ligt het verschil in typing. NIP-10 neemt aan dat het doel een note is en codeert positie in een thread; NIP-22 codeert identiteit en kind van het doel expliciet en neemt verder niets aan. Die expliciete typing is waarom de nieuwere voorstellen in dit nummer naar kind 1111 grijpen: een commentaar draagt al een machineleesbare uitspraak over waar het aan hangt.
Een live kind-1111-commentaar opgehaald van nos.lol en relay.primal.net deze week, antwoordend op een ander commentaar onder een video:
{
"id": "c8d335f8bfea58ecd1a943d6000fb2045f4bddf4a36c67df53eb661671f7ab45",
"pubkey": "3e911baba55ae247339cf805dd6ff49ad2cd6bee84ac44e088ce66450c49104f",
"created_at": 1787062681,
"kind": 1111,
"tags": [
["E", "1c492f2bac17b79d66934a340fa43d8d30d0aea4c9fa329346c05573ef912d70", "", "482d024b8acfde50e7429e5ac561d764f3a53a8b4fb0b6975369d9f0926ef839"],
["A", "34236:482d024b8acfde50e7429e5ac561d764f3a53a8b4fb0b6975369d9f0926ef839:e64ba9ea157b1a315caff51dbca656ed73ce817d4494e3966adf24055a86f5c5", ""],
["K", "34236"],
["P", "482d024b8acfde50e7429e5ac561d764f3a53a8b4fb0b6975369d9f0926ef839"],
["e", "7a14723b9ef999e74b1757a0fb74942cb6c121138d4ddafe096a57a67ed0a442", "", "8b69e548402afa997343d73e8088224a440f256350f6257b61acc4bb1fa4af4f"],
["k", "1111"],
["p", "8b69e548402afa997343d73e8088224a440f256350f6257b61acc4bb1fa4af4f"],
["client", "Divine", "31990:d95aa8fc0eff8e488952495b8064991d27fb96ed8652f12cdedc5a4e8b5ae540:divine-mobile", "wss://relay.divine.video"]
],
"content": "niiice",
"sig": "a5517fdea07647efa7ab1730fbea8df882690bba667e93ea5aeba4a73be6a49af1ee17c045535483650caf41dbbcb0897d5803fa39b59f395fd6f9bb193bb789"
}
De hoofdlettertags houden de video en de auteur vast terwijl de kleine e en k naar het parent-commentaar wijzen — de vorm die de specificatie beschrijft. Implementaties die kind 1111 lezen en schrijven omvatten Divine Mobile, waarvan de clienttag in het event hierboven staat, Amethyst, waarvan commentaren in dezelfde relayresultaten verschijnen, en nostrord, dat threadposts deze week als forumposts rendert. Het voorgestelde patchformaat in NIPs PR #2438 bouwt voort op hetzelfde kind.
Stuur een NIP-17-DM om een project of nieuwsitem te delen via het Nostr Compass-project.