redesign: irc-client / terminal aesthetic — buffer, nicklist, cap-ls grammar

This commit is contained in:
Jean Chevronnet 2026-08-30 18:36:41 +00:00
parent 899040a319
commit 182f14a7f2
No known key found for this signature in database
GPG key ID: 439666D63A9477E4
6 changed files with 264 additions and 321 deletions

View file

@ -1,85 +1,66 @@
{% extends "base.html" %}
{% block title %}Features — echoIRCd{% endblock %}
{% block content %}
<section class="page-head">
<h1>Features</h1>
<p class="lede">Everything below is original, native Rust — the InspIRCd protocol and API are a
reference for wire compatibility, never a source of code.</p>
</section>
{% block title %}#features — echoIRCd{% endblock %}
{% block topic %}#features — what's inside the daemon &amp; services{% endblock %}
{% block chan %}#features{% endblock %}
{% block cmd %}/msg echoircd help{% endblock %}
{% block buffer %}
<div class="ln"><span class="t">19:31</span><span class="g n-cyan">&lt;you&gt;</span><span class="m">/msg echoircd what can you do</span></div>
<div class="ln"><span class="t">19:31</span><span class="g n-amber">&lt;echoircd&gt;</span><span class="m">plenty — here's the short tour. all of it is original, native Rust.</span></div>
<section class="wrap prose">
<div class="block">
<h2>The daemon</h2>
<ul>
<li><strong>Safe by construction</strong><span class="mono">#![forbid(unsafe_code)]</span> across the whole tree, enforced in CI.</li>
<li><strong>Reactor core</strong> — a single core thread with a mio/epoll reactor pool; zero-copy broadcast lines and parallel large-channel fan-out.</li>
<li><strong>Full mode set</strong> — every standard channel and user mode, host cloaking, and custom prefixes.</li>
<li><strong>Operators</strong> — an InspIRCd-style privilege model: command grants, named privileges, and a usermode/chanmode allow-list per oper type.</li>
<li><strong>Edge</strong> — connection classes, per-class flood / fakelag, RFC&nbsp;1413 ident, and PROXY protocol v1/v2 (with TLS TLVs).</li>
<li><strong>Observability</strong> — a metrics endpoint, structured JSON logging, and native syslog.</li>
<div class="grp">
<div class="grp-h">the daemon</div>
<ul class="bul">
<li><b>safe by construction</b><span class="kw">#![forbid(unsafe_code)]</span> across the tree, enforced in CI</li>
<li><b>reactor core</b> — single core thread + mio/epoll pool, zero-copy broadcast, parallel channel fan-out</li>
<li><b>full mode set</b> — every standard channel/user mode, host cloaking, custom prefixes</li>
<li><b>operators</b> — a privilege model: command grants, named privs, per-type mode allow-list</li>
<li><b>the edge</b> — connection classes, per-class flood/fakelag, RFC1413 ident, PROXY v1/v2</li>
<li><b>observability</b> — a metrics endpoint, JSON logging, native syslog</li>
</ul>
</div>
<div class="block">
<h2>Transport &amp; TLS</h2>
<ul>
<li><strong>6697</strong> direct TLS, <strong>7799</strong> WebSocket-over-TLS (wss), <strong>6667</strong> plaintext.</li>
<li>Two interchangeable backends — <strong>OpenSSL</strong> and <strong>rustls</strong> — both serving TLS&nbsp;1.3.</li>
<li>With OpenSSL&nbsp;3.5 the handshake negotiates post-quantum <span class="mono">X25519MLKEM768</span> key exchange.</li>
<li>Per-host <strong>SNI</strong> certificates, reloaded live on rehash.</li>
<div class="grp">
<div class="grp-h">transport &amp; tls</div>
<ul class="bul">
<li><b>6697</b> direct TLS · <b>7799</b> WebSocket (wss) · <b>6667</b> plaintext</li>
<li>two backends — <b>OpenSSL</b> and <b>rustls</b> — both serving TLS 1.3</li>
<li>with OpenSSL 3.5 the handshake negotiates post-quantum <span class="kw">X25519MLKEM768</span></li>
<li>per-host <b>SNI</b> certificates, reloaded live on rehash</li>
</ul>
</div>
<div class="block">
<h2>IRCv3</h2>
<p>Capabilities advertised to clients:</p>
<div class="chips">
<span>server-time</span><span>message-tags</span><span>account-tag</span><span>account-notify</span>
<span>extended-join</span><span>chghost</span><span>multi-prefix</span><span>away-notify</span>
<span>invite-notify</span><span>setname</span><span>echo-message</span><span>userhost-in-names</span>
<span>batch</span><span>labeled-response</span><span>standard-replies</span><span>extended-monitor</span>
<span>draft/chathistory</span><span>draft/event-playback</span><span>draft/message-redaction</span>
<span>draft/multiline</span><span>draft/metadata-2</span><span>draft/read-marker</span>
<span>draft/webpush</span><span>draft/account-registration</span><span>sts</span>
</div>
<div class="grp">
<div class="grp-h">ircv3</div>
<div class="srvline"><span class="g n-amber">&lt;echoircd&gt;</span><span class="capline">CAP * LS :server-time message-tags account-tag account-notify extended-join chghost multi-prefix away-notify invite-notify setname echo-message userhost-in-names batch labeled-response standard-replies extended-monitor draft/chathistory draft/event-playback draft/message-redaction draft/multiline draft/metadata-2 draft/read-marker draft/webpush draft/account-registration sts</span></div>
</div>
<div class="block">
<h2>SASL</h2>
<ul>
<li><strong>PLAIN</strong> — classic username/password.</li>
<li><strong>EXTERNAL</strong> — authenticate by TLS client-certificate fingerprint.</li>
<li><strong>SCRAM-SHA-256</strong> — challenge/response, no password on the wire.</li>
<li><strong>ECDSA-NIST256P-CHALLENGE</strong> — sign a server challenge with a NIST&nbsp;P-256 key; the private key never leaves your client.</li>
<div class="grp">
<div class="grp-h">sasl</div>
<div class="srvline"><span class="g n-amber">&lt;echoircd&gt;</span><span class="capline">sasl=PLAIN,EXTERNAL,SCRAM-SHA-256,ECDSA-NIST256P-CHALLENGE</span></div>
<ul class="bul">
<li><b>EXTERNAL</b> — authenticate by your TLS client-certificate fingerprint</li>
<li><b>SCRAM-SHA-256</b> &amp; <b>ECDSA-NIST256P-CHALLENGE</b> — challenge/response, no secret on the wire</li>
</ul>
</div>
<div class="block">
<h2>Services</h2>
<ul>
<li><strong>NickServ</strong> — registration, grouped nicks, certificates, public keys, vhosts, profile metadata.</li>
<li><strong>ChanServ</strong> — founder/access, auto-op, akick, topic and mode locks.</li>
<li><strong>OperServ / MemoServ / more</strong> — network administration, offline messaging, and games.</li>
<li><strong>Event-sourced</strong> — every change is an appended event, replayed to rebuild state.</li>
<li><strong>SASL over S2S</strong> — the daemon relays mechanisms mechanism-agnostically; the services layer holds the credentials.</li>
<div class="grp">
<div class="grp-h">services</div>
<ul class="bul">
<li><b>NickServ</b> — registration, grouped nicks, certs, public keys, vhosts, profiles</li>
<li><b>ChanServ</b> — founder/access, auto-op, akick, topic &amp; mode locks</li>
<li><b>OperServ · MemoServ · more</b> — network admin, offline messages, games</li>
<li><b>event-sourced</b> store; SASL relayed to services mechanism-agnostically</li>
</ul>
</div>
<div class="block">
<h2>Security</h2>
<ul>
<li>A native anti-abuse engine in the core — not a bolt-on module.</li>
<li>Connection-flood and nick-flood detection, mass-join screening.</li>
<li>Behavioral and content heuristics with computed-pattern mining.</li>
<li>A DEFCON state machine and policy, plus DNSBL / MX-blacklist screening via a native async resolver.</li>
<div class="grp">
<div class="grp-h">security</div>
<ul class="bul">
<li>a native anti-abuse engine in the core — connection/nick-flood and mass-join screening</li>
<li>behavioral and content heuristics with computed-pattern mining</li>
<li>a DEFCON state machine plus DNSBL / MX screening via a native async resolver</li>
</ul>
</div>
</section>
<section class="connect-strip">
<div class="cs-in">
<div><h2>Ready?</h2><p>See how to connect and register.</p></div>
<a class="btn primary" href="/connect">Connect &amp; register</a>
</div>
</section>
<div class="ln"><span class="t">19:32</span><span class="g">*</span><span class="m i">echoircd nods toward <a href="/connect">#connect</a></span></div>
{% endblock %}