Skip to content

topical communities#4

Open
alltheseas wants to merge 11 commits into
damus-io:masterfrom
alltheseas:patch-2
Open

topical communities#4
alltheseas wants to merge 11 commits into
damus-io:masterfrom
alltheseas:patch-2

Conversation

@alltheseas
Copy link
Copy Markdown

@alltheseas alltheseas commented Sep 29, 2025

Topical communities

Summary by CodeRabbit

Documentation

  • Published a DIP-style specification for open communities on Nostr: defines community identification, timelines, and a subscription mechanism.
  • Describes privacy handling (public identifiers vs encrypted community content) and client behavior for merging public and private entries during login and subscribe/unsubscribe flows.
  • Includes example queries, relationship notes to existing specs, and a one-day proof-of-concept link.

simply community DIP
added non- to bitcoiners
updated with Daniel's elaboration and details
added link to NIP-22
Added "Isn't this just NIP-22?" dev question
Update simple open communities with publishing subscribed communities
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jan 16, 2026

Warning

Rate limit exceeded

@alltheseas has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 15 minutes and 56 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📝 Walkthrough

Walkthrough

Adds a new DIP proposal document (05.md) that specifies open communities in Nostr: community identifiers (NIP-73), timeline construction using kind:1111 posts with root I tags, a subscription mechanism via kind:30073 events, privacy handling, client merge behavior, example queries, and PoC link.

Changes

Cohort / File(s) Summary
Community Protocol Documentation
05.md
Adds 126-line DIP proposal describing open communities: NIP-73 identifiers for topics/relays/geohashes, timelines from kind:1111 posts with root I tags, subscription events via kind:30073 (d and I tags, optional encrypted content), privacy/encryption guidance (NIP-44/NIP-51), client merge/login/subscribe/unsubscribe behaviors, example queries, relation to NIP-22, and a one-day PoC link.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 I found a doc beneath a tree,
Ideas for communities, wild and free.
With tags and kinds our pathways gleam,
I hop along, a spec-lit dream.
Hooray for pixels, relays, and tea! 🥕✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'topical communities' accurately reflects the main change, which introduces a new DIP proposal document (05.md) defining topical communities in Nostr via open communities specification.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@jb55
Copy link
Copy Markdown
Contributor

jb55 commented Jan 16, 2026

maybe just call it "topical communities"

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@05.md`:
- Line 12: Fix the grammatical typo in the markdown sentence that reads "This is
can be" by replacing it with "This can be" in file 05.md; search for the exact
phrase "This is can be a major roadblock for adoption of
public-square/Twitter-style/`kind:1` clients outside Bitcoiner circles." and
update it to "This can be a major roadblock for adoption of
public-square/Twitter-style/`kind:1` clients outside Bitcoiner circles." to
correct the grammar.
- Line 7: The sentence in 05.md repeats "find their people"; remove the
redundant phrase so it reads smoothly (e.g., "Bitcoiners find it easy to find
their people and join in the conversation. However, for non-bitcoiners, it is
not trivial to find interesting people to follow or conversations to join.").
Edit that sentence to keep a single occurrence of "find their people" and adjust
punctuation/capitalization accordingly.
- Line 123: Remove the stray editing artifact "1m" found in the document (a lone
token present on its own line); open 05.md, locate the line containing the
extraneous "1m" and delete that token so the line is either blank or replaced
with the intended content, then save the file.
🧹 Nitpick comments (3)
05.md (3)

90-93: Format encrypted content structure as a proper code block.

The JSON structure showing the encrypted content format is not in a proper code block, which reduces readability and makes it harder to distinguish from the surrounding text.

📝 Proposed fix
   Encrypted content format:
+  ```json
   {
     "communities": ["#private-topic", "#another-private"]
   }
