FreeCord is a self-hosted desktop community app for persistent text chat, low-latency voice, screen sharing, roles, and file sharing. One FreeCord installation hosts one private community. The desktop client is built with Electron, React, and TypeScript; the server uses Node.js, PostgreSQL, LiveKit, and MinIO.
Early alpha: FreeCord
0.8.0-alpha.11is intended for hands-on testing. Installers are unsigned, upgrades may require manual work, and the project has not received an independent security audit.
Download the latest release · Deployment guide · Configuration reference · Support FreeCord
- Invite-only accounts with an initial owner, refresh-token rotation, roles, permissions, account recovery, and audit events
- Persistent channels, encrypted text messages, edits, deletion, mentions, reactions, custom emotes, GIF search, local decrypted search, and pagination
- LiveKit voice channels with device selection, mute, deafen, voice activity, per-user volume, RNNoise, echo cancellation, and reconnect handling
- Permission-filtered voice channel rosters are visible before joining; speaking indicators become live after joining the selected channel
- Screen sharing with selectable quality, frame rate, bitrate, multi-stream viewing, and stream volume controls where the operating system exposes capture audio
- Avatars, presence, shared-file browsing, image/audio/video attachments, and an optional isolated Copyparty surface
- Docker Compose deployment with PostgreSQL, LiveKit, MinIO, and the FreeCord API
| Platform | Package | Current status |
|---|---|---|
| Windows 10/11 x64 | NSIS .exe |
Primary test platform; unsigned installer shows a Windows warning |
| CachyOS / Arch x64 | AppImage | Primary Linux target; KDE Plasma on Wayland with PipeWire is the supported configuration |
| Other Linux desktops | AppImage | May work but are not currently release-qualified |
| Browser | None | FreeCord is desktop-only; no web client is included |
See Platform support for known limitations.
Linux screen video is supported, but desktop-audio sharing remains experimental. Current CachyOS physical testing can still capture the streamer's microphone/self audio instead of the selected application's audio, so it is not release-qualified yet.
-
Give the server two public DNS names, such as
api.example.comandrtc.example.com. -
Clone this repository, copy
.env.exampleto.env, and set the publicLIVEKIT_URLplus a strong initial owner password. -
Pull the published service images with
docker compose pull. -
Open TCP
443and7881, plus UDP50000-50010, at the host and upstream firewall. Forward them through NAT when applicable. -
Adapt
deploy/Caddyfile.example, then run:docker compose up -d docker compose ps curl https://api.example.com/health
-
Install the desktop client, enter
https://api.example.com, and sign in with the bootstrap owner credentials. -
Create invitation tokens from the owner/admin interface. Remove the bootstrap password from the deployment after the owner exists.
The same compose.yaml can be pasted directly into Portainer's Web Editor; no Git checkout or server-side build tools are required. Portainer steps, backup guidance, and upgrade instructions are in Deployment.
FreeCord desktop client
|-- HTTPS + server-sent events --> FreeCord API --> PostgreSQL
| |
| +---------> MinIO / S3 objects
|
+-- WebRTC signaling + media --------> LiveKit
|-- UDP media (preferred)
+-- TCP fallback
The Electron renderer has no Node.js access. A context-isolated preload exposes a fixed, typed IPC surface. Database, S3, LiveKit, and signing secrets stay on the server.
Text content is encrypted in the desktop renderer with AES-256-GCM using a community chat key carried by invitation. The server stores ciphertext and metadata. This is an early implementation, not an audited multi-device key-management protocol: losing the local key can make history unreadable, and resetting a password does not recover it. Message attachments and voice/video are transport-encrypted but are currently readable by the self-hosted server/media infrastructure; they are not end-to-end encrypted.
Read Security and Architecture before exposing a server publicly.
Requires Node.js 22.12 or newer, Python 3 for contract tests, and Docker Compose for a full stack.
cd server
npm ci
npm test
cd ../apps/desktop
npm ci
npm run typecheck
npm run buildRun all repository contract checks from the root with:
python -m unittest discover -s tests -v
database/validate.sh 10See Contributing before opening a pull request.
FreeCord is independent open-source software and is not affiliated with Discord, TeamSpeak, or their owners. Bug reports and focused pull requests are welcome. If the project is useful to you, you can buy me a coffee.
FreeCord is distributed under the BSD 3-Clause License. Bundled dependency licenses are listed in Third-party notices.