Cascade IRC Client
A fast, native desktop IRC client built with Go and Wails.
Cascade started as a scratch-your-own-itch project: I couldn't find a free, well-maintained IRC client that didn't require managing a YAML file or paying a subscription. It's built on Wails with a Go backend and a React/ShadCN UI, and has solid IRCv3 coverage — SASL/SCRAM auth, server-time, echo-message, message-tags, chathistory, rate limiting, and TLS.
The part I'm most invested in is the plugin system: plugins are separate binaries that communicate over IPC, so they're language-agnostic and can be enabled or disabled without restarting the client. It currently ships with plugins for tab completion and per-user nickname colors, with more planned.
Added reply/channel-context threading (storage, tag-aware send, compose and display), opt-in link-unfurl previews, send/receive invites, clickable channel and nick mentions, and a cross-network activity inbox that absorbs invites.
Rebranded with a new app icon, virtualized the message list onto an ordered event bus for smoother scrollback, fixed lingering presence-dot bugs, and hardened credential storage with keychain-backed secrets and a raw-send CRLF guard.
Fixed NOTICE/PM routing, reconnect and nick-collision handling, then hardened the connection itself with a half-open socket watchdog, force-close on system wake, SASL completing before registration, and fixes for CAP REQ flood churn and a plugin IPC deadlock.
Added STS, multi-prefix, cap-notify, CHATHISTORY, typing indicators, bot mode (+B), and the remaining ratified caps (extended-monitor, no-implicit-names, UTF8ONLY, account-extban), plus several rounds of spec-compliance fixes — error numerics, ISUPPORT-driven CHANTYPES/CASEMAPPING, /who, and message splitting.
Shipped an in-app updater with prerelease-channel support, added cross-platform builds for Windows and Linux (amd64/arm64) alongside macOS, fixed release-pipeline bugs (bundle versioning, arm64 toolchains), and launched a public docs site.
Shipped a scripting system for user scripts: a typed event context (self, account, network, message ID, time, action, highlight state), with the SDK pin reconciled against the app automatically at startup.
Built the language-agnostic plugin system over IPC (tab completion, per-user nickname colors), then restructured the app around Zustand state management with real test infrastructure and CI.