From 191e582525522bc80659eb5bccf0898036c2a08f Mon Sep 17 00:00:00 2001 From: sepehr-safari Date: Wed, 12 Aug 2026 04:20:39 +0300 Subject: [PATCH] The outbox is shipped, so stop calling it planned Per-author routing on other people's relay lists is in Plaza. The NIP table still listed it as planned against a milestone that has landed, the roadmap still had "Reach" in what comes next, and the Plaza page mentioned NIP-65 only for the reader's own relay list. Says what it actually does and what it measured, and why the relays it connects to are not the popular ones. --- content/nips.mdx | 2 +- content/plaza.mdx | 38 +++++++++++++++++++++++++++++++++++--- content/roadmap.mdx | 29 ++++++++++++++++------------- 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/content/nips.mdx b/content/nips.mdx index a111442..7989ba6 100644 --- a/content/nips.mdx +++ b/content/nips.mdx @@ -38,6 +38,7 @@ rather than library surface. | [89](https://github.com/nostr-protocol/nips/blob/master/89.md) | Application handlers | the `client` tag on notes you post | | [92](https://github.com/nostr-protocol/nips/blob/master/92.md) | Media attachments, `imeta` | dimensions read off the tag, so an image reserves its box before it loads | | [57](https://github.com/nostr-protocol/nips/blob/master/57.md) | Zaps, `kind:9735` receipts | receipts are read and shown. Sending is a milestone away | +| [65](https://github.com/nostr-protocol/nips/blob/master/65.md) | Relay lists, `kind:10002` | per-author routing: the feed reads where the people you follow write, and what you post goes where your own list says | ## Planned, and where it lands @@ -48,7 +49,6 @@ missing, it is because I have not made that promise, not because I forgot it. | Spec | Title | Milestone | Status | |----|----|----|----| -| [NIP-65](https://github.com/nostr-protocol/nips/blob/master/65.md) | Per-author routing on other people's `kind:10002` lists. The library side is done above, the routing is not | Reach | 馃毀 planned | | [NIP-24](https://github.com/nostr-protocol/nips/blob/master/24.md) | Extra `kind:0` fields (`display_name`, `website`, `banner`, `bot`, `birthday`), carried through untouched when I rewrite a profile | Your identity, and your key | 馃毀 planned | | [NIP-50](https://github.com/nostr-protocol/nips/blob/master/50.md) | Search, which is a relay-side feature: a `search` string on an ordinary filter | Find anything, and keep it clean | 馃毀 planned | | [NIP-51](https://github.com/nostr-protocol/nips/blob/master/51.md) | Lists: bookmarks (`kind:10003`) and the mute list (`kind:10000`) | Find anything, and keep it clean | 馃毀 planned | diff --git a/content/plaza.mdx b/content/plaza.mdx index ae14836..45a8c3f 100644 --- a/content/plaza.mdx +++ b/content/plaza.mdx @@ -74,8 +74,9 @@ and avatars from `kind:0` 路 inline pictures and link previews 路 threads with t chain above a note and replies nested under it 路 quotes and `nostr:` mentions rendered inline 路 a composer with a mention picker and drafts that survive a quit 路 reactions 路 notifications for what was aimed at you 路 profile pages with a -following count 路 your own relay list, read and write, routed by -[NIP-65](/nips) 路 settings, sessions, and sign-out without lock-in. +following count 路 your own relay list, read and write 路 a feed routed by +[NIP-65](/nips) to where the people you follow actually publish 路 settings, +sessions, and sign-out without lock-in. There is no follower count anywhere, on purpose. Following is a number someone states about themselves, and it is the length of their own contact list. @@ -83,7 +84,38 @@ Followers is not: nothing on your disk can know who follows a person, and the honest options are an indexer's figure or none. Plaza does not print numbers it cannot check. -Private messages are the milestone after this one. +Private messages are a milestone away. + +## Where the feed comes from + +Following somebody on Nostr does not mean you will see them. If they publish +only to relays you are not connected to, they are simply absent: no error, no +empty state, nothing to say a person is missing. + +Plaza reads where the people you follow actually write. It takes their NIP-65 +relay lists, works out which relays reach the most of them, connects to the ones +you are not already on, and asks each relay only about the people who write +there. A small relay is asked about its dozen writers rather than about everyone +you follow, and anybody no chosen relay carries is asked of your own relays, so +nobody falls through. + +The relays it picks are not the popular ones. Popularity answers "what should I +consider adding", which is a question for you; connections answer "which relays +reach people I cannot otherwise see", and the popular relays all carry the same +crowd. So the two questions get two answers: the suggestions in settings are +ranked by how many of your follows use each relay, and the connections are +chosen by who they reach. + +Measured on my own account, which follows 257 people: between the relays I chose +myself and the eight it routes to, 202 of them are covered, and 156 of those by +two relays each, so one relay being down does not hide anybody. The remaining 55 +are asked of every relay I have, which is what the app did for everyone before +any of this. Adding the routed connections is what moved those numbers; without +them the eight relays in my own pool were the whole answer. + +It is bounded on purpose: eight routed connections alongside the eight in your +own pool, and one is only opened while it would reach somebody not already +covered twice, so a tidy follow list opens fewer. ## Careful with what is yours diff --git a/content/roadmap.mdx b/content/roadmap.mdx index f1d49b3..44dc139 100644 --- a/content/roadmap.mdx +++ b/content/roadmap.mdx @@ -26,44 +26,47 @@ No dates. The order is a commitment; a calendar would not be. network answers. - **Docs and benchmarks**: this site, the [NIP-support table](/nips), and reproducible [performance numbers](/performance). +- **Reach**: following somebody means seeing them. Plaza reads the NIP-65 relay lists (kind + 10002) of the people you follow, works out which relays reach the most of them, connects to + the ones you are not already on, and asks each relay only about the people who write there. + Anybody no chosen relay carries is asked of your own relays, so nobody falls through. What + you post goes where your own list says it should, and scrolling past what is on disk asks + the relays for older notes. ## What comes next, in order 1. **Notifications worth opening.** Who it was, what they did, the note it was about, and what a zap carried: NIP-25 reactions, NIP-18 reposts, NIP-10 replies, and NIP-57 zap receipts (kind 9735). Today a reply is a line of text with no face and no content. -2. **Reach.** Following somebody means seeing them: per-author routing from each author's - NIP-65 relay list (kind 10002) on the way in, the outbox model on the way out, and older - notes when you scroll past what is local. -3. **Ship it, and fix it.** A packaged Linux build, an update path that reaches people who +2. **Ship it, and fix it.** A packaged Linux build, an update path that reaches people who already installed, and enough diagnostics to act on a report. A release you cannot fix is a liability. -4. **Your identity, and your key.** Edit your kind 0 profile without dropping the NIP-24 +3. **Your identity, and your key.** Edit your kind 0 profile without dropping the NIP-24 fields another client set, show a NIP-05 address as identification rather than a badge, and export your key as a NIP-49 `ncryptsec` you have verified before you need it. A third way in is being evaluated: a FROST bunker in the shape of fiatjaf's [promenade](https://git.fiatjaf.com/promenade), where the key is split across independent signers and reached over NIP-46. -5. **Readable and usable by everyone.** Operable without a mouse, a light theme, and type +4. **Readable and usable by everyone.** Operable without a mouse, a light theme, and type that scales. -6. **Find anything, and keep it clean.** Search people, notes and hashtags: NIP-50 where a +5. **Find anything, and keep it clean.** Search people, notes and hashtags: NIP-50 where a relay supports it, and `#t` filters for the hashtags. NIP-51 bookmarks (kind 10003) and mutes (kind 10000), and opening a note by address, from a NIP-19 `nevent` or `naddr`. -7. **Media worth looking at.** Post pictures: [Blossom](https://github.com/hzrd149/blossom) +6. **Media worth looking at.** Post pictures: [Blossom](https://github.com/hzrd149/blossom) BUD-02 upload to the servers in your kind 10063 list, with a NIP-92 `imeta` tag so they render elsewhere, and NIP-B7 to re-find a blob by its sha256 when a host goes down. Then the picture a quote quotes, and NIP-71 video (kinds 21 and 22). -8. **Money, carefully.** Zaps you can send and receive (NIP-57) and a NIP-47 wallet +7. **Money, carefully.** Zaps you can send and receive (NIP-57) and a NIP-47 wallet connection, with the care that anything moving money deserves. The kind 9735 receipt is the only proof a zap was paid, and it is the recipient's LNURL server that publishes it. Then NIP-61 nutzaps, Cashu ecash sent to a pubkey: a Lightning zap needs an LNURL provider the recipient signed up for in advance, and an account four clicks old has none, so this is what makes a new person payable at all. -9. **Private messages.** NIP-17, gift wrapped per NIP-59 (a kind 13 seal inside a kind 1059 +8. **Private messages.** NIP-17, gift wrapped per NIP-59 (a kind 13 seal inside a kind 1059 wrap), on the local store, signing through Notary, published only to the recipient's kind 10050 DM relays. -10. **Groups.** NIP-29, on relays that support it: every event carries an `h` tag with the - group id, and the relay hosting the group is the authority on who is in it. +9. **Groups.** NIP-29, on relays that support it: every event carries an `h` tag with the + group id, and the relay hosting the group is the authority on who is in it. ## What this deliberately does not do @@ -92,7 +95,7 @@ you price it. rejection that starts `pow:`, needs no setting at all. - **NIP-96 HTTP file storage.** Supporting both upload paths looks like broader compatibility. NIP-96 carries an `unrecommended` banner in its own spec and the NIPs index - strikes it through as replaced by Blossom, so uploads go to Blossom (item 7) and nowhere + strikes it through as replaced by Blossom, so uploads go to Blossom (item 6) and nowhere else. - **Web-of-trust distance filtering.** Computed over a store that holds only what you happened to sync, the graph is wrong in a way that changes between launches, so the same