Mar 2026
An in-progress personal build, currently paused: a self-hostable Discord alternative with real-time chat, forum channels, voice and video, and end-to-end encrypted DMs using the Signal Protocol, running on infrastructure you own.
Tech Stack
Tags
About this project
Constellia is a self-hostable communication platform I'm building as a modern alternative to Discord, for communities that want control over their own infrastructure. The surface is what you'd expect from a chat app in 2026: real-time messaging, channel categories with drag-and-drop, forum-style threaded channels, inline replies, voice and video over WebRTC, screen sharing, markdown (GFM) with XSS-safe sanitisation, full-text search, reactions, pinning, link unfurling, file attachments, typing indicators, presence, custom status, per-community nicknames, profile cards. All of it running on a server the operator owns.
The more interesting pieces sit underneath. Direct messages are end-to-end encrypted with the Signal Protocol: X3DH for the initial key agreement, Double Ratchet for per-message keys, passphrase-encrypted key backup for restore across devices. The server cannot read them even in principle. On the safety side there's PhotoDNA-compatible CSAM scanning (async, non-blocking), keyword and spam auto-moderation, per-channel slowmode backed by Redis TTLs, content reports, append-only audit logs, granular roles with channel-level permission overrides, and a moderation dashboard. On the privacy side, GDPR/UK-GDPR/CCPA compliance is baked in with data export (Art. 20) and PII-anonymising account deletion.
Built as a Turborepo monorepo with pnpm workspaces: Fastify and TypeScript on Node 20, PostgreSQL 15 behind Prisma, WebSocket fanout over Redis pub/sub, BullMQ for jobs, Prometheus metrics, structured JSON logging with Pino. Web client in React 19 and Vite 6, React Native / Expo for mobile, Electron for desktop, all sharing the same @constellia/shared and @constellia/crypto packages. A seeded demo guild (a fictional WoW raid community with 17 channels, seven named members, and fifty-odd sample messages) boots on first clone so you can see the thing working end-to-end without writing a line of config.
I worked across the whole lifecycle: architecture, backend, frontend, crypto, devops, seed data, and documentation. Status: this is a personal project in active development, currently paused while I focus on client work. The feature set above reflects the intended scope, with parts live and parts still in progress.