Direct messages, voice clips & scheduled messages
Three features that turn the chat into a fully-fledged team comms surface: one-to-one conversations, voice clips and messages that send later.
Direct messages
Click a colleague's avatar → "Send message" → a DM group is created automatically (kind: dm). DMs use the same schema as group channels — every feature (threads, reactions, voice clips) works identically. They stay private and never appear in the general channel directory.
Voice clips
Hold the mic button, speak, release. Onboard uploads the audio to storage and attaches the URL via chat_messages.voice_message_url. Playback right in the thread, with a waveform and a speed control. Useful for fast service briefings: "Tonight table 14 is a birthday, special is sold out" — quicker dictated than typed.
Optional transcription
When the OpenAI Whisper key is configured in the workspace, a voice clip can be transcribed with one click after sending. The transcript appears below the voice clip — searchable like any text post.
Scheduled messages
A message that sends later. Stored in chat_scheduled_messages until the trigger time, then promoted by a cron job into chat_messages.
Typical use cases: briefings for the late shift ("Service brief 16:30 — please remember…"), reminders for the closing sequence, weekend prompts. A scheduled message stays editable or deletable until delivery.
Presence & typing indicator
The chat shows live who's online and who's typing in a group. Presence updates per minute (privacy-by-design — last activity, not exact second). The typing indicator fades after 5 idle seconds.
Push notifications
Chat messages drive push notifications — on web (browser push), iOS and Android. @-mentions and DMs override the recipient's mute setting; regular channel traffic respects it. Push endpoints live in chat_push_subscriptions and the /api/cron/notification-push worker dispatches them.