Skip to content

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.

Client: CAP LS 302
Server: CAP * LS :SASL=PLAIN EXTENDED-JOIN AWAY-NOTIFY MESSAGE-TAGS SERVER-TIME ...
Client: CAP REQ :EXTENDED-JOIN AWAY-NOTIFY MULTI-PREFIX
Server: CAP * ACK :EXTENDED-JOIN AWAY-NOTIFY MULTI-PREFIX
Client: CAP END

SASL authentication before registration completes.

  • Announced as: SASL=PLAIN (since PLAIN is the only supported mechanism)
  • Non-requestable via CAP REQ SASL alone — use SASL=PLAIN
  • Actually: SASL=PLAIN is the full cap value; clients request it as SASL

Purpose: Allows authentication using SASL PLAIN before the connection registration completes. See SASL Authentication.

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!

Sends notifications when users in shared channels identify or log out.

When a user identifies:

:Alice!alice@host ACCOUNT AliceAccount

When a user logs out:

:Alice!alice@host ACCOUNT *

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 lunch

When a user clears away:

:Alice!alice@host AWAY

Notifies clients when server capabilities change dynamically (e.g., after REHASH).

Notifies users in shared channels when someone’s hostname changes (e.g., via +x mode or CHGHOST).

Format:

:Alice!oldident@oldhostname CHGHOST newident newhostname

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 #channel

Adds account name and real name to JOIN messages.

Standard JOIN:

:Alice!alice@host JOIN #channel

Extended JOIN:

:Alice!alice@host JOIN #channel AliceAccount :Alice's Real Name

The account field is * if the user is not identified.

Adds account information to INVITE messages.

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)

Displays all status prefixes for users in NAMES replies and similar responses.

Without MULTI-PREFIX:

@Alice ← shows only highest prefix

With MULTI-PREFIX:

@+Alice ← shows all prefixes (op and voice)

Full IRCv3 message tag support. Enables the use of message tags for metadata attachment.

Enables:

  • SERVER-TIME tags (time=)
  • MSGID tags (msgid=)
  • ACCOUNT-TAG tags (account=)
  • Bot tags (+draft/bot)
  • Client-only tags (+vendor/name)

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!

Adds a unique msgid= tag to every message.

Example:

@msgid=abc123xyz456 :Alice!alice@host PRIVMSG #channel :Hello!

Efficient user tracking. Track when specific nicknames go online or offline.

See MONITOR command.

Allows clients to change their real name (GECOS) during an active session.

Extended NAMES reply — nicks are shown as nick!ident@host instead of just nick.

Extended user modes in WHO replies.

Strict Transport Security. Announces TLS upgrade policy.

  • Plaintext connections: sts=port=6697
  • TLS connections: sts=duration=2592000

Non-requestable — informational only.

CapabilityStatus
batchNot implemented
echo-messageNot implemented
labeled-responseNot implemented
standard-repliesNot implemented