redesign: light project site + live network status from a lusers probe

This commit is contained in:
Jean Chevronnet 2026-08-30 18:54:22 +00:00
parent 182f14a7f2
commit d1ec6962dd
No known key found for this signature in database
GPG key ID: 439666D63A9477E4
10 changed files with 473 additions and 282 deletions

View file

@ -3,67 +3,60 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="dark">
<title>{% block title %}echoIRCd{% endblock %}</title>
<meta name="description" content="echoIRCd — an IRC network written from scratch in Rust. Full IRCv3, modern TLS, native services.">
<title>{% block title %}echoIRCd — a from-scratch IRC server in Rust{% endblock %}</title>
<meta name="description" content="echoIRCd is a modern IRC daemon and services suite, written from scratch in Rust — full IRCv3, modern TLS, SASL.">
<meta property="og:title" content="echoIRCd">
<meta property="og:description" content="An IRC network written from scratch in Rust.">
<meta property="og:description" content="A from-scratch IRC server, written in Rust.">
<meta property="og:type" content="website">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<div class="client">
<div class="titlebar">
<span class="conn" title="connected"></span>
<span class="tb-name">echoircd.org</span>
<span class="tb-server">irc.echoircd.org · +6697 · TLS1.3</span>
<header class="topbar">
<div class="bar-in">
<a class="brand" href="/">
<svg class="mark" viewBox="0 0 32 32" aria-hidden="true">
<circle cx="8" cy="16" r="3.1" fill="currentColor"/>
<path d="M14 9.5a9 9 0 0 1 0 13" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/>
<path d="M18.5 5.5a15 15 0 0 1 0 21" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/>
</svg>
<span class="brand-name">echoIRCd</span>
</a>
<nav class="mainnav">
<a href="/"{% if active == "home" %} class="on"{% endif %}>Home</a>
<a href="/features"{% if active == "features" %} class="on"{% endif %}>Features</a>
<a href="/connect"{% if active == "connect" %} class="on"{% endif %}>Connect</a>
<a href="https://orbit.devtronic.pro">Web&nbsp;client</a>
<a href="https://git.devtronic.pro/echo/echoIRCd" class="ext">Source&#8599;</a>
</nav>
</div>
</header>
<nav class="tabs">
<a href="/" class="tab{% if active == "home" %} on{% endif %}">#home</a>
<a href="/features" class="tab{% if active == "features" %} on{% endif %}">#features</a>
<a href="/connect" class="tab{% if active == "connect" %} on{% endif %}">#connect</a>
<a href="https://git.devtronic.pro/echo/echoIRCd" class="tab ext">git&#8599;</a>
</nav>
<main>
{% block content %}{% endblock %}
</main>
<div class="topic"><span class="tp">»</span> {% block topic %}echoIRCd — a native-Rust IRC daemon &amp; services{% endblock %}</div>
<div class="workspace">
<div class="buffer">
{% block buffer %}{% endblock %}
<footer class="site-foot">
<div class="foot-in">
<div class="foot-brand">
<svg class="mark" viewBox="0 0 32 32" aria-hidden="true">
<circle cx="8" cy="16" r="3.1" fill="currentColor"/>
<path d="M14 9.5a9 9 0 0 1 0 13" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/>
<path d="M18.5 5.5a15 15 0 0 1 0 21" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/>
</svg>
<span>echoIRCd</span>
</div>
<aside class="nicklist">
{% block nicklist %}
<div class="nl-head">names · 9</div>
<ul class="nl">
<li><span class="s n-amber">~</span><span class="n-amber">echoircd</span></li>
<li><span class="s n-green">@</span><span class="n-green">NickServ</span><span class="bf">B</span></li>
<li><span class="s n-blue">@</span><span class="n-blue">ChanServ</span><span class="bf">B</span></li>
<li><span class="s n-magenta">@</span><span class="n-magenta">OperServ</span><span class="bf">B</span></li>
<li><span class="s n-cyan">@</span><span class="n-cyan">MemoServ</span><span class="bf">B</span></li>
<li><span class="s n-blue">+</span><span>TLS1.3</span></li>
<li><span class="s n-blue">+</span><span>IRCv3</span></li>
<li><span class="s n-blue">+</span><span>SASL</span></li>
<li><span class="s dim">·</span><span class="dim">you</span></li>
</ul>
{% endblock %}
</aside>
<p class="foot-tag">A native-Rust IRC daemon &amp; services. No forks, no C, no <code>unsafe</code>.</p>
<nav class="foot-links">
<a href="https://git.devtronic.pro/echo/echoIRCd">echoIRCd</a>
<a href="https://git.devtronic.pro/echo/echo">services</a>
<a href="https://git.devtronic.pro/echo/website">website</a>
<a href="https://orbit.devtronic.pro">web client</a>
</nav>
</div>
<div class="inputbar">
<span class="ib-ch">[{% block chan %}#home{% endblock %}]</span>
<span class="ib-prompt"></span>
<span class="ib-text">{% block cmd %}/connect{% endblock %}</span><span class="cur"></span>
</div>
<div class="statusbar">
<span class="sb-l">echoIRCd 5.0.0</span>
<span class="sb-m">#![forbid(unsafe_code)]</span>
<span class="sb-r"><a href="https://git.devtronic.pro/echo/echo">services</a> · <a href="https://git.devtronic.pro/echo/website">website</a></span>
</div>
</div>
</footer>
</body>
</html>

View file

@ -1,54 +1,55 @@
{% extends "base.html" %}
{% block title %}#connect — echoIRCd{% endblock %}
{% block topic %}#connect — point any client at irc.echoircd.org, or use the browser{% endblock %}
{% block chan %}#connect{% endblock %}
{% block cmd %}/server irc.echoircd.org +6697{% endblock %}
{% block buffer %}
<div class="ln"><span class="t">19:33</span><span class="g n-cyan">&lt;you&gt;</span><span class="m">/server irc.echoircd.org +6697</span></div>
<div class="ln"><span class="t">19:33</span><span class="g dim">-!-</span><span class="m dim">connecting to irc.echoircd.org:6697 … TLS1.3 up (X25519MLKEM768)</span></div>
<div class="ln"><span class="t">19:33</span><span class="g dim">-!-</span><span class="m dim">Welcome to the echoiRCd IRC Network</span></div>
{% block title %}Connect — echoIRCd{% endblock %}
{% block content %}
<section class="pagehead">
<div class="wrap">
<h1>Connect</h1>
<p>Point any IRC client at the network — or open it right in your browser.</p>
</div>
</section>
<table class="detail">
<tr><th>server</th><td>irc.echoircd.org</td></tr>
<tr><th>tls (recommended)</th><td>6697</td></tr>
<tr><th>plaintext</th><td>6667</td></tr>
<tr><th>network</th><td>echoiRCd</td></tr>
</table>
<div class="webchat">
<span class="dim">prefer the browser?</span>
<a class="btn" href="https://orbit.devtronic.pro">open the web client &#8599;</a>
<section class="wrap doc">
<div class="doc-block">
<table class="detail">
<tr><th>Server</th><td><code>irc.echoircd.org</code></td></tr>
<tr><th>TLS (recommended)</th><td><code>6697</code></td></tr>
<tr><th>Plaintext</th><td><code>6667</code></td></tr>
<tr><th>Network</th><td>echoiRCd</td></tr>
</table>
<p class="webchat"><a class="btn btn-ghost" href="https://orbit.devtronic.pro">Open the web client &#8599;</a></p>
</div>
<div class="grp">
<div class="grp-h">client quick-start</div>
<p class="note">most clients take a one-line server string; the leading <span class="kw">+</span> means TLS.</p>
<div class="doc-block">
<h2>Client quick-start</h2>
<p>Most clients take a one-line server string; the leading <code>+</code> on the port means TLS.</p>
<pre class="code">/server irc.echoircd.org +6697
/join #echoircd</pre>
<table class="detail">
<tr><th>HexChat</th><td>add irc.echoircd.org/+6697 · tick “Use SSL”</td></tr>
<tr><th>WeeChat</th><td>/server add echo irc.echoircd.org/6697 -tls</td></tr>
<tr><th>irssi</th><td>/connect -tls irc.echoircd.org 6697</td></tr>
<tr><th>mIRC</th><td>/server irc.echoircd.org +6697</td></tr>
<tr><th>HexChat</th><td>add <code>irc.echoircd.org/+6697</code> · tick “Use SSL”</td></tr>
<tr><th>WeeChat</th><td><code>/server add echo irc.echoircd.org/6697 -tls</code></td></tr>
<tr><th>irssi</th><td><code>/connect -tls irc.echoircd.org 6697</code></td></tr>
<tr><th>mIRC</th><td><code>/server irc.echoircd.org +6697</code></td></tr>
</table>
</div>
<div class="grp">
<div class="grp-h">register your nick</div>
<p class="note">keep your nick, found channels, and log in with SASL.</p>
<div class="doc-block">
<h2>Register your nick</h2>
<p>Registering lets you keep your nickname, found channels, and log in with SASL.</p>
<pre class="code">/msg NickServ REGISTER &lt;password&gt; &lt;email&gt;
/msg NickServ IDENTIFY &lt;password&gt;</pre>
</div>
<div class="grp">
<div class="grp-h">log in with a key (ecdsa)</div>
<p class="note">sign a server challenge with a NIST&nbsp;P-256 key instead of sending a password — nothing secret crosses the wire.</p>
<div class="doc-block">
<h2>Log in with a key (ECDSA)</h2>
<p>Sign a server challenge with a NIST&nbsp;P-256 key instead of sending a password — nothing
secret crosses the wire.</p>
<pre class="code"># generate a key, read its public half
ecdsatool keygen ~/.ecdsa.pem
ecdsatool pubkey ~/.ecdsa.pem
# store it, then pick ECDSA-NIST256P-CHALLENGE for SASL
/msg NickServ SET PUBKEY &lt;printed-public-key&gt;</pre>
<p class="note">point your client's SASL settings at the same key file.</p>
<p class="note">Point your client's SASL settings at the same key file.</p>
</div>
</section>
{% endblock %}

View file

@ -1,66 +1,85 @@
{% extends "base.html" %}
{% 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>
{% block title %}Features — echoIRCd{% endblock %}
{% block content %}
<section class="pagehead">
<div class="wrap">
<h1>Features</h1>
<p>Everything below is original, native Rust. The InspIRCd protocol is a reference for wire
compatibility — never a source of code.</p>
</div>
</section>
<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>
<section class="wrap doc">
<div class="doc-block">
<h2>The daemon</h2>
<ul>
<li><b>Safe by construction</b><code>#![forbid(unsafe_code)]</code> across the tree, enforced in CI.</li>
<li><b>Reactor core</b> — a single core thread with a mio/epoll pool; zero-copy broadcast and parallel channel fan-out.</li>
<li><b>Full mode set</b> — every standard channel and user mode, host cloaking, custom prefixes.</li>
<li><b>Operators</b> — a privilege model: command grants, named privileges, and a per-type mode allow-list.</li>
<li><b>The edge</b> — connection classes, per-class flood/fakelag, RFC&nbsp;1413 ident, PROXY protocol v1/v2.</li>
<li><b>Observability</b> — a metrics endpoint, structured JSON logging, and native syslog.</li>
</ul>
</div>
<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>
<div class="doc-block">
<h2>Transport &amp; TLS</h2>
<ul>
<li><b>6697</b> direct TLS · <b>7799</b> WebSocket (wss) · <b>6667</b> plaintext.</li>
<li>Two interchangeable backends — <b>OpenSSL</b> and <b>rustls</b> — both serving TLS&nbsp;1.3.</li>
<li>With OpenSSL&nbsp;3.5 the handshake negotiates post-quantum <code>X25519MLKEM768</code>.</li>
<li>Per-host <b>SNI</b> certificates, reloaded live on rehash.</li>
</ul>
</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 class="doc-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>
<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>
<div class="doc-block">
<h2>SASL</h2>
<ul>
<li><b>PLAIN</b> — classic username / password.</li>
<li><b>EXTERNAL</b> — authenticate by your TLS client-certificate fingerprint.</li>
<li><b>SCRAM-SHA-256</b> — challenge / response, no password on the wire.</li>
<li><b>ECDSA-NIST256P-CHALLENGE</b> — sign a challenge with a NIST&nbsp;P-256 key; the private key never leaves your client.</li>
</ul>
</div>
<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>
<div class="doc-block">
<h2>Services</h2>
<ul>
<li><b>NickServ</b> — registration, grouped nicks, certificates, public keys, vhosts, profiles.</li>
<li><b>ChanServ</b> — founder/access, auto-op, akick, topic and mode locks.</li>
<li><b>OperServ · MemoServ · more</b> — network administration, offline messaging, and games.</li>
<li><b>Event-sourced</b> store; SASL relayed to services mechanism-agnostically.</li>
</ul>
</div>
<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>
<div class="doc-block">
<h2>Security</h2>
<ul>
<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>
<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>
<section class="ctaband">
<div class="wrap ctaband-in">
<div><h2>Try it</h2><p class="mono-line">irc.echoircd.org · +6697 · TLS 1.3</p></div>
<a class="btn btn-primary" href="/connect">Connect &amp; register</a>
</div>
</section>
{% endblock %}

View file

@ -1,28 +1,68 @@
{% extends "base.html" %}
{% block title %}echoIRCd — a native-Rust IRC network{% endblock %}
{% block topic %}#home — echoIRCd, a native-Rust IRC daemon &amp; services · no fork · no C · no unsafe{% endblock %}
{% block chan %}#home{% endblock %}
{% block cmd %}/connect{% endblock %}
{% block buffer %}
<div class="banner">
<div class="wordmark">echo<span class="w-hi">IRCd</span><span class="cur cur-lg"></span></div>
<div class="w-sub">an IRC network written from scratch in Rust — built, not forked</div>
</div>
{% block title %}echoIRCd — a from-scratch IRC server in Rust{% endblock %}
{% block content %}
<section class="hero">
<div class="hero-in">
<div class="hero-main">
<p class="eyebrow">IRC daemon &amp; services · written in Rust</p>
<h1>The from-scratch<br>IRC server.</h1>
<p class="hero-sub">echoIRCd is a modern IRC daemon and a full services suite, built from the
ground up in Rust — full IRCv3, modern TLS, and SASL. No forks. No C. No <code>unsafe</code>.</p>
<div class="cta">
<a class="btn btn-primary" href="/connect">Connect to the network</a>
<a class="btn btn-ghost" href="/features">See the features</a>
</div>
</div>
<div class="ln"><span class="t">19:28</span><span class="g dim">-!-</span><span class="m dim">Now talking on <b>#home</b></span></div>
<div class="ln"><span class="t">19:28</span><span class="g dim">-!-</span><span class="m dim">echoIRCd/5.0.0 · irc.echoircd.org · network echoiRCd · <span class="ok">+6697 TLS1.3</span></span></div>
<div class="ln"><span class="t">19:28</span><span class="g n-green">--&gt;</span><span class="m dim">you (~guest@echoircd.org) has joined <b>#home</b></span></div>
<div class="ln"><span class="t">19:29</span><span class="g n-amber">&lt;echoircd&gt;</span><span class="m">hey — you're looking at an IRC network written from the ground up in Rust.</span></div>
<div class="ln"><span class="t">19:29</span><span class="g n-amber">&lt;echoircd&gt;</span><span class="m">original code: no InspIRCd fork, no C, and <span class="kw">#![forbid(unsafe_code)]</span> across the whole tree.</span></div>
<div class="ln"><span class="t">19:29</span><span class="g n-amber">&lt;echoircd&gt;</span><span class="m">the daemon speaks full IRCv3 and modern TLS; services handle accounts, channels and SASL.</span></div>
<div class="ln"><span class="t">19:30</span><span class="g">*</span><span class="m i">echoircd slides the tabs your way — <b>#features</b> for the tech, <b>#connect</b> to join</span></div>
<div class="ln"><span class="t">19:30</span><span class="g n-cyan">&lt;you&gt;</span><span class="m">nice. how do I get on?</span></div>
<div class="ln"><span class="t">19:30</span><span class="g n-amber">&lt;echoircd&gt;</span><span class="m"><a href="/connect">/connect</a> — or open <a href="https://orbit.devtronic.pro">the web client</a> right in your browser.</span></div>
<div class="quickfacts">
<a class="qf" href="/features"><span class="qf-k">tls</span> 1.3 · post-quantum</a>
<a class="qf" href="/features"><span class="qf-k">ircv3</span> full cap set</a>
<a class="qf" href="/features"><span class="qf-k">sasl</span> incl. ecdsa</a>
<a class="qf" href="/features"><span class="qf-k">unsafe</span> 0 lines</a>
<aside class="statuscard" aria-label="live network status">
<div class="sc-head"><span class="sc-title">network status</span>
{% if status.online %}<span class="dot on" title="online"></span>{% else %}<span class="dot off" title="offline"></span>{% endif %}
</div>
<dl class="sc-rows">
<div><dt>state</dt><dd>{% if status.online %}<b class="live">online</b>{% else %}<b class="down">offline</b>{% endif %}</dd></div>
<div><dt>users</dt><dd>{{ status.users }}</dd></div>
<div><dt>network</dt><dd>echoiRCd</dd></div>
<div><dt>version</dt><dd>echoIRCd {{ status.version }}</dd></div>
<div><dt>tls</dt><dd>1.3 · X25519MLKEM768</dd></div>
</dl>
<div class="sc-foot">live from <code>irc.echoircd.org</code></div>
</aside>
</div>
</section>
<section class="band">
<div class="wrap">
<h2 class="h-center">Why echoIRCd</h2>
<div class="cards">
<div class="fcard"><h3>Safe by construction</h3><p><code>#![forbid(unsafe_code)]</code> across the whole tree, enforced in CI. Original code — not a fork of anything.</p></div>
<div class="fcard"><h3>Full IRCv3</h3><p>server-time, message-tags, account-tag, batch, labeled-response, chathistory, multiline, standard-replies and more.</p></div>
<div class="fcard"><h3>Modern TLS</h3><p>Direct TLS and WebSocket, OpenSSL &amp; rustls backends, TLS&nbsp;1.3 with post-quantum X25519MLKEM768, per-host SNI.</p></div>
<div class="fcard"><h3>SASL, incl. ECDSA</h3><p>PLAIN, EXTERNAL, SCRAM-SHA-256, and ECDSA-NIST256P-CHALLENGE — sign a challenge, no password on the wire.</p></div>
<div class="fcard"><h3>Native services</h3><p>NickServ, ChanServ, OperServ, MemoServ and more over S2S — accounts, channels, vhosts, an event-sourced store.</p></div>
<div class="fcard"><h3>Anti-abuse built in</h3><p>A native security engine: connection &amp; nick-flood detection, behavioral/content heuristics, DEFCON, DNSBL/MX screening.</p></div>
</div>
<p class="h-center more"><a href="/features">Everything that's inside &#8594;</a></p>
</div>
</section>
<section class="wrap latest">
<h2>Latest</h2>
<ul class="news">
<li>
<span class="news-date">Aug 2026</span>
<div><a href="https://git.devtronic.pro/echo/echoIRCd"><b>echoIRCd 5.0</b></a> — SASL <b>ECDSA-NIST256P-CHALLENGE</b>, post-quantum TLS&nbsp;1.3, the operator privilege model, and a native anti-abuse engine.</div>
</li>
<li>
<span class="news-date">Aug 2026</span>
<div><a href="https://git.devtronic.pro/echo/echo"><b>echo services</b></a> — key-based login (<code>SET PUBKEY</code>), event-sourced accounts, and SASL relayed over the server link.</div>
</li>
</ul>
</section>
<section class="ctaband">
<div class="wrap ctaband-in">
<div><h2>Ready to connect?</h2><p class="mono-line">irc.echoircd.org · +6697 · TLS 1.3</p></div>
<a class="btn btn-primary" href="/connect">Get connected</a>
</div>
</section>
{% endblock %}