echoIRCd

Configuration reference

Every configuration block and field echoIRCd understands. For the format itself and a quick start, see Configuration. Most options re-apply on echoircd rehash (SIGHUP) with no restart; the TLS certificate is re-read on rehash too.

Format#

echoIRCd config files use a block format: section { field value; field value; … }.

  • One field per ; terminator; a block may span multiple lines.
  • Comments: # and // for line comments, /* … */ for block comments. An inline # on an active line is treated as part of the value unless the value is quoted — quote values that contain #.
  • Booleans are yes / no. A bare field with no value (e.g. operprefix;) enables it.
  • Quoting: quote any value containing spaces or #.
  • A legacy flat key = value format is also accepted; blocks are translated to flat keys internally, so the two are exactly equivalent.

Structural blocks (server, listen, tls, cloak, brand, oper, opertype, class, link, webirc, motd, opermotd) map their fields to specific keys. Grouping blocks (limits, timeouts, flood, connections, channels, users, opers, logging, modules, dns, antiabuse, restrictions, accounts, verification, reputation, securitygroups, websocket, sts, services, dnsbl, …) are cosmetic — each field inside is simply a flat key, so you could equally place it at top level.

Password fields accept plaintext, sha256:<hex>, pbkdf2:…, or a bcrypt $2b$ hash. Generate one with printf '%s' 'pw' | ./echoircd mkpasswd.

server#

Server identity (not repeatable).

FieldDescription
nameThis server's unique name on the network
networkNetwork name shown to clients
sid3-char server ID for S2S (a digit + two alphanumerics)
description (desc)Shown in LINKS / WHOIS 312
pidfilePID file so echoircd rehash / kill -HUP can find the process (omit to disable)

listen#

A bound socket. Repeatable. ip "*" / "[::]" binds IPv4+IPv6 dual-stack.

FieldDescription
ipBind address (0.0.0.0, [::], *, 127.0.0.1, …)
portBind port
typeclient (default) or server (S2S)
tlsyes = direct-TLS listener
wssyes = WebSocket-over-TLS (browser clients)
wsyes = plaintext WebSocket

tls#

TLS certificate (re-read on rehash).

FieldDescription
certPath to the certificate PEM
keyPath to the private-key PEM
backendopenssl (default) or rustls (pure-Rust, no system OpenSSL)
sniPer-host cert "<hostname> <cert-path> <key-path>"repeatable
handshake_timeoutSeconds before a stalled TLS handshake is dropped

brand#

Per-SNI branding — one daemon presenting multiple identities. A client that connected via this TLS SNI host sees this servername/network (welcome burst, ISUPPORT NETWORK=, numeric source) instead of the globals. Needs TLS+SNI. Repeatable.

FieldDescription
hostThe TLS SNI hostname this brand applies to
servernameServer name shown on this host
networkNetwork name shown on this host

motd / opermotd#

Lines of the MOTD (shown on connect) and the oper MOTD (/OPERMOTD). Each quoted line is one entry; repeatable.

oper#

An oper account. Repeatable. A block with neither password nor fingerprint is refused.

FieldDescription
nameOper account name
passwordAuth secret (plaintext / sha256: / pbkdf2: / bcrypt)
fingerprint (fp, certfp)Require this TLS client-cert SHA-256 fingerprint (2FA, or alone)
typeReferences an opertype (role); no type = full access
levelOperlevel (KILL-protection tier)

class#

A reusable capability class that opertypes compose. Repeatable.

FieldDescription
nameClass name
commandsCommands granted (* = all, -TOKEN removes one)
privsPrivileges granted (* = all, -token removes one)
snomasksSnomask letters granted
usermodesOper-only user modes the type may set (letters, or *)
chanmodesOper-only channel modes the type may set (letters, or *)

opertype#

A named oper role (WHOIS "is a <title>"). Repeatable. Ships five: helpop, globop, admin, servadmin, netadmin (only netadmin holds every privilege).

FieldDescription
nameOpertype name (referenced by oper.type)
classesSpace-separated capability classes to compose
modesUser modes auto-applied on oper-up
titleWHOIS title
levelOperlevel for this type

