rIRCd

A bleeding-edge IRC server written in Rust with comprehensive IRCv3 support.

45+ IRCv3 specs Rust + Tokio SASL PLAIN / SCRAM / EXTERNAL MariaDB-backed
Download Latest Release View on GitHub

Features

Everything you need for a modern IRC network, out of the box.

🔒 Strong Authentication

SASL PLAIN, SCRAM-SHA-256 with mutual auth, and EXTERNAL via TLS client certificates. Bcrypt-hashed passwords. Account registration from any client.

💾 Full Persistence

Channels, topics, modes, bans, operators, voice lists, message history, read markers, and metadata all persisted in MariaDB. Nothing lost on restart.

💬 Message History

CHATHISTORY LATEST/BEFORE/AFTER/AROUND/BETWEEN/TARGETS with event playback. Edit history and REDACT events replayed for full client sync.

🔒 TLS Everywhere

Native TLS for IRC, WebSocket, and filehost. Strict Transport Security (STS). Host cloaking with HMAC-SHA256. SASL EXTERNAL with client certs.

📎 File Uploads

Embedded HTTPS file upload endpoint (draft/filehost). HTTP Basic auth using IRC credentials. MIME-typed downloads. Configurable size limits.

🌐 WebSocket Transport

Native WebSocket and WSS listeners for browser-based clients. IRCv3 text.ircv3.net and binary.ircv3.net subprotocols.

Quick Start

Get running in under a minute.

Terminal
# Build from source
cargo build --release
sudo cp target/release/rircd /usr/local/bin/

# Interactive setup (creates /etc/rIRCd/config.toml)
sudo rircd init

# Start the server
sudo rircd run

# Or install as a systemd service
sudo cp distrib/rircd.service /etc/systemd/system/
sudo systemctl enable --now rircd

IRCv3 Specification Support

45+ capabilities and extensions implemented.

CapabilityStatusNotes
capability-negotiationFullCAP LS/REQ/ACK/NAK/END, 302 multi-line
message-tagsFullParse & send tags; TAGMSG; msgid/server-time/account tags
server-timeFulltime tag on messages
message-idsFullmsgid tag; unique ID per message
batchFullNAMES and CHATHISTORY wrapped in BATCH
echo-messageFullPRIVMSG, NOTICE, TAGMSG echoed to sender
multi-prefixFullNAMES/WHO send all prefixes in rank order
extended-joinFullJOIN with account and realname
account-tagFullaccount= tag on messages
account-notifyFullACCOUNT on login/quit to channel peers
chghostFullSETHOST/SETUSER (oper-only); CHGHOST broadcast
setnameFullSETNAME command with broadcast
away-notifyFullAWAY broadcast to channel peers
invite-notifyFullINVITE broadcast to channel members
labeled-responseFullClient label tag echoed on replies
standard-repliesFullFAIL for errors
no-implicit-namesFullSuppress NAMES burst on JOIN
userhost-in-namesFullFull nick!user@host in NAMES
utf8onlyFullNon-UTF-8 rejected with FAIL
cap-notifyFullDynamic CAP NEW/CAP DEL on REHASH
saslFullPLAIN, SCRAM-SHA-256, EXTERNAL (TLS client cert)
stsFullStrict Transport Security
monitorFullMONITOR +/−/C/L/S with extended globs
whoxFullWHO with %fields; 354 RPL_WHOSPCRPL
botFullUmode +B; RPL_WHOISBOT
account-extbanFullMODE +b ~a:account
STATUSMSGFullPRIVMSG/NOTICE to @# and +#
message-redactionFullREDACT with soft-delete; replayed in CHATHISTORY
draft/message-editFullEdit with DB-backed ownership; edit history replay
draft/reactFullTAGMSG with +draft/react and +draft/unreact
typingFull+typing=active/paused/done
replyFull+reply=msgid forwarded
draft/chathistoryFullLATEST/BEFORE/AFTER/AROUND/BETWEEN/TARGETS
draft/event-playbackFullJOIN/PART/QUIT/TOPIC/NICK in history
draft/channel-renameFullRENAME with fallback PART+JOIN
draft/read-markerFullMARKREAD per-account, persisted
draft/metadata-2FullGET/LIST/SET/CLEAR; persisted
draft/multilineFullBATCH multiline; max 4096 bytes / 20 lines
draft/pre-awayFullAWAY during registration
draft/network-iconFullICON= ISUPPORT token
draft/filehostFullHTTPS file uploads; HTTP Basic auth; MIME downloads
draft/account-registrationFullREGISTER from any client
draft/extended-isupportFullISUPPORT command
WebSocketFullWS + WSS transport; text.ircv3.net subprotocol
WebIRCFullGateway IP passthrough

Configuration

All settings live in a single /etc/rIRCd/config.toml file.

[server]

nameServer hostname
listenPlain-text ports
listen_tlsTLS ports
listen_wsWebSocket ports
listen_wssWebSocket TLS ports
motdMessage of the day
cloak_keyHost cloaking secret

[tls]

certPEM certificate path
keyPEM private key path
client_certsEnable SASL EXTERNAL

[database]

hostMariaDB/MySQL host
portDatabase port
userDatabase username
passwordDatabase password
databaseDatabase name

[filehost]

listenHTTP listen address
public_urlPublic download URL
upload_dirLocal storage path
max_sizeMax upload bytes

[network]

nameNetwork name (005 NETWORK)
iconNetwork icon URL

[[opers]]

nameOperator username
hostmaskRestrict by host
password_hashBcrypt hash

Standard IRC Commands

Full command set beyond IRCv3 extensions.

LIST Channel listing with filters
LUSERS Server statistics
VERSION Server version
TIME Server local time
INFO Server info and uptime
LINKS Linked servers
STATS Server stats (u, o)
WHOWAS Historical nick info
WHO User query with glob masks
HELP Per-command help text
KNOCK Request invite to +i channel
KILL Oper: forcibly disconnect
WALLOPS Oper: broadcast to +w users
MOTD Message of the day
ISON Check nick online status
USERHOST User host info lookup

Modes

User and channel modes supported by rIRCd.

User Modes

+B Bot mode (shown in WHOIS)
+i Invisible (hidden from WHO)
+o IRC operator
+r Registered (auto on SASL login)
+w Receives WALLOPS

Channel Modes

+o Channel operator
+v Voice
+h Half-op
+b Ban list (~a:account extban)
+e Ban exception
+I Invite exception
+q Quiet (silence without kick)
+i Invite-only
+m Moderated
+n No external messages
+s Secret
+t Topic restricted to ops
+k Channel key
+l User limit
+R Registered users only
+c Strip colours/formatting
+C Block CTCP

CLI

Server management commands.

rircd init Create config directory with defaults
rircd run Start the server
rircd stop Send SIGTERM to running server
rircd status Check if server is running
rircd genpasswd Hash a password for oper config