NIPs by PolleramaCommunity NIPs, surfaced by trustConnect
npub1patrlck0muv...

Pinboards

Published Jul 14, 2026
kind 30067 · Pinboardkind 39067 · Pin

Pinboards

draft optional

This NIP defines a pinboard system for Nostr, enabling users to create visual collections of curated content. Pinboards use a two-event architecture that separates board metadata from individual pins, allowing for mixed-content curation, collaborative boards, cross-board pinning, and profile-level pins.

Motivation

NIP-51 defines list kinds for content curation, but these have structural limitations that Pinboards attempt to address.

Content-Type Segregation

NIP-51 defines separate curation set kinds for specific content types:

KindContent TypeExpected Tags
30004Articles/notesa (kind:30023), e (kind:1)
30005Videose (kind:21)
30006Picturese (kind:20)

This forces users to maintain separate lists for different media. A "Japan Trip 2024" collection requires:

  • A kind 30006 set for photos
  • A kind 30005 set for videos
  • A kind 30004 set for blog articles
  • A kind 30003 set for external links

Pinboards allow heterogeneous content in a single collection. One "Japan Trip 2024" pinboard can contain photos, videos, articles, notes, external links, books, podcasts—organized together thematically.

Additional NIP-51 Limitations

LimitationNIP-51 ListsPinboards
Content typesSegregated by kindMixed in one board
Item storageAll embedded in one eventSeparate events per pin
CollaborationSingle author onlyOptional multi-author
Cross-postingItems belong to one listPins reference multiple boards
AttributionList owner onlyPer-pin author tracking
ScalabilityLimited by event sizeUnlimited pins

Event Kinds

Kind 30067: Pinboard

A parameterized replaceable event containing board metadata. Pins are stored separately.

Required Tags:

TagDescription
dUnique identifier (used to generate naddr)
titleHuman-readable board title

Optional Tags:

TagDescription
descriptionExtended description of the board
imageCover image URL
tHashtag for categorization (repeatable)
collaborativePresence-only flag; when present, anyone can pin to this board

Content: Empty string or optional description text.

Example:

{
  "kind": 30067,
  "pubkey": "<board-creator-pubkey>",
  "created_at": 1704067200,
  "content": "",
  "tags": [
    ["d", "japan-trip-2024"],
    ["title", "Japan Trip 2024"],
    ["description", "Photos, videos, and memories from my trip to Japan"],
    ["image", "https://example.com/mt-fuji.jpg"],
    ["t", "japan"],
    ["t", "travel"],
    ["collaborative"]
  ]
}

Board Address Format: 30067:<pubkey>:<d-tag>

Kind 39067: Pin

A regular event representing a single pinned item. Unlike NIP-51 lists where items are embedded as tags, each pin is its own event—enabling per-item authorship, comments, and flexible board membership.

Required Tags:

TagDescription
dUnique identifier (used to generate naddr)
Board Reference Tags (Optional)
TagDescription
ABoard coordinate: 30067:<pubkey>:<d-tag> (repeatable for multi-board pinning)

A pin with no board A tags is a "profile pin" displayed on the author's profile.

Content Reference Tags (Exactly One Required)

Pins reference content using two methods:

For Nostr events — use e or a tags:

TagDescription
eEvent reference for notes (kind:1), pictures (kind:20), videos (kind:21/22), etc.
aCoordinate reference for articles (kind:30023), bookmarks (kind:39701), recipes, etc.

For external content — use NIP-73 i tags:

TagDescription
iExternal content ID per [NIP-73](73.md)
kExternal content kind per [NIP-73](73.md)

Supported external content types include:

Typei tag formatk tag
Web URLshttps://example.com/pageweb
Booksisbn:9780765382030isbn
Podcastspodcast:guid:<guid>podcast:guid
Podcast Episodespodcast:item:guid:<guid>podcast:item:guid
Moviesisan:0000-0000-401A-0000-7isan
Academic Papersdoi:10.1000/xyz123doi
Locationsgeo:<geohash>geo
Metadata Tags (Optional)
TagDescription
titleCustom title for this pin
tHashtag (repeatable)

Content: Optional comment about the pinned item.

Examples

Mixed-content board

A single "Japan Trip 2024" pinboard containing photos, videos, articles, notes, and external links:

// Photo (references kind:20 picture event)
{
  "kind": 39067,
  "content": "Sunrise at Mt. Fuji",
  "tags": [
    ["d", "<picture-event-id>"]
    ["A", "30067:<pubkey>:japan-trip-2024"],
    ["e", "<picture-event-id>", "wss://relay.example.com"]
  ]
}

// Video (references kind:21 video event)
{
  "kind": 39067,
  "content": "The bullet train experience",
  "tags": [
    ["d", "<video-event-id>"]
    ["A", "30067:<pubkey>:japan-trip-2024"],
    ["e", "<video-event-id>", "wss://relay.example.com"]
  ]
}

// Article (references kind:30023 long-form content)
{
  "kind": 39067,
  "content": "Great tips for first-time visitors",
  "tags": [
    ["d", "30023:<author>:tokyo-guide"]
    ["A", "30067:<pubkey>:japan-trip-2024"],
    ["a", "30023:<author>:tokyo-guide", "wss://relay.example.com"]
  ]
}

// Note (references kind:1 note)
{
  "kind": 39067,
  "content": "Best ramen I've ever had",
  "tags": [
    ["d", "<note-event-id>"]
    ["A", "30067:<pubkey>:japan-trip-2024"],
    ["e", "<note-event-id>", "wss://relay.example.com"]
  ]
}