A trusted S2S peer. Repeatable.

FieldDescription
namePeer server name
ipPeer address
portPeer port
passwordShared link secret
autoconnectDial the peer on boot / after a netsplit (no default)
services (uline)Mark the peer as a U-lined services server

services#

The linked server that handles SASL (client AUTHENTICATE is relayed to it). Unset = SASL disabled.

FieldDescription
sasl_serverServer name that handles SASL

webirc#

Trusted web gateways (kiwiirc / CGI:IRC) that send WEBIRC with the real client's host+ip. Repeatable.

FieldDescription
passwordShared WEBIRC secret
name (gateway)Gateway name
mask (ipmask)Restrict which source IP may use the password

cloak#

Host cloaking for user mode +x.

FieldDescription
keyLong random hex secret (keep private; changing it re-cloaks everyone)
methodhmac-sha256 (default) / account / fingerprint / staticordered, first match wins
account_prefixPrefix for the account method (default account)
cert_prefixPrefix for the fingerprint method (default cert)
static_host (static)Host shown for the static method

dns#

Reverse-DNS and ident behaviour.

FieldDescription
resolve_hostsReverse-DNS on connect (default yes; no = bare IP)
use_resolved_hostUse a resolved name in the hostmask (default yes)
useidentLook up every client's ident (RFC 1413)
requireidentRefuse clients whose ident can't be confirmed
ident_timeoutSeconds to wait for the ident reply (default 5)

dnsbl#

A DNS blocklist checked on connect. Repeatable.

FieldDescription
dnsblBlocklist zone, or a full per-list string "domain=<zone> name=<label> action=<a> duration=<d> reason=<r>"
dnsbl_actionmark (default) / kill / kline / gline / zline
dnsbl_reasonReason string
dnsbl_durationBan seconds for a *line action (default 86400)

limits#

Advertised in ISUPPORT and enforced.

FieldDefaultDescription
maxnick30Nick length (NICKLEN)
maxchannel50Channels a user may join
maxbans100Ban-list entries per channel
maxinvites100Pending invites per user
modes20Mode changes per MODE line
max_line16384Max bytes per line / recvq
max_sendq1048576Queued output before a slow client is dropped
whowas_maxentries256Historical nick records retained
maxwatch128WATCH entries per user
maxmonitor128MONITOR entries per user
maxsilence32SILENCE entries per user
maxaccept64/ACCEPT (caller-id) entries per user
maxsignore64Server-ignore entries per user
metadata_maxkeys32IRCv3 METADATA keys per target
metadata_maxvalue512METADATA value length
multiline_maxbytes4096draft/multiline max bytes
multiline_maxlines24draft/multiline max lines
chathistory_limit256CHATHISTORY messages kept per conversation
chathistory_maxage604800Max age (s) a client may request
event_playbackyesRecord JOIN/PART/QUIT/NICK/MODE/TOPIC/KICK into history
webpushyesdraft/webpush master switch (RFC 8291/8292)
webpush_away_onlyyesOnly push to away users
webpush_ttl259200Push TTL (s)
dccallow_maxentries20/DCCALLOW entries per user
http_max_concurrent32In-flight outbound HTTP requests (API modules)

webpush_sub, webpush_vapid_file, webpush_database tune the Web Push key/store paths.

timeouts#

FieldDefaultDescription
registration_timeout60Drop clients that never register
ping_frequency90Idle time before a PING is sent
ping_timeout60Then drop if no PONG within this long
slow_command_ms200Snotice when one core event takes ≥ this (0 = off)

flood#

FieldDefaultDescription
flood_messages8Messages per window before dropping (opers exempt)
flood_seconds4The flood window
joinflood_duration60+j default window
nickflood_duration60+F default window
connflood"5 10"Refuse > N connections per S seconds from one IP
blockamsgyesBlock mass /amsg and /ame
blockamsg_delay3Same text to a different target list within N s = block
blockamsg_actionblockblock / kill / gline / kline / zline
blockamsg_duration900Ban seconds for a *line action

connections#

