Skip to main content

Staff Communication & Group Chat

A comprehensive real-time communication suite for frontline restaurant teams, enabling instant messaging, group chats, announcements, voice transcription, and AI-powered translation.

Overview

The Staff Communication platform keeps all work-related communication within Olympus Cloud for compliance, reduces reliance on personal messaging apps, and breaks language barriers with AI translation.

Key Benefits

  • Unified Communication: All team messaging in one platform
  • Compliance Ready: Message retention and audit logging
  • Language Agnostic: AI translation for diverse teams (20+ languages)
  • Voice-First: Hold-to-record with automatic transcription
  • Hierarchy Aware: Tenant → Brand → Location → Department structure

Features

1. Direct Messages (DM)

One-on-one messaging between staff members.

FeatureDescription
Real-time DeliveryMessages delivered instantly via WebSocket
Read ReceiptsSee when messages are read
Typing IndicatorsKnow when someone is composing
Message HistoryPaginated history with search

2. Group Chats

Team-based communication channels.

Group TypeDescriptionAuto-Created
Location GroupsAll staff at a locationYes
Role GroupsServers, kitchen, managementYes
Custom GroupsManager-created teamsNo
Cross-LocationMulti-location for managersNo

3. Announcements

Broadcast messages to teams.

FeatureDescription
Broadcast ScopeAll staff, specific roles, or locations
Read TrackingSee who viewed the announcement
Pin ImportantKeep critical messages at top
Brand-WideExecutive announcements across all locations

4. Voice Transcription

Hands-free messaging for busy environments.

FeatureDescription
Hold-to-RecordSimple voice capture UI
Whisper TranscriptionPowered by OpenAI Whisper v3
Choice on SendSend as voice OR text
PlaybackListen to voice messages inline

5. AI-Powered Translation

Break language barriers across diverse teams.

FeatureDescription
Auto-DetectIdentify message source language
Real-Time TranslationTranslate to reader's preferred language
20+ LanguagesSupport for major world languages
Cost-OptimizedRoutes through ACP T1/T2 models

Architecture

Components

ComponentLocationPurpose
Chat ServiceRust PlatformBusiness logic, access control
Chat RepositoryRust PlatformSpanner persistence
WebSocket HandlerGo GatewayReal-time message delivery
Translation ServicePython AI/MLAI-powered translation
Voice TranscriptionPython AI/MLWhisper STT integration

API Reference

Conversations

# List my conversations
GET /api/v1/chat/conversations
Authorization: Bearer YOUR_TOKEN

# Create conversation
POST /api/v1/chat/conversations
Content-Type: application/json
{
"conversation_type": "group",
"name": "Kitchen Team",
"location_id": "uuid",
"participant_ids": ["uuid1", "uuid2"]
}

# Get conversation details
GET /api/v1/chat/conversations/{id}

# Update conversation settings
PATCH /api/v1/chat/conversations/{id}
{
"name": "New Name",
"settings": { "muted": true }
}

# Leave/delete conversation
DELETE /api/v1/chat/conversations/{id}

Messages

# Get messages (paginated)
GET /api/v1/chat/conversations/{id}/messages?limit=50&before=timestamp

# Send message
POST /api/v1/chat/conversations/{id}/messages
{
"content": "Hello team!",
"message_type": "text",
"attachments": []
}

# Edit message (within time window)
PATCH /api/v1/chat/conversations/{id}/messages/{mid}
{
"content": "Updated message"
}

# Delete message
DELETE /api/v1/chat/conversations/{id}/messages/{mid}

Participants

# Add participant
POST /api/v1/chat/conversations/{id}/participants
{
"user_id": "uuid"
}

# Remove participant
DELETE /api/v1/chat/conversations/{id}/participants/{uid}

# Mark as read
POST /api/v1/chat/conversations/{id}/read
# Search messages across conversations
GET /api/v1/chat/search?q=inventory&limit=20

WebSocket Events

Client → Server

// Subscribe to conversation updates
{ "type": "subscribe", "conversation_id": "uuid" }

// Send typing indicator
{ "type": "typing", "conversation_id": "uuid" }

// Send message via WebSocket
{ "type": "message", "conversation_id": "uuid", "content": "Hello!" }

