-
Notifications
You must be signed in to change notification settings - Fork 2
topical communities #4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 7 commits
4cfff88
603eecd
77b0e8d
89b1001
b547c6e
232322a
53489ef
bc48fcf
9c34c8d
fab7212
f5efbcd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,126 @@ | ||
| Simple topical communities | ||
| ======================= | ||
|
|
||
|
|
||
| ### Problem Statement | ||
|
|
||
| Nostr today is like a large bitcoin meetup. Bitcoiners find it easy to find their people and join in on the conversation by default find their people. However, for *non*-bitcoiners, it is not trivial to find interesting people to follow or conversations to join in. | ||
|
|
||
| We have observed that new users who are not Bitcoin enthusiasts often cannot find people or content that is interesting for them. Since most of the content is overwhelmingly Bitcoin | ||
| /Nostr oriented, they often leave within a few minutes of joining Nostr — thinking it is not "for them". | ||
|
|
||
| This is can be a major roadblock for adoption of public-square/Twitter-style/`kind:1` clients outside Bitcoiner circles. | ||
|
alltheseas marked this conversation as resolved.
Outdated
|
||
|
|
||
| On the flip side, veteran Nostr users often have multiple different interests, but often hold back on talking about them as they believe their followers might not be interested. | ||
|
|
||
|
|
||
| This DIP aims to solve this problem by introducing a simple spec for open communities that can be easily implemented by `kind:1` clients, enabling: | ||
| - veteran nostr/bitcoin users to talk about other specific interests or topics that might be too specific for global timelines (e.g. Linux, Gardening, Homelabbing, Physics, Math, specific cities, etc) | ||
| - new non-Bitcoiner users to easily find content that they are interested in and engage, within 5 minutes of downloading the app. | ||
|
|
||
| This DIP aims to achieve that in a way that: | ||
| - fits well with the general open "public-square" nature of `kind:1` clients. | ||
| - reuses existing NIPs and keeps things simple. | ||
|
|
||
|
|
||
| It is hypothesized that if new to nostr people are joining with or without invite to a nostr community, the ability to easily find interesting conversations outside Bitcoin topics will improve retention of new users on `kind:1` clients. | ||
|
|
||
|
|
||
| ### One day prototype/proof of concept | ||
|
|
||
| This is a quick proof of concept made in a single day to illustrate the general concept: | ||
|
|
||
| https://github.com/user-attachments/assets/59a4de53-fa3d-4df5-8f8f-386cef3ae70c | ||
|
|
||
| ### Spec | ||
|
|
||
| These open communities can be based around different things. For example: | ||
| 1. Topics (similar to subreddits — but with no owners/moderators) | ||
| 2. Relays (More customizable moderation rules can be set by the relay operator — i.e. there is clear ownership) | ||
| 3. Geohashes (For people connecting to others in their area — no owners/moderators) | ||
|
|
||
| Each community is simply defined via [NIP-73](https://github.com/nostr-protocol/nips/blob/master/73.md) identifiers: | ||
| 1. Topic communities are defined by NIP-73 hashtag ids | ||
| 2. Relay communities are defined by NIP-73 URL ids pointing to a Nostr relay | ||
| 3. Geohash communities are defined by NIP-73 geohash ids | ||
|
|
||
| Each community has a timeline. To build a timeline for an open community, clients MAY simply fetch `kind:1111` posts with a root `I` tag for that community. See [NIP-22](https://github.com/nostr-protocol/nips/blob/master/22.md) for details. | ||
|
|
||
| If it is a relay community, clients MAY provide the user the option to fetch events from several relays (censorship resistance), or from the referenced relay (moderated experience). | ||
|
|
||
| Each post can have its own thread. Threads are simply NIP-22 comments with root `E` and `e` tags (pointing to the root thread post, and the parent response — respectively). | ||
|
|
||
| ### Community Subscriptions | ||
|
|
||
| Users track which communities they've subscribed to using a dedicated event `kind:30073`. | ||
|
alltheseas marked this conversation as resolved.
Outdated
|
||
|
|
||
| Event Structure | ||
| ``` | ||
| { | ||
| "kind": 30073, | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should probably be a 10xxx event if the d-tag is always empty. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We use kind: 10015 for hashtag/community follows.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @vitorpamplona is that written down somewhere? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. NIP-51 |
||
| "tags": [ | ||
| ["d", ""], | ||
| ["I", "#gardening"], | ||
| ["I", "#photography"], | ||
| ["I", "#cooking"] | ||
| ], | ||
| "content": "<optional: NIP-44 encrypted private entries>", | ||
| "created_at": <unix timestamp> | ||
| } | ||
| ``` | ||
| ``` | ||
| Tags | ||
| ┌─────┬────────────────────────────────────────────────────────────┐ | ||
| │ Tag │ Description │ | ||
| ├─────┼────────────────────────────────────────────────────────────┤ | ||
| │ d │ Empty string (single list per user) │ | ||
| ├─────┼────────────────────────────────────────────────────────────┤ | ||
| │ I │ NIP-73 community identifier (one per subscribed community) │ | ||
| └─────┴────────────────────────────────────────────────────────────┘ | ||
| ``` | ||
|
|
||
| Privacy | ||
|
|
||
| Community subscriptions can be public, private, or mixed: | ||
|
|
||
| Public entries are stored in I tags, visible to anyone querying the event. | ||
|
|
||
| Private entries are stored in content field, encrypted using https://github.com/nostr-protocol/nips/blob/master/44.md with the user encrypting to themselves (same pubkey for sender and recipient). This follows the same pattern as NIP-51 private entries. | ||
|
|
||
| Encrypted content format: | ||
| { | ||
| "communities": ["#private-topic", "#another-private"] | ||
| } | ||
|
|
||
| Clients MUST merge both public (from tags) and private (from decrypted content) entries when displaying the user's subscribed communities. | ||
|
|
||
| Client Behavior | ||
|
|
||
| On Login: | ||
| 1. Fetch kind:30073 event for the user's pubkey | ||
| 2. Parse I tags for public community subscriptions | ||
| 3. If content is non-empty, decrypt and merge private subscriptions | ||
| 4. Display combined list as "Your Communities" | ||
|
|
||
| On Subscribe/Unsubscribe: | ||
| 1. Update the community list (add/remove from tags or encrypted content) | ||
| 2. Publish updated kind:30073 event | ||
| 3. Being a parameterized replaceable event, only the latest version is kept | ||
|
|
||
| Example Query | ||
|
|
||
| { | ||
| "kinds": [30073], | ||
| "authors": ["<pubkey>"], | ||
| "#d": [""] | ||
| } | ||
|
|
||
|
|
||
|
|
||
| ## Isn't this just NIP-22? | ||
|
|
||
| Yes, strictly speaking this is part of NIP-22. However, NIP-22 could have some slight different interpretations and implementation differences based on the use case (e.g. Which tags to use for constructing threads, how to semantically interpret different `I` tags, etc). This DIP aims to specify one specific interpretation for a specific use case. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am not sure what this NIP is doing different than NIP-22. In the current text, it looks like they are exactly the same, with the same interpretation and use cases, including the "Which tags to use for constructing threads" and "how to semantically interpret different
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes i think that's the point of the nip (or dip in this case) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To be the same?
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. there are lot of different choices you could have, being vague is not good for a spec There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, you guys tell me if there is something extra I need to do on top of NIP-22. Amethyst users can already read/participate in these communities in the current version in production. And users can choose to blend their favorite hashtags/communities with the main follows feed or not. |
||
| 1m | ||
|
alltheseas marked this conversation as resolved.
Outdated
|
||
|
|
||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.