So, hereβs my first foray ever into vibe coding. If anyone wants to add any assistance, please let me know.
But I want to have a TRULY decentralized Wavlake equivalent so that Nostr music canβt have its backbone ripped out from underneath it again.
So here is what I got so far for totally new NIP
βββββββββββββββββββββ-
# NIP-XX β Audio-Only Posts with Tags & Albums
**(Kind 1063 + Kind 1 β Fully Relay-Compatible)**
## Abstract
A lightweight, relay-compatible way to publish **audio-only** content (`.wav`, `.mp3`, `.m4a`, `.mp4` audio) with:
- **Semantic tags** (`music`, `podcast`, `genre:rock`, `mood:chill`, etc.)
- **Album / series grouping** per `npub`
- Optional track number, album art, release year
Uses **existing NIP-94 Kind 1063** for file metadata and **Kind 1** for the user post.
---
## Motivation
- Native support for **music**, **podcasts**, **audiobooks**, **field recordings**, etc.
- Let clients filter/feed by type or genre
- Group tracks into **albums** or **podcast series** without new kinds
- **No relay updates required**
---
## Specification
### 1. Kind 1063 β **Audio File Metadata** (Extended)
| Tag | Required | Description |
|-----|----------|-------------|
| `url` | **yes** | Direct HTTPS URL to the audio file |
| `m` | **yes** | MIME: `audio/wav`, `audio/mpeg`, `audio/mp4`, etc. |
| `size`| no | File size in bytes |
| `t` | **yes** | **Audio type tag** β one of: `music`, `podcast`, `audiobook`, `soundscape`, `spokenword` |
| `g` | no | **Genre tags** β repeatable: `g,rock`, `g,hiphop`, `g,ambient`, `g,comedy`, `g,truecrime` |
| `album` | no | **Album / series name** (e.g., `"Summer Vibes 2025"`, `"TechBit Podcast"`) |
| `track`| no | Track number: `1`, `2`, `1/12`, etc. |
| `year`| no | Release year: `2025` |
| `artist`| no | Display name of creator (fallback: `npub` nickname) |
| `i` | no | Thumbnail / album art URL (recommended 1:1 or 3:2) |
| `duration` | no | Duration in seconds (e.g., `212`) |
> **All new tags are standard NIP-01 `name,value` tags** β relays store them blindly.
#### Example: Music Track in Album
```json
{
"kind": 1063,
"tags": [
["url", "
https://cdn.example.com/tracks/sunset-drive.mp3"],
["m", "audio/mpeg"],
["size", "5231098"],
["t", "music"],
["g", "synthwave"],
["g", "electronic"],
["album", "Neon Nights"],
["track", "3"],
["year", "2025"],
["artist", "DJ Nova"],
["i", "
https://cdn.example.com/art/neon-nights.jpg"],
["duration", "198"]
],
"content": "",
"created_at": 1731714000,
"pubkey": "npub1beatbox...",
"id": "a1b2c3d4...",
"sig": "..."
}
```
#### Example: Podcast Episode
```json
{
"kind": 1063,
"tags": [
["url", "
https://pod.example.com/ep42.m4a"],
["m", "audio/mp4"],
["t", "podcast"],
["g", "technology"],
["g", "startup"],
["album", "Founder Files"],
["track", "42"],
["year", "2025"],
["duration", "3421"],
["i", "
https://pod.example.com/art/founder-files.jpg"]
],
"content": "",
"created_at": 1731714100,
"pubkey": "nostr:npub1podcast...",
"id": "e5f6g7h8...",
"sig": "..."
}
```
---
### 2. Kind 1 β **User Post** (Unchanged, just references)
| Tag | Required | Description |
|-----|----------|-------------|
| `e` | **yes** | ID of the Kind 1063 event (marker `"audio"` recommended) |
```json
{
"kind": 1,
"content": "New synthwave banger from *Neon Nights* β Track 3: Sunset Drive",
"tags": [
["e", "a1b2c3d4...", "", "audio"]
],
"created_at": 1731714010,
"pubkey": "npub1beatbox...",
"id": "x9y8z7w6...",
"sig": "..."
}
```
---
## Album Grouping Logic (Client-Side)
Clients **group audio events** from the **same `pubkey`** by:
```text
Key = pubkey + album tag value
```
### Steps:
1. Fetch all **Kind 1063** events from a given `npub`.
2. Group by:
- `album` tag (if present) β one album
- If missing β treat as **singles** (group under `"Singles"` or `npub` name)
3. Within each album:
- Sort by `track` (numeric or `n/total`)
- Fallback: `created_at`
4. Show album view with cover (`i` tag), tracklist, play-all button.
---
## Client Rendering Rules (Updated)
1. **Detect** Kind 1 with `e` β Kind 1063
2. Read all tags from Kind 1063:
- Render `<audio>` with `url` + `m`
- Show **type badge**: `π΅ Music`, `ποΈ Podcast`, etc.
- Show **genres** as chips: `#synthwave #electronic`
- If `album` exists β show **"From: Neon Nights β’ Track 3"**
3. In **profile/feed view**:
- Group same-album tracks
- Show album card with art (`i`), title, year, track count
---
## Supported Tags Summary
| Tag | Example | Meaning |
|-----|--------|--------|
| `t` | `music` | Primary type |
| `g` | `rock`, `jazz`, `comedy` | Repeatable genres/moods |
| `album` | `Neon Nights` | Group key |
| `track` | `5`, `2/10` | Ordering |
| `year` | `2025` | Filter by year |
| `artist` | `DJ Nova` | Display name |
| `duration` | `198` | Show `3:18` |
---
## Full Example: Album "Neon Nights" (3 tracks)
```json
// Track 1
{
"kind": 1063,
"tags": [
["url", "
https://cdn/.../track1.mp3"], ["m", "audio/mpeg"],
["t", "music"], ["g", "synthwave"], ["album", "Neon Nights"],
["track", "1"], ["year", "2025"], ["i", "
https://cdn/.../cover.jpg"]
],
"id": "track1_id..."
}
// Track 2 β same album, track "2"
// Track 3 β posted with Kind 1
{
"kind": 1,
"content": "Dropping Track 3 tonight!",
"tags": [["e", "track3_1063_id", "", "audio"]],
"id": "post_id..."
}
```
Client shows:
```
Neon Nights (2025) β’ DJ Nova
[Album Art]
1. Opening Credits 3:42
2. Midnight Cruise 4:11
3. Sunset Drive 3:18 β now playing
```
---
## Ready-to-Submit NIP Text
```markdown
# NIP-XX β Audio-Only Posts with Tags & Albums (Kind 1063 + Kind 1)
## Abstract
Extends NIP-94 Kind 1063 to support rich audio tagging and album grouping using only existing event kinds.
## Specification
### Kind 1063 Tags
- `t` (required): `music` | `podcast` | `audiobook` | `soundscape` | `spokenword`
- `g` (repeatable): genre/mood tags
- `album`: album or series name
- `track`: track number (e.g., `3`, `1/12`)
- `year`, `artist`, `duration`, `i` (art): optional
### Kind 1
- Must contain `e` tag pointing to Kind 1063 with marker `"audio"` (recommended)
### Client Behavior
- Group Kind 1063 events by `pubkey + album`
- Sort by `track` or `created_at`
- Render `<audio>` with metadata badges
## Compatibility
- Uses **only Kind 1 and Kind 1063**
- **No relay changes required**
- Works on **all existing relays today**
```