FieldDefaultDescription
conn_waitpongyesHold registration until the client echoes a PING cookie
conn_waitpong_killonbadreplyyesDrop on a wrong pong
conn_waitpong_exempt_localhost4/6yesExempt loopback
connectbanyesZ-line an IP range that opens too many connections
connectban_threshold10Connections from a range before it's banned
connectban_duration21600Ban seconds
connectban_bootwait120Grace after startup (reconnect storm)
connectban_ipv4cidr / connectban_ipv6cidr32 / 128Range width for counting
connectban_exemptNever ban this glob/CIDR (repeatable)
accept_rate / accept_burst0Max new connections/sec per source IP at the accept edge
proxyTrust the PROXY header from these sources (repeatable)

classes#

Per-class connection policy. connectclass is repeatable; each is a single quoted string (first match wins).

Tokens: allow=<mask[,mask]>, deny=yes, parent=<name>, requiressl=yes|trusted, password=<pw>, hash=<algo>, port=<p[,p]>, asn=<n[,n]>, localmax=<n>, globalmax=<n>, limit=<n>, maxchans=<n>, pingfreq=<s>, timeout=<s>, modes=<+modes>, recvq=<bytes>, softsendq=<bytes>, hardsendq=<bytes>, fakelag=no, penaltythreshold=<n>, commandrate=<s>, useident=yes, requireident=yes, resolvehostnames=no, maxconnwarn=yes. connectclass_required yes refuses clients that match no allow class.

sts#

Strict Transport Security. Off unless sts_duration > 0.

FieldDescription
sts_durationSeconds clients should stick to TLS (0 = off)
sts_portThe TLS port to upgrade to
sts_preloadAdvertise preload eligibility

opers#

FieldDefaultDescription
operprefixyesGive every oper a ! prefix (mode y, above owner)
ojoin / ojoin_opyes/OJOIN as network staff, optionally opped
oper_svsloginyesAllow services to SVSLOGIN opers
maphideyesHide LINKS / MAP from non-opers
hideservicesyesHide U-lined services from MAP/LINKS/STATS
hidewhoisyesHide sensitive WHOIS lines from ordinary users

hidewhois_* sub-keys tune exactly which WHOIS lines (server, idle, secure) are hidden and whether opers/self see everything.

channelvis#

Restrict who sees a mode change or list mode, by rank. Repeatable.

FieldDescription
hidemodeHide a mode change below a rank: "<mode> <rank>"
hidelistOnly this rank+ may view a list mode: "<mode> <rank>"

channels#

FieldDescription
announce_channels (chancreate)Snotice opers when a new channel is created
channames_denyForbid these chars in new channel names
permchannels_database+P permanent-channel store path
markread_databasedraft/read-marker store path
restrictchansOnly opers may create channels
restrictchanGlob whitelist ordinary users may create (repeatable)
badchanForbid joining a glob: "<glob> reason=… redirect=… allowopers=yes"
goodchanWhitelist back out of a broad badchan (repeatable)

users#

On-connect behaviour.

FieldDescription
connbannerNOTICE sent at connect (repeatable)
conn_umodes (autoumodes)User modes auto-set on every client
autojoin (conn_join)Channels every client auto-joins (repeatable)
seenicksSnotice opers on every nick change
opermodes (oper_umodes)Extra user modes set on oper-up
operjoinChannels an oper auto-joins on oper-up (repeatable)
vhostSelf-service vhost: "<user> <pass> <host>" (repeatable)

accounts#

Bridges IRCv3 draft/account-registration to an HTTP backend.

FieldDescription
account_registrationMaster switch (default no)
acctregister_registerurl / acctregister_verifyurlREGISTER / VERIFY endpoints
acctregister_apikeySent as X-API-Key
acctregister_autologin / acctregister_beforeconnect / acctregister_emailrequired / acctregister_requiretlsPolicy toggles
acctregister_ratecount / acctregister_ratetimeRate limit per IP

verification#

Anti-bot gates (reCAPTCHA / Cloudflare challenge). Keys: recaptcha, recaptcha_secret, recaptcha_url, recaptcha_issuer, recaptcha_ttl, recaptcha_message, recaptcha_whitelistports (repeatable) — and the matching cloudflare_* set.

antiabuse#

