~/projects/voiceapp
Concord (VoiceApp)
A self-hosted Discord for one friend group — text, voice, screenshare, camera, calls and files, on my own stack.Vlastiti self-hosted Discord za jednu ekipu — tekst, glas, dijeljenje ekrana, kamera, pozivi i datoteke, na mojoj infrastrukturi.
Concord — born as VoiceApp — is my own self-hosted Discord: a private, Discord-style comms app I built for one friend group so we own our text, voice and screenshare instead of renting it. It's an end-to-end TypeScript project: a shared types package, a Node/TypeScript modular-monolith backend (Fastify, transport → service → domain → adapters), and an Electron + React desktop client whose renderer is deliberately unprivileged.
The hard part is real-time media. Voice, video and screenshare run over a self-hosted LiveKit (WebRTC) server — you click a channel to join the call, and the share picker splits app windows, whole screens and cameras into a clean grid. State lives in PostgreSQL and Valkey, and file uploads go to a self-hosted S3-compatible object store (Garage). I planned the whole thing with the BMAD method (brief, PRD, UX, architecture) and locked it down with 14 architecture invariants — the strictest being that the optional `/claude` command is client-local and prompt-only, so an AI helper can never reach the server or other people's data.
July 2026 was a sprint of 19 releases: private 1:1 DM calls (voice, video, screenshare, call log, missed-call badges), an Android PWA and a native Capacitor shell with real audio routing, multi-source screenshare with adaptive quality, a live drawing overlay and remote control — approved viewers take over mouse and keyboard through virtual pointers while the host's cursor stays parked — plus collaborative roadmap channels, an owner-granted admin role, an RNNoise voice gate with real volume controls, and a Discord-parity UX batch (type-anywhere, tile fullscreen, tray, participant menus). The rename to Concord landed mid-month.
It's not a demo — it's deployed and in use. The client ships as a Windows installer (electron-builder, NSIS), and the backend runs as a single Docker Compose stack — Postgres, Valkey, Garage, LiveKit and a Caddy reverse proxy that fetches certificates automatically — self-hosted on my TrueNAS server behind a real domain.
Concord — rođen kao VoiceApp — moj je vlastiti self-hosted Discord: privatna aplikacija za komunikaciju u stilu Discorda koju sam izradio za jednu ekipu kako bismo sami posjedovali svoj tekst, glas i dijeljenje ekrana umjesto da ih iznajmljujemo. Riječ je o end-to-end TypeScript projektu: zajednički paket tipova, Node/TypeScript backend kao modularni monolit (Fastify, transport → service → domain → adapters) i Electron + React desktop klijent čiji je renderer namjerno nepovlašten.
Najteži dio je medijski prijenos u stvarnom vremenu. Glas, video i dijeljenje ekrana idu preko self-hosted LiveKit (WebRTC) servera — kanalu se pridružiš jednim klikom, a birač izvora dijeli prozore aplikacija, cijele ekrane i kamere u pregledni raspored. Stanje je u PostgreSQL-u i Valkeyu, a datoteke se spremaju u self-hostani S3-kompatibilni object store (Garage). Sve sam isplanirao BMAD metodom (brief, PRD, UX, arhitektura) i osigurao s 14 arhitektonskih invarijanti — najstroža je da je opcionalna `/claude` naredba isključivo klijentska i samo-prompt, pa AI pomoćnik nikad ne može doći do servera ni tuđih podataka.
Srpanj 2026. bio je sprint od 19 izdanja: privatni 1:1 DM pozivi (glas, video, dijeljenje ekrana, popis poziva, oznake propuštenih poziva), Android PWA i nativna Capacitor ljuska sa stvarnim usmjeravanjem zvuka, dijeljenje ekrana iz više izvora s prilagodljivom kvalitetom, sloj za crtanje uživo i daljinsko upravljanje — odobreni gledatelji preuzimaju miša i tipkovnicu kroz virtualne pokazivače dok domaćinov kursor ostaje parkiran — plus zajednički roadmap kanali, admin uloga koju dodjeljuje vlasnik, RNNoise voice gate sa stvarnim kontrolama glasnoće i paket Discord-parity poboljšanja (tipkanje bilo gdje, fullscreen pločice, tray, izbornici sudionika). Preimenovanje u Concord stiglo je sredinom mjeseca.
Nije riječ o demou — deployano je i u upotrebi. Klijent se isporučuje kao Windows instaler (electron-builder, NSIS), a backend radi kao jedan Docker Compose stack — Postgres, Valkey, Garage, LiveKit i Caddy reverse proxy koji automatski dohvaća certifikate — self-hostan na mom TrueNAS serveru iza prave domene.
HighlightsIstaknuto
A full Discord-style client — text channels, voice, screenshare, camera and file sharing — built in Electron + React with a deliberately unprivileged renderer.
Real-time voice & video over a self-hosted LiveKit (WebRTC) media server: click-to-join voice channels, private 1:1 DM calls with a call log, and multi-source screenshare with adaptive quality, live drawing overlays and viewer remote control (virtual pointers, so the host's mouse stays put).
Servers, channels, roles, @-mentions, single-use invite codes, an owner-granted admin role, collaborative real-time roadmap channels — backed by Postgres, Valkey and an S3-compatible object store (Garage) for uploads.
An Android PWA and a native Capacitor shell with real audio routing, so the same app rides along in a pocket; RNNoise-based voice gate with mic and speaker volume controls.
Shipped end-to-end: a Windows installer (electron-builder) plus a one-command Docker Compose backend (Postgres · Valkey · Garage · LiveKit · Caddy), self-hosted on a TrueNAS box with automatic TLS. 19 releases in July alone (0.1.11 → 0.1.29), and hundreds of automated tests.
Potpun klijent u stilu Discorda — tekstualni kanali, glas, dijeljenje ekrana, kamera i slanje datoteka — izrađen u Electronu + Reactu s namjerno nepovlaštenim rendererom.
Glas i video u stvarnom vremenu preko self-hosted LiveKit (WebRTC) media servera: pridruživanje glasovnim kanalima jednim klikom, privatni 1:1 DM pozivi s popisom poziva i dijeljenje ekrana iz više izvora s prilagodljivom kvalitetom, crtanjem uživo i daljinskim upravljanjem gledatelja (virtualni pokazivači, pa domaćinov miš ostaje na miru).
Serveri, kanali, uloge, @-spominjanja, jednokratni pozivni kodovi, admin uloga koju dodjeljuje vlasnik, zajednički roadmap kanali u stvarnom vremenu — na Postgresu, Valkeyu i S3-kompatibilnom object storeu (Garage) za uploade.
Android PWA i nativna Capacitor ljuska sa stvarnim usmjeravanjem zvuka, pa ista aplikacija ide i u džep; RNNoise voice gate s kontrolama glasnoće mikrofona i zvučnika.
Isporučeno od početka do kraja: Windows instaler (electron-builder) i backend na jednu naredbu kroz Docker Compose (Postgres · Valkey · Garage · LiveKit · Caddy), self-hostan na TrueNAS uređaju uz automatski TLS. 19 izdanja samo u srpnju (0.1.11 → 0.1.29) i stotine automatiziranih testova.