+  ```

35-51: Consider adding guidance on community discovery.

The spec clearly defines how communities are structured and how timelines are built, but doesn't address how users discover available communities. Consider adding a section explaining:

  • How clients populate a list of available communities for users to browse
  • Whether there's a recommended way to discover popular or active communities
  • How new communities become visible to users

This would help implementers create a better user experience for community discovery.


58-70: Add language identifier to code fence.

The code fence showing the event structure should have a language identifier (e.g., json) for proper syntax highlighting.

Based on static analysis hints.

📝 Proposed fix
-```
+```json
   {
     "kind": 30073,
     "tags": [
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 617013e and 53489ef.

📒 Files selected for processing (1)
  • 05.md
🧰 Additional context used
🪛 LanguageTool
05.md

[grammar] ~10-~10: Use a hyphen to join words.
Context: ...content is overwhelmingly Bitcoin /Nostr oriented, they often leave within a few ...

(QB_NEW_EN_HYPHEN)


[style] ~18-~18: This phrase can be considered informal. To elevate your writing, consider using a more professional alternative.
Context: ...bling: - veteran nostr/bitcoin users to talk about other specific interests or topics that...

(TALK_ABOUT_DISCUSS)


[style] ~18-~18: In American English, abbreviations like “etc.” require a period.
Context: ...abbing, Physics, Math, specific cities, etc) - new non-Bitcoiner users to easily fi...

(ETC_PERIOD)


[grammar] ~29-~29: Use a hyphen to join words.
Context: ...new users on kind:1 clients. ### One day prototype/proof of concept This is ...

(QB_NEW_EN_HYPHEN)


[style] ~122-~122: In American English, abbreviations like “etc.” require a period.
Context: ...antically interpret different I tags, etc). This DIP aims to specify one specific...

(ETC_PERIOD)

🪛 markdownlint-cli2 (0.18.1)
05.md

5-5: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)


5-5: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


29-29: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


33-33: Bare URL used

(MD034, no-bare-urls)


35-35: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


53-53: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


58-58: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


71-71: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


88-88: Bare URL used

(MD034, no-bare-urls)


120-120: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

🔇 Additional comments (1)
05.md (1)

55-55: kind:30073 is available for use.

Verification confirms that kind:30073 is not defined in any published NIP or existing Nostr specification, so there are no conflicts with official standards. This is an appropriate choice for a new parameterized replaceable event kind.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment thread 05.md Outdated
Comment thread 05.md Outdated
Comment thread 05.md Outdated
@alltheseas alltheseas changed the title renamed to simple topical communities topical communities Jan 16, 2026
Comment thread 05.md Outdated
Event Structure
```
{
"kind": 30073,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We use kind: 10015 for hashtag/community follows.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vitorpamplona is that written down somewhere?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIP-51

Comment thread 05.md

## 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.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The 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 I tags" example use cases.

Copy link
Copy Markdown
Contributor

@jb55 jb55 Feb 5, 2026

Choose a reason for hiding this comment

The 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)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be the same?

Copy link
Copy Markdown
Contributor

@jb55 jb55 Feb 13, 2026

Choose a reason for hiding this comment

The 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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The 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.

alltheseas and others added 3 commits February 10, 2026 09:15
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@05.md`:
- Around line 122-123: Remove the duplicated paragraph that starts "Yes,
strictly speaking this is part of NIP-22. However, NIP-22 could have some slight
different interpretations..." so only a single instance remains; locate the
repeated block (the two identical consecutive paragraphs) and delete the second
occurrence, leaving the original paragraph unchanged.
- Line 55: Update the documentation line that currently references `kind:30073`
to use the standardized Nostr event kinds: replace `kind:30073` with
`kind:10004` (Communities list) and mention that it stores references to
community definitions of `kind:34550` via `"a"` tags per NIP-51/NIP-72; adjust
the surrounding sentence to state that users track subscribed communities using
the Communities list (`kind:10004`) containing `"a"` tags pointing to
`kind:34550` community definitions.
🧹 Nitpick comments (3)
05.md (3)

58-70: Add language specifier to code block.

The fenced code block should specify json as the language for proper syntax highlighting.

✨ Proposed improvement
-```
+```json
   {
     "kind": 30073,

91-93: Format JSON example consistently in a code block.

The encrypted content format should be in a fenced code block like other JSON examples in this document for consistency and readability.

📦 Proposed improvement
   Encrypted content format:
+  ```json
   {
     "communities": ["#private-topic", "#another-private"]
   }
+  ```

112-116: Add language specifier to code block.

The fenced code block should specify json as the language for proper syntax highlighting.

✨ Proposed improvement
-  {
+  ```json
+  {
     "kinds": [30073],
     "authors": ["<pubkey>"],
     "#d": [""]
   }
