nips/51.md
monlovesmango 30daaedbdb
NIP-51 Lists (#183)
Co-authored-by: Semisol <45574030+Semisol@users.noreply.github.com>
Co-authored-by: Ricardo Arturo Cabral Mejía <me@ricardocabral.io>
Co-authored-by: fiatjaf_ <fiatjaf@gmail.com>
2023-03-09 14:16:57 -03:00

4.0 KiB

NIP-51

Lists

draft optional author:fiatjaf author:arcbtc author:monlovesmango author:eskema depends:33

A "list" event is defined as having a list of public and/or private tags. Public tags will be listed in the event tags. Private tags will be encrypted in the event content. Encryption for private tags will use NIP-04 - Encrypted Direct Message encryption, using the list author's private and public key for the shared secret. A distinct event kind should be used for each list type created.

If a list type should only be defined once per user (like the 'Mute' list), the list type's events should follow the specification for NIP-16 - Replaceable Events. These lists may be referred to as 'replaceable lists'.

Otherwise the list type's events should follow the specification for NIP-33 - Parameterized Replaceable Events, where the list name will be used as the 'd' parameter. These lists may be referred to as 'parameterized replaceable lists'.

List Event Kinds

kind list type NIP
10000 Mute 51a
10001 Pin 51b
30000 Categorized People 51c
30001 Categorized Bookmarks 51d

Replaceable List Event Example

Lets say a user wants to create a 'Mute' list and has keys:

priv: fb505c65d4df950f5d28c9e4d285ee12ffaf315deef1fc24e3c7cd1e7e35f2b1
pub: b1a5c93edcc8d586566fde53a20bdb50049a97b15483cb763854e57016e0fa3d 

The user wants to publicly include these users:

["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"],
["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"]

and privately include these users (below is the JSON that would be encrypted and placed in the event content):

[
    ["p", "9ec7a778167afb1d30c4833de9322da0c08ba71a69e1911d5578d3144bb56437"],
    ["p", "8c0da4862130283ff9e67d889df264177a508974e2feb96de139804ea66d6168"]
]

Then the user would create a 'Mute' list event like below:

{
  "kind": 10000,
  "tags": [
    ["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"],
    ["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],
  ],
  "content": "VezuSvWak++ASjFMRqBPWS3mK5pZ0vRLL325iuIL4S+r8n9z+DuMau5vMElz1tGC/UqCDmbzE2kwplafaFo/FnIZMdEj4pdxgptyBV1ifZpH3TEF6OMjEtqbYRRqnxgIXsuOSXaerWgpi0pm+raHQPseoELQI/SZ1cvtFqEUCXdXpa5AYaSd+quEuthAEw7V1jP+5TDRCEC8jiLosBVhCtaPpLcrm8HydMYJ2XB6Ixs=?iv=/rtV49RFm0XyFEwG62Eo9A==",
  ...other fields
}

Parameterized Replaceable List Event Example

Lets say a user wants to create a 'Categorized People' list of nostr people and has keys:

priv: fb505c65d4df950f5d28c9e4d285ee12ffaf315deef1fc24e3c7cd1e7e35f2b1
pub: b1a5c93edcc8d586566fde53a20bdb50049a97b15483cb763854e57016e0fa3d 

The user wants to publicly include these users:

["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"],
["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"]

and privately include these users (below is the JSON that would be encrypted and placed in the event content):

[
    ["p", "9ec7a778167afb1d30c4833de9322da0c08ba71a69e1911d5578d3144bb56437"],
    ["p", "8c0da4862130283ff9e67d889df264177a508974e2feb96de139804ea66d6168"]
]

Then the user would create a 'Categorized People' list event like below:

{
  "kind": 30000,
  "tags": [
    ["d", "nostr"],
    ["p", "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d"],
    ["p", "32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],
  ],
  "content": "VezuSvWak++ASjFMRqBPWS3mK5pZ0vRLL325iuIL4S+r8n9z+DuMau5vMElz1tGC/UqCDmbzE2kwplafaFo/FnIZMdEj4pdxgptyBV1ifZpH3TEF6OMjEtqbYRRqnxgIXsuOSXaerWgpi0pm+raHQPseoELQI/SZ1cvtFqEUCXdXpa5AYaSd+quEuthAEw7V1jP+5TDRCEC8jiLosBVhCtaPpLcrm8HydMYJ2XB6Ixs=?iv=/rtV49RFm0XyFEwG62Eo9A==",
  ...other fields
}