Server → Client

// New message received
{
"type": "message",
"data": {
"id": "uuid",
"conversation_id": "uuid",
"sender_id": "uuid",
"content": "Hello!",
"created_at": "2026-01-07T12:00:00Z"
}
}

// Typing indicator
{
"type": "typing",
"data": {
"user_id": "uuid",
"conversation_id": "uuid"
}
}

// Read receipt
{
"type": "read",
"data": {
"user_id": "uuid",
"message_id": "uuid"
}
}

// Presence update
{
"type": "presence",
"data": {
"user_id": "uuid",
"status": "online"
}
}

Data Models

Conversation

FieldTypeDescription
idUUIDConversation identifier
tenant_idUUIDTenant ownership
location_idUUIDOptional location scope
conversation_typeEnumDM, Group, Announcement
nameStringDisplay name (groups only)
participantsArrayList of participants
settingsJSONConversation settings
created_atTimestampCreation time

Message

FieldTypeDescription
idUUIDMessage identifier
conversation_idUUIDParent conversation
sender_idUUIDMessage author
contentStringMessage text
message_typeEnumText, Voice, File, System
attachmentsArrayFile attachments
mentionsArray@mentioned user IDs
reactionsMapEmoji reactions
translated_contentMapTranslations by language
created_atTimestampSend time
deleted_atTimestampSoft delete time

Participant

FieldTypeDescription
user_idUUIDUser identifier
roleEnumMember, Admin, Owner
joined_atTimestampJoin time
last_read_atTimestampLast read marker
muted_untilTimestampMute expiration

Database Schema

-- Conversations table
CREATE TABLE chat_conversations (
id STRING(36) NOT NULL,
tenant_id STRING(36) NOT NULL,
location_id STRING(36),
conversation_type STRING(20) NOT NULL,
name STRING(255),
settings JSON,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP,
) PRIMARY KEY (id);

-- Participants (interleaved)
CREATE TABLE chat_participants (
conversation_id STRING(36) NOT NULL,
user_id STRING(36) NOT NULL,
role STRING(20) NOT NULL DEFAULT 'member',
joined_at TIMESTAMP NOT NULL,
last_read_at TIMESTAMP,
muted_until TIMESTAMP,
) PRIMARY KEY (conversation_id, user_id),
INTERLEAVE IN PARENT chat_conversations ON DELETE CASCADE;

-- Messages (interleaved)
CREATE TABLE chat_messages (
id STRING(36) NOT NULL,
conversation_id STRING(36) NOT NULL,
sender_id STRING(36) NOT NULL,
content STRING(MAX),
message_type STRING(20) NOT NULL DEFAULT 'text',
attachments JSON,
mentions ARRAY<STRING(36)>,
reactions JSON,
translated_content JSON,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP,
deleted_at TIMESTAMP,
) PRIMARY KEY (conversation_id, id),
INTERLEAVE IN PARENT chat_conversations ON DELETE CASCADE;

-- Index for message retrieval
CREATE INDEX idx_messages_created
ON chat_messages(conversation_id, created_at DESC);

Push Notifications

EventNotificationPriority
New Message"John: Hello team!"Normal
@Mention"John mentioned you in Kitchen Team"High
Announcement"Manager: Important update"High
Quiet HoursNotifications suppressed-

Best Practices

  1. Use Groups for Teams: Create role-based groups rather than large DM threads
  2. Pin Announcements: Keep important messages visible
  3. Enable Quiet Hours: Respect staff work-life balance
  4. Voice for Busy Times: Use voice messages during rush
  5. Verify Translations: AI translations are helpful but not perfect

Performance Targets

MetricTarget
WebSocket Latencyunder 100ms
Message Delivery99.9% reliability
Voice TranscriptionPowered by Whisper v3
Search Responseunder 500ms
Concurrent Connections10,000+ per location

Security & Compliance

ControlImplementation
Tenant IsolationAll queries scoped to tenant_id
Access ControlParticipant membership required
Message EncryptionTLS in transit, encrypted at rest
Audit LoggingAll actions logged for compliance
GDPR ComplianceMessage retention policies
Data ExportUser data export on request

Changelog

VersionDateChanges
3.0.02026-01-07Initial release with DM, groups, voice