A bleeding-edge IRC server written in Rust with comprehensive IRCv3 support.
Everything you need for a modern IRC network, out of the box.
SASL PLAIN, SCRAM-SHA-256 with mutual auth, and EXTERNAL via TLS client certificates. Bcrypt-hashed passwords. Account registration from any client.
Channels, topics, modes, bans, operators, voice lists, message history, read markers, and metadata all persisted in MariaDB. Nothing lost on restart.
CHATHISTORY LATEST/BEFORE/AFTER/AROUND/BETWEEN/TARGETS with event playback. Edit history and REDACT events replayed for full client sync.
Native TLS for IRC, WebSocket, and filehost. Strict Transport Security (STS). Host cloaking with HMAC-SHA256. SASL EXTERNAL with client certs.
Embedded HTTPS file upload endpoint (draft/filehost). HTTP Basic auth using IRC credentials. MIME-typed downloads. Configurable size limits.
Native WebSocket and WSS listeners for browser-based clients. IRCv3 text.ircv3.net and binary.ircv3.net subprotocols.
Get running in under a minute.
# 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
45+ capabilities and extensions implemented.
| Capability | Status | Notes |
|---|---|---|
capability-negotiation | Full | CAP LS/REQ/ACK/NAK/END, 302 multi-line |
message-tags | Full | Parse & send tags; TAGMSG; msgid/server-time/account tags |
server-time | Full | time tag on messages |
message-ids | Full | msgid tag; unique ID per message |
batch | Full | NAMES and CHATHISTORY wrapped in BATCH |
echo-message | Full | PRIVMSG, NOTICE, TAGMSG echoed to sender |
multi-prefix | Full | NAMES/WHO send all prefixes in rank order |
extended-join | Full | JOIN with account and realname |
account-tag | Full | account= tag on messages |
account-notify | Full | ACCOUNT on login/quit to channel peers |
chghost | Full | SETHOST/SETUSER (oper-only); CHGHOST broadcast |
setname | Full | SETNAME command with broadcast |
away-notify | Full | AWAY broadcast to channel peers |
invite-notify | Full | INVITE broadcast to channel members |
labeled-response | Full | Client label tag echoed on replies |
standard-replies | Full | FAIL for errors |
no-implicit-names | Full | Suppress NAMES burst on JOIN |
userhost-in-names | Full | Full nick!user@host in NAMES |
utf8only | Full | Non-UTF-8 rejected with FAIL |
cap-notify | Full | Dynamic CAP NEW/CAP DEL on REHASH |
sasl | Full | PLAIN, SCRAM-SHA-256, EXTERNAL (TLS client cert) |
sts | Full | Strict Transport Security |
monitor | Full | MONITOR +/−/C/L/S with extended globs |
whox | Full | WHO with %fields; 354 RPL_WHOSPCRPL |
bot | Full | Umode +B; RPL_WHOISBOT |
account-extban | Full | MODE +b ~a:account |
STATUSMSG | Full | PRIVMSG/NOTICE to @# and +# |
message-redaction | Full | REDACT with soft-delete; replayed in CHATHISTORY |
draft/message-edit | Full | Edit with DB-backed ownership; edit history replay |
draft/react | Full | TAGMSG with +draft/react and +draft/unreact |
typing | Full | +typing=active/paused/done |
reply | Full | +reply=msgid forwarded |
draft/chathistory | Full | LATEST/BEFORE/AFTER/AROUND/BETWEEN/TARGETS |
draft/event-playback | Full | JOIN/PART/QUIT/TOPIC/NICK in history |
draft/channel-rename | Full | RENAME with fallback PART+JOIN |
draft/read-marker | Full | MARKREAD per-account, persisted |
draft/metadata-2 | Full | GET/LIST/SET/CLEAR; persisted |
draft/multiline | Full | BATCH multiline; max 4096 bytes / 20 lines |
draft/pre-away | Full | AWAY during registration |
draft/network-icon | Full | ICON= ISUPPORT token |
draft/filehost | Full | HTTPS file uploads; HTTP Basic auth; MIME downloads |
draft/account-registration | Full | REGISTER from any client |
draft/extended-isupport | Full | ISUPPORT command |
WebSocket | Full | WS + WSS transport; text.ircv3.net subprotocol |
WebIRC | Full | Gateway IP passthrough |
All settings live in a single /etc/rIRCd/config.toml file.
| name | Server hostname |
| listen | Plain-text ports |
| listen_tls | TLS ports |
| listen_ws | WebSocket ports |
| listen_wss | WebSocket TLS ports |
| motd | Message of the day |
| cloak_key | Host cloaking secret |
| cert | PEM certificate path |
| key | PEM private key path |
| client_certs | Enable SASL EXTERNAL |
| host | MariaDB/MySQL host |
| port | Database port |
| user | Database username |
| password | Database password |
| database | Database name |
| listen | HTTP listen address |
| public_url | Public download URL |
| upload_dir | Local storage path |
| max_size | Max upload bytes |
| name | Network name (005 NETWORK) |
| icon | Network icon URL |
| name | Operator username |
| hostmask | Restrict by host |
| password_hash | Bcrypt hash |
Full command set beyond IRCv3 extensions.
LIST Channel listing with filtersLUSERS Server statisticsVERSION Server versionTIME Server local timeINFO Server info and uptimeLINKS Linked serversSTATS Server stats (u, o)WHOWAS Historical nick infoWHO User query with glob masksHELP Per-command help textKNOCK Request invite to +i channelKILL Oper: forcibly disconnectWALLOPS Oper: broadcast to +w usersMOTD Message of the dayISON Check nick online statusUSERHOST User host info lookupUser and channel modes supported by rIRCd.
+B Bot mode (shown in WHOIS)+i Invisible (hidden from WHO)+o IRC operator+r Registered (auto on SASL login)+w Receives WALLOPS+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 CTCPServer management commands.
rircd init Create config directory with defaultsrircd run Start the serverrircd stop Send SIGTERM to running serverrircd status Check if server is runningrircd genpasswd Hash a password for oper config