A modern, self-hosted chat platform that combines the best features of Discord, Revolt, and Guilded with real-time messaging capabilities.
Demo is currently Down till all the core features are implemented.
All Features are Experimental until the Official V1.0.0 Release.
Features may experience visual bugs or unexpected behaviour, please report this via the issues section.
- Runtime: Node.js 20+ with TypeScript
- API Framework: Fastify + Socket.IO
- Database: PostgreSQL 16
- Cache: Redis 7
- Storage: MinIO (S3-compatible)
- Voice/Video: LiveKit
- Push Notifications: ntfy
- Desktop Client: Tauri 2.0 + SolidJS + TypeScript + Vite
- Mobile Client: React Native (V2)
- Web Client: SolidJS + TypeScript + Vite
- Admin Panel: React-admin
- Styling: Tailwind CSS + CSS Variables
- State Management: SolidJS Signals + Custom Stores
โ
Real-time text messaging with Socket.IO
โ
Message editing and deletion
โ
Message reactions (emoji)
โ
Message pinning
โ
Message replies with cross-segment reference handling
โ
File attachments with type/size validation
โ
Typing indicators
โ
Read receipts and unread message counts
โ
Giphy integration (trending/search)
โ
Voice channels with LiveKit integration
โ
Video streaming (permission-based)
โ
Screen sharing (permission-based)
โ
DM voice calls
โ
Temporary voice channels (auto-cleanup when empty)
โ
Voice state tracking (mute, deafen, streaming)
โ
AFK channel auto-move
โ
Voice participant management (move, disconnect, mute)
โ
User limits and bitrate configuration
โ
Full-screen stream viewer overlay
โ
Host preview (see your own stream)
โ
Picture-in-Picture (PiP) mode via browser API
โ
Minimize to audio-only mode (listen while browsing)
โ
Stream audio controls (volume slider, mute)
โ
Live viewer count display
โ
Quality selection (720p, 1080p, Native)
โ
Browser fullscreen support
โ
DM channels with auto-creation on friendship
โ
Message status tracking (sent/received/read)
โ
DM voice calls
โ
Friend system (requests, accept/reject)
โ
User blocking
โ
Server creation, update, and deletion
โ
Channel management with reordering
โ
Category management with permission overrides
โ
Role management with templates and bulk operations
โ
Granular role-based permissions system
โ
Channel permission overrides (role and user level)
โ
Member management (kick, ban, timeout)
โ
Invite system with expiration and max uses
โ
Server transfer ownership
โ
Welcome channel and announcement channels
โ
Server popup configuration (welcome messages)
โ
Audit logging for server actions
โ
JWT access tokens + httpOnly refresh token cookies
โ
Password hashing with Argon2
โ
Password reset via email
โ
Credential encryption (AES-GCM for "Remember me")
โ
Rate limiting (per-endpoint)
โ
Admin claim code system
โ
Session management with token rotation
โ
User status (online, idle, dnd, offline)
โ
Custom status with text, emoji, and expiration
โ
Themes (Dark, Light, OLED, Nord) with system preference detection
โ
Avatar management with history tracking
โ
Display names and profile customization
โ
Timezone support (public/private)
โ
User search by username
โ
Presence coalescing (throttled updates)
โ
Message archiving to MinIO cold storage (gzip compressed)
โ
Message segmentation for efficient history management
โ
Retention policies (time-based and size-based)
โ
Message export (JSON/CSV with date range filtering)
โ
Storage statistics per channel/DM
โ
Event bus system (pub/sub for real-time events)
โ
SSE fallback gateway with sequence tracking
โ
Idempotency support (Idempotency-Key header)
โ
Redis caching (sessions, presence, voice state)
โ
Health checks
โ
Client-side message caching with ETag/hash-based sync
โ
Debounced ACK requests (reduces server load)
โ
Push notifications via ntfy
โ
Mention notifications
โ
Friend request notifications
โ
Reaction notifications
โ
Priority levels
- Message search functionality with filters
- Custom emoji support (server-specific)
- Sticker packs
- Message scheduling UI (backend supports queued_at)
- Rich text editor (markdown rendering exists)
- Two-factor authentication (2FA/TOTP)
- Device tracking and session management UI
- Message encryption at rest
- End-to-end encryption for voice/video calls
- Comprehensive keyboard shortcuts
- Accessibility improvements (screen readers, ARIA labels)
- Language localization (i18n)
- Theme customization with live preview
- Load balancing and horizontal scaling
- CDN integration for media files
- Analytics dashboard for server metrics
- Advanced database optimization
- Audio Check
- Bringing in Video (Webcam)
- Virtual backgrounds and effects
The getDisplayMedia() browser API has inherent limitations for audio capture:
| Share Type | Audio Behavior |
|---|---|
| Browser Tab | Captures tab audio only |
| Window | No isolated app audio (system audio or nothing) |
| Entire Screen | Captures all system audio |
Why can't I share audio from a specific app (Spotify, YouTube, etc.)?
Browsers intentionally do not expose per-application audio routing for privacy and security reasons. The getDisplayMedia() API cannot isolate audio streams from individual applications.
Workarounds:
- Share a browser tab if your content is web-based (captures that tab's audio only)
- Use system audio and close other audio sources
- For advanced use cases, a native desktop application or browser extension with elevated permissions would be required
- Docker & Docker Compose
- Node.js 20+
- pnpm 8+
# Install dependencies
pnpm install
# Start development servers
pnpm dev
# Build all packages
pnpm build
# Configure environment
cp docker/.env.example docker/.env
# Edit docker/.env with your settings
# Start all services
cd docker
docker-compose up -d
sgchat/
โโโ packages/
โ โโโ shared/ # Shared types, validators, constants
โ โโโ api/ # Fastify server (main API)
โ โโโ client-core/ # Shared React components
โ โโโ client-desktop/ # Tauri desktop app
โ โโโ client-web/ # Web fallback client
โ โโโ client-mobile/ # React Native (V2) - Mobile client
โ โโโ admin/ # React-admin dashboard for admins
โโโ docker/ # Docker compose and configs
โโโ themes/ # Bundled themes
โโโ docs/ # Documentation
Contributions are welcome! Please follow these steps:
Fork the repository Create a feature branch (git checkout -b feature/AmazingFeature) Commit your changes (git commit -m 'Add some AmazingFeature') Push to the branch (git push origin feature/AmazingFeature) Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Built with modern web technologies Real-time communication powered by Fastify and Socket.IO Self-hosted push notifications through ntfy
Login: https://imgur.com/a/KkAJ8FL Friends/DMs: https://imgur.com/a/HQFJlbd Server: https://imgur.com/a/SGehJfG Server options: https://imgur.com/a/h1hMYsE Server permissions: https://imgur.com/a/z1mE8W1