Project Archive

Subway

In 2012, I built a web IRC proof of concept to validate that real-time browser chat could preserve context, recover from disconnects, and stay usable under active channel traffic.

What This Proved

  • IRC could feel native in a browser, not like a compromised fallback.
  • Session continuity was possible with persistent history + backlog replay.
  • Plugin hooks and notifications could be layered onto IRC workflows without replacing IRC itself.

Throughout college, my friends and I lived on IRC. It was our group chat before modern group chat. The pain point was constant context loss: switching machines meant losing your scroll position, unread state, and conversation momentum.

I had just discovered , and the idea of shipping real-time behavior directly in the browser felt transformative. Around the same time, Paul Irish posted a challenge to improve web IRC clients. Subway started as a direct response to that challenge.

Over two years of intermittent development, Subway evolved from a proof of concept into a practical daily client: persistent history across sessions, plugin-driven behavior, desktop highlights, and reconnect logic designed to recover work rather than drop it.

Details

Time
2012-2014
Source
Status
Archived

Architecture Proof

A quick architecture pass focused on the two critical questions: how messages moved and how sessions recovered.

System Map

  • Browser UI (Backbone/jQuery) handled channels, unread state, and rendering.
  • Socket.io bridge carried real-time bidirectional events between browser and Node runtime.
  • IRC session layer translated IRC semantics (join/part/topic/message) into browser-safe events.
  • Persistence layer replayed recent history after reconnect or browser restart.
  • Plugin hooks allowed notifications and automation without changing core transport logic.

Lifecycle Sequence

  1. Browser connects to Node bridge via Socket.io.
  2. Bridge binds an IRC session and joins active channels.
  3. Server rehydrates recent message history for continuity.
  4. Incoming IRC events stream to browser and update channel state.
  5. Notification/plugin hooks fire on highlights and alert rules.
  6. On disconnect, session queues/replays missed highlights on resume.

Session Replay

The replay below auto-runs the connect → sync → notify → reconnect flow. Each event includes a provenance badge: sourced, memory, or inferred.

Subway — browser IRC proof of concept, 2012

This replay is a reconstruction of original behavior from the Subway project: socket negotiation, persistent history restore, plugin-driven notifications, and reconnect recovery on a Node.js + Socket.io stack.

Booting
dj@irc.thedjpetersen.com
Topic
Subway PoC: proving IRC can feel native in the browser
04:09 AMsubway-botSourced
connected to irc.thedjpetersen.com over WebSocket transport
04:09 AMsubway-botSourced
restored 42 lines from prior browser session
04:09 AM
ari
Memory
switching laptops without losing scrollback is huge.
04:09 AM
lena
Memory
and unread counts survive refresh now. that never worked in qwebirc.
Pulling history and plugin manifests from storage…

Further Reading

Related architecture writing with the same real-time systems thread.