repartee 0.4.0

A modern terminal IRC client built with Ratatui and Tokio
repartee-0.4.0 is not a library.

Repartee

A modern terminal IRC client built with Rust, Ratatui, and Tokio.

Inspired by irssi. Designed for the future.

License: MIT Rust GitHub Pages


Features

  • Full IRC protocol — channels, queries, CTCP, TLS, channel modes, ban/except/invex lists
  • IRCv3 — server-time, echo-message, away-notify, account-notify, chghost, multi-prefix, BATCH netsplit grouping, message-tags, and more
  • SASL — PLAIN, EXTERNAL (client certificate), and SCRAM-SHA-256
  • irssi-style navigation — Esc+1–9 window switching, aliases, familiar /commands
  • Mouse support — click buffers and nicks, scroll chat history
  • Lua 5.4 scripting — event bus, custom commands, full IRC and state access, sandboxed per-script environments
  • Persistent logging — SQLite with WAL, FTS5 full-text search, optional AES-256-GCM encryption
  • Netsplit detection — batches join/part floods into single events
  • Flood protection — blocks CTCP spam and nick-change floods automatically
  • Theming — irssi-compatible format strings with 24-bit color support and custom abstracts
  • Web frontend — built-in HTTPS web UI with mobile support, real-time sync with the terminal, swipe gestures, 5 themes
  • DCC CHAT — direct client-to-client messaging with active and passive (reverse) connections
  • Spell check — inline correction with Hunspell dictionaries, multilingual, Tab to cycle suggestions
  • Detach & reattach — detach from your terminal and reattach later; IRC connections stay alive
  • Extban$a:account ban type with /ban -a shorthand
  • Single binary — ~5.5MB, zero runtime dependencies (SQLite, Lua, and WASM frontend bundled)

Installation

From source

git clone https://github.com/outragedevs/repartee.git
cd repartee
cargo build --release
./target/release/repartee

Requirements

  • Rust 1.85+ (2024 edition) — install via rustup
  • A terminal with 256-color or truecolor support (iTerm2, Alacritty, kitty, WezTerm, etc.)
  • A modern web browser for the web frontend (optional)

Quick Start

Launch repartee:

repartee

Add a server and connect:

/server add libera irc.libera.chat
/connect libera
/join #repartee

Or edit ~/.repartee/config.toml directly:

[servers.libera]
label    = "Libera"
address  = "irc.libera.chat"
port     = 6697
tls      = true
autoconnect = true
channels = ["#repartee"]

Key Bindings

Key Action
Esc + 1–9 Switch to buffer
Ctrl+N / Ctrl+P Next / previous buffer
Tab Nick completion
Up / Down Input history
Mouse click Select buffer or nick
Mouse wheel Scroll chat
Ctrl+\ Detach from terminal
Ctrl+Z Detach from terminal

Directory Layout

~/.repartee/
  config.toml        # main configuration
  .env               # credentials (SASL passwords, log encryption key)
  themes/            # custom .theme files
  scripts/           # Lua scripts
  logs/messages.db   # chat logs (SQLite)
  sessions/          # Unix sockets for detached sessions

Sessions & Detach

repartee can run in the background while you close your terminal:

# Detach: press Ctrl+\ or type /detach — terminal is restored
# Reattach from any terminal:
repartee a

# Or start headless (no terminal needed):
repartee -d
repartee a       # attach when ready

Everything survives detach — IRC connections, scrollback, scripts, and channel state.


Scripting

Scripts are Lua 5.4 files placed in ~/.repartee/scripts/:

meta = {
    name        = "hello",
    version     = "1.0",
    description = "Greet users on join",
}

function setup(api)
    api.on("irc.join", function(event)
        if event.nick ~= api.our_nick() then
            api.irc.say(event.channel, "Welcome, " .. event.nick .. "!")
        end
    end)
end

Load at runtime:

/script load hello

Or autoload in config:

[scripts]
autoload = ["hello"]

Theming

Themes are TOML files in ~/.repartee/themes/ using irssi-compatible format strings with 24-bit color extensions:

[colors]
bg        = "1a1b26"
fg        = "a9b1d6"
highlight = "e0af68"
nick_self = "7aa2f7"

[abstracts]
pubmsg  = "{pubmsgnick $0}$1"
own_msg = "{ownmsgnick $0}$1"

Set the active theme:

[general]
theme = "mytheme"

Documentation

Full documentation is available at outragedevs.github.io/repartee.


License

MIT — see LICENSE.