Files
podsteadr/README.md
T
ssmithxandClaude Fable 5 594a9a8783 feat(server): podpuddle scaffold + Fastify backend (nostr auth, RSS, streams)
- docker-compose stack: podpuddle + MediaMTX (RTMP/WHIP/HLS) + blossom-server
- NIP-98 nostr-only login with session cookies, replay guard, clock-skew window
- podcasts/episodes CRUD; episodes register browser-uploaded blossom blobs
- RSS 2.0 + itunes + podcast namespace feeds with lnaddress value blocks
  (podcast:guid UUIDv5 verified against the spec vector)
- streams API with hashed stream keys; MediaMTX http-auth webhook
  (query/password/bearer forms); API poller flips live/ended status
- NIP-53 kind 30311 live events published with the server's nostr identity
- recordings: ffmpeg remux + server-key blossom upload → podcast episode
- 35 vitest tests green

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 19:01:38 +00:00

60 lines
2.0 KiB
Markdown

# podpuddle
Self-hosted, nostr-native podcast publishing and livestreaming.
- **Log in with nostr** — NIP-07 browser extension (Alby, nos2x, …); the server verifies
NIP-98 signed requests. No passwords, no email.
- **Upload an mp4** → it is stored on a [Blossom](https://github.com/hzrd149/blossom) server
(bundled, or point at any external one) and published in an RSS 2.0 podcast feed with
Podcasting 2.0 `<podcast:value>` lightning-address payment info.
- **Go live** — stream from OBS (RTMP) or straight from the browser (WebRTC/WHIP) through
MediaMTX; viewers watch via HLS and the stream is announced on nostr as a NIP-53
(kind 30311) live event.
- **Publish recordings** — live streams are recorded; one click remuxes and publishes a
recording as a podcast episode.
## Quick start
```sh
cp .env.example .env # edit PUBLIC_HOST if not localhost
docker compose up --build -d
```
Then open http://localhost:8095, log in with a NIP-07 extension, and follow the wizard.
## Services / ports
| Service | Host port | Purpose |
|---|---|---|
| podpuddle | 8095 | Web UI + API + RSS feeds |
| MediaMTX | 1935 | RTMP ingest (OBS) |
| MediaMTX | 8889 (+8189/udp) | WebRTC/WHIP ingest (browser) |
| MediaMTX | 8890 | HLS playback |
| blossom-server | 8098 | Media blob storage (sha256-addressed) |
## Streaming with OBS
Create a stream in the UI; it gives you:
- Server: `rtmp://<host>:1935/live`
- Stream key: `<streamId>?key=<secret>`
The HLS playback URL (`http://<host>:8890/live/<streamId>/index.m3u8`) is public and never
contains the secret.
## Development
```sh
docker compose up mediamtx blossom -d # backends
cd server && npm install && npm run dev # API on :8095
cd frontend && npm install && npm run dev # Vite on :5173, proxies /api + /feeds
```
Tests: `cd server && npm test`.
## Data
Everything lives in named docker volumes: `podpuddle-data` (SQLite, server nostr key,
covers), `mediamtx-recordings` (stream recordings, 7-day retention), `blossom-data`
(media blobs).