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.
| Feature | Description |
|---|---|
| Real-time Delivery | Messages delivered instantly via WebSocket |
| Read Receipts | See when messages are read |
| Typing Indicators | Know when someone is composing |
| Message History | Paginated history with search |
2. Group Chats
Team-based communication channels.
| Group Type | Description | Auto-Created |
|---|---|---|
| Location Groups | All staff at a location | Yes |
| Role Groups | Servers, kitchen, management | Yes |
| Custom Groups | Manager-created teams | No |
| Cross-Location | Multi-location for managers | No |
3. Announcements
Broadcast messages to teams.
| Feature | Description |
|---|---|
| Broadcast Scope | All staff, specific roles, or locations |
| Read Tracking | See who viewed the announcement |
| Pin Important | Keep critical messages at top |
| Brand-Wide | Executive announcements across all locations |
4. Voice Transcription
Hands-free messaging for busy environments.
| Feature | Description |
|---|---|
| Hold-to-Record | Simple voice capture UI |
| Whisper Transcription | Powered by OpenAI Whisper v3 |
| Choice on Send | Send as voice OR text |
| Playback | Listen to voice messages inline |
5. AI-Powered Translation
Break language barriers across diverse teams.
| Feature | Description |
|---|---|
| Auto-Detect | Identify message source language |
| Real-Time Translation | Translate to reader's preferred language |
| 20+ Languages | Support for major world languages |
| Cost-Optimized | Routes through ACP T1/T2 models |
Architecture
Components
| Component | Location | Purpose |
|---|---|---|
| Chat Service | Rust Platform | Business logic, access control |
| Chat Repository | Rust Platform | Spanner persistence |
| WebSocket Handler | Go Gateway | Real-time message delivery |
| Translation Service | Python AI/ML | AI-powered translation |
| Voice Transcription | Python AI/ML | Whisper 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
# 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
| Field | Type | Description |
|---|---|---|
id | UUID | Conversation identifier |
tenant_id | UUID | Tenant ownership |
location_id | UUID | Optional location scope |
conversation_type | Enum | DM, Group, Announcement |
name | String | Display name (groups only) |
participants | Array | List of participants |
settings | JSON | Conversation settings |
created_at | Timestamp | Creation time |
Message
| Field | Type | Description |
|---|---|---|
id | UUID | Message identifier |
conversation_id | UUID | Parent conversation |
sender_id | UUID | Message author |
content | String | Message text |
message_type | Enum | Text, Voice, File, System |
attachments | Array | File attachments |
mentions | Array | @mentioned user IDs |
reactions | Map | Emoji reactions |
translated_content | Map | Translations by language |
created_at | Timestamp | Send time |
deleted_at | Timestamp | Soft delete time |
Participant
| Field | Type | Description |
|---|---|---|
user_id | UUID | User identifier |
role | Enum | Member, Admin, Owner |
joined_at | Timestamp | Join time |
last_read_at | Timestamp | Last read marker |
muted_until | Timestamp | Mute 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
| Event | Notification | Priority |
|---|---|---|
| New Message | "John: Hello team!" | Normal |
| @Mention | "John mentioned you in Kitchen Team" | High |
| Announcement | "Manager: Important update" | High |
| Quiet Hours | Notifications suppressed | - |
Best Practices
- Use Groups for Teams: Create role-based groups rather than large DM threads
- Pin Announcements: Keep important messages visible
- Enable Quiet Hours: Respect staff work-life balance
- Voice for Busy Times: Use voice messages during rush
- Verify Translations: AI translations are helpful but not perfect
Performance Targets
| Metric | Target |
|---|---|
| WebSocket Latency | under 100ms |
| Message Delivery | 99.9% reliability |
| Voice Transcription | Powered by Whisper v3 |
| Search Response | under 500ms |
| Concurrent Connections | 10,000+ per location |
Security & Compliance
| Control | Implementation |
|---|---|
| Tenant Isolation | All queries scoped to tenant_id |
| Access Control | Participant membership required |
| Message Encryption | TLS in transit, encrypted at rest |
| Audit Logging | All actions logged for compliance |
| GDPR Compliance | Message retention policies |
| Data Export | User data export on request |
Related Documentation
- ACP AI Router - Translation model routing
- WebSocket Connection
- WebSocket Events
Changelog
| Version | Date | Changes |
|---|---|---|
| 3.0.0 | 2026-01-07 | Initial release with DM, groups, voice |