An open-source, self-hosted chat platform with text channels, voice chat, screen sharing, direct messages, file uploads, and custom themes.
- Text channels — organized by categories, with message editing, reactions, and file attachments
- Voice chat — real-time voice channels with per-user volume control and noise suppression (RNNoise)
- Screen sharing — VP9 video at 60fps with process-specific audio capture (Windows)
- Direct messages — private conversations outside of servers
- File uploads — drag-and-drop images and files into any channel
- Roles & permissions — manage members with customizable roles
- Custom themes — light and dark mode with OKLCH color tokens
- Auto-updates — the desktop client updates itself via GitHub Releases
- Self-hosted — run the server on your own hardware with Docker Compose
| Package | Stack |
|---|---|
@migo/server |
Fastify 5, PostgreSQL (Drizzle ORM), LiveKit, JWT auth (jose) |
@migo/client |
Electron 40, React 19, Zustand, Tailwind CSS 4, Radix UI, LiveKit SDK |
@migo/shared |
Zod schemas, TypeScript types, WebSocket protocol definitions |
Docker Compose runs the Migo server, PostgreSQL, and Watchtower (auto-updates). LiveKit runs natively (auto-downloaded) for best voice/video performance.
One-line installer (Ubuntu/Debian) — installs all prerequisites automatically
curl -fsSL https://raw.githubusercontent.com/eduardoalba00/migo/main/scripts/install-linux.sh | sudo bashThis installs git, Docker, and Node.js, clones the repo to /opt/migo, opens firewall ports, generates secrets, and starts everything. Once it finishes, skip to Connect.
git clone https://github.com/eduardoalba00/migo.git
cd migo
node scripts/setup.mjsThe setup script detects your public IP, generates secrets, writes .env.prod, and starts all services (Postgres, Migo server, Watchtower, LiveKit). If you have a domain name, the script can enable HTTPS via Caddy reverse proxy — required for web client access.
node scripts/start-prod.mjs # Start services
node scripts/stop-prod.mjs # Stop all servicesOpen these ports on your server (port forwarding):
| Port | Protocol | Purpose |
|---|---|---|
| 443 | UDP | TURN relay (screen share through restrictive NATs) |
| 7880 | TCP | LiveKit signaling (not needed with HTTPS/domain) |
| 7881 | TCP | LiveKit WebRTC TCP fallback |
| 8080 | TCP | Migo API + WebSocket |
| 50000–60000 | UDP | LiveKit WebRTC media |
HTTPS mode (if you configured a domain during setup):
| Port | Protocol | Purpose |
|---|---|---|
| 80 | TCP | Let's Encrypt ACME challenge + HTTP redirect |
| 8443 | TCP | HTTPS reverse proxy (Caddy) |
Open ports manually on Linux (UFW)
If your firewall wasn't configured by the install script, you can open the required ports with UFW:
sudo ufw allow 443/udp
sudo ufw allow 7880/tcp
sudo ufw allow 7881/tcp
sudo ufw allow 8080/tcp
sudo ufw allow 50000:60000/udp
# HTTPS mode only
sudo ufw allow 80/tcp
sudo ufw allow 8443/tcp
sudo ufw enableOpen Migo → Add Workspace → enter your server URL:
- Desktop client:
http://<your-server-ip>:8080 - Web client (HTTPS mode):
https://<your-domain>:8443
Watchtower checks for new server images every 5 minutes and automatically restarts the container when an update is available.
- Node.js v20+
- pnpm v9+
- Docker (for PostgreSQL in dev)
- Windows: Visual Studio Build Tools (for the native audio capture addon)
git clone https://github.com/eduardoalba00/migo.git
cd migo
pnpm install
# Windows only — build the native audio capture addon
cd packages/client
npx node-gyp rebuild
cd ../..pnpm dev # Starts Postgres (Docker) + LiveKit (native) + Fastify — all in one command
pnpm dev:client # Electron + Vite React app (separate terminal)pnpm build:server # tsc → packages/server/dist/
pnpm build:client # electron-vite build
pnpm db:generate # Generate Drizzle migration files from schema changes
pnpm db:migrate # Apply migrationsSee CONTRIBUTING.md for the full contributor workflow.
Contributions are welcome! Please read the Contributing Guide and Code of Conduct before opening a pull request.