# podsteadr — Nostr-native Podcasting & Livestreaming Self-hosted, nostr-native podcast publishing and livestreaming. Log in with a NIP-07 nostr identity (no passwords, no email), upload an mp4 to publish an RSS 2.0 feed with Podcasting 2.0 lightning payment info, or go live via OBS (RTMP) or the browser (WebRTC/WHIP) — the stream is announced on nostr as a NIP-53 live event and viewers watch over HLS. This is a three-container stack: | App | Manifest | Role | |---|---|---| | `podsteadr` | `apps/podsteadr/manifest.yml` | Fastify API + built Vue UI + RSS feeds | | `podsteadr-mediamtx` | `apps/podsteadr-mediamtx/manifest.yml` | RTMP/WHIP ingest, HLS output, recording | | `podsteadr-blossom` | `apps/podsteadr-blossom/manifest.yml` | BUD-02 sha256-addressed media blobs | All three join a dedicated `podsteadr-net` bridge network and resolve each other by short DNS aliases (`podsteadr-app`, `mediamtx`, `blossom`). ## Building the Image The app image is built from the **podsteadr** repo, source of truth at `http://146.59.87.168:3000/ssmithx/podsteadr`. ### Option 1: Use the build script ```bash # From archy repo root ./apps/podsteadr/build-from-prototype.sh ``` ### Option 2: Build from source directory ```bash cd ~/podsteadr podman build -t localhost/podsteadr:1.0.0 -f ~/archy/apps/podsteadr/Dockerfile . ``` ### Publishing to the shared registry ```bash ./apps/podsteadr/push-to-registry.sh 1.0.0 ``` Then update `apps/podsteadr/manifest.yml`'s `container.image` to the pushed tag so other nodes pull instead of building locally. ## Ports See `apps/PORTS.md`. Summary: 8095 (web UI/API/RSS), 1935 (RTMP), 8889 (WebRTC/WHIP), 8189/udp (WebRTC ICE), 8890 (HLS), 8098 (Blossom). All of podsteadr's ports are `auth: none` — this is a public podcast/livestream server, not a private personal app; RSS feeds, HLS playback, and blob reads must stay reachable by third-party clients with no Archipelago session, and the app enforces its own NIP-98 signed-request auth for sensitive routes and per-stream secret keys for RTMP/WHIP publish. See the `auth_rationale` on each port mapping. ## Nostr Identity podsteadr's frontend vendors a copy of Archipelago's `nostr-provider.js` shim and references it directly from `index.html` (its Fastify server isn't the nginx-served SPA shape the platform auto-patches — see "Nostr Signer Bridge" in `docs/app-developer-guide.md`). `apps/podsteadr/manifest.yml` declares a `post_install` hook that re-copies the canonical `/opt/archipelago/web-ui/nostr-provider.js` over the vendored copy on every install/reinstall, so it doesn't go stale across OTA releases. ## Data - `/var/lib/archipelago/podsteadr` — SQLite DB, server's own nostr key, covers, and (read-only here) shared stream recordings. - `/var/lib/archipelago/podsteadr/recordings` — stream recordings (writable by `podsteadr-mediamtx`, read-only for `podsteadr`), 7-day retention. - `/var/lib/archipelago/podsteadr-blossom/data` — media blobs. ## Known gotchas See the podsteadr repo's `docs/STATUS.md` for the full list (blossom v4 config `rules:` nesting, no HTTP range support in blossom 4.x, split-horizon blossom URL, MediaMTX has no shell so status is polled not hooked, standard vs. low-latency HLS). The blossom and mediamtx config files embedded in `apps/podsteadr-blossom/manifest.yml` / `apps/podsteadr-mediamtx/manifest.yml` already carry the load-bearing ones inline as comments.