Skip to content

FlumeIRC/flume

Repository files navigation

Flume

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

Features

  • 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

Install

From source (all platforms)

git clone https://github.com/FlumeIRC/flume.git
cd flume
cargo install --path flume-tui

With Python scripting support

cargo install --path flume-tui --features python

Requires Python 3.10+ development headers.

Homebrew (macOS/Linux)

brew install FlumeIRC/tap/flume

Arch Linux (AUR)

yay -S flume

FreeBSD

pkg install flume

Pre-built binaries

Download from the Releases page.

Quick Start

# 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

File Locations

~/.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

Example config.toml

[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 = true

LLM Setup

Interactive 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

Scripting

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.

Emoji

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.

Keybindings

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.

Commands

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

License

BSD-3-Clause

About

Flume IRC client project

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages