
Concord is a feature-rich TUI (terminal user interface) client for Discord, written in Rust with ratatui. Full Discord experience, right in your terminal.
brew install concord
Or with the tap for the latest version:
brew install chojs23/tap/concord
npm install -g @chojs23/concord
You can also run Concord without a global install:
npx @chojs23/concord
The npm package installs a prebuilt binary from the GitHub Release artifacts.
Install native dependencies first.
On macOS with Homebrew:
brew install opus pkg-config
On Fedora:
sudo dnf install opus-devel alsa-lib-devel pkgconf-pkg-config
On Debian or Ubuntu:
sudo apt install libopus-dev libasound2-dev pkg-config
cargo install concord --locked
To install without local voice playback and microphone support:
cargo install concord --locked --no-default-features
To install the latest unreleased version directly from the Git repository:
cargo install --locked --git https://github.com/chojs23/concord
Install the packaged release from nixpkgs:
nix profile install nixpkgs#concord-tui
Run the packaged release without installing:
nix run nixpkgs#concord-tui
Run the latest release without installing (requires flakes enabled):
nix run github:chojs23/concord
Install into your profile:
nix profile install github:chojs23/concord
Or add the flake as an input in your own flake.nix:
{
inputs.concord.url = "github:chojs23/concord";
}
Install the latest release with the cargo-dist shell installer:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/chojs23/concord/releases/latest/download/concord-installer.sh | sh
On Windows, use the PowerShell installer instead:
powershell -ExecutionPolicy Bypass -c "irm https://github.com/chojs23/concord/releases/latest/download/concord-installer.ps1 | iex"
The installer places concord under $CARGO_HOME/bin, which is usually
~/.cargo/bin on Unix and %USERPROFILE%\.cargo\bin on Windows.
You need the Rust stable toolchain, Cargo, and the native dependencies listed in the Cargo install section.
git clone https://github.com/chojs23/concord.git
cd concord
cargo build --release
The release binary is produced at:
target/release/concord
To build without local voice playback and microphone support, disable default features:
cargo build --release --no-default-features
On WSLg, audio is usually exposed through PulseAudio instead of a real ALSA sound card. If playback does not start, check that PulseAudio and ALSA routing work before debugging Discord voice itself:
pactl info
paplay /usr/share/sounds/alsa/Front_Center.wav
aplay -D pulse /usr/share/sounds/alsa/Front_Center.wav
Email and QR code logins may trigger a CAPTCHA challenge on Discord's side. We cannot solve that, so I strongly recommend using token authentication.
By default, tokens are saved in the system keychain when available. In the
default auto mode, Concord falls back to its state directory when keychain
storage is unavailable. See the Security section below for details.
To sign out with the default keys, open your profile with Space, p, then
choose [o] sign out.
Space, Space)/
Concord renders a practical subset of Discord-style Markdown in message bodies:
# H1, ## H2, ### H3> quoted text- item and * item**bold**, *italic*, __underline__, ~~strikethrough~~, and `inline code`Image rendering is powered by ratatui-image. On startup, Concord queries the terminal to detect the best available graphics protocol. Supported protocols:
If your terminal does not support any graphics protocol, images will be rendered as halfblock approximations. For the best experience, use a terminal that supports the Kitty or iTerm2 protocol.
You can toggle image viewing on or off in the configuration file. When image viewing is off, attachments and emojis will be shown as text placeholders.
Video and audio playback uses mpv. Make sure mpv is installed and in your PATH.
YouTube playback depends on your local mpv setup, such as yt-dlp support.
External media playback is off by default. You can enable it with
media_playback = true under [display], or toggle it from the in-app Display
options menu.
discord-ipc socket, detects connected apps, and
lets you pick which one to share from your profile's activity pickershare_rich_presence under [presence] in config.toml<leader>n) with Unreads and Mentions tabs, per-channel
message previews, and mark-as-read / mark-all-read⚠️ Keymap action names and default bindings may have breaking changes between releases.
All default key settings in this section can be customized. See Keymap options for the config format and supported actions.
Concord has a four-pane. Guilds (1), Channels (2), Messages (3), Members (4)
With default vim-style navigation:
| Key | Action |
|---|---|
1 2 3 4 |
Focus pane |
Tab / Shift+Tab |
Cycle focus forward / backward |
h / l, ← / → |
Move focus left / right |
j / k, ↑ / ↓, Ctrl+n / Ctrl+p |
Move down / up |
J, K / H, L |
Scroll viewport |
Ctrl+d / Ctrl+u |
Half-page scroll |
Alt+h/l/←/→ |
Resize focused pane width |
gg / G |
Jump or scroll to top / bottom |
Enter |
Open or activate the selected item |
/ |
Filter Guilds/Channels, search Messages/Members |
Space |
Open leader shortcut window |
i |
Text insert mode, or forum post composer |
Esc / q |
Close popup, cancel mode, or go back |
q |
Quit Concord |
Ctrl+n and Ctrl+p are fixed row movement keys. The default j and k
row movement keys are SelectNext and SelectPrevious and can be changed in
keymap.toml.
Press Space to open the leader shortcut window.
| Key sequence | Action |
|---|---|
Space, 1 |
Toggle the Servers pane |
Space, 2 |
Toggle the Channels pane |
Space, 4 |
Toggle the Members pane |
Space, a |
Open actions for the focused pane |
Space, p |
Open my profile settings |
Space, o |
Choose concord option category |
Space, n |
Open the notification inbox |
Space, v |
Voice command prefix |
Space, Space |
Open the fuzzy channel switcher |
Focus a pane, then press Space, a to open actions for that pane. Action
shortcuts are shown inside the leader popup and only run when the action is
enabled. In the Messages pane, the selected message also supports these direct
shortcuts:
Message shortcuts:
| Shortcut | Action | Description |
|---|---|---|
y |
Copy | Copy the selected message text and show a short toast |
r |
Add/remove reaction | Open the reaction picker for the selected message |
R |
Reply | Start a reply to the selected message |
d |
Delete | Open a delete confirmation before deleting the message |
e |
Edit | Start editing the selected message when editing is allowed |
o |
Open URL | Open the selected message URL, or choose from multiple URLs |
x |
Play media | Play selected video or audio media in an external player |
v |
View attachment | Open the selected message's attachment viewer |
Message action menu shortcuts:
| Shortcut | Action | Description |
|---|---|---|
y |
Copy | Copy the selected message text and show a short toast |
r |
Add/remove reaction | Open the reaction picker for the selected message |
R |
Reply | Start a reply to the selected message |
d |
Delete | Open a delete confirmation before deleting the message |
e |
Edit | Start editing the selected message when editing is allowed |
o |
Open URL | Open the selected message URL, or choose from multiple URLs |
D |
Remove embeds | Remove embeds from the selected message |
x |
Play media | Play selected video or audio media in an external player |
v |
View attachment | Open the selected message's attachment viewer |
g |
Go to referenced message | Go to the replied or forwarded message |
p |
show message sender profile | Open the |
$ claude mcp add concord \
-- python -m otcore.mcp_server <graph>