Concord
Chat that lives in your terminal.
Concord is a self-hosted chat app with voice channels, roles and plugins, built for the keyboard. Run a server, share its address, and your people are in.
Community-shaped. Terminal-native.
Servers down the left, a channel tree you can fold, chat in the middle, members on the right. Replies, edits, pins, mentions, whispers and unread counts all work the way you expect, and every mouse action has a key.
Here, pick one. 40+ themes are built into the client and switch live, no restart. Drop a TOML file in
~/.concord/themes/ to make your own.
Built to be yours.
There's no company server in the middle. Your server holds your chat, and voice and files go straight between people.
-
01
Run your own server
Run one on a home PC, a Raspberry Pi or a VPS. The installer sets it up for you, or start concord-server and a wizard asks for the terms, a name, a port, your email and whether to list it on the Grapevine. The first person to sign up becomes its owner. Every server is independent: no central account.
concord-server --reconfigure · --hybrid · --dashboardconcord-server · first run
Termsaccepted
Server namehomelab
Port8080
Admin email[email protected]
Grapevinelisted
✓ wrote concord-server.toml
share → homelab.lan:8080
-
02
Voice channels
Audio goes peer to peer over WebRTC: the server introduces people and never carries the sound. Opus at 48 kHz, with echo cancellation, RNNoise noise suppression and automatic levelling. Your mic opens when you speak, each person's volume is yours to set, and the call stays up while you look at other servers.
/join-voice #lounge · Ctrl+M mute · Ctrl+D deafen -
03
Files, peer to peer
/attach streams a file from your machine straight to whoever downloads it with /download. The server never stores the bytes. That's a deliberate tradeoff: the sender stays online while people download.
/attach ./homelab-notes.md -
04
Plugins are programs
A plugin is its own program that the server runs alongside itself. It adds channels with games, boards or bots, and never needs a change to Concord. Admins install one from Server Settings → Plugins (Ctrl+B) by typing its GitHub repo: Concord downloads the right build, checks it and starts it, no restart. See the plugins →
Ctrl+B → Plugins → I · JMThomas00/concord-chessinstall a plugin repo JMThomas00/Tukan ✓ downloaded · checked · started # no restart
TODO
voice testpin docsDOING
themesDONE
wizardhub -
05
Grapevine discovery
List your server on a Grapevine hub if you want people to find it. Anyone can run a hub, and hubs connect to share their listings. Listings never show a server's address: when you join, the hub hands you a single-use token first. Browse the Grapevine →
Login screen: Ctrl+G · Settings → Manage Servers → B
pick a server, press A to join -
06
Roles and moderation
Admin, Moderator and custom roles built from permission flags, with per-channel overrides, nicknames and custom titles. Kick, ban, timeout and mute, lock a channel, and move people between voice channels.
/role assign @pixel modsBITPERMISSION · ROLE “MODS”
10Send messages
14Attach files
20Pin messages
5Kick members
32Mute members
6Ban members
63Administrator
Hands stay on the keys.
Mouse support is there when you want it, and every click has a key. This is the client's message-highlight mode. Click the panel, then use the same keys.
- Tab
- Move between panels (ShiftTab goes back)
- Esc
- Close, cancel, go back
- CtrlS
- Settings, including Manage Servers
- CtrlN
- Add a server
- CtrlB
- Server settings: channels, roles, members, plugins (admins)
- CtrlG
- Grapevine browser (login and Add Server)
- CtrlT
- Theme browser with live preview
- CtrlU
- Updates, on the login screen
- CtrlM / D
- Mute / deafen yourself in voice
- AltM
- Message navigation: reply, edit, delete, links, pin, copy
- /
- Slash commands;
/helpopens a searchable finder - CtrlQ
- Quit
Two ways in.
The easy way is one line, and a short form does the rest. The hard way builds every piece from source, the old-fashioned way. Both end in the same place: chatting.
One line. Done.
A short form asks what you'd like (the client, a server, a hub, or any mix) and where, installs it, and helps you take your first steps.
- 1
Paste one line
In Terminal.
In any terminal.
In PowerShell.
curl -fsSL https://github.com/JMThomas00/Concord/releases/latest/download/install.sh | sh
curl -fsSL https://github.com/JMThomas00/Concord/releases/latest/download/install.sh | sh
irm https://github.com/JMThomas00/Concord/releases/latest/download/install.ps1 | iex
- 2
Answer the form
The installer downloads the latest release for your computer and checks its checksum, installs what the client needs, and puts
concordon your PATH. For a server or hub it writes the settings, starts it in the background and checks it's up. It can list your server on the Grapevine and add the official server to your client.- Latest release, checksum verified
- The client's libraries (on Linux, GTK if it's missing)
concordon your PATH and in Windows Terminal's new-tab menu- A server or hub that starts on its own
- The official server in your list, if you like
- 3
Open Concord
In a new terminal. Make your profile: a name, your email and a password. One profile signs you in to every server you join, and the official server,
server.concordchat.cc, is waiting in your list. Say hi!concord
Updating: on the login screen, Ctrl+U checks for a newer release and offers Update, Configure and uninstall (X). Running the one line again also updates and keeps your settings. Just looking? End the line with sh -s -- --dry-runEnd the line with sh -s -- --dry-runRun $env:CONCORD_INSTALL_ARGS = "--dry-run" first to see every step without changing anything. Prefer to download? Every release has the client, server and hub, and SHA256SUMS.
From clone to chat.
Go 1.24 or newer. The server, hub and installer are pure Go; the client's voice needs clang and the Opus libraries.
- 1
Get the tools
Homebrew for Go and Opus, and Apple's command line tools for clang.
Pick your distribution.
Go from go.dev/dl, then MSYS2. Run this in MSYS2, and put
C:\msys64\mingw64\binon your PATH. Use clang: MinGW's GCC 16.2 crashes building the audio library.brew install go opus opusfile pkg-config xcode-select --install
Debian / Ubuntu
sudo apt install golang clang make pkg-config libopus-dev libopusfile-dev libgtk-3-dev
Fedora
sudo dnf install golang clang make pkgconf opus-devel opusfile-devel gtk3-devel
Arch
sudo pacman -S go clang make pkgconf opus opusfile gtk3
pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-opus mingw-w64-x86_64-opusfile mingw-w64-x86_64-pkg-config make
- 2
Get the source and build
Builds the server, the client with voice, and the Grapevine hub into
build/.make testruns every test.git clone https://github.com/JMThomas00/Concord.git && cd Concord make build
git clone https://github.com/JMThomas00/Concord.git && cd Concord make build
git clone https://github.com/JMThomas00/Concord.git && cd Concord make build-windows
- 3
Start your server
The first run walks through a setup wizard (terms, name, port, email, Grapevine) and writes
concord-server.toml. The first person to sign up becomes its owner.--reconfigureruns the wizard again../build/concord-server
./build/concord-server
build\concord-server.exe
- 4
Open the client
Make your profile, then press Ctrl+N (or + in the server column) and enter the address and port. For a server behind HTTPS, like the official one on port 443, turn on TLS. Ctrl+G browses the Grapevine.
./build/concord-client
./build/concord-client
build\concord-client.exe
No C compiler? go build -tags novoice ./cmd/client builds a client without voice. Docker: the repo's Dockerfile and docker-compose.yml run the server and hub; the official server runs that way.
Ship it in a container.
One image runs the server and the Grapevine hub, each with its own data folder. It's how the official server runs. The client stays on your computer: it's a terminal app, not a container workload.
- 1
Build the image
The image holds
concord-serverandconcord-hub. Both are pure Go, so the build needs no C toolchain.git clone --branch pre-v0.1.0-fixes https://github.com/JMThomas00/Concord.git && cd Concord docker build -t concord .
- 2
Make the data folders
The container runs as user 10001, so it needs to own them. Skip this and SQLite fails with a misleading "unable to open database file".
mkdir -p server-data hub-data && sudo chown 10001:10001 server-data hub-data
- 3
Run the setup wizard once
The same wizard as anywhere else. Set the host to
0.0.0.0so it's reachable from outside the container, then press Ctrl+C once it says it's listening. Running a hub too? Do the same withconcord-hubandhub-data.docker run -it --rm -v "$(pwd)/server-data:/app/data" concord concord-server
- 4
Start it
Both services restart on their own. Just the server? Add
serverto the end.docker compose up -d
Ports: 8080 for the server, 7777 for the hub. Taken already? Leave docker-compose.yml alone and add a docker-compose.override.yml with ports: !override. HTTPS: neither service does TLS itself, so put Caddy, nginx or a Cloudflare Tunnel in front, like the official server.