- Editable podcast settings: new /podcasts/:id/settings page, reusing
PodcastForm.vue in an edit mode (PUT instead of POST) since it was
previously create-only with no way to fix a field (e.g. lightning
address) after the fact.
- Recorded episodes can now be priced same as uploads: "Publish
recording" gained an optional price_sats field, wired through the
existing episode paywall machinery. Live streams themselves stay
unpaywalled by design — only the resulting recording can be priced.
- Accept Cashu tokens as an alternative to a Lightning invoice:
POST .../purchase/token redeems a pasted token directly (via the
mint's swap/receive flow) and finalizes the purchase in one step,
no quote/confirm round trip. A token worth more than the price is
treated as a tip (seller gets the full amount); worth less is
rejected. Added a "pay with a Cashu token instead" option next to
the existing invoice flow.
- cashu.ts: fixed payout() always requesting an invoice for the full
held balance with no room for the mint's routing-fee reserve, which
made a balance that exactly matched one sale's price permanently
unwithdrawable (needed slightly more than held to cover the fee).
Now shrinks the request and requotes once if the first quote doesn't
fit.
- docker-compose.yml / mediamtx.yml: renamed the podsteadr container's
DNS alias away from the literal string "podsteadr" — on a host whose
own hostname is "podsteadr", cloud-init's self-hostname /etc/hosts
entry shadowed the container-network alias, so mediamtx's auth
webhook callback resolved to the wrong address and rejected every
RTMP publish attempt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Renames the repo directory and every podpuddle/PODPUDDLE reference
across code, config, and docs to podsteadr/PODSTEADR (package names,
Docker Compose project/service/volume names, env var names, UI/RSS
strings). Existing Docker volume data (uploaded blobs, mediamtx
recordings, the server's sqlite DB and its nostr identity key) was
migrated to new podsteadr_-prefixed volumes with matching filenames
so it isn't orphaned by the rename.
- blossom-server 4.4.1 expects rules nested under storage: — the top-level
rules list was ignored, leaving an empty ruleset that rejected all uploads
- podpuddle now verifies blobs and uploads recordings via BLOSSOM_URL_INTERNAL
(http://blossom:3000) while feeds keep the browser-facing URL; unreachable
blossom now returns 502 instead of a 500
- mediamtx: fix deprecated allow-origin params, disable MoQ
- scripts/e2e.mjs: 14 API checks (login, replay/URL rejection, upload,
episode, feed, stream keys, mediamtx auth) — all green, plus verified
live: RTMP publish with key → HLS 200, wrong key refused, status
planned→live→ended via poller, recording remuxed + published as episode,
feed XML well-formed with 2 items
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>