30817:music-playlists-extended

Music Playlists (Extended)

Sunami

published
2026-06-01

This spec defines an addressable event kind for publishing music playlists on Nostr. Tracks can be referenced either by Nostr-native coordinates (a tags) or by Podcast Index GUIDs (i tags) — both are valid and may be used together in the same playlist.

Event Kind

  • 34139: Playlist (addressable per NIP-01)

Playlist Event

A playlist is an addressable event containing an ordered list of music tracks.

Format

The .content field is reserved for a track listing — an ordered list of tracks that clients can display as a fallback. It SHOULD use Markdown and include one track per line in playlist order:

# Playlist Title

Artist One - Track Title
Artist Two - Track Title

N tracks

For playlists using only a tags (Nostr-native), .content MAY be omitted since tracks resolve directly via relays.

For playlist descriptions, use the alt and/or description tags — not .content.

Tags

Required:

  • d - Unique identifier for this playlist
  • title - Playlist title
  • alt - Short human-readable description (NIP-31) — used for accessibility and link previews

Optional:

  • description - Longer human-readable description of the playlist
  • image - URL to playlist artwork
  • a - Track references in Nostr-native format 36787:<pubkey>:<d-tag> (multiple, ordered)
  • i - Track and feed references using Podcasting 2.0 GUIDs (multiple, ordered — see Podcast Index Track References)
  • t - Category tags for discovery
  • type - Playlist type (see Playlist Types)
  • role - Playlist role (see Playlist Roles)

Example (Nostr-native a tags only)

{
  "kind": 34139,
  "content": "Survival Guide - January Shock\nJune & The Jets - You Sure Did\nBear's Snare - Ocean Breeze\n\n3 tracks",
  "tags": [
    ["d", "summer-vibes-2024"],
    ["title", "Summer Vibes 2024"],
    ["alt", "Playlist: Summer Vibes 2024"],
    ["description", "A hand-picked selection of chill electronic tracks from Summer 2024, curated for late-night listening."],
    ["t", "playlist"],
    ["t", "music"],
    ["type", "ep"],
    ["role", "release"],
    ["image", "https://cdn.blossom.example/img/playlist.jpg"],
    ["a", "36787:abc123...:january-shock"],
    ["a", "36787:def456...:you-sure-did"],
    ["a", "36787:abc123...:ocean-breeze"]
  ]
}

Example (both a and i tags)

{
  "kind": 34139,
  "content": "# Summer Vibes 2024\n\nSurvival Guide - January Shock\nJune & The Jets - You Sure Did\nBear's Snare - Ocean Breeze\n\n3 tracks",
  "tags": [
    ["d", "summer-vibes-2024"],
    ["title", "Summer Vibes 2024"],
    ["alt", "Music playlist: Summer Vibes 2024"],
    ["description", "A hand-picked selection of chill electronic tracks from Summer 2024, curated for late-night listening."],
    ["t", "playlist"],
    ["t", "music"],
    ["type", "ep"],
    ["role", "release"],
    ["image", "https://cdn.blossom.example/img/playlist.jpg"],
    ["a", "36787:abc123...:january-shock"],
    ["a", "36787:def456...:you-sure-did"],
    ["a", "36787:abc123...:ocean-breeze"],
    ["i", "podcast:item:guid:a1b2c3d4-e5f6-7890-abcd-ef1234567890"],
    ["i", "podcast:item:guid:b2c3d4e5-f6a7-8901-bcde-f12345678901"],
    ["i", "podcast:item:guid:c3d4e5f6-a7b8-9012-cdef-012345678902"],
    ["i", "podcast:guid:d7b4abee-1234-5678-9abc-def012345678"],
    ["i", "podcast:guid:e8c5bcff-2345-6789-abcd-ef0123456789"]
  ]
}

Nostr-native Track References

Playlists may reference music tracks using a tags in the format:

["a", "36787:<pubkey>:<d-tag>"]

Where:

  • 36787 is the Music Track event kind (see Music Tracks)
  • <pubkey> is the track author's public key (hex)
  • <d-tag> is the track's unique identifier

a tags resolve by querying Nostr relays for the referenced track events.

Podcast Index Track References

Playlists may additionally reference music tracks using i tags with prefixes from the Podcasting 2.0 namespace:

["i", "podcast:item:guid:<itemGuid>"]
["i", "podcast:guid:<feedGuid>"]

Where:

  • podcast:item:guid references a specific track by its RSS <guid> element value. One tag per track, in playlist order.
  • podcast:guid references the feed containing one or more tracks, by the feed's <podcast:guid> element value. Emitters SHOULD NOT emit duplicate podcast:guid tags for the same feed.

Item GUID tags SHOULD appear in playlist order. Feed GUID tags MAY appear in any order.

The mapping between items and feeds is implicit. Clients resolve all feed GUIDs, parse each feed, and search across them to match each item GUID.

Resolution

Clients resolve i tags by:

  1. Collecting podcast:guid values from i tags
  2. Looking up feed URLs via a podcast catalogue (e.g., the Podcast Index API podcasts/byguid endpoint, or any compatible directory)
  3. Fetching and parsing each feed's RSS XML
  4. Matching each podcast:item:guid across all parsed feeds
  5. Falling back to the .content track listing for unresolved items

Playlist Types

The type tag describes the release format:

  • album - A full-length studio album
  • ep - An extended play (typically 4-6 tracks)
  • single - A single track release
  • compilation - A collection of tracks from various sources/artists
  • live - A live recording/performance
  • remix - A remix album
  • soundtrack - Music from a film, game, or other media
  • mixtape - A user-curated or DJ mix
  • demo - A demo recording

Clients MAY use additional values. Unknown values SHOULD be displayed as-is.

Playlist Roles

The role tag describes the playlist's role in the ecosystem:

  • release - An artist's official release (album, EP, single, etc.) (default)
  • curated - A public themed playlist assembled by a single curator
  • personal - A user's private collection, useful for organizing tracks
  • collaborative - A community playlist editable by multiple contributors

When role is omitted, release is assumed.

Implementation Notes

  • Playlists are updatable (addressable events — re-publishing with the same d tag replaces the previous version)
  • a and i tag order are both canonical; clients SHOULD preserve track order when displaying
  • Clients SHOULD handle missing/deleted tracks gracefully — show a placeholder from .content or skip
  • When a feed cannot be resolved (dead URL, removed from index), clients MAY show the corresponding .content line instead
  • When a referenced track is not found via a tags, clients MAY fall back to i tag resolution or skip
  • Use naddr identifiers to link to playlists
  • Playlists support NIP-25 reactions and NIP-22 comments

Cited links

Discussion

Connect a key to comment.