TM-WhatsApp
Active buildAn early-stage WhatsApp-class messenger for Turkmenistan — Signal Protocol end-to-end encryption, designed for 2 Mbps networks, currently a scaffolded monorepo with the architecture decided and no end-user features shipped.
- TypeScript
- NestJS
- Expo
- React Native
- Prisma
- PostgreSQL 16
- Redis 7
- MinIO
- Socket.IO
- WebRTC
- Signal Protocol
- Zod
- Turborepo
- Docker
- Railway
Outcome
Scaffolded monorepo with 12 accepted ADRs and E2EE (Signal Protocol) research complete — OTP, messaging, and calls are not implemented yet.
Context
The most-used chat app in Turkmenistan today is IMO — laggy and ad-stuffed — while WhatsApp itself is unreliable or blocked. TM-WhatsApp is a WhatsApp-class messenger designed from the ground up for the local community: fast, clean, and genuinely end-to-end encrypted, built to tolerate ~2 Mbps networks and restrictive NATs. It is a sister project to Carberk and deliberately reuses its stack, OTP gateway, and deployment patterns.
Engineering Decisions (12 accepted ADRs)
- E2EE is real: Signal Protocol for messages (ADR-0003), client-side-encrypted media with per-attachment AES-256 keys (ADR-0008), and user-held backup keys the operator cannot recover (ADR-0007). The server stores ciphertext and prekey bundles only — never plaintext, identity keys, or the contact graph.
- Device-aware from day one (ADR-0006): account → N devices → prekey bundles; linked devices join via QR scan and signed approval, capped at roughly five per account.
- Three transports, no overlap (ADR-0004): Socket.IO for chat and signaling, HTTPS/MinIO for media and backups, WebRTC for calls with a degradation ladder down to audio-only.
- Auth (ADR-0009): phone-number identity (+993) with OTP delivered through the same SMS-gateway fleet pattern as Carberk; per-device refresh tokens with rotation and sliding expiry.
- Phased hosting (ADR-0001): Railway until App Store and Play approval, then lift-and-shift to infrastructure inside Turkmenistan; every backend component is a plain Docker container.
- Monorepo: pnpm + Turborepo with strict TypeScript — NestJS API, Expo mobile (iOS and Android from one codebase), and shared db, contracts, and crypto packages.
Current State
Scaffolded; no end-user feature is complete. What exists: the founding ADR set and five-phase roadmap, health endpoints with shared Zod contracts and tests, initial device-aware Prisma models, a local Compose topology (Postgres 16, Redis 7, MinIO) proven by a CI smoke job, mobile UI design tokens and a component kit, and Turkmen/Russian/English localization foundations. OTP, messaging, contact discovery, calls, and release builds are not implemented yet.