nips/65.md

4.2 KiB

NIP-65

Relay List Metadata

draft optional author:mikedilger

A special replaceable event meaning "Relay List Metadata" is defined as an event with kind 10002 having a list of r tags, one for each relay the author uses to either read or write to.

The primary purpose of this relay list is to advertise to others, not for configuring one's client.

The content is not used and SHOULD be an empty string.

The r tags can have a second parameter as either read or write. If it is omitted, it means the author uses the relay for both purposes.

Clients SHOULD, as with all replaceable events, use only the most recent kind-10002 event they can find.

The meaning of read and write

Write relays are for events that are intended for anybody (e.g. your followers). Read relays are for events that address a particular person.

Clients SHOULD write feed-related events created by their user to their user's write relays.

Clients SHOULD read feed-related events created by another from at least some of that other person's write relays. Explicitly, they SHOULD NOT expect them to be available at their user's read relays. It SHOULD NOT be presumed that the user's read relays coincide with the write relays of the people the user follows.

Clients SHOULD read events that tag their user from their user's read relays.

Clients SHOULD write events that tag a person to at least some of that person's read relays. Explicitly, they SHOULD NOT expect that person will pick them up from their user's write relays. It SHOULD NOT be presumed that the user's write relays coincide with the read relays of the person being tagged.

Clients SHOULD presume that if their user has a pubkey in their ContactList (kind 3) that it is because they wish to see that author's feed-related events. But clients MAY presume otherwise.

Motivation

There is a common nostr use case where users wish to follow the content produced by other users. This is evidenced by the implicit meaning of the Contact List in NIP-02

Because users don't often share the same sets of relays, ad-hoc solutions have arisen to get that content, but these solutions negatively impact scalability and decentralization:

  • Most people are sending their posts to the same most popular relays in order to be more widely seen
  • Many people are pulling from a large number of relays (including many duplicate events) in order to get more data
  • Events are being copied between relays, oftentimes to many different relays

Purposes

The purpose of this NIP is to help clients find the events of the people they follow, to help tagged events get to the people tagged, and to help nostr scale better.

Suggestions

It is suggested that people spread their kind 10002 events to many relays, but write their normal feed-related events to a much smaller number of relays (between 2 to 6 relays). It is suggested that clients offer a way for users to spread their kind 10002 events to many more relays than they normally post to.

Authors may post events outside of the feed that they wish their followers to follow by posting them to relays outside of those listed in their "Relay List Metadata". For example, an author may want to reply to someone without all of their followers watching.

It is suggested that relays allow any user to write their own kind 10002 event (optionally with AUTH to verify it is their own) even if they are not otherwise subscribed to the relay because

  • finding where someone posts is rather important
  • these events do not have content that needs management
  • relays only need to store one replaceable event per pubkey to offer this service

Why not in kind 0 Metadata

Even though this is user related metadata, it is a separate event from kind 0 in order to keep it small (as it should be widely spread) and to not have content that may require moderation by relay operators so that it is more acceptable to relays.

Example

{
  "kind": 10002,
  "tags": [
    ["r", "wss://alicerelay.example.com"],
    ["r", "wss://brando-relay.com"],
    ["r", "wss://expensive-relay.example2.com", "write"],
    ["r", "wss://nostr-relay.example.com", "read"],
  ],
  "content": "",
  ...other fields