IRCv3: What Changed, and Why It Matters
IRCv3 is not a new protocol. It is the same IRC from 1993, extended through a formal capability negotiation system that lets modern clients and servers use new features while remaining wire-compatible with everything that came before.
IRC Is Not Dead. It Evolved.
IRC was designed in 1988 by Jarkko Oikarinen. The core protocol — RFC 1459, formalised in 1993 — defined how clients connect to servers, join channels, and exchange messages. For its time, it was remarkably well-designed: federated, decentralised, text-based, and requiring no account registration with a central authority.
By 2010, IRC had a reputation problem. Compared to Slack and Discord, IRC felt primitive: no message history when you reconnected, no read receipts, no way to know if a message was delivered. The protocol was frozen in 1993 while everything around it moved.
IRCv3 is the working group that changed this — not by replacing IRC, but by extending it through a formal capability negotiation mechanism.
Capability Negotiation: The Foundation
The central innovation of IRCv3 is the CAP command. Before connecting,
a client and server negotiate which extensions both support:
CAP LS 302
CAP REQ :sasl message-tags batch chathistory
CAP ACK :sasl message-tags batch chathistory
A client that does not send CAP LS gets classic IRC behaviour.
A client that does gets the extended feature set. The same server handles both
transparently. This allowed IRCv3 to ship individual features as stable
specifications without requiring a protocol flag day.
SASL: Authentication Done Right
Classic IRC authentication was NICKSERV IDENTIFY password — a
plaintext password sent as a PRIVMSG to a bot. If TLS was not configured, the
password crossed the network in the clear.
IRCv3 replaces this with SASL (Simple Authentication and Security Layer), a proper authentication framework used across SMTP, IMAP, and LDAP. The IRCv3 SASL extension supports multiple mechanisms:
- PLAIN — username and password over TLS. Simple, widely supported.
- EXTERNAL — authentication via TLS client certificate. The server validates your certificate fingerprint. No password transmitted at all.
- SCRAM-SHA-256 — challenge-response. The server never sees your password, only a derived proof.
EXTERNAL authentication via client certificate means authentication requires possession of the private key, with nothing to intercept in transit.
STS: Strict Transport Security for IRC
The sts capability brings to IRC what HSTS brought to HTTPS.
On first connection, the server advertises an STS policy:
:server CAP * LS :sts=duration=2592000,port=6697
A compliant client records this policy and refuses any future plaintext connection to the server. An attacker who intercepts a subsequent connection attempt cannot downgrade it to plaintext. The window of vulnerability is limited to the first connection — identical to the HSTS model the web has used for over a decade.
Message Tags: Structured Metadata
In classic IRC, every message is a flat text line. Metadata — timestamps, reply references, reactions — had to be embedded in the message text using ad-hoc conventions that legacy clients would render as garbage.
IRCv3 message tags prepend structured key-value metadata to any message:
@time=2026-05-18T09:23:41.000Z;+reply=msg-id-123 :nick!user@host PRIVMSG #channel :response
Standard tags defined by IRCv3 include:
time— server-side timestamp, enabling accurate history display regardless of client clockmsgid— unique message identifier, enabling reply threading and read receipts+reply— references themsgidof the message being replied to+react— emoji reactions without polluting the message streambatch— groups related messages for atomic client processing
CHATHISTORY: Persistent History Without Logging Everything
The absence of message history when reconnecting was the most-cited reason for
moving away from IRC. IRCv3's CHATHISTORY command lets clients
request message history from the server on demand:
CHATHISTORY #channel LATEST * 50
CHATHISTORY #channel BEFORE msgid=abc123 50
CHATHISTORY nick AFTER timestamp=2026-05-18T00:00:00Z 100
Critically, this is a pull model. The server stores only what is configured. An operator who values privacy can set short retention windows — 24 hours, or none at all — without breaking the protocol for clients that request history.
This is the opposite of Discord and Slack, where all history is retained indefinitely, indexed, and accessible to the platform operator regardless of user preferences.
MONITOR: Presence Without Polling
Classic IRC had no efficient way to know when a specific user came online.
Clients would repeatedly WHOIS a nick, generating significant server load.
IRCv3's MONITOR extension lets clients register a watchlist:
MONITOR + nick1,nick2,nick3
The server sends RPL_MONONLINE or RPL_MONOFFLINE
when a monitored nick changes status. No polling. One event per state change.
Multiline Messages
Classic IRC messages are limited to 512 bytes per line. Long messages had to be
split by the client, arriving as separate PRIVMSGs with no indication they
belong together. IRCv3's multiline extension uses the batch
mechanism to send multiple lines as a single logical message:
BATCH +ref multiline #channel
@batch=ref PRIVMSG #channel :First line
@batch=ref PRIVMSG #channel :Second line, same message
BATCH -ref
Clients that support multiline display the batch as one coherent message. Legacy clients see each line individually — degraded but functional.
Why IRCv3 and Not Something Else
Matrix, Signal, Discord, and Telegram all solve the "IRC feels old" problem. None of them solve it in a way that is compatible with self-hosting, federation without central authority, zero-dependency client implementation, and protocol transparency.
IRCv3 is implementable. A complete client can be written by one person in a few thousand lines of code. The protocol is a published specification, not a reverse-engineered API. Any language that can open a TCP socket and parse lines can speak IRCv3.
The server we run — Ergo — is a single binary with no external database dependency. It handles message history, account registration, and all IRCv3 extensions internally. It runs on a Tor hidden service. Its configuration file is readable without a manual.
Simplicity, auditability, self-hostability, and federation without central registration: these are the properties that matter for a communication infrastructure that should still be running in ten years without depending on anyone else's continued goodwill. IRCv3 has them.
References
- IRCv3 Capability Negotiation specification — the CAP command, version negotiation, and the full list of registered capabilities.
- IRCv3 SASL 3.1 specification — authentication mechanisms: PLAIN, EXTERNAL, SCRAM-SHA-256.
- IRCv3 Strict Transport Security specification — STS policy advertisement, duration, port enforcement.
-
IRCv3 Message Tags specification
— tag syntax, client vs server tags, the
+prefix convention. - IRCv3 CHATHISTORY specification — pull model, target types (channel/nick), pagination commands (LATEST, BEFORE, AFTER).
- IRCv3 MONITOR specification — watchlist management, RPL_MONONLINE / RPL_MONOFFLINE numerics.
- IRCv3 Multiline Messages specification — BATCH-based multiline, graceful degradation for legacy clients.
- RFC 1459 — Internet Relay Chat Protocol (1993) — the original IRC specification, baseline for all IRCv3 extensions.
- Ergo IRCd — the IRCv3-compliant server we run. Single binary, built-in history, account management, full CAP negotiation support.
Connect to Our IRC Server
Tor onion (recommended):
2xz3ngedsne2ngd3blpgnrqmeitffnzsnjacdjinu63yi5tjcyfitbid.onion
Ports: 6667 plain / 6696 TLS 1.3