+  ```

Comment thread 05.md Outdated
Comment thread 05.md
Per NIP-51, kind 30xxx events are parameterized replaceable events
intended for users to have MULTIPLE lists with different d-tag values.
Since this DIP uses an empty d-tag (users only need ONE global community
subscription list), it should use a standard replaceable event (10xxx range).

This change:
- Updates kind from 30073 to 10073
- Removes the unnecessary "d" tag
- Updates documentation from "parameterized replaceable" to "replaceable"
- Simplifies query filters (no need for #d filter)

Users can still subscribe to unlimited communities via multiple I tags.
This change only affects the event kind architecture, not functionality.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@alltheseas
Copy link
Copy Markdown
Author

cc @derekross

@alltheseas
Copy link
Copy Markdown
Author

alltheseas commented Feb 10, 2026

Comparison: DIP-05 vs NIP-72 vs NIP-29                                                                                                      
                                                                                                                                              
  Here's a breakdown of the three approaches:                                                                                                 
                                                                                                                                              
  This DIP (Topical Communities) - Simple & Open                                                                                              
                                                                                                                                              
  Philosophy: Like Twitter hashtags or "un-owned subreddits"
  - ✅ Completely open - no owners, no moderators (for topic/geohash communities)                                                             
  - ✅ Dead simple - just add an I tag with a NIP-73 identifier                                                                               
  - ✅ Permissionless - anyone can post to any community                                                                                      
  - ✅ Three types: Topics (#gardening), Relays (URL), Geohashes (location)
  - Uses kind 1111 for posts
  - Users track subscriptions in kind 10073 (after our fix)

  Key insight: "We want to talk about Linux, gardening, or physics without needing someone to create/moderate a community first"

  ---
  NIP-72 Communities - Reddit-Style with Moderation

  Philosophy: Like Reddit subreddits - organized communities with moderation
  - ⚙️ Has owners/moderators - defined in community metadata
  - ⚙️ Moderation system - moderators issue approval events (kind 4550)
  - ⚙️ Community definition event - kind 34550 defines the community
  - ⚙️ Structured - name, description, image, moderator list
  - Uses kind 1111 for posts (same as DIP)
  - Moderators can approve/remove posts

  Example: "Bitcoin Discussion" community with specific moderators who curate content

  ---
  NIP-29 Groups - Private Chat Rooms

  Philosophy: Like Discord servers or Telegram groups - closed, relay-enforced
  - 🔒 Closed membership - only approved members can write
  - 🔒 Relay-enforced - the relay controls access
  - 🔒 Complex permission system - roles, admins, invites
  - 🔒 Privacy options - private, restricted, hidden, closed modes
  - 🔒 9+ event kinds for management (9000-9020, 39000-39003)
  - Uses regular kind numbers (11, 12, etc.) with h tag

  Example: Private group chat for a project team

  ---
  Quick Comparison Table
  ┌────────────┬────────────────────────────┬──────────────────────────┬──────────────────────────────┐
  │  Feature   │           DIP-05           │          NIP-72          │            NIP-29            │
  ├────────────┼────────────────────────────┼──────────────────────────┼──────────────────────────────┤
  │ Access     │ Open to all                │ Open, moderated          │ Closed, invite-only          │
  ├────────────┼────────────────────────────┼──────────────────────────┼──────────────────────────────┤
  │ Ownership  │ None (topics/geo) or relay │ Community creator + mods │ Relay + admins               │
  ├────────────┼────────────────────────────┼──────────────────────────┼──────────────────────────────┤
  │ Moderation │ None or relay-level        │ Yes (approval events)    │ Yes (relay-enforced)         │
  ├────────────┼────────────────────────────┼──────────────────────────┼──────────────────────────────┤
  │ Complexity │ Very simple                │ Medium                   │ Complex                      │
  ├────────────┼────────────────────────────┼──────────────────────────┼──────────────────────────────┤
  │ Post Kind  │ 1111                       │ 1111                     │ Regular kinds (11, 12, etc.) │
  ├────────────┼────────────────────────────┼──────────────────────────┼──────────────────────────────┤
  │ Best For   │ Discovery, topics, casual  │ Organized communities    │ Private groups               │
  ├────────────┼────────────────────────────┼──────────────────────────┼──────────────────────────────┤
  └────────────┴────────────────────────────┴──────────────────────────┴──────────────────────────────┘
  ---
  Why DIP-05 Exists

  From the DIP itself:
  "Nostr is like a large bitcoin meetup. Non-bitcoiners can't find their people... This DIP enables new users to find content (Linux,
  Gardening, Physics) within 5 minutes."

  The gap it fills:
  - NIP-29 is too closed (can't discover new users)
  - NIP-72 requires someone to create/moderate communities first
  - DIP-05 lets anyone instantly post to #gardening or #linux without setup

  It's the lowest friction approach for topical discovery on Nostr.

CentauriAgent added a commit to CentauriAgent/foxhole that referenced this pull request Feb 10, 2026
Per Damus team update in damus-io/dips#4 — regular replaceable event
instead of parameterized replaceable. Removed d tag requirement.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants