Skip to content

Repository files navigation

◼ TOLKI

A private desktop messenger with voice calls.

Friends, real-time chat and groups, SFU calls with noise suppression — in a brutalist dark-pink UI.

stack backend db calls license

Download · Local dev setup · Deploy · Releases · Contributing

English · Русский

Features

  • 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).

Stack

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

Repository layout

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)

Development

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.mjs

To test chat with a second account, open http://localhost:5173 in a browser.

Tests

docker compose exec backend pytest    # backend
cd apps/desktop && pnpm test          # desktop (Vitest)

Deploy & releases

  • Backend deploys to the VPS automatically on push to main (.github/workflows/deploy.ymldeploy/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.

Roadmap

  • E2E-encrypted calls (Insertable Streams)
  • macOS build (signing + notarization)
  • Mobile app

License

AGPL-3.0. Want to help? See CONTRIBUTING.md.