IRCv3 Capabilities
ElixIRCd supports modern IRC client features through the IRCv3 capability negotiation system. Capabilities are negotiated during the connection handshake using the CAP command.
Capability Negotiation Flow
Section titled “Capability Negotiation Flow”Client: CAP LS 302Server: CAP * LS :SASL=PLAIN EXTENDED-JOIN AWAY-NOTIFY MESSAGE-TAGS SERVER-TIME ...Client: CAP REQ :EXTENDED-JOIN AWAY-NOTIFY MULTI-PREFIXServer: CAP * ACK :EXTENDED-JOIN AWAY-NOTIFY MULTI-PREFIXClient: CAP ENDSupported Capabilities
Section titled “Supported Capabilities”SASL (sasl)
Section titled “SASL (sasl)”SASL authentication before registration completes.
- Announced as:
SASL=PLAIN(since PLAIN is the only supported mechanism) - Non-requestable via
CAP REQ SASLalone — useSASL=PLAIN - Actually:
SASL=PLAINis the full cap value; clients request it asSASL
Purpose: Allows authentication using SASL PLAIN before the connection registration completes. See SASL Authentication.
ACCOUNT-TAG (account-tag)
Section titled “ACCOUNT-TAG (account-tag)”Attaches the authenticated account name to messages via message tags.
When active: Messages from identified users include account=AccountName in their tag list.
Example:
@account=Alice :Alice!alice@host PRIVMSG #channel :Hello!ACCOUNT-NOTIFY (account-notify)
Section titled “ACCOUNT-NOTIFY (account-notify)”Sends notifications when users in shared channels identify or log out.
When a user identifies:
:Alice!alice@host ACCOUNT AliceAccountWhen a user logs out:
:Alice!alice@host ACCOUNT *AWAY-NOTIFY (away-notify)
Section titled “AWAY-NOTIFY (away-notify)”Real-time notifications when users in shared channels set or remove their away status.
When a user sets away:
:Alice!alice@host AWAY :Out for lunchWhen a user clears away:
:Alice!alice@host AWAYCAP-NOTIFY (cap-notify)
Section titled “CAP-NOTIFY (cap-notify)”Notifies clients when server capabilities change dynamically (e.g., after REHASH).
CHGHOST (chghost)
Section titled “CHGHOST (chghost)”Notifies users in shared channels when someone’s hostname changes (e.g., via +x mode or CHGHOST).
Format:
:Alice!oldident@oldhostname CHGHOST newident newhostnameCLIENT-TAGS (client-tags)
Section titled “CLIENT-TAGS (client-tags)”Allows clients to attach vendor-specific client-only tags to messages. These tags are forwarded to other clients but not interpreted by the server.
Format: Tags prefixed with + are client-only:
@+typing=active TAGMSG #channelEXTENDED-JOIN (extended-join)
Section titled “EXTENDED-JOIN (extended-join)”Adds account name and real name to JOIN messages.
Standard JOIN:
:Alice!alice@host JOIN #channelExtended JOIN:
:Alice!alice@host JOIN #channel AliceAccount :Alice's Real NameThe account field is * if the user is not identified.
INVITE-EXTENDED (invite-extended)
Section titled “INVITE-EXTENDED (invite-extended)”Adds account information to INVITE messages.
INVITE-NOTIFY (invite-notify)
Section titled “INVITE-NOTIFY (invite-notify)”When a user is invited to a channel, other channel members receive a notification:
:Alice!alice@host INVITE Bob #channel(Sent to all channel members with this capability)
MULTI-PREFIX (multi-prefix)
Section titled “MULTI-PREFIX (multi-prefix)”Displays all status prefixes for users in NAMES replies and similar responses.
Without MULTI-PREFIX:
@Alice ← shows only highest prefixWith MULTI-PREFIX:
@+Alice ← shows all prefixes (op and voice)MESSAGE-TAGS (message-tags)
Section titled “MESSAGE-TAGS (message-tags)”Full IRCv3 message tag support. Enables the use of message tags for metadata attachment.
Enables:
SERVER-TIMEtags (time=)MSGIDtags (msgid=)ACCOUNT-TAGtags (account=)- Bot tags (
+draft/bot) - Client-only tags (
+vendor/name)
SERVER-TIME (server-time)
Section titled “SERVER-TIME (server-time)”Adds a time= tag to every message with the server’s timestamp in ISO 8601 format.
Example:
@time=2024-01-15T14:30:00.000Z :Alice!alice@host PRIVMSG #channel :Hello!MSGID (msgid)
Section titled “MSGID (msgid)”Adds a unique msgid= tag to every message.
Example:
@msgid=abc123xyz456 :Alice!alice@host PRIVMSG #channel :Hello!MONITOR (monitor)
Section titled “MONITOR (monitor)”Efficient user tracking. Track when specific nicknames go online or offline.
See MONITOR command.
SETNAME (setname)
Section titled “SETNAME (setname)”Allows clients to change their real name (GECOS) during an active session.
UHNAMES / extended-names (uhnames)
Section titled “UHNAMES / extended-names (uhnames)”Extended NAMES reply — nicks are shown as nick!ident@host instead of just nick.
EXTENDED-UHLIST (extended-uhlist)
Section titled “EXTENDED-UHLIST (extended-uhlist)”Extended user modes in WHO replies.
STS (sts)
Section titled “STS (sts)”Strict Transport Security. Announces TLS upgrade policy.
- Plaintext connections:
sts=port=6697 - TLS connections:
sts=duration=2592000
Non-requestable — informational only.
Not Implemented
Section titled “Not Implemented”| Capability | Status |
|---|---|
batch | Not implemented |
echo-message | Not implemented |
labeled-response | Not implemented |
standard-replies | Not implemented |