IRC services for InspIRCd networks, written in Rust. NickServ, ChanServ, and a dozen more, backed by an append-only event log instead of a database. https://echo.dev.tronic.pro
Find a file
Jean 30e91bb295
All checks were successful
CI / check (push) Successful in 3m46s
MemoServ SENDALL + ChanServ AKICK CLEAR
SENDALL (admin) leaves a memo on every registered account for a
network-wide announcement that persists until read. AKICK CLEAR empties a
channel's auto-kick list in one command.
2026-07-15 18:32:46 +00:00
.forgejo/workflows CI: install cmake for aws-lc-sys (rustls crypto backend) 2026-07-15 00:12:57 +00:00
api NickServ: add UPDATE and LIST 2026-07-15 18:24:52 +00:00
modules MemoServ SENDALL + ChanServ AKICK CLEAR 2026-07-15 18:32:46 +00:00
proto Rename the project to Echo (was fedserv) 2026-07-14 15:24:41 +00:00
scripts Harden for production: fsync writes, deployment + backup tooling 2026-07-15 11:45:50 +00:00
src MemoServ SENDALL + ChanServ AKICK CLEAR 2026-07-15 18:32:46 +00:00
testing Add SASL SCRAM-SHA-256 and SCRAM-SHA-512 2026-07-12 03:59:24 +00:00
.gitignore chanserv: op, deop, voice, devoice, kick, ban, unban 2026-07-12 11:21:35 +00:00
build.rs Vendor protoc so the build needs no system protobuf compiler 2026-07-15 00:11:26 +00:00
Cargo.lock Make the SCRAM verifier the sole password credential; finish the account-registration relay 2026-07-15 15:47:41 +00:00
Cargo.toml Make the SCRAM verifier the sole password credential; finish the account-registration relay 2026-07-15 15:47:41 +00:00
config.example.toml Rename the project to Echo (was fedserv) 2026-07-14 15:24:41 +00:00
LICENSE License (AGPL-3.0) and graceful shutdown 2026-07-15 12:05:39 +00:00
README.md Harden for production: fsync writes, deployment + backup tooling 2026-07-15 11:45:50 +00:00

Echo

A federated IRC services daemon, written in Rust.

Echo runs the services side of an IRC network, the accounts, channels, and operator tooling, as a set of pseudo-clients (NickServ, ChanServ, and the rest) linked to an ircd over its server-to-server protocol. State is an append-only event log folded into memory, and that log gossips between nodes, so several Echo instances on different servers share one account and channel database with no central store.

Clean-room work, informed by the ideas behind modern event-log and gossip services, not derived from any project's source.

Highlights

  • Federated. Every change is an event; nodes exchange logs and converge. Account identity is global across the network, while channel state stays with the node that owns it.
  • Event-sourced. State is a fold over an append-only log. Restart replays it, compaction folds it, replication ships it, all through one code path.
  • Modular. The core is one crate. Each service and each ircd protocol is a separate crate depending only on the echo-api SDK, so a new service or a new ircd is one new crate.
  • Memory-safe. No manual memory management and no data races, in a domain that has historically shipped both.

Quick start

git clone https://git.devtronic.pro/fedserv/echo.git
cd echo
cp config.example.toml config.toml   # set the uplink host and link password
cargo run --release -- config.toml

Echo links to an InspIRCd uplink out of the box. Point config.toml at your ircd's server port and add a matching <link> block on the ircd side. The full reference is on the Configuration page.

Services

Every service is a first-class pseudo-client, all started by default.

Service Role
NickServ account registration, identification, grouped nicks, SASL
ChanServ channel registration, access lists, mode-lock, auto-op
BotServ per-channel bots, fantasy commands, kickers
HostServ virtual hosts, self-serve and operator-approved
MemoServ messages to accounts, delivered online or not
OperServ akills, DEFCON, jupes, session limits, log search
StatServ network and channel statistics
GroupServ account groups whose members inherit channel access
ChanFix reop an opless channel from accumulated op-time
HelpServ a help-desk ticket queue for operators
InfoServ network bulletins shown on connect and login
ReportServ user abuse reports feeding the operator audit trail
DiceServ dice and math for tabletop games

Architecture

Three layers, each a clean boundary:

  • Protocol turns raw server-to-server lines into a normalized event and action vocabulary. The engine never sees a raw line, so supporting another ircd is one new crate.
  • Engine holds the live network view and the event-sourced store, and routes messages to services. Services reach it only through the Store and NetView traits, keeping the log, gossip, and credential material out of a module's reach.
  • Services are pseudo-clients, one crate each, implementing a single Service trait.

The full write-up is in the wiki: Architecture and Federation.

Documentation

The wiki has the detail:

  • Architecture — the engine, the store, the module boundary
  • Federation — gossip, the global/local scope model, conflict resolution
  • Services — every service and its commands
  • Configuration — the config.toml reference
  • Directory API — the gRPC account and channel directory for websites
  • Writing a Module — build your own service or ircd link
  • Deployment — running Echo in production: install, durability, backups

Status

Echo links to a live InspIRCd uplink and runs the full service suite over an event-sourced, gossip-replicated store. It supports SASL (PLAIN, SCRAM-SHA-256/512, EXTERNAL), an optional mutually-authenticated TLS peer link, an email subsystem for registration confirmation and password recovery, and a gRPC directory API for websites to mirror accounts and channels. It is verified against a real ircd with the irctest compliance suite.

License

Not yet declared. This is original, clean-room work; a license will be set before any public release.