Try it: evilnet.github.io/seance
— the latest build of develop, straight from GitHub Pages
Traditional Web based IRC clients (TheLounge, KiwiIRC etc) require you to host a service somewhere to translate between http requests and IRC. But that era is coming to an end. Modern IRC servers like Nefarious2 have support for web-sockets directly, and chat history, and fast-reconnect. This means Seance can operate without a seperate service.
Seance is a static site: A browser-based IRC client with no server of its own. The page opens a WebSocket directly to a compatable IRC server. It supports modern IRC features:
SASL, message-tags,
server-time, batch, echo-message, labeled-response, draft/chathistory,
draft/read-marker, draft/message-redaction, +typing, STS and more.
- Just files. Build once, drop
public/on any web server (or GitHub Pages), done. No Node process, no database, no accounts on the client side. - Brandable
config.jsoncan set the network name, default server, theme, logo, help links, uploader and feature switches; seedocs/resources/branding.md. - Chat History. Backlog, read markers and catch-up after a
reconnect all come from the ircd's
CHATHISTORYcapability. - Modern chat features. Replies, reactions, editing and deletion, typing indicators, inline media previews, search, mentions, multiple networks.
- Installable. Seance also supports use as a Chrome/Edge/Android PWA
(Progressive Web App) (
docs/resources/pwa.md), and has a framework for being built as an Electron and Capacitor app for desktop and mobile stores (ios/apple/etc) undershells/.
Seance is built primarily and tested for nefarious2 (ircv3.2-upgrade beta
branch), EvilNet's ircd, but any ircd that offers IRC over WebSocket and the
same caps should work, degrading gracefully where a cap is missing. It works on
Nefarious ircd, Unrealircd etc.
Try it out on these networks:
- AfterNET: webirc.afternet.org port 9998 (web+irc://webirc.afternet.org:9998/#seance)
- Swiftirc: fiery.swiftirc.net port 4443 (web+irc://fiery.swiftirc.net:4443/#swiftric)
- Unreal ircd: irc.unrealircd.org port 443 (web+irc://irc.unrealircd.org/#chat)
If you have religious anti-AI beliefs, this project is not for you. The project is built mainly with Claude Code (fable). ("But where are all the apps!")
Driving claude, however, are seasoned IRC veterans who "get it" with regards to classic IRC culture but also strive to expand the IRC experience with modern features normal folks have rightly become used to in apps like Discord and Slack.
Seance began as a fork of The Lounge — The Vuejs user interface, themes and years of polish built the foundation this inherits. Thank you to The Lounge contributors, and to Shout before it. Seance is MIT licensed (like they were).
We are greatful for, and lean heavily on the ircv3 project which has been working for a very long time on some of these expanded IRC capabilities and extensions to the IRC protocol. But we also feel their incentives and taste differ from our own, so we embrace our own path in some areas choosing to create alternative CAPs or modify the implementation to suit us.
Requires Node.js 22 or newer and Yarn 1 (classic), which
ships with Node's corepack.
git clone https://github.com/evilnet/seance.git
cd seance
corepack yarn install
NODE_ENV=production corepack yarn buildThat produces public/. Serve it from any static host:
python3 -m http.server -d public 8000and open http://localhost:8000/. Brand it by editing client/config.json
before the build (or public/config.json after — runtime settings are read
from there on every page load).
The IRC server has to accept WebSocket connections from the page's origin over
wss:// (a browser will not open a plain ws:// socket from an https://
page). Running nefarious2 for local development, including a Docker script
with a self-signed certificate, is described in
docs/resources/nefarious2-dev.md.
corepack yarn watch # rebuild public/ on change
corepack yarn lint # eslint + prettier + stylelint
corepack yarn test # lint + mocha
corepack yarn test:mocha # mocha only (builds first)Run corepack yarn githooks-install once to get the pre-commit lint hook. If
linting fails, corepack yarn format:prettier usually fixes it.
Live tests against a real ircd (test/irc/*.live.ts) run when
SEANCE_IRC_URL points at one, e.g. SEANCE_IRC_URL=wss://localhost:8443/.
Where things live:
client/js/irc/— the IRC layer: WebSocket transport, parser, CAP/SASL, one handler per command, one file per slash command.client/components/,client/js/— the Vue 3 app.docs/— design notes and plans:bus-contract.md(the events between the IRC layer and the UI),nefarious2-websocket.md(what the server actually does on the wire), anddocs/projects/for in-progress work.tools/— the dev ircd runner, a WebSocket IRC probe and a PWA installability check.attic/— the original server code, kept for reference only.
See CLAUDE.md for a fuller map of the codebase and its
conventions.
Usable as a daily client against nefarious2; branding, PWA, and Electron
packaging are in place, mobile shells are scaffolded. Push notifications
work on chrome/PWA but not yet in the app frameworks (it needs the
ircd's draft/webpush to send). The original plan and its checklist are in
docs/projects/initial_conversion.md.