30817:music-playlists-extended
Music Playlists (Extended)
- signed by
- npub1tp4pz...5s3c7a
- published
- 2026-06-01
- event
- 2ae4f575ab...cbc6
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 playlisttitle- Playlist titlealt- Short human-readable description (NIP-31) — used for accessibility and link previews
Optional:
description- Longer human-readable description of the playlistimage- URL to playlist artworka- Track references in Nostr-native format36787:<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 discoverytype- 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:
36787is 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:guidreferences a specific track by its RSS<guid>element value. One tag per track, in playlist order.podcast:guidreferences the feed containing one or more tracks, by the feed's<podcast:guid>element value. Emitters SHOULD NOT emit duplicatepodcast:guidtags 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:
- Collecting
podcast:guidvalues fromitags - Looking up feed URLs via a podcast catalogue (e.g., the Podcast Index API
podcasts/byguidendpoint, or any compatible directory) - Fetching and parsing each feed's RSS XML
- Matching each
podcast:item:guidacross all parsed feeds - Falling back to the
.contenttrack listing for unresolved items
Playlist Types
The type tag describes the release format:
album- A full-length studio albumep- An extended play (typically 4-6 tracks)single- A single track releasecompilation- A collection of tracks from various sources/artistslive- A live recording/performanceremix- A remix albumsoundtrack- Music from a film, game, or other mediamixtape- A user-curated or DJ mixdemo- 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 curatorpersonal- A user's private collection, useful for organizing trackscollaborative- 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
dtag replaces the previous version) aanditag order are both canonical; clients SHOULD preserve track order when displaying- Clients SHOULD handle missing/deleted tracks gracefully — show a placeholder from
.contentor skip - When a feed cannot be resolved (dead URL, removed from index), clients MAY show the corresponding
.contentline instead - When a referenced track is not found via
atags, clients MAY fall back toitag resolution or skip - Use
naddridentifiers to link to playlists - Playlists support NIP-25 reactions and NIP-22 comments
Cited links
podcastindex.org
Podcastindex.org
The Podcast Index is here to preserve, protect and extend the open, independent podcasting ecosystem.
github.com
nips/01.md at master · nostr-protocol/nips
Nostr Implementation Possibilities. Contribute to nostr-protocol/nips development by creating an account on GitHub.
github.com
GitHub - Podcastindex-org/podcast-namespace: A wholistic rss namespace for podcasting
A wholistic rss namespace for podcasting. Contribute to Podcastindex-org/podcast-namespace development by creating an account on GitHub.
rssboard.org
RSS 2.0 Specification (Current)
The current version of the RSS 2.0 specification (2.0.11), published on March 30, 2009.
github.com
podcast-namespace/docs/1.0.md at main · Podcastindex-org/podcast-namespace
A wholistic rss namespace for podcasting. Contribute to Podcastindex-org/podcast-namespace development by creating an account on GitHub.
podcastindex-org.github.io
API Docs | PodcastIndex.org
Discussion
Connect a key to comment.