Any Nostr key pair can become a community with no special relay or infrastructure required. A single event declares the community’s relays, blossom servers, and named content sections. Each section normally pairs allowed kinds with a profile list (a tag); Rooms is the exception — see Rooms.
Most event kinds target one or more communities with an h tag (community pubkey). Kind 9 messages in a room use c for the community pubkey instead (Room).
Community Creation Event (kind:10222)
A community is created when a key pair publishes a kind 10222 event. The pubkey of this key pair becomes the unique identifier for that community. One key pair can only represent one community.
The community’s name, picture, and description are derived from the pubkey’s kind 0 metadata event.
{
"id": "<event-id>",
"pubkey": "<community-pubkey>",
"created_at": 1675642635,
"kind": 10222,
"tags": [
// at least one main relay for the community + other optional backup relays
// optional "enforced" = relay only stores events from authors allowed by the section's lists (kind 9 in a room: community in `c`, see [Room][nostr-room])
["r", "<relay-url>", "enforced"],
["r", "<relay-url>"],
// one or more blossom servers
["blossom", "<blossom-url>"],
// one or more ecash mints
["mint", "<mint-url>", "cashu"],
// future: other tags e.g. ["<service-type>", "<url>"] as needed
// Interactions section for comments, reactions, and labels (recommended for all communities)
["content", "Interactions"],
["k", "1111"], // comments
["k", "7"], // reactions
["k", "1985"], // labels
["a", "30000:<pubkey>:Interactions", "<relay-url>"], // profile list
// Rooms: room definitions (kind 30223) — no `a` on this row; per-room lists live on each 30223 ([Room][nostr-room]). Chat in rooms is still kind 9.
["content", "Rooms"],
["k", "30223"],
["content", "Forum"],
["k", "11"],
["a", "30000:<pubkey>:Forum", "<relay-url>"], // profile list
["content", "Apps"],
["k", "32267"], // apps
["k", "30063"], // releases
["a", "30000:<pubkey>:Apps", "<relay-url>"], // profile list
// Optional terms of service, points to another event
["tos", "<event-id-or-address>", "<relay-url>"],
// Optional location
["location", "<location>"],
["g", "<geo-hash>"],
// Optional language(s) — repeat for multilingual communities
["l", "en", "ISO-639-1"]
],
"content": "",
"sig": "<signature>"
}
Tag definitions
| Tag | Description |
|---|---|
r |
Relay URLs for community content. First is main relay. Optional second value enforced: relay only stores events whose author is allowed by the relevant profile list — usually the community pubkey appears in h, except kind 9 in a room, where it appears in c (Room). |
blossom |
Blossom server URLs. |
mint |
Mint URL for token/payment features. |
| other | Communities MAY use additional tags for other server-side services; tag name = service type, first value = URL. Clients SHOULD ignore unknown tags. |
content |
Name of content section (e.g., “Rooms”, “Forum”). |
k |
Event kind allowed in this section. |
a |
Profile list reference: 30000:<pubkey>:<d-tag>. Exception: the Rooms section ( k 30223 ) MUST NOT use a; per-room ACL is only on each kind 30223 (Rooms). |
retention |
Retention policy: [kind, value, type]. Type is “time” (seconds) or “count”. |
tos |
Reference to posting policy event. |
location |
Community location. |
g |
Geo hash. |
l |
Language tag: ISO-639-1 code (e.g. "en"), mark MUST be "ISO-639-1". Repeat for multilingual communities. |
The a tag references a profile list (kind 30000) of member pubkeys (p tags) for that section — except Rooms, where lists live only on kind 30223. Lists also carry membership metadata and optional form for intake. See Profile List Metadata below.
The pubkey of the key pair that creates this event serves as the unique identifier for the community. This means:
- Each key pair can only represent one community
- Communities can be easily discovered by querying for the most recent kind 10222 event for a given pubkey
- Community managers can update their settings by publishing a new kind 10222 event
Profile Lists
Each content section references a profile list via a, except Rooms — Rooms. The whitelist is the set of p tags on the fetched list.
Access Requests
A profile list MAY include a form tag pointing to a Form template (30168:<pubkey>:<form-id>) or a plain web URL. This is the community’s public intake channel:
- A prospective contributor fetches the form template and submits a form response (kind:1069)
-
The community admin reviews the response and, if approved, adds the pubkey as a
ptag to the profile list - That pubkey can now publish to that section — no separate approval event needed
Communities may choose to automate this flow by managing the list with an on-server hot-key that instantly adds/removes profiles based on responses.
Apps targeting a specific community may bypass the form entirely and provide their own UX; with the form tag as a fallback for interoperabilty.
Multiple Tiers
Different content sections can reference different profile lists, creating natural access tiers — see Profile List.
Rooms
On 10222, Rooms is declared with content + k 30223 (room definitions), no a. Chat in those rooms is still kind 9 with c = community pubkey and h = opaque room id (NIP-29 group id shape — not the display name); see Room. ACL for posting is only on each 30223. Clients MUST ignore any a on the Rooms block. Enforcing relays MAY bucket kind 9 by #h like NIP-29; scope with #c.
Targeting publications at communities
Most publications target communities via one or more h tags; each value is a community pubkey. Exception — Room kind 9: c = community pubkey, h = opaque room id (Room).
-
Forum kind 11 is exclusive to one community: exactly one
h= community pubkey. -
Kind 9 in a room (Room): exactly one
c= community pubkey and oneh= room id; see Rooms. -
Other publications (e.g. kind 32267, articles, etc.) may use multiple
htags to target several communities simultaneously; clients filter by these tags when listing content. -
Comments, reactions, and zaps carry no
htag of their own — they just reference the h-tagged event they interact with.
Anyone can zap community content regardless of whitelist status. Query zap receipts on the community relays with no author filtering — external appreciation is always welcome.
Community-Exclusive Publications
Kind 9 (in a room) and Forum kind 11 are exclusive to one community. Forum: h = community pubkey. Kind 9 in a room: c = community pubkey, h = opaque room id (Room, Rooms).
{
"id": "<event-id>",
"pubkey": "<pubkey>",
"created_at": 1675642635,
"kind": 9,
"tags": [
["h", "<opaque-room-id>"],
["c", "<community-pubkey>"]
],
"content": "<message>",
"sig": "<signature>"
}
Forum posts are defined in kind 11.
Requesting from relays
When reading community content, query the community’s relays. For most kinds, filter by #h = community pubkey; for kind 9 in a room, #c = community pubkey and #h = room id (Room). Relays marked enforced only store events from allowed authors per the relevant lists. Relays without enforced may store any author; clients filter by membership.
Common Content Sections
Communities can define any mix of content sections. Typical bundles are below; Rooms (k 30223 on 10222) is in Rooms.
Activity
Recommended for all communities. Covers all forms of activity on community content: reactions, comments, reposts, labels, and reports.
| Kind | Description |
|---|---|
| kind:7 | Reactions |
| kind:1111 | Comments |
| kind:6 | Reposts |
| kind:16 | Generic Reposts |
| kind:1985 | Labels |
| kind:1984 | Reports |
Reposts (kind:6, kind:16) allow community members to bring any existing publication — including content authored outside the community — into the community’s feed without needing to be the original author.
Labels (kind:1985) can also function as a categorized repost: a member targets a label event at the community’s relay to surface and tag external content under a community-defined category without republishing the original event or requiring authorship.
When a publication targets multiple communities, members from all those communities participate together: filter by the Activity section’s profile list from each targeted community. Members meet in one shared discussion around the publication — no duplicates, no fragmented conversations across multiple places.
Communities that don’t want to be part of discussions with certain other communities can simply not accept those events.
Projects
For project planning and tracking.
| Kind | Description |
|---|---|
| kind:30315 | Projects |
| kind:30316 | Milestones |
Apps
For app and release publishing.
| Kind | Description |
|---|---|
| kind:32267 | Apps |
| kind:30063 | Releases |
Forum
For threaded discussion. Uses kind 11 posts, each targeting the community via a single h tag. Forum posts are exclusive to one community and cannot be targeted at multiple communities simultaneously.
Listing a User’s Communities
Since communities are just pubkeys, existing Nostr primitives (like profile lists) can be used to list which communities a user is part of.
Pinned Content
Communities can also publish a kind 10001 pin list like any other profile. This gives communities a built-in way to feature content — pinned articles, apps, releases, or any other event — without any additional spec. Clients that display pinned events on profiles will automatically show them for communities too.
Implementation Notes
Communities work on any standard Nostr relay. Access control may be enforced client-side only, or optionally by relays that the community marks with enforced on the r tag.
Client filtering workflow:
-
Fetch the community’s kind 10222 event to get content sections and which relays (if any) are
enforced -
Fetch lists: each section’s
atags, except Rooms (noaon 10222 — use 30223, Rooms) -
Query:
#h= community for most kinds; kind 9 in a room uses#c= community and#h= room id (Room). Withenforced, lists are already applied; otherwise filterauthorsagainst the right lists.
Media fallback:
Community blossom servers SHOULD back up all media files referenced in community publications — even when the original URLs point to different servers. By storing files by their content hash, the community server becomes a reliable fallback when external URLs suffer link rot. Clients can try the community’s blossom server when the original media URL fails.
Additional recommendations:
- Clients MAY cache community metadata and profile lists to reduce relay queries
- Clients SHOULD check membership before attempting to publish
-
Relays MAY optionally enforce profile list membership (and then list themselves with
enforcedin the community’srtag); otherwise clients filter by membership. Relays MAY implement retention policies; this is not required.
Benefits
- No special relay required — works on any standard Nostr relay
- Easy onboarding — new users don’t need to set up any personal relay or media server to join Nostr via a community. They can use the community’s relay and blossom server immediately.
- Any existing npub can become a community
- Most existing publications can be targeted at communities (backwards compatible)
- Communities are not permanently tied to specific relays
- Communities can define their own content types with membership-based access control
-
Cross-community interaction via multi-community
htags on publications - Users can request access by submitting Form Responses
-
Simple membership management — just add/remove
ptags in the membership list
Comments
Public conversation about this article.
No comments yet.
Article metadata
About this entry
Event Id
Raw event
Other authors
No one else has published this topic yet.
