Moderation
How chat moderation works in HowlCast — short version, GetStream does it.
There's no "mod" role in HowlCast. The broadcaster moderates directly, using GetStream's built-in chat moderation tools.
Why no mod role
DESIGN-DECISIONS.md explicitly removes mod assignment. Reasoning:
- Single broadcaster product — small chat
- Adding mods adds DB tables, role checks, audit logs, UI surfaces, abuse vectors
- GetStream Chat already ships pin / delete / ban / mute in their dashboard
For a den-sized audience this is enough. If you outgrow it, the path forward is "use GetStream's built-in mod assignment" rather than "build a parallel role system".
Moderating during a stream
Inline (preferred)
The broadcaster's chat client (signed-in dashboard or popout) shows mod actions on hover for any message:
- 📌 Pin — promotes a message to the pinned banner above the chat
- 🗑 Delete — removes the message from everyone's view
- 🔇 Mute user — they can read but not write
- 🚫 Ban user — they get kicked from the channel
These come from stream-chat-react's default UI. The signed-in broadcaster's JWT has the role required.
From GetStream dashboard
GetStream Chat dashboard → Chats → pick channel → message log. You can see, delete, and ban from here without being live.
Per-user permanent demotion
To strip an invited viewer's chat-write access permanently:
bun run db:execute:remote --command 'UPDATE profiles SET is_invited = 0 WHERE user_id = "<id>"'After this, their composer locks immediately on next refresh — LockedComposerOverlay shows "Sign in to chat" overlay.
UI for this is on the roadmap. Open an issue if you need it sooner.
Pinned message default
The chat dock ships with a default pinned message:
Be useful or be silent. No spoilers without /spoiler.
Edit it in apps/web/src/components/channel/channel-page.tsx — search for <PinnedMessage>. Future: surface this as a dashboard setting.
Spam mitigation
GetStream Chat handles per-channel rate-limits server-side. The HowlCast layer adds a 5/hour throttle on branding.upload, but no rate limit on chat messages — that's GetStream's job.
If you start seeing spam patterns GetStream isn't catching, file an issue. Adding kv-throttle per-user on message.new is a 30-line addition.
Next: Streamer Mode.