Update the README, deployment, operations, troubleshooting, getting-started,
self-hosting, deployment-profile and skill docs that still described a single
shared service token/access token, so they match the key-per-user model.
Replace the shared CAPTION_API_KEY with an optional per-user registry.
keys.py stores 64-character keys and single-use invites as SHA-256 digests
and derives each user's source/output rooms and capability tokens from a
shared master secret. /relay-config now returns those per-key values,
/claim.html redeems invites, and /admin.html (gated by CAPTION_ADMIN_KEY)
mints invites and revokes keys. /health and the static pages are public.
Nothing in Caption Local points at a relay or caption website unless the
deployment or operator supplies one:
- relay-config.js has no default relay. The address comes from ?relay= or
configure(); without one, join() refuses and setup() asks for an address.
- ws-publisher.js no longer defaults to wss://api.caption.ninja; with no
url it reports "No relay configured" and opens no socket.
- The capture page's relay and caption website fields start empty
(example.org placeholders). Sharing stays off and its checkbox is disabled
until a relay address is set. Without a caption website, captions are
still sent but no editor/overlay link is built.
- /relay-config no longer special-cases caption.ninja hostnames.
- Resample PCM in the audio worklet when the browser cannot open a 16 kHz
AudioContext (Firefox), keeping the native 16 kHz path where available;
add Node coverage in tests/resampler.test.cjs.
- Default the capture page relay and caption-site fields to the self-hosted
relay/UI, and only let a ?relay= link override the prefilled address.
- Remember the service access token in sessionStorage for the tab session so
the redirect target does not require re-entry on every load.
- Add an inline favicon to stop the token-protected /favicon.ico 401.
- Drop the invalid ws://[::1]:* Content-Security-Policy source.
- Document Chrome/Edge/Firefox capture.