A modern, fast, terminal-based IRC client built in Rust.
Flume supports multi-server connections, a rich TUI with theming and split views, vi/emacs keybinding modes, a dual scripting engine (Lua and Python), LLM-powered script and theme generation, DCC file transfers, XDCC, and emoji shortcodes.
Documentation | GitHub | #flume on Libera.Chat
- Multi-server — connect to multiple IRC networks simultaneously
- Full IRCv3 — message-tags, SASL, server-time, away-notify, STS, with graceful degradation to RFC 1459/2812
- Theming — hot-reloadable theme engine with hash-based nick coloring
- Split views — side-by-side or top-bottom buffer splits with saveable layouts
- Vi and Emacs modes — configurable keybinding modes with full readline support
- Lua + Python scripting — dual runtime with unified API, event system, and custom commands
- LLM generation — describe what you want in plain English and Flume writes the script, theme, or layout for you (bring your own API key)
- DCC — file transfers (send/receive/resume), DCC CHAT, XDCC bot support, passive DCC for NAT
- Bouncer support — ZNC and Soju with buffer playback
- Emoji shortcodes — type
:thumbsup:to send 👍, tab-complete with:thu+ Tab - Secure vault — encrypted secret storage for passwords and API keys
git clone https://github.com/FlumeIRC/flume.git
cd flume
cargo install --path flume-tuicargo install --path flume-tui --features pythonRequires Python 3.10+ development headers.
brew install FlumeIRC/tap/flumeyay -S flumepkg install flumeDownload from the Releases page.
# Start Flume
flume
# Add a network with credentials
/secure init
/secure set libera_pass your-sasl-password
/server add libera irc.libera.chat 6697 -tls -autoconnect -username mynick -password ${libera_pass}
# Or configure SASL auth
/server set libera auth_method sasl
/server set libera sasl_username mynick
/server set libera sasl_password ${libera_pass}
# Save and connect
/save
/connect libera
# Join a channel
/join #flume~/.config/flume/ # Configuration
config.toml # Main settings
irc.toml # Network definitions
~/.local/share/flume/ # Data
themes/ # Theme files
layouts/ # Saved split layouts
scripts/
lua/autoload/ # Lua scripts loaded on startup
python/autoload/ # Python scripts loaded on startup
available/ # Installed but not auto-loaded
generated/ # Created by /generate
vault.toml # Encrypted secrets
logs/ # IRC message logs
[general]
default_nick = "mynick"
quit_message = "Flume IRC"
[ui]
theme = "solarized-dark"
show_join_part = true
show_hostmask_on_join = true
[ui.keybindings]
mode = "vi" # or "emacs"
[notifications]
highlight_words = ["mynick", "flume"]
[llm]
provider = "anthropic" # or "openai"
model = "claude-sonnet-4-20250514"
[dcc]
enabled = true
download_directory = "~/Downloads/flume"
passive = trueInteractive setup:
/generate init
This walks you through choosing a provider and storing your API key. Then:
/generate script --name greeter auto-respond when someone says hello
/generate theme --name midnight dark blue with warm orange accents
/generate layout --name monitoring #ops on the left and #alerts on the right
Flume supports both Lua and Python scripts with the same API:
Lua (~/.local/share/flume/scripts/lua/autoload/hello.lua):
flume.event.on("message", function(e)
if e.text:find("hello") then
flume.channel.say(e.server, e.channel, "Hello, " .. e.nick .. "!")
end
end)Python (~/.local/share/flume/scripts/python/autoload/hello.py):
import flume
def on_message(e):
if "hello" in e.get("text", ""):
flume.channel.say(e["server"], e["channel"], f"Hello, {e['nick']}!")
flume.event.on("message", on_message)Scripts can register custom commands with help text:
flume.command.register("greet", function(args)
flume.buffer.print("", "", "Hello " .. args)
end, "Greet someone by name")Then /help greet shows the help text.
See examples/scripts/ for more examples.
Type :shortcode: in messages — they're replaced with emoji on send:
:thumbsup: → 👍 :fire: → 🔥 :wave: → 👋 :heart: → ❤️
:rocket: → 🚀 :100: → 💯 :tada: → 🎉 :coffee: → ☕
Tab-complete: type :thu then Tab to cycle through matches. Search with /emoji fire.
| Key | Action |
|---|---|
Ctrl+C |
Quit |
Ctrl+X |
Cycle servers |
Alt+1-9 |
Jump to buffer |
Alt+Left/Right |
Cycle buffers |
Alt+Tab |
Swap split focus |
PageUp/Down |
Scroll |
Tab |
Nick / emoji completion |
Emacs mode adds Ctrl+A/E/B/F/D/K/U/W/P/N and Alt+B/F. Vi mode adds normal/insert modes with h/j/k/l/w/b/i/a/A and more.
Use /help for the full list, or /help <command> for details on any command.
| Command | Description |
|---|---|
/set <key> <value> |
View or change settings |
/go <name or #> |
Jump to buffer by name or number |
/split v|h <buf> |
Split view |
/script load <name> |
Load a script |
/generate script <desc> |
AI-generate a script |
/dcc list |
Show DCC transfers |
/xdcc <bot> <pack#> |
Request XDCC pack |
/emoji <search> |
Search emoji shortcodes |
BSD-3-Clause