mirror of
https://github.com/J3vb/OwnCord.git
synced 2026-09-03 03:50:00 +03:00
ba014242e73950b6d2374897adf8e7c3fbcaf8a1
Remove serverStripSlot and memberListSlot from the app layout in MainPage.ts. Remove standalone MemberList creation, mounting, and visibility subscription from ChatArea.ts. The member list is now part of the unified sidebar (Task 8).
OwnCord
The gaming chat platform you actually own.
A self-hosted Windows chat platform with real-time messaging, voice/video, file sharing, and a web admin panel. Run your own server and keep everything under your control — zero cloud dependencies, works fully on LAN.
Features
Chat
- Real-time text messaging over WebSocket
- Message editing, deletion, and replies
- Emoji reactions with per-message counts
- Typing indicators
- Full-text message search (SQLite FTS5)
- Pinned messages per channel
- Rich link previews with Open Graph metadata
- YouTube embed support with cached titles
- GIF picker powered by Tenor with inline rendering
- Inline image previews with lightbox viewer
Voice & Video
- Voice channels powered by LiveKit SFU
- Webcam video chat with responsive grid layout
- Mute, deafen, camera, and screenshare controls
- Push-to-talk with global hotkey (non-consuming, works while unfocused)
- Per-user volume control (right-click user in voice channel)
- RNNoise ML noise suppression
- Voice activity detection with speaker indicators
- LiveKit server runs as a companion process alongside
chatserver.exe
Channels & Organization
- Text and voice channels organized by categories
- Create, edit, delete, and reorder channels
- Unread message indicators
- Quick channel switcher (Ctrl+K)
File Sharing
- Drag-and-drop and clipboard paste uploads
- Inline image previews with persistent caching (IndexedDB)
- File download with native save dialog
- Configurable max upload size
Users & Permissions
- Invite-only registration with invite codes
- Role-based permissions with custom roles
- Member list with online/offline presence
- User profiles with status (online, idle, dnd, offline)
Administration
- Web-based admin panel at
/admin(IP-restricted to private networks by default) - Dashboard with server stats and recent activity
- User management (ban, kick, role assignment) with modals
- Channel management (create, edit, delete)
- Settings management (server name, MOTD, limits, security)
- Live server log streaming via SSE with level filters, search, auto-scroll, pause/resume, copy, and clear
- Audit log with search, action type filter, copy, and CSV export
- Database backup and restore with pre-restore safety backups
- Server update checker and one-click apply (GitHub Releases)
Security
- TLS encryption (self-signed, Let's Encrypt, or custom cert)
- Trust-on-first-use certificate pinning in the client
- Ed25519-signed client auto-updates
- Rate limiting on all endpoints
- CSRF protection and security headers
Desktop Client
- Native Windows app built with Tauri v2
- System tray integration
- Desktop notifications with taskbar flash and sound
- In-app auto-update with progress notification
- Credential storage via Windows Credential Manager
- Custom emoji picker and soundboard
- Compact mode for information-dense layouts
Quick Start
- Download the latest release from GitHub Releases
- Run
chatserver.exe— generatesconfig.yamlon first run - Open
https://localhost:8443/adminto access the admin panel - Generate an invite code and share it with friends
- Friends download the client installer and connect using your server address
Architecture
Two components: a Go server and a Tauri v2 client (Rust + TypeScript).
+---------------------+ +---------------------+
| OwnCord Client | | OwnCord Server |
| (Tauri v2) | | (Go) |
| | | |
| +---------------+ | WSS | +---------------+ |
| | Chat UI |--+------->| | WebSocket Hub| |
| +---------------+ | | +---------------+ |
| +---------------+ | HTTPS | +---------------+ |
| | REST Client |--+------->| | REST API | |
| +---------------+ | | +---------------+ |
| +---------------+ | LiveKit | +---------------+ |
| | Voice/Video |--+------->| | LiveKit SFU | |
| +---------------+ | | +---------------+ |
+---------------------+ | +---------------+ |
| | SQLite DB | |
| +---------------+ |
+---------------------+
- WebSocket — chat messages, typing, presence, voice signaling
- REST API — message history, file uploads, channel management, auth
- LiveKit — voice and video via LiveKit SFU (companion process)
Project Structure
OwnCord/
├── Server/ # Go server
│ ├── api/ # REST handlers + middleware
│ ├── ws/ # WebSocket hub + SFU
│ ├── db/ # SQLite queries + migrations
│ ├── auth/ # Authentication + rate limiting
│ ├── config/ # YAML config loading
│ ├── updater/ # GitHub Releases update checker
│ ├── admin/ # Web admin panel (static SPA)
│ └── storage/ # File upload storage
├── Client/
│ └── tauri-client/ # Tauri v2 desktop client
│ ├── src-tauri/ # Rust backend (plugins, commands)
│ ├── src/ # TypeScript frontend
│ │ ├── lib/ # Core services (API, WS, LiveKit, updater)
│ │ ├── stores/ # Reactive state (auth, channels, messages, voice)
│ │ ├── components/ # UI components (28 modules)
│ │ ├── pages/ # Page layouts
│ │ └── styles/ # CSS
│ └── tests/ # Unit, integration, and E2E tests
└── docs/ # Project documentation (Obsidian vault)
Building from Source
Prerequisites
- Go 1.25+
- Node.js 20+
- Rust (stable)
- Windows 10/11
Server
cd Server
go build -o chatserver.exe -ldflags "-s -w -X main.version=1.2.0" .
Client
cd Client/tauri-client
npm install
npm run tauri build
The installer is output to
Client/tauri-client/src-tauri/target/release/bundle/nsis/.
Running Tests
# Server
cd Server && go test ./...
# Client
cd Client/tauri-client
npm test # unit tests (vitest)
npm run test:e2e # Playwright E2E tests
npm run test:coverage # coverage report
Configuration
The server generates a config.yaml on first run. Key settings:
| Setting | Default | Description |
|---|---|---|
server.port |
8443 |
HTTPS port |
server.name |
OwnCord Server |
Display name |
tls.mode |
self_signed |
TLS mode (self_signed, acme, manual, off) |
upload.max_size_mb |
100 |
Max upload size |
voice.livekit_url |
ws://localhost:7880 |
LiveKit server WebSocket URL |
voice.livekit_api_key |
— | LiveKit API key (required for voice) |
voice.livekit_api_secret |
— | LiveKit API secret (min 32 chars, required for voice) |
voice.livekit_binary |
— | Path to livekit-server binary (empty = don't auto-start) |
voice.quality |
medium |
Voice quality (low, medium, high) |
server.admin_allowed_cidrs |
private nets | CIDRs allowed to access /admin |
github.token |
— | Token for update checks (optional, for higher rate limits) |
Auto-Updates
The client checks for updates after connecting to the server. Updates are Ed25519-signed and verified before install.
To enable signed releases in CI, add these GitHub repository secrets:
TAURI_SIGNING_PRIVATE_KEY— Ed25519 private key (vianpx tauri signer generate)TAURI_SIGNING_PRIVATE_KEY_PASSWORD— key password
Documentation
Detailed docs live in the docs/brain/ Obsidian vault:
- Quick Start Guide
- Port Forwarding Guide
- Tailscale Guide
- Client Architecture
- Server Spec
- WebSocket Protocol
- REST API
- Database Schema
- Testing Strategy
- Contributing
- Security
Tech Stack
| Component | Technology |
|---|---|
| Server | Go, chi router, LiveKit server SDK |
| Database | SQLite (pure Go, embedded) |
| Client | Tauri v2 (Rust + TypeScript) |
| Voice/Video | LiveKit SFU (companion process) |
| Build | NSIS installer, GitHub Actions CI |
License
MIT
Languages
TypeScript
48.7%
Go
44%
JavaScript
2.2%
Rust
2.1%
CSS
1.4%
Other
1.5%