Applies to the next caller — no restart. Leave a field on “Default” to fall through to the environment config.
Admin credentials unlock library search, on-air announcements, the back-to-air mention, and mirroring each persona's voice from the station. Stored server-side, never shown back.
Two levels, and they should never be the same. Admin opens this panel, the keys and the test buttons — whoever has it controls the application and can spend your API keys. Guest only opens the phone: the Call button, on this page and on any embed. Admin works as a guest code too, so you only carry one. Both are stored as salted hashes, never plaintext.
Locked out? Set CALLIN_ADMIN_KEY in the
environment as a recovery override; restarting the app clears IP bans.
Leave this empty and anyone who can load the page can call. Set a code when the page is reachable from the internet and you want only the people you gave it to ringing the booth. No username — the code is the whole thing. It must be different from the admin password: a code you hand out that also opens the settings panel defeats the point of having two.
Stored server-side in
data/secrets.json and never sent back to this page — only
whether each is set and its last four characters. Leave a field blank
to keep the current value.
Runs one real completion on your key — costs a fraction of a cent on hosted providers, free on Ollama.
Synthesizes one real line — a fraction of a cent on cloud TTS, free on a local backend.
Segments put audio on air on a caller’s say-so, so they’re off by default. Track skipping, sound effects and direct queueing are never available to callers, regardless of settings — use “Test station + tools” to see the exact list.
The DJ on the call and the DJ on the broadcast are the same person. Without this they talk over each other — the caller hears two of them, and so does everyone listening.
Every call costs model time and airtime, so these stop runaway use — one open tab could otherwise dial in a loop. Defaults are generous; set any to 0 to turn it off. Callers see a friendly “lines are busy” message, never an error code.
Applied to every spoken line on its way to the voice, so it holds regardless of which model or provider is in use — and regardless of whether the prompt was obeyed.
Off by default — being asked your name just to request a song is friction. A name the caller volunteers is still used to credit the request on air either way.
The station refuses song requests when nobody is listening — and a caller on the line isn’t pulling the stream, so they don’t count. This tunes their browser in for the duration of the call so requests are accepted. Volume 0 keeps it silent behind the DJ.
What the DJ is told about the station before the call. Each item costs time-to-first-token on every turn, not just at the start — so more context means a slightly slower reply. Set a count to 0 to leave it out.
The music library is not preloaded — the DJ searches it on demand with a tool, so it always reflects what you actually have. That needs the station admin credentials.
Small steers layered on top of the persona — not a replacement for it. The DJ keeps its own voice and applies these lightly. Leave blank and the persona alone decides.
After the caller hangs up, the DJ can mention the call on air — “just had someone on about…”. It’s one passing line between tracks, not a recap, and the station re-voices it in the persona. Needs the station admin credentials.
Each sound can be a built-in, a file you upload here, or a URL you host yourself. Uploads stay on this machine and are served to callers from it — mp3, wav, ogg, m4a, aac or webm, up to 2 MB each.
Live reference — reflects the permissions you've enabled above. Anything greyed out is currently off.
Every tool your SUB/WAVE publishes over MCP, and whether a caller can reach it. The blocked ones are listed too — otherwise the only way to find out what's missing is to switch everything on and see. Reference only; change what's reachable under Caller permissions.
Drops an iframe into the target div.
allow="microphone" is set for you — without it the mic silently
fails inside a frame.
Recent activity of the web service — settings
changes, call tokens, station reads, webhooks. The call agent's own
logs (what it heard, check-ins, call summaries) live in its container:
docker logs <stack>-wavetalk-worker-1.