FAQ

What is repartee?

repartee is a terminal IRC client written in Rust, inspired by irssi and built as a port of kokoirc (TypeScript/OpenTUI/Bun) to Rust/ratatui/tokio.

Why Rust?

  • Performance: ~24MB self-contained binary (including bundled SQLite, Hunspell, and Leptos WASM web frontend), instant startup, minimal memory usage
  • Safety: Memory-safe without garbage collection
  • Concurrency: tokio async runtime handles multiple connections efficiently
  • Reliability: Rust's type system catches bugs at compile time
  • Distribution: Single static binary, no runtime dependencies

How does repartee compare to kokoirc?

Featurekokoircrepartee
LanguageTypeScriptRust
TUI frameworkOpenTUI/Reactratatui
RuntimeBunNative binary
Binary size~68MB~24MB (with embedded WASM web UI)
ScriptingTypeScriptLua 5.4
Config formatTOMLTOML (same format)
Theme formatirssi-compatibleirssi-compatible (same)

The config and theme formats are compatible -- you can copy your kokoirc config to repartee with minimal changes.

How do I migrate from kokoirc?

  1. Copy ~/.kokoirc/config.toml to ~/.repartee/config.toml
  2. Copy ~/.kokoirc/.env to ~/.repartee/.env
  3. Copy ~/.kokoirc/themes/ to ~/.repartee/themes/
  4. Scripts need to be rewritten from TypeScript to Lua

How do I migrate from irssi?

repartee uses irssi-compatible format strings, so your theme knowledge transfers directly. The key differences:

  • Config is TOML instead of irssi's custom format (or edit interactively via /wizard / /config or /set)
  • Scripts are Lua instead of Perl
  • Most /commands work the same

Does repartee support DCC?

Yes -- repartee supports DCC CHAT with full irssi/erssi parity:

  • Active and passive (reverse) DCC CHAT connections
  • =nick buffer convention -- DCC chats appear as =Alice in the buffer list
  • Auto IP detection from the IRC socket, with manual override via /set dcc.own_ip
  • Auto-accept masks, timeout, nick tracking, DCC REJECT
  • Tab-completable commands: /dcc chat, /dcc close, /dcc list, /dcc reject
  • Scripting events: dcc.chat.request, dcc.chat.connected, dcc.chat.message, dcc.chat.closed

Does repartee load chat history?

Yes. When you open a channel, query, or DCC buffer, the last 20 messages (configurable via display.backlog_lines) are loaded from the local SQLite log database. In addition, on servers or bouncers supporting draft/chathistory, repartee automatically fetches server-side history upon joining a channel (and you can fetch older messages on demand with /chathistory).

Where are logs stored?

~/.repartee/logs/messages.db -- a SQLite database with optional AES-256-GCM encryption.

Can I use multiple IRC networks and bouncers?

Yes. Add multiple [servers.*] sections to your config, or use /wizard to configure them interactively. Each server gets its own connection and set of channel buffers.

If you use a bouncer like Soju or Lurker, set bouncer_control = true on a single control connection and repartee will automatically discover all your upstream networks via soju.im/bouncer-networks, spawn per-network sibling connections with username/netid credentials, synchronize read markers across devices (draft/read-marker), and let you search server-side logs (/bsearch) or manage upstream networks (/bouncer).

Does repartee support IRCv3?

Yes -- repartee negotiates 30+ IRCv3 and bouncer capabilities at connection time:

  • Core & identity: server-time, echo-message, labeled-response, away-notify, account-notify, chghost, setname, cap-notify, multi-prefix, extended-join, userhost-in-names, no-implicit-names, invite-notify
  • History & messaging: batch, message-tags, draft/chathistory, draft/event-playback, draft/multiline, draft/read-marker, draft/message-redaction, draft/channel-context, +typing, +draft/reply, +draft/react
  • Presence, accounts & metadata: monitor, extended-monitor, draft/account-registration, draft/metadata-2, draft/extended-isupport, draft/webpush
  • Bouncer extensions: soju.im/bouncer-networks, soju.im/bouncer-networks-notify, soju.im/search, soju.im/client-cert
  • SASL: ECDSA-NIST256P-CHALLENGE, SCRAM-SHA-512, SCRAM-SHA-256, SCRAM-SHA-1, EXTERNAL (client TLS certificate), OAUTHBEARER, PLAIN (strongest-first automatic selection)
  • WHOX & Extban: auto-detected WHOX for account/host tracking, and $a:account extbans with /ban -a shorthand

See the IRCv3 Reference for the complete specification matrix.

How do I keep repartee running in the background?

Use /detach (or press Ctrl+\ / Ctrl+Z) to detach from the terminal. repartee continues running -- IRC connections stay alive, messages are logged, and scripts keep executing.

Reattach with repartee a from any terminal. You can also start headless with repartee -d and attach later.

See Sessions & Detach for the full guide.

Can I close my terminal and reconnect later?

Yes. When you close your terminal window, repartee catches SIGHUP and auto-detaches. The session stays running and you can reattach with repartee a.

This also works across SSH disconnections -- start with repartee -d on a remote server, disconnect SSH, reconnect later, and repartee a picks up your session.

What does /cycle do?

/cycle parts and immediately rejoins a channel. Useful for refreshing your nick list, re-triggering auto-op, or clearing stale channel state. Channel keys are preserved. Alias: /rejoin.

Can I run shell commands without detaching?

Yes! Use /shell to open an embedded terminal inside Repartee. You get a full PTY-backed shell (zsh, bash, vim, htop) in a separate buffer. Press Ctrl+] to switch back to IRC input, or click another buffer in the sidebar. Type exit in the shell to close it automatically. You can open multiple shells -- they appear under a "Shell" group in the sidebar.

The shell also works in the web frontend -- each web session gets its own independent PTY sized to the browser viewport. The web shell uses a beamterm WebGL2 renderer with FiraCode Nerd Font, mouse text selection, Ctrl+/- font resize, and clipboard paste.

How do I report bugs?

Open an issue on GitHub or visit repart.ee.