// External URL (NIP-73)
{
  "kind": 39067,
  "content": "Where I stayed in Tokyo",
   "tags": [
    ["d", "https://booking.example.com/tokyo-hotel"]
    ["A", "30067:<pubkey>:japan-trip-2024"],
    ["i", "https://booking.example.com/tokyo-hotel"],
    ["k", "web"],
    ["title", "Tokyo Hotel Recommendation"]
  ]
}

// Book recommendation (NIP-73)
{
  "kind": 39067,
  "content": "Read this before visiting",
  "tags": [
    ["d", "isbn:9784805311981"]
    ["A", "30067:<pubkey>:japan-trip-2024"],
    ["i", "isbn:9784805311981"],
    ["k", "isbn"],
    ["title", "Japan Travel Guide"]
  ]
}

Pin to multiple boards

{
  "kind": 39067,
  "content": "",
  "tags": [
    ["d", "<picture-event-id>"]
    ["A", "30067:<pubkey>:japan-trip-2024"],
    ["A", "30067:<pubkey>:best-photos-2024"],
    ["A", "30067:<pubkey>:travel-memories"],
    ["e", "<picture-event-id>"]
  ]
}

Profile pin (no board)

{
  "kind": 39067,
  "content": "My favorite photo ever",
  "tags": [
    ["d", "<picture-event-id>"]
    ["e", "<picture-event-id>"],
    ["t", "photography"]
  ]
}

Pin a pinboard to another pinboard (meta-curation):

{
   "kind": 39067,
   "content": "Amazing travel photography collection",
   "tags": [
     ["d", "30067:<curator>:japan-trip-2024"]
     ["A", "30067:<owner>:best-of-2024"],
     ["a", "30067:<curator>:japan-trip-2024"]
   ]
}

Using NIP-B0 bookmark (optional)

Users who prefer to manage their web bookmarks as events can create a NIP-B0 bookmark first, then pin it:

{
  "kind": 39067,
  "content": "Great resource",
  "tags": [
    ["d", "39701:<pubkey>:github.com/nostr-protocol/nips"]
    ["A", "30067:<pubkey>:dev-resources"],
    ["a", "39701:<pubkey>:github.com/nostr-protocol/nips"]
  ]
}

This is optional—users can also pin URLs directly using NIP-73 i tags.

Collaboration Model

Private Boards (Default)

Without the collaborative tag, only the board owner's pins are displayed.

Filter for private board pins:

{
  "kinds": [39067],
  "authors": ["<board-owner-pubkey>"],
  "#A": ["30067:<board-owner-pubkey>:<d-tag>"]
}

Collaborative Boards

With the collaborative tag present, all pins referencing the board are displayed regardless of author.

Filter for collaborative board pins:

{
  "kinds": [39067],
  "#A": ["30067:<board-owner-pubkey>:<d-tag>"]
}

Content Type Inference

Clients infer content type from the reference to provide appropriate rendering:

**For e tag references:** Fetch the event and use its kind:

KindContent Type
1Note
20Picture
21, 22Video

**For a tag references:** Parse kind from coordinate (kind:pubkey:d-tag):

KindContent Type
30023Long-form article
30078Application data (recipes, etc.)
30311Live event
31922, 31923Calendar event
34550Community
30067Nested pinboard
39701Web bookmark (NIP-B0)

**For i tag references:** Use the k tag value:

k valueContent Type
webWeb link
isbnBook
podcast:guidPodcast
podcast:item:guidPodcast episode
isanMovie
doiAcademic paper
geoLocation

Client Behavior

Displaying Boards

  1. Fetch board event (kind 30067) by coordinate
  2. Fetch pins using appropriate filter based on collaborative flag
  3. For each pin:
  4. If e or a tag: fetch referenced Nostr event
  5. If i tag: render based on content type, optionally fetch metadata
  6. Display in masonry/grid layout with content-type-aware rendering

Creating Pins

  1. Allow selection of target board(s) or "profile pin"
  2. For Nostr content: use e or a tags
  3. For external content: use NIP-73 i/k tags
  4. Accept optional title, comment, and hashtags
  5. Publish kind 39067 with appropriate tags

Profile Pins

Display pins by user that have no board A tag:

{"kinds": [39067], "authors": ["<pubkey>"]}

Filter client-side for pins without 30067: coordinate references.

Engagement

Boards support NIP-25 reactions and NIP-57 zaps:

{
  "kind": 7,
  "content": "+",
  "tags": [
    ["d", "<note-event-id>"]
    ["a", "30067:<pubkey>:<d-tag>"],
    ["p", "<board-author-pubkey>"]
  ]
}

Comparison with NIP-51

FeatureNIP-51 Curation SetsPinboards
Content types per listSingle (30004=articles, 30005=videos, 30006=pictures)Any type in one board
External contentLimitedFull NIP-73 support (URLs, books, podcasts, movies, papers)
Item storageEmbedded in list eventSeparate pin events
CollaborationNoYes (collaborative flag)
Multi-list membershipNoYes (multiple A tags)
Profile-level itemsNoYes (pins without board)
Per-item attributionNo (list owner only)Yes (pin author tracked)
Per-item commentsNoYes (pin content field)
ScalabilityEvent size limitedUnlimited

Security Considerations

  • Validate URLs in i tags to prevent javascript: or data: scheme attacks
  • Sanitize user content before rendering
  • Collaborative boards may receive spam; consider reputation-based filtering

References

  • [NIP-51: Lists](51.md)
  • [NIP-73: External Content IDs](73.md)
  • [NIP-B0: Web Bookmarks](B0.md)
  • [NIP-25: Reactions](25.md)
  • [NIP-22: Comment](22.md)
  • [NIP-57: Lightning Zaps](57.md)