FieldDescription
antirandomScore random-looking nick/ident/realname (drones)
antirandom_threshold / antirandom_checkfull / antirandom_action / antirandom_duration / antirandom_reason / antirandom_showfailedTuning + action
hashident / hashident_keyReplace ident with a stable opaque per-IP token (HMAC key)
locale / locale_dirServer-wide language (en default; fr/es ship); rehash to switch
solvemsgUnvouched users answer one arithmetic question before PMs deliver
antimixedutf8 / amu_threshold / amu_minlen / amu_action / amu_target / amu_reasonBlock look-alike mixed-script spam
badword+G censor word "<find> [replacement]" (repeatable)

restrictions#

FieldDescription
restrictmsgOnly opers/services may be PM'd by ordinary users
disabled_commandsRefuse these commands to ordinary users (repeatable)
restrictcommandPer-command: "<CMD> connectdelay=<s> exemptidentified=yes exempttls=no reason=…"
securelist + securelist_*Delay /LIST for new connections (defeats list-spam bots)
autodrop_commandsSilently drop a pre-registration client that sends any of these (HTTP scanners)

reputation#

Per-address scoring plus the y: score extban.

FieldDescription
reputation_databaseStore path
reputation_minchanmembersOnly bump if in a channel this big
reputation_scorecapMaximum score
reputation_whoisWho sees the score: all / opers / self / none
reputationexpireDecay rule "<score> <age>" (repeatable)

securitygroups#

Named groups usable as an extban (+b g:<name>). securitygroup is repeatable, each a quoted string: "<name> <criteria…>" where criteria include public, tls, insecure, account, unregistered, oper, exclude-oper, bot, webirc, mask=<glob>, exclude=<glob>, scoremin=<n>, scoremax=<n>, asn=<n[,n]>.

logging#

FieldDescription
syslog / syslog_target / syslog_facility / syslog_tagMirror the log stream to syslog (Unix socket or host:port UDP)
log_jsonAppend the log stream to a file as JSONL
snoop_stderrAlso echo server-notices to stderr
metrics_bindOpenMetrics/Prometheus scrape endpoint (bind privately), e.g. "127.0.0.1:9109"
chanlogMirror oper snotices into a channel, optionally filtered by snomask letters (repeatable)

modules#

Extra features toggled here.

FieldDescription
abbreviationA unique command prefix resolves to its command (WHOI→WHOIS)
aliasCommand alias "<ALIAS> <target>", e.g. "NS NickServ" (repeatable)
customprefixReconfigure or add channel-prefix tiers
customtitle/TITLE <name> <pass> grants a WHOIS title (+ optional vhost)
randquoteGreet each connecting user with a random line (repeatable)
showfileServe a text file as its own command: "<CMD> <path>"
filter_engineOper /FILTER pattern engine: glob (default) or regex
geoip_database / geoip_asn_databaseMaxMind .mmdb for country/city and ASN (enables G:/asn= and WHOIS geo)
network_iconAdvertise a network icon (draft/ICON)
relaymsg_separators / relaymsg_ident / relaymsg_hostdraft/relaymsg (/RELAYMSG) for bridges
extjwt_secret / extjwt_duration / extjwt_chunk / extjwt_service/EXTJWT token issuance
filehost_*Advertise a file-upload service + issue upload tokens
dccallow_blockfile / dccallow_blockchatBlock unwanted DCC unless /DCCALLOW +<nick>
http_tls_verifyVerify upstream TLS certs for the HTTP client (API modules)

websocket#

Relevant only with a ws/wss listener.

FieldDefaultDescription
ws_originAllowed Origin globs (repeatable; empty = any)
ws_proxyrangesProxies whose X-Real-IP/XFF we trust (repeatable)
ws_trust_proxynoTrust those headers from ANY peer
ws_allowmissingoriginyesAllow clients that send no Origin
ws_defaultmodetextFrame mode with no subprotocol: text / binary / reject
ws_nativepingyesLiveness via WebSocket pings (else IRC PING)
ws_handshake_timeout10Seconds to complete the HTTP Upgrade
ws_ping_interval60Seconds between keepalive pings
ws_timeout120Drop after this many seconds of silence