Files
archy/apps/podsteadr/README.md
T
ssmithx e2641bc10c feat(apps): package podsteadr as a full Archipelago app (3-container manifest set)
Adds apps/podsteadr (main Fastify+Vue app, container.build from the podsteadr
repo), apps/podsteadr-mediamtx (RTMP/WHIP ingest, HLS, recording), and
apps/podsteadr-blossom (BUD-02 media blobs), wired together on a dedicated
podsteadr-net bridge network per the multi-container pattern documented in
docs/app-developer-guide.md (indeedhub's api/relay/minio/redis/postgres
siblings). All podsteadr ports are auth: none with a rationale, since it's a
public podcast/livestream server whose RSS feeds, HLS playback, and blob
reads must stay reachable by third-party clients with no Archipelago session
— the app already gates its own sensitive routes with NIP-98 and per-stream
secret keys.

Also updates apps/PORTS.md, apps/README.md, and bumps the reviewed
unauthenticated-port count in core/container/src/manifest.rs's
unauthenticated_ports_are_all_accounted_for test (25 -> 31) to acknowledge
the six new auth:none ports. Regenerated catalog-derived files
(core/archipelago/src/fips/app_ports.rs,
neode-ui/src/views/appSession/generatedAppSessionConfig.ts) via
scripts/generate-app-catalog.py.

All three manifests pass scripts/validate-app-manifest.sh and
`cargo test -p archipelago-container manifest`.
2026-08-07 14:45:22 +00:00

86 lines
3.4 KiB
Markdown

# 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.