A private desktop messenger with voice calls.
Friends, real-time chat and groups, SFU calls with noise suppression — in a brutalist dark-pink UI.
Download · Local dev setup · Deploy · Releases · Contributing
English · Русский
- Accounts — JWT + bcrypt, email verification, password reset, auto-login (refresh token in the OS's encrypted storage).
- Friends — requests, adding via a temporary invite code, presence and status (online / away / do-not-disturb / invisible) over WebSocket.
- Chat — DMs and groups: replies, reactions, edit/delete, forwarding, rich text (bold, italic, spoilers, quotes, code), in-chat search, a "Media & Files" panel, read receipts, typing indicators, unread counters, voice messages.
- Attachments — up to 10 images/files per message (S3-compatible storage), full-screen image viewer.
- Encryption — message text and attachments (including voice messages) are encrypted at rest; calls are end-to-end encrypted (LiveKit Insertable Streams, per-call key negotiated directly between participants — the server never sees it).
- Saved messages — a chat with yourself for notes and forwarded messages.
- Pinning & ordering — pin and drag-and-drop friends/groups, synced across devices.
- Calls — 1:1 and group calls over WebRTC/LiveKit (SFU + TURN), screen sharing with audio, RNNoise noise suppression (WASM AudioWorklet), device selection, mic test.
- Notifications — native OS toasts when the window isn't focused (respects your status).
- Tray & auto-update — minimizes to the system tray instead of quitting, silently auto-updates in the background (electron-updater).
| Layer | Tech |
|---|---|
| Desktop | Electron 31, React 18, TypeScript, electron-vite, TailwindCSS |
| Backend | FastAPI, SQLAlchemy 2 (async), Alembic, Pydantic v2 |
| Data | PostgreSQL 16, Redis 7, S3-compatible object storage |
| Realtime | WebSocket (presence, chat, typing, group/call events) |
| Calls | LiveKit (SFU + built-in TURN), RNNoise |
| Infra | Docker Compose, Caddy (auto-HTTPS), GitHub Actions CI/CD |
| Monorepo | pnpm workspaces + Turborepo |
apps/
├── backend/ # FastAPI: core / models / repositories / services / schemas / api
│ ├── alembic/ # DB migrations
│ └── tests/ # pytest (in-memory SQLite)
├── desktop/ # Electron: main / preload / renderer
│ └── src/renderer/ # React: api / components / contexts / features / shared
└── email/ # email templates (React Email -> static HTML)
deploy/ # prod stack: compose, deploy.sh, Caddy, LiveKit
.github/workflows/ # deploy.yml (backend on the VPS), release.yml (installers)
Requirements: Docker, Node.js 20+, pnpm.
# 1. Secrets
cp .env.example .env
# 2. Backend (PostgreSQL + Redis + API)
docker compose up -d
docker compose run --rm backend alembic upgrade head
# API: http://localhost:8000, Swagger: /docs
# 3. Desktop
cd apps/desktop
pnpm install
node scripts/dev.mjsTo test chat with a second account, open http://localhost:5173 in a browser.
docker compose exec backend pytest # backend
cd apps/desktop && pnpm test # desktop (Vitest)- Backend deploys to the VPS automatically on push to
main(.github/workflows/deploy.yml→deploy/deploy.sh). Details and initial server setup are in deploy/README.md. - Desktop builds and publishes on a
v*git tag (.github/workflows/release.yml); users get the update automatically. How to cut a release is in apps/desktop/RELEASING.md.
- E2E-encrypted calls (Insertable Streams)
- macOS build (signing + notarization)
- Mobile app
AGPL-3.0. Want to help? See CONTRIBUTING.md.