Freeq is a fully compatible IRC server. Any IRC client can connect and use it
normally. But underneath, several things work differently — and if you care
about identity, encryption, or federation, they might matter to you.
Standard IRC has no real concept of identity. You pick a nick, maybe register
it with NickServ, and hope nobody impersonates you on another network.
Freeq uses AT Protocol (the protocol behind Bluesky)
for authentication. Your IRC identity is your DID — the same cryptographic
identifier behind your Bluesky account. When you authenticate:
chadfowler.com).Authentication happens via SASL with a custom mechanism (ATPROTO-CHALLENGE).
The server sends a cryptographic challenge; your client signs it with your
AT Protocol credentials. Your private keys never leave your machine.
You can authenticate with:
- Browser-based OAuth (like logging into any Bluesky app)
- App passwords (for headless/bot use)
- Direct cryptographic signatures (if you manage your own keys)
If you don't authenticate, everything still works — you're just a guest.
In standard IRC, channel ownership is fragile. If everyone leaves, the
channel resets. Ops are granted per-session and disappear on disconnect.
Freeq introduces DID-based channel authority:
Bans work the same way: MODE #channel +b did:plc:abc123 bans an identity,
not a hostmask. No more whack-a-mole with IP changes and nick switches.
Traditional IRC federation (RFC 2813) uses a spanning tree of trusted
servers with a shared, fragile namespace. Netsplits are catastrophic.
Most modern networks just don't federate.
Freeq servers federate over iroh QUIC connections.
Each server is independent and maintains its own state. Channel authority
(founders, DID-based ops, topics) converges using
Automerge CRDTs — no timestamps, no conflicts,
no split-brain.
What syncs across servers:
- Channel messages, membership, topics
- DID-based ops and founder status
- Nick ownership
What stays local:
- TCP connections and sessions
- Rate limiting and connection state
Servers discover each other by iroh endpoint ID (a public key). There's no
DNS, no hub server, no registration process. You point your server at a
peer's endpoint ID and they're linked.
# That's it. Two servers, federated.
freeq-server --iroh
freeq-server --iroh --s2s-peers <other-server-endpoint-id>
IRC has always struggled with NAT. DCC doesn't work. Server linking
requires public IPs and open ports.
Freeq's iroh transport gives you QUIC connections that punch through NAT
automatically, with relay fallback when direct connections aren't possible.
This works for both client↔server and server↔server links.
The server advertises its iroh endpoint in CAP LS. Clients that support
it auto-upgrade — no configuration needed.
Standard IRC messages are plaintext on the server. Always have been.
Freeq supports client-side AES-256-GCM encryption per channel. The server
sees only ciphertext. Everyone in the channel shares a passphrase; key
derivation uses HKDF-SHA256 salted with the channel name.
/encrypt my-secret-passphrase
There's also a DID-based encryption mode where the group key is derived
from the sorted DIDs of channel members — no shared secret needed, and
the key rotates automatically when membership changes.
Want to talk to someone without any server in the middle? Freeq clients
can open direct iroh QUIC connections to each other for encrypted DMs.
/p2p start
/p2p connect <their-endpoint-id>
/p2p msg <id> hello
The server is never involved. Messages don't touch IRC at all. Peer
endpoint IDs are discoverable via WHOIS.
IRC has always been TCP. Freeq speaks IRC over four transports, and you
can mix them freely in the same channel:
| Transport | What it gives you |
|---|---|
| TCP (:6667) | Standard IRC — works with every client ever made |
| TLS (:6697) | Encrypted standard IRC |
| WebSocket | Browser clients, no plugins needed |
| iroh QUIC | NAT traversal, E2E encryption, P2P federation |
All four feed into the same protocol handler. The server doesn't care
how you got there.
When you join a channel, the server replays recent messages as standard
PRIVMSGs. No special client support needed — your existing IRC client
shows them. Clients that negotiate server-time and batch get proper
timestamps and grouping.
History is stored in SQLite and survives restarts.
Freeq uses IRCv3 message tags to carry structured media metadata alongside
plain text. The same message has two representations:
In WeeChat you see a clickable link. In the Freeq TUI you see an inline
media badge. The server never handles media bytes — images and files are
hosted on your AT Protocol PDS (Bluesky's blob storage).
Freeq is still IRC. Specifically:
/me) worksThe goal is to make IRC better without making it something else.