# Project Context ## Purpose OpenSpeak is an open-source TeamSpeak alternative built in Go. The project provides both server and client applications to enable voice communication over networks. The goal is to create a free, self-hosted, feature-rich voice communication platform. ## Tech Stack - **Language:** Go (golang) - **Protocol:** Protocol Buffers/gRPC for client-server communication - **Architecture:** Modular client-server architecture ## Project Conventions ### Code Style - Follow standard Go conventions using `gofmt` for formatting - Use `go lint` and `go vet` for code quality checks - PascalCase for exported identifiers, camelCase for unexported - Descriptive variable names that indicate purpose - Keep lines under 120 characters where practical - Comment all exported functions and types ### Architecture Patterns - **Client-Server Model:** Separate executable applications for server and client with clear responsibilities - **Protocol Buffers/gRPC:** Use protobuf for message definition and gRPC for efficient service communication - **Modular by Feature:** Organize packages around domain concepts (e.g., `voice`, `auth`, `streaming`, `config`) - **Repository Pattern:** Abstract data access logic where applicable - **Middleware Pattern:** Use middleware for cross-cutting concerns like logging, authentication, and error handling ### Testing Strategy - **Unit Tests:** Use Go's standard `testing` package (`testing.T`) - **Table-Driven Tests:** Use data-driven test patterns for comprehensive test coverage - **Integration Tests:** Test components working together, especially client-server communication - **Benchmarks:** Use `testing.B` for performance-critical code paths - Test files should be in the same package as the code being tested with `_test.go` suffix - Aim for meaningful test coverage of business logic ### Git Workflow - **Branching Strategy:** Feature branches for development - `feature/*` for new features - `bugfix/*` for bug fixes - `main` for stable releases - **Commit Conventions:** Conventional commits - `feat:` for new features - `fix:` for bug fixes - `docs:` for documentation changes - `refactor:` for code refactoring - `test:` for test additions/changes - `perf:` for performance improvements - Example: `feat: add voice channel broadcasting to server` ## Domain Context ### Voice Communication Architecture - **Audio Codec:** Opus (provides best latency/quality trade-off) - Used by Discord, Telegram, and WebRTC - Supports variable bitrate for bandwidth efficiency - Native Go support via external libraries - **Voice Stream Model:** Server broadcast to channel members - Clients send encoded audio packets to server - Server receives from all speakers and broadcasts to channel members - Server handles basic audio packet routing (not mixing/processing) - Each user receives individual streams from other speakers ### Server Responsibilities - **Authentication & Authorization:** User login, token validation (admin tokens stored locally initially) - **Channel Management:** Create, delete, manage voice channels - **Voice Stream Routing:** Receive audio packets from clients, broadcast to channel members - **User Presence Tracking:** Track online status and which channels users are in - **Connection Management:** Handle client connections/disconnections and cleanup ### Client Responsibilities (Desktop GUI) - **Audio Capture:** Record audio from user's microphone - **Audio Encoding:** Encode to Opus format before sending to server - **Audio Playback:** Decode received streams and mix for playback to speakers - **UI Management:** Display channels, users, connection status - **Stream Handling:** Handle multiple concurrent incoming audio streams ### Core Features (Initial Release) - Voice channels (persistent, users can join/leave) - Authentication (admin token-based access) - Real-time voice communication in channels - User presence tracking (who's online, who's in which channel) ## Important Constraints - **Audio Latency:** Must minimize latency for real-time voice communication (target <100ms round-trip) - **Concurrency:** Server must handle multiple concurrent connections and voice streams efficiently - **Network Bandwidth:** Optimize audio bitrate vs. quality (Opus helps with this) - **Memory Management:** Goroutines and channels for concurrent audio packet handling - **Platform Support:** Go backend (cross-platform server), GUI client (consider platform specifics) - **Open Source:** Ensure all dependencies are compatible with chosen license (consider GPL/MIT/Apache) ## External Dependencies ### Core Libraries (To Be Determined) - **Audio Codec:** `github.com/gopxl/beep` or `pion/webrtc` for Opus support - **gRPC/Protobuf:** `google.golang.org/grpc` and `google.golang.org/protobuf` (already chosen) - **GUI Framework:** (TBD - consider Fyne, Gio, or Ebiten for cross-platform desktop) - **Logging:** Standard library or `github.com/sirupsen/logrus` for structured logging ### Server Infrastructure - **Network:** Raw TCP/UDP connections, gRPC for control plane - **Concurrency:** Go goroutines and channels for audio packet handling - **Configuration:** Local config files for server settings, admin token storage - **Data Persistence:** Not needed for MVP (stateless server, optional later for user/channel persistence)