- Cookie-based viewer identity: first chat attempt prompts for a nickname
(inline modal, not a blocking native prompt()), generates a client-side
uid, both persisted in cookies for 1 year
- Right panel is now a live chat feed (username + message + status) with
an input row below it, replacing the old bare prompt textarea
- New POST /api/chat: runs a moderation check (banned-word blocklist —
ponytail: starter list, not a real content policy, swap in the real one)
before a message is allowed into the existing prompt-matching/generation
pipeline; rejected messages still show in the chat log, just flagged
- New GET /api/chat: recent chat history (capped at 300), polled every 3s
- Left queue simplified to prompt + submitter name only — dropped the
resolution/duration/date metadata that was there before
- schedule/promptQueue now carry `requestedBy`/`nickname` through to
/api/live/state so the left queue and "now playing" bar can show who
asked for what
- /api/prompt kept working (now a thin wrapper over the same
submitPromptToQueue() the chat endpoint uses) for direct API testing
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>