v0.1.0Pre-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

Discord-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

    Start concord-server and a setup wizard asks for a name, host, port and database file. Share the address it prints. The first account to register becomes Admin. The server is pure Go with SQLite, so it builds without a C compiler.

    concord-server --setup · --hybrid · --dashboard

    concord-server · first run

    Server namehomelab

    Bind host0.0.0.0

    Port8080

    Databaseconcord.db

    ✓ wrote concord-server.toml

    share → homelab.lan:8080

  2. 02

    Voice channels

    Audio goes peer to peer over WebRTC, encoded with Opus in 20 ms frames. Talk with voice activity detection or push-to-talk, at 8 to 48 kHz. It works on a local network out of the box; across the internet it needs a STUN or TURN server.

    /join-voice lounge
  3. 03

    Files, peer to peer

    /attach streams a file from your machine straight to whoever downloads it. 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 a folder holding its own binary and a plugin.toml. Drop it into the server's plugins folder and restart. It can answer in chat like a bot, or draw its own pane, like a kanban board you drive from the keyboard.

    Plugins/<name>/plugin.toml
    Plugins/
    └── kanban/
        ├── plugin.toml
        └── kanban      # its own binary

    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, hubs share listings with each other, and there's no central authority. Listings don't show your server's address.

    Settings → Manage Servers → B · browse hubs
    Login or Add Server: Ctrl+G
  6. 06

    Roles and moderation

    Admin, Moderator and custom roles built from permission flags, with per-channel overrides. Kick, ban, timeout and mute, hand out custom titles, and move people between voice channels.

    /role @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 focus: servers → channels → chat
    CtrlS
    Open Settings, including Manage Servers
    CtrlN
    Add a server from Main
    CtrlB
    Open Server Admin Panel (connected admins)
    CtrlG
    Browse Grapevine hubs from Login or Add Server
    CtrlT
    Theme browser with live preview
    AltM
    Highlight a message to reply, edit, pin or open its links
    /
    Slash commands, with tab completion; use /help for the command list
    CtrlQ
    Quit
    04 · Install

    From clone to chat.

    Release builds for Windows, macOS (Apple silicon) and Linux arrive with v0.1.0 on the Releases page. Until then, build from source with Go 1.24 or newer. The server and hub are pure Go; the voice-enabled client needs a C compiler and the Opus libraries, plus GTK 3 on Linux for its save dialog.

    1. 1

      Get the tools

      Homebrew for Go and the Opus libraries, and Apple's command line tools for clang.

      Debian and Ubuntu shown. Check go version says 1.24 or newer.

      Install Go 1.24+ from go.dev/dl and MSYS2 from msys2.org, then run this in the MSYS2 MinGW64 shell.

      brew install go git make pkg-config opus opusfile
      xcode-select --install
      sudo apt install golang git make clang pkg-config libopus-dev libopusfile-dev libgtk-3-dev
      pacman -S git make mingw-w64-x86_64-clang mingw-w64-x86_64-pkgconf mingw-w64-x86_64-opus mingw-w64-x86_64-opusfile
    2. 2

      Get the source

      Clone the repository from GitHub.

      git clone https://github.com/JMThomas00/Concord.git && cd Concord
    3. 3

      Build

      Makes all three binaries: server, client with voice, and the Grapevine hub, in build/.

      make build
      make build
      make build-windows
    4. 4

      Start your server

      The first run opens a setup wizard and prints the address to share. The first account to register becomes Admin.

      ./build/concord-server
      ./build/concord-server
      build\concord-server.exe
    5. 5

      Open the client

      On first launch, finish Identity Setup. With no saved servers, Concord opens Add Server directly; enter the server name, address and port, then press Enter. Later, press Ctrl+N from Main or open Settings → Manage Servers to add another. Press Ctrl+G on Login or Add Server to browse Grapevine hubs.

      ./build/concord-client
      ./build/concord-client
      build\concord-client.exe
    concord-client 0.1.0root@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
    0.1.0 (pre-release)
    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 [--setup] [--hybrid] [--dashboard] [--debug]

    DESCRIPTION

    The first run starts a setup wizard: server name, bind host (0.0.0.0), port (8080) and database path (concord.db). It writes concord-server.toml and prints the address to share. The first account to register becomes Admin.

    OPTIONS

    --setupre-run the wizard

    --hybridlogs and a live dashboard, side by side

    --dashboarddashboard only

    --debugverbose logging

    NOTES

    Pure Go with SQLite. No CGO, so the server builds without a C compiler.

    /join-voice lounge

    → joined ◉ lounge · 3 peers

    transport
    WebRTC data channels, peer to peer
    codec
    Opus, 20 ms frames
    sample rate
    8 · 16 · 24 · 48 kHz
    modes
    voice activity (300 ms hold) · push-to-talk
    audio
    CoreAudio · WASAPI · ALSA/PulseAudio
    mic

    note: works on a LAN out of the box. Across the internet, voice needs a STUN/TURN server.

    /attach ./homelab-notes.md

    The file streams from your machine straight to theirs. The server only passes the handshake along.

    by design: the sender stays online while others download.

    tree Plugins/

    Plugins/
    └── kanban/
        ├── plugin.toml
        └── kanban        # its own binary, any language

    cat Plugins/kanban/plugin.toml

    # example
    [plugin]
    id      = "kanban"
    name    = "Kanban"
    
    [process.entrypoint.linux]
    bin = "kanban"
    
    [[channel_kind]]
    kind        = "board"
    remote_pane = true

    Drop the folder in, restart the server. Concord spawns the process, gives it a service account, and restarts it if it crashes. A plugin either relays chat like a bot or, with remote_pane, draws its own pane and takes your keystrokes.

    concord-hub --dashboard

    opt-in
    enable [grapevine] in concord-server.toml
    browse
    Settings → Manage Servers → B; Login / Add Server: Ctrl+G
    listings
    no host or port shown
    join
    single-use token, then connect
    hubs
    anyone can run one; hubs share listings

    /role @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 · /title · /move-voice

    /help

    GLOBAL

    Tab
    next panel
    Ctrl+S
    settings / manage servers
    Ctrl+N
    add server from Main
    Ctrl+B
    server admin (admins)
    Ctrl+G
    hub browser (login / add server)
    Ctrl+T
    theme browser
    /help
    search commands
    Ctrl+Q
    quit

    CHAT

    Enter
    send
    Tab
    complete @mention
    PgUp/PgDn
    scroll history
    Alt+M
    highlight mode

    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

    Release builds (Windows, macOS arm64, Linux) arrive with v0.1.0 at github.com/JMThomas00/Concord/releases. Until then, build from source with Go 1.24+. Server and hub are pure Go; the client needs clang and Opus, plus GTK 3 on Linux.

    ## 1 · tools — macOS

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

    — Linux (Debian/Ubuntu)

    sudo apt install golang git make clang pkg-config libopus-dev libopusfile-dev libgtk-3-dev

    — Windows (MSYS2 MinGW64 shell, after Go 1.24+ and MSYS2)

    pacman -S git make mingw-w64-x86_64-clang mingw-w64-x86_64-pkgconf mingw-w64-x86_64-opus mingw-w64-x86_64-opusfile

    ## 2 · source + build

    git clone https://github.com/JMThomas00/Concord.git && cd Concord
    make build            # Windows: make build-windows

    ## 3 · run

    ./build/concord-server   # first run: setup wizard, prints the address to share
    ./build/concord-client   # first run: finish Identity Setup; Add Server opens directly
                             # later: Ctrl+N from Main adds a server
                             # Ctrl+G opens hubs on Login/Add Server

    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