About HexBot
At its peak in the early 2000s, Internet Relay Chat had millions of daily users spread across networks like EFnet, Undernet, DALnet, and Quakenet — a federated mesh of servers that nobody owned, running a protocol that anyone could implement. Hackers, open-source developers, gamers, and underground communities all operated in real time, in plain text, across thousands of channels. It was the internet’s town square, engine room, and back alley all at once.
Bots were an inevitability. Channels needed protection — flood attacks and takeover attempts were a daily reality on the early net, and human operators couldn’t stay awake forever. So people automated them. A bot could hold ops, enforce channel modes, kick spammers, and reconnect after a netsplit without anyone lifting a finger. From there the use cases multiplied: DCC file servers seeding warez and MP3s to anyone who asked, trivia bots keeping quiet channels alive, seen bots tracking who was last online, dice rollers, quote databases, weather fetchers pulling data from early web APIs. Each bot was a tiny daemon with a specific job, running 24/7 on whatever hardware its author could afford to leave powered on.
The architecture that emerged from that era was surprisingly elegant. An event table. A permission system built on flags. A way to attach handlers to patterns at runtime and detach them without restarting. These ideas proved so sound that every serious IRC bot written since has reinvented some version of them. HexBot is our version — a modular IRC bot for Node.js, written in TypeScript, that takes those same principles and applies them with the tools available today. Hot-reloadable plugins. Type-safe APIs. Docker-ready deployment. The spirit of those 3am channel guardians, running on infrastructure that Oikarinen could never have imagined.
Key Features
Architecture
HexBot uses a two-tier module system. Core modules are always loaded and provide the bot’s foundational services — the IRC bridge, dispatcher, permission engine, channel state, and database. Plugins are isolated, hot-reloadable units that register event binds against the dispatcher and never depend on each other.
Plugins call bind(type, flags, mask, handler) to subscribe to IRC events. The dispatcher matches incoming events against all registered binds, checks permissions, and calls handlers in registration order.