Open-source communication platform with voice, video, and text.
No identity verification. No data collection. Self-host ready.
Website · Features · Self-Host · Development · Roadmap
Popular communication platforms are increasingly demanding government-issued IDs from their users. After multiple data breaches, trusting them with your passport or national ID is a risk most people shouldn't have to take.
mqvi is built on a simple principle: your conversations should belong to no one but you.
- No phone number or government ID required
- Zero data collection
- Full source code is public — don't trust, verify
- Self-host on your own server for complete control
- Text Channels — Real-time messaging with file/image sharing, typing indicators, and message editing
- Voice & Video — Low-latency voice and video powered by LiveKit SFU
- Screen Sharing — 1080p/30fps with VP9 codec and adaptive bitrate
- Direct Messages — Private one-on-one conversations with friend system
- Emoji Reactions — React to messages with emoji
- Multi-Server — Join and manage multiple servers from a single account (Discord-style)
- Channels & Categories — Organize conversations into text and voice channels
- Roles & Permissions — Granular permission system with channel-level overrides
- Invite System — Control who joins your server with invite codes
- Message Pinning — Pin important messages to channels
- Full-Text Search — Search through message history (FTS5)
- Push-to-Talk & Voice Activity Detection
- Per-User Volume Control — Adjust individual user volumes (0–200%)
- Microphone Sensitivity — Configurable VAD threshold
- Noise Suppression — Built-in via LiveKit
- Join/Leave Sounds
- Desktop App — Native Electron app with auto-update
- Presence System — Online, idle, DND status with automatic idle detection
- Unread Tracking — Per-channel unread message counts with @mention badges
- Keyboard Shortcuts — Navigate without touching the mouse
- Context Menus — Right-click actions everywhere
- Custom Themes — Multiple color themes
- i18n — English and Turkish, with infrastructure for more languages
| Layer | Technology |
|---|---|
| Backend | Go (net/http + gorilla/websocket) |
| Frontend | React + TypeScript + Vite + Tailwind CSS |
| Desktop | Electron |
| State | Zustand |
| Voice/Video | LiveKit (self-hosted SFU) |
| Database | SQLite (modernc.org/sqlite, pure Go) |
| Auth | JWT (access + refresh tokens) |
mqvi.net (central)
├── User accounts
├── Friend lists
├── Encrypted DMs
└── Server directory
/ \
┌─────────┘ └──────────┐
▼ ▼
Public Hosting Self-Hosted Server
(managed by mqvi) (your infrastructure)
├── Text & voice channels ├── Text & voice channels
├── Messages & files ├── Messages & files
└── Roles & permissions └── Roles & permissions
All users have a single account on mqvi.net. Your account, friends, DMs, and server memberships live centrally. No extra domain or setup needed to start using mqvi. (You can still fork the project and run everything independently — see Full Server below.)
Servers (where channels and voice chat live) can be hosted in two ways:
Create a server directly from the app. We handle the infrastructure — no technical knowledge needed.
Run your own voice/video server for full control. See Self-Host: Voice Server Only below.
Use your mqvi.net account normally — create a server, add friends, chat. The only difference: voice and video traffic goes through your own LiveKit server instead of ours. Your conversations never touch our infrastructure.
SSH into your server and run:
curl -fsSL https://raw.githubusercontent.com/akinalpfdn/Mqvi/main/deploy/livekit-setup.sh | sudo bashThe script automatically:
- Downloads the LiveKit binary
- Opens firewall ports (UFW / firewalld)
- Generates secure API credentials
- Creates
livekit.yamlconfig - Starts LiveKit as a systemd service
Requirements: Any Linux server (Ubuntu 22.04+ / Debian 12+ recommended), 1 GB RAM, 1 CPU core. Providers like Hetzner, DigitalOcean, or Contabo offer this for $3–5/month.
Open PowerShell as Administrator and run:
irm https://raw.githubusercontent.com/akinalpfdn/Mqvi/main/deploy/livekit-setup.ps1 | iexThe script automatically:
- Downloads the LiveKit binary
- Opens Windows Firewall ports
- Attempts router port forwarding via UPnP
- Generates secure API credentials
- Creates
livekit.yamlconfig - Starts LiveKit with auto-start on boot (Task Scheduler)
Requirements: Windows 10/11. If using your own PC, it needs to stay on and connected to the internet.
When the script finishes, you'll see 3 values:
| Value | Example |
|---|---|
| URL | ws://203.0.113.10:7880 |
| API Key | LiveKitKeyf3a1b2c4 |
| API Secret | aBcDeFgHiJkLmNoPqRsTuVwXyZ012345 |
Go to mqvi, create a new server, select "Self-Hosted", and enter these 3 values. That's it.
| Problem | Solution |
|---|---|
| Voice doesn't connect | Ports are probably closed. Run sudo ufw status (Linux) or check Windows Firewall. Also check your cloud provider's web firewall. |
| I can connect but hear no audio | UDP ports 50000–60000 might be blocked. Make sure your provider allows UDP on these ports. |
| "Connection refused" error | LiveKit might not be running. Run systemctl status livekit (Linux) or check Task Manager for livekit-server (Windows). |
| Works on LAN but not from outside | Make sure use_external_ip: true is set in your livekit.yaml. On Windows, also check that your router forwards ports 7880, 7881, 7882, and 50000–60000. |
Run the entire mqvi platform on your own infrastructure. Completely independent from mqvi.net — you control everything: accounts, messages, files, voice.
- Linux server (Ubuntu 22.04+ recommended)
- 2 vCPU, 4 GB RAM minimum
- Domain name (optional — IP address works fine)
mkdir -p ~/mqvi && cd ~/mqvi
# Clone the deploy files
git clone --depth 1 https://github.com/akinalpfdn/Mqvi.git /tmp/mqvi-src
cp /tmp/mqvi-src/deploy/package/start.sh .
cp /tmp/mqvi-src/deploy/livekit.yaml .
cp /tmp/mqvi-src/deploy/.env.example .env
rm -rf /tmp/mqvi-src
chmod +x start.shYou'll need to build the server binary from source (see Building from Source) or get it from a release if available.
The mqvi-server binary (~40 MB) is a single executable with the frontend, database migrations, and i18n files all embedded. No Go, Node.js, or any other runtime needed.
Edit .env and set at least these 2 secrets:
nano .env| Variable | How to generate |
|---|---|
JWT_SECRET |
openssl rand -hex 32 |
ENCRYPTION_KEY |
openssl rand -hex 32 |
LiveKit credentials are managed through the admin panel after first login — no need to set them in .env. If you want to auto-seed a LiveKit instance on first start, you can optionally uncomment the LIVEKIT_* variables in .env and set them to match your livekit.yaml.
./start.shstart.sh automatically downloads the LiveKit binary if not present, creates data directories, and starts both LiveKit and mqvi. To run in the background:
nohup ./start.sh > output.log 2>&1 &Open http://YOUR_SERVER_IP:9090 in your browser. The first user to register becomes the server owner.
apt install caddyAdd to /etc/caddy/Caddyfile:
yourdomain.com {
reverse_proxy localhost:9090
}
lk.yourdomain.com {
reverse_proxy localhost:7880
}
systemctl restart caddyCaddy automatically obtains and renews SSL certificates via Let's Encrypt. Update LIVEKIT_URL in .env to wss://lk.yourdomain.com.
Make sure these ports are open:
| Port | Protocol | Purpose |
|---|---|---|
9090 |
TCP | Web UI + API |
7880 |
TCP | LiveKit signaling |
7881 |
TCP | LiveKit TURN relay |
7882 |
UDP | LiveKit media |
50000–60000 |
UDP | LiveKit ICE candidates |
See .env.example for all options. Key settings:
| Variable | Default | Description |
|---|---|---|
SERVER_PORT |
9090 |
HTTP port |
JWT_SECRET |
— | Required. Random string for token signing |
ENCRYPTION_KEY |
— | Required. AES-256 key for encrypting stored LiveKit credentials |
DATABASE_PATH |
./data/mqvi.db |
SQLite database path |
UPLOAD_DIR |
./data/uploads |
File upload directory |
UPLOAD_MAX_SIZE |
26214400 |
Max upload size in bytes (25 MB) |
LIVEKIT_URL |
— | Optional. Only for auto-seeding a LiveKit instance on first start |
LIVEKIT_API_KEY |
— | Optional. Must match livekit.yaml if set |
LIVEKIT_API_SECRET |
— | Optional. Must match livekit.yaml if set |
- Go 1.21+
- Node.js 20+
- npm
# Clone
git clone https://github.com/akinalpfdn/Mqvi.git
cd Mqvi
# Backend
cd server
go mod download
go run .
# Frontend (separate terminal)
cd client
npm install
npm run devThe Vite dev server proxies /api and /ws to localhost:9090.
Windows (PowerShell):
powershell -ExecutionPolicy Bypass -File deploy\build.ps1Linux / macOS:
# Frontend
cd client && npm install && npm run build && cd ..
# Copy frontend into server for embedding
rm -rf server/static/dist && cp -r client/dist server/static/dist
# Backend (single binary with embedded frontend)
cd server
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ../deploy/package/mqvi-server .
cd ..mqvi/
├── server/ # Go backend
│ ├── main.go # Entry point + wire-up
│ ├── config/ # Environment-based config
│ ├── models/ # Domain structs
│ ├── repository/ # Data access (raw SQL)
│ ├── services/ # Business logic
│ ├── handlers/ # HTTP/WS request handling
│ ├── middleware/ # Auth, permissions, rate limiting
│ ├── ws/ # WebSocket hub + events
│ ├── database/ # SQLite + embedded migrations
│ ├── static/ # Embedded frontend (populated at build)
│ └── pkg/ # Shared utilities
│ ├── i18n/ # Backend i18n + embedded locales
│ └── crypto/ # AES-256-GCM encryption
├── client/ # React frontend
│ └── src/
│ ├── api/ # API client functions
│ ├── stores/ # Zustand state management
│ ├── hooks/ # Custom React hooks
│ ├── components/ # UI components
│ ├── styles/ # Theme + globals
│ ├── i18n/ # Frontend translations (EN + TR)
│ └── types/ # TypeScript types
├── electron/ # Electron desktop wrapper
│ ├── main.ts # Main process
│ └── preload.ts # Preload script (secure IPC)
├── deploy/ # Build & deploy scripts
│ ├── build.ps1 # Windows build script
│ ├── start.sh # Server startup script
│ ├── livekit-setup.sh # LiveKit auto-setup (Linux)
│ ├── livekit-setup.ps1 # LiveKit auto-setup (Windows)
│ ├── livekit.yaml # LiveKit config template
│ └── .env.example # Environment config template
└── docker-compose.yml # Docker development stack
handlers/ → services/ → repository/ → SQLite
↕ ↕
middleware ws/hub (WebSocket broadcast)
- Layered architecture: handlers parse HTTP, services contain business logic, repositories handle data access
- Constructor dependency injection: no global state, all dependencies injected via constructors
- Interface segregation: consumers depend on minimal interfaces, not concrete types
- WebSocket hub: fan-out pattern for real-time event broadcasting
- Text channels with real-time messaging
- Voice & video calls (LiveKit)
- Screen sharing (1080p/30fps)
- Role & permission system with channel overrides
- Emoji reactions
- Direct messages & friend system
- Message pinning & search
- Invite system
- Presence & idle detection
- Keyboard shortcuts
- Custom themes
- i18n (EN + TR)
- Desktop app (Electron with auto-update)
- Multi-server architecture
- One-click self-host setup (LiveKit)
- End-to-end encryption (E2EE)
- Mobile apps (iOS & Android)
- Plugin / bot API
- Federation between servers
- Encrypted file sharing
Contributions are welcome! Please open an issue to discuss what you'd like to change before submitting a PR.
AGPL-3.0 — free for personal and non-commercial use. Commercial use requires a separate license. See CLA.md for contribution terms.