v0.1.0-rc2Pre-releaseMITWritten in Go

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.

01 · The client

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.

Ctrl+T in the app.
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.
02 · Features

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.

  1. 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 · --dashboard

    concord-server · first run

    Termsaccepted

    Server namehomelab

    Port8080

    Admin emailyou@example.com

    Grapevinelisted

    ✓ wrote concord-server.toml

    share → homelab.lan:8080

  2. 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
  3. 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
  4. 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-chess
    install a plugin
    repo  JMThomas00/Tukan
    ✓ downloaded · checked · started
    # no restart

    TODO

    voice testpin docs

    DOING

    themes

    DONE

    wizardhub
  5. 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
  6. 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 mods

    BITPERMISSION · ROLE “MODS”

    10Send messages

    14Attach files

    20Pin messages

    5Kick members

    32Mute members

    6Ban members

    63Administrator

03 · Keyboard first

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.

ALT+M · HIGHLIGHT MODEclick here, then press ↑ or ↓
    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; /help opens a searchable finder
    CtrlQ
    Quit
    04 · Install

    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.

    The Easy Way

    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. 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. 2

      Answer the form

      The installer downloads the latest release for your computer and checks its checksum, installs what the client needs, and puts concord on 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)
      • concord on 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. 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.

    The Hard Way

    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. 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\bin on 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. 2

      Get the source and build

      Builds the server, the client with voice, and the Grapevine hub into build/. make test runs 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. 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. --reconfigure runs the wizard again.

      ./build/concord-server
      ./build/concord-server
      build\concord-server.exe
    4. 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.

    05 · Docker

    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. 1

      Build the image

      The image holds concord-server and concord-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. 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. 3

      Run the setup wizard once

      The same wizard as anywhere else. Set the host to 0.0.0.0 so it's reachable from outside the container, then press Ctrl+C once it says it's listening. Running a hub too? Do the same with concord-hub and hub-data.

      docker run -it --rm -v "$(pwd)/server-data:/app/data" concord concord-server
    4. 4

      Start it

      Both services restart on their own. Just the server? Add server to 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.

    concord-client v0.1.0-rc2root@concord: ~/concordtty · utf-8connected

    banner: ANSI Shadow · one of 327 the client picks from at launch ·

    concord --about

    Terminal chat — IRC-like, self-hosted, keyboard-driven.

    version
    v0.1.0-rc2 (pre-release)
    install
    one line · or build it the hard way
    license
    MIT
    written in
    Go 1.24+
    ships as
    concord-server · concord-client · concord-hub
    runs on
    Windows · macOS · Linux
    source
    github.com/JMThomas00/Concord

    » type help in the prompt below, or scroll. ` switches back to human mode.

    concord-client --preview

    Replies, edits, soft deletes, pins, @mentions, /whisper, typing indicators and per-channel unread counts. Click to focus a panel, or never touch the mouse.

    /theme

    44 themes ship inside the binary and switch live. Pick one: it re-skins this whole page.

    Ctrl+T opens the same browser in the app. A TOML file in ~/.concord/themes/ overrides a built-in theme with the same name.

    man concord-server

    CONCORD-SERVER(1)Concord Manual

    NAME

    concord-server — run your own Concord server

    SYNOPSIS

    concord-server [--reconfigure] [--hybrid | --dashboard] [--debug] [--test-mail address] [--reset-password email]

    DESCRIPTION

    The first run starts a setup wizard: the terms, a server name, a port (8080), the admin email and the Grapevine. It writes concord-server.toml in the folder it runs from. The first person to sign up becomes the owner. The one-line installer does all of this and starts it in the background.

    OPTIONS

    --reconfigurerun the setup wizard again

    --hybrida live dashboard beside the log

    --dashboardthe dashboard instead of the log

    --debugverbose logging

    --test-mailsend a test email with the [mail] settings

    --reset-passworda temporary password for that account (servers without mail)

    NOTES

    Pure Go with SQLite. No CGO, so the server builds without a C compiler. Docker: the repo's Dockerfile and docker-compose.yml.

    /join-voice #lounge

    → joined ◉ lounge · 3 peers

    transport
    WebRTC, peer to peer; the server only introduces you
    codec
    Opus, 48 kHz, 20 ms frames, 24–96 kbps
    outgoing
    echo cancellation · 80 Hz low-cut · RNNoise · auto levelling
    mic
    voice detection: open only while you speak
    volume
    per person, from the member list (←/→)
    keys
    Ctrl+M mute · Ctrl+D deafen
    level

    note: the call stays up while you look at other servers. Everyone in a call needs a current client.

    /attach ./homelab-notes.md

    The file streams from your machine straight to theirs (/download <id>). The server only passes the handshake along.

    by design: the sender stays online while others download.

    # in Concord: Ctrl+B → Plugins → I

    install a plugin from GitHub
    repo JMThomas00/concord-chess
    ✓ downloaded the build for this server
    ✓ checked it
    ✓ started # no restart · U updates it later

    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.

    games
    tic-tac-toe · checkers · Tak · chess · reflex
    tools
    Tukan (kanban) · Mynah (AI personas)
    extras
    achievements and leaderboards
    build one
    concord-plugin new <name> --template game|pane|bot|pty

    » cd /plugins for every plugin, how they work, and the skill that teaches your agent to build one.

    concord-hub --dashboard

    opt-in
    the installer asks, or [grapevine] in concord-server.toml
    browse
    login: Ctrl+G · Settings → Manage Servers → B · A joins
    listings
    no host or port shown
    join
    single-use token, then connect
    hubs
    anyone can run one; hubs connect to share listings
    official
    https://grapevine.concordchat.cc

    » cd /grapevine for live hubs, or cd /servers for who's listed right now.

    /role assign @pixel mods

    bitpermissionmods (example)
    10SEND_MESSAGES[x]
    14ATTACH_FILES[x]
    20PIN_MESSAGES[x]
    5KICK_MEMBERS[x]
    32MUTE_MEMBERS[x]
    6BAN_MEMBERS[ ]
    63ADMINISTRATOR[ ]

    Admin, Moderator and custom roles, with per-channel overrides.

    /kick · /ban · /timeout · /mute · /lock · /title · /move-voice

    /help

    GLOBAL

    Tab
    next panel
    Esc
    close / back
    Ctrl+S
    settings
    Ctrl+N
    add a server
    Ctrl+B
    server settings (admins)
    Ctrl+T
    theme browser
    [ / ]
    hide servers / members
    Ctrl+Q
    quit

    LOGIN

    Ctrl+G
    Grapevine browser
    Ctrl+P
    profiles
    Ctrl+F
    forgot password
    Ctrl+U
    updates

    CHAT

    Enter
    send
    Ctrl+J
    new line
    /help
    command finder
    Alt+M
    message navigation
    Ctrl+M / D
    mute / deafen

    HIGHLIGHT (Alt+M)

    R
    reply
    E / D
    edit / delete your own
    P
    pin (mods and up)
    L
    links
    A
    copy attachment ID

    THIS PAGE

    j / k
    next / previous channel
    /
    command prompt
    t
    next theme
    r
    another banner
    `
    human mode

    cat INSTALL

    ## the easy way · one line

    A short form asks what you'd like (client, server, hub, or any mix), installs it, checks the checksum, and puts concord on your PATH.

    — macOS and Linux

    curl -fsSL https://github.com/JMThomas00/Concord/releases/latest/download/install.sh | sh

    — Windows (PowerShell)

    irm https://github.com/JMThomas00/Concord/releases/latest/download/install.ps1 | iex
    concord   # make your profile; server.concordchat.cc is in your list

    updates: Ctrl+U on the login screen · just looking: sh -s -- --dry-run

    ## the hard way · from clone to chat

    Go 1.24+. Server, hub and installer are pure Go; the client's voice needs clang and Opus.

    — macOS

    brew install go opus opusfile pkg-config
    xcode-select --install

    — Debian / Ubuntu · Fedora · Arch

    sudo apt install golang clang make pkg-config libopus-dev libopusfile-dev libgtk-3-dev
    sudo dnf install golang clang make pkgconf opus-devel opusfile-devel gtk3-devel
    sudo pacman -S go clang make pkgconf opus opusfile gtk3

    — Windows (MSYS2, with C:\msys64\mingw64\bin on your PATH; use clang)

    pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-opus mingw-w64-x86_64-opusfile mingw-w64-x86_64-pkg-config make

    — build and run

    git clone https://github.com/JMThomas00/Concord.git && cd Concord
    make build                # Windows: make build-windows
    ./build/concord-server    # first run: setup wizard · first sign-up is the owner
    ./build/concord-client    # make your profile · Ctrl+N adds a server

    head -4 docker-compose.yml

    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.

    git clone --branch pre-v0.1.0-fixes https://github.com/JMThomas00/Concord.git && cd Concord
    docker build -t concord .
    mkdir -p server-data hub-data && sudo chown 10001:10001 server-data hub-data   # the container runs as uid 10001
    docker run -it --rm -v "$(pwd)/server-data:/app/data" concord concord-server   # wizard once: host 0.0.0.0, Ctrl+C when listening
    # a hub too? docker run -it --rm -v "$(pwd)/hub-data:/app/data" concord concord-hub
    docker compose up -d                                                             # or: docker compose up -d server
    ports
    8080 server · 7777 hub · change them in docker-compose.override.yml
    https
    neither does TLS: Caddy, nginx or a Cloudflare Tunnel in front
    restarts
    unless-stopped

    head -1 LICENSE

    MIT License

    git remote get-url origin

    https://github.com/JMThomas00/Concord.git # by Jordan (@JMThomas00)

    grep -E 'bubbletea|lipgloss|webrtc|opus|malgo|websocket|sqlite' go.mod

    github.com/charmbracelet/bubbletea v1.3.4
    github.com/charmbracelet/lipgloss v1.1.0
    github.com/gen2brain/malgo v0.11.24
    github.com/gorilla/websocket v1.5.3
    github.com/hraban/opus v0.0.0-20251117090126-c76ea7e21bf3
    github.com/pion/webrtc/v3 v3.3.6
    modernc.org/sqlite v1.34.4

    » end of channel. to human mode, or cd #welcome.

    logo
    TERMINAL# welcometheme: dracula j/k channels · / command · t theme · r banner · l logo
    root@concord:1337 / TTY 01

    SESSION TRANSFER COMPLETE

    CONCORD OS

    [ OK ] connected to concord.local:1337
    [ OK ] terminal attached /dev/tty1
    [ OK ] effective user: root
    [ OK ] payload signature resolved
    
    CLASSIFICATION: GRAPE INVASION
    PERSISTENCE:    vines ready to root
    TARGET:        every pixel of this screen