The Marathon has begun
Another first π€
nostr:naddr1qqwk6ctjv96xsmmw95cnwd3kxqurgd3nxcmnwdpdxdjkjvr5vypzpup098ryp73kqx47wecyd2y7ceuyup3unrws4sdrhy8g4cl8sljsqvzqqqrkvughyj2d
The Marathon has begun
Another first π€
nostr:naddr1qqwk6ctjv96xsmmw95cnwd3kxqurgd3nxcmnwdpdxdjkjvr5vypzpup098ryp73kqx47wecyd2y7ceuyup3unrws4sdrhy8g4cl8sljsqvzqqqrkvughyj2d
You can watch it here if your client wonβt show you live events
nostr:npub1zafcms4xya5ap9zr7xxr0jlrtrattwlesytn2s42030lzu0dwlzqpd26k5 look what I did fren
vibed out

Whats the spec? Which NIP?
idk itβs all in the documentation of https://watchparty-nostr.shakespeare.wtf
But idk how to find that lol
cc: nostr:npub1hee433872q2gen90cqh2ypwcq9z7y5ugn23etrd2l2rrwpruss8qwmrsv6 nostr:npub18ams6ewn5aj2n3wt2qawzglx9mr4nzksxhvrdc4gzrecw7n5tvjqctp424 nostr:npub1q3sle0kvfsehgsuexttt3ugjd8xdklxfwwkh559wxckmzddywnws6cd26p
I found this in the code
# NIP: Watch Party Implementation
This document describes how this application implements watch parties using NIP-53 (Live Activities).
## Event Kinds
This application uses the following standard NIP-53 event kinds:
### Kind 30311: Live Event (Watch Party)
Used to create and manage watch parties. This is an addressable event that represents a live streaming/watch party session.
**Required Tags:**
- `d`: Unique identifier for the watch party
- `title`: Name of the watch party
- `streaming`: URL to the video/stream to watch
- `status`: Current status (`planned`, `live`, or `ended`)
- `starts`: Unix timestamp when the watch party started/will start
- `p`: Host's pubkey with role "Host"
**Optional Tags:**
- `summary`: Description of the watch party
- `image`: Thumbnail/preview image URL
- `t`: Hashtags for categorization
- `current_participants`: Number of currently active participants
- `total_participants`: Total number of participants who joined
- `ends`: Unix timestamp when the watch party ended/will end
**Example:**
```json
{
"kind": 30311,
"tags": [
["d", "wp-1702234567890-abc123"],
["title", "Movie Night: The Matrix"],
["summary", "Join us for a classic sci-fi movie night!"],
["streaming", "https://youtube.com/watch?v=example"],
["image", "
"],
["status", "live"],
["starts", "1702234567"],
["p", "host-pubkey-hex", "", "Host"],
["t", "movies"],
["t", "scifi"]
],
"content": ""
}
```
### Kind 1311: Live Chat Message
Used for chat messages within a watch party. Each message references the parent watch party event.
**Required Tags:**
- `a`: Coordinate to the parent watch party event (format: `30311:pubkey:d-tag`, with `root` marker)
**Optional Tags:**
- `e`: Event ID of a message being replied to
**Example:**
```json
{
"kind": 1311,
"tags": [
["a", "30311:host-pubkey:wp-1702234567890-abc123", "", "root"]
],
"content": "This movie is amazing! πΏ"
}
```
## Marathons (24/7 Series Streaming)
Marathons are continuous 24/7 watch parties for series collections with 7+ episodes. They enable synchronized viewing of entire series in order with automatic looping.
### Marathon Event Structure
Marathons use the same kind 30311 (Live Event) but with additional metadata:
**Required Tags:**
- All standard kind 30311 tags
- Multiple `streaming` tags, one per episode with optional episode label
- `t` tag with value "marathon" to identify marathon events
- `content` field containing playlist JSON
**Content Field JSON:**
```json
{
"episodes": [
{"episode": 1, "url": "https://..."},
{"episode": 2, "url": "https://..."}
],
"currentEpisode": 0,
"loop": true
}
```
**Example Marathon Event:**
```json
{
"kind": 30311,
"content": "{\"episodes\":[{\"episode\":1,\"url\":\"https://archive.org/ep1\"},{\"episode\":2,\"url\":\"https://archive.org/ep2\"}],\"currentEpisode\":0,\"loop\":true}",
"tags": [
["d", "marathon-abc123"],
["title", "Cowboy Bebop Marathon"],
["summary", "24/7 marathon - 26 episodes playing in order"],
["streaming", "https://archive.org/ep1", "Episode 1"],
["streaming", "https://archive.org/ep2", "Episode 2"],
["status", "live"],
["t", "marathon"],
["t", "kinostr"],
["e", "original-series-post-id", "", "mention"]
]
}
```
### Marathon Features
- **Episode Navigation**: Users can skip forward/backward or jump to any episode
- **Continuous Playback**: Episodes play in sequence with automatic progression
- **24/7 Looping**: Series loops continuously for always-on viewing
- **Synchronized Viewing**: All participants watch the same episode together
- **Minimum 7 Episodes**: Only series with 7+ episodes qualify for marathons
### Series Detection
Series are automatically detected from kind 1 events containing 7+ video URLs. Each URL represents an episode in the series.
## Movie Libraries
This application includes a feature to browse movie collections curated by Nostr users. The implementation:
1. **Curator Discovery**: Users can browse featured curators or add custom curators by npub
2. **Movie Extraction**: Automatically extracts movie links from kind 1 (text notes) events
3. **Supported Platforms**: Archive.org, YouTube, Vimeo, and direct video links
4. **Quick Watch Parties**: Users can create watch parties directly from any movie in a library
5. **Attribution**: Watch parties created from library movies include an `e` tag referencing the original post
### Movie Detection
The application scans kind 1 events for URLs matching:
- `archive.org` domains
- YouTube URLs (`youtube.com`, `youtu.be`)
- Vimeo URLs (`vimeo.com`)
- Direct video files (`.mp4`, `.webm`, `.ogg`, `.m3u8`)
### Watch Party Tags for Library Movies
When creating a watch party from a library movie, additional tags are added:
```json
{
"kind": 30311,
"tags": [
["d", "unique-identifier"],
["title", "Movie Title"],
["streaming", "movie-url"],
["e", "original-post-event-id", "", "mention"],
["t", "kinostr"]
]
}
```
The `e` tag references the original movie post, and the `kinostr` tag categorizes it as movie-related content.
## Implementation Notes
### Video Platform Support
The video player component supports embedding from:
- YouTube (youtube.com, youtu.be)
- Vimeo (vimeo.com)
- Twitch (twitch.tv)
- Direct video files (.mp4, .webm, .ogg, .m3u8)
- Generic iframe embeds for other platforms
### Real-time Updates
- Watch party list refreshes every 30 seconds to show new parties and status changes
- Chat messages refresh every 5 seconds to show new messages
- Auto-scroll to bottom when new chat messages arrive
### Anonymous Viewing
Users can view watch parties and read chat without logging in. Authentication is only required to:
- Create a watch party
- Send chat messages
### NIP-19 Identifiers
Watch parties are identified using `naddr` (addressable event coordinates) which includes:
- Kind: 30311
- Pubkey: Host's public key
- Identifier: The `d` tag value
Format: `/watch/naddr1...`
## Zap Splits (NIP-57)
This application implements automatic zap splits to reward content curators when their movies or series are used in watch parties.
### Split Configuration
When a watch party is created from a library movie or series:
- **Host (Watch Party Creator)**: 70% of zaps
- **Curator (Original Content Poster)**: 30% of zaps
### Implementation
Watch parties created from library content include `zap` tags following NIP-57:
```json
{
"kind": 30311,
"tags": [
["zap", "host-pubkey-hex", "", "70"],
["zap", "curator-pubkey-hex", "", "30"],
["e", "original-post-event-id", "", "mention"]
]
}
```
### User Interface
- **Creation Dialogs**: Show zap split information before creating
- **Watch Party Page**: Display zap split recipients and percentages in sidebar
- **Transparency**: Users can see exactly how their zaps will be distributed
### Benefits
- **Curator Rewards**: Content curators earn passive income when their collections are used
- **Content Discovery**: Incentivizes high-quality content curation
- **Fair Distribution**: Hosts create the experience, curators provide the content
- **Automated**: Splits happen automatically through NIP-57 protocol
## Compliance
This implementation fully complies with:
- **NIP-53**: Live Activities specification
- **NIP-57**: Lightning Zaps with split payments
- **NIP-01**: Basic protocol flow
- **NIP-19**: bech32-encoded entity identifiers
nostr:npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s ππ€ pls sir
Noice π€
i played the first episode in its entirety and it worked really well, never started episode 2 tho
Member Cytube? I member! I wrote a clone of it few years ago, but am too lazy to maintain it. This is very similar tho. I would pick it up again and Nostrify it. If I wasn't lazy. And I am. Lazy.
Lazy ? No prob.
Might be worth a shot. what that Shakespeare do to a existing project tho.
nostr:npub1hee433872q2gen90cqh2ypwcq9z7y5ugn23etrd2l2rrwpruss8qwmrsv6 can answer any questions, I havenβt tried existing projects yet
Well I might just give it a try when I have some time on my hands, just for the heck of it. I really like the blossom and Nostr parts of your take on the watchparty idea.
However moderating the rooms, allow vote based skipping, leader assignment and it's edge cases like leader inactivity/disconnection etc. were the most annoying parts (also why I gave up)
Nostr login would take much of the user account storing it of my hands. Blossom would allow extra advertisement-less media source, which could be huge plusses
You can import projects too if you have the git repo or zip file
Interesting. Maybe I should let it loose on the codebase and see what happens π€