NexWire logo Open source

NexWire

A native macOS IRC client — multi-server, dense, and keyboard-driven.

Networks live in a source list on the left; channels and private messages are tabs along the bottom, so a dozen conversations stay one keystroke apart. It follows the system light and dark appearance, stores conversations locally so scrollback survives a quit, and keeps credentials in the login Keychain — never in the database.

macOS 14 or later · Swift 6.2 to build · GPL-3.0

A real Mac app, not a port

Modern protocol support underneath, native macOS behaviour on top — system appearance, the Keychain, Notification Center, and the keyboard.

Multi-Server, TLS by Default

Connect to as many networks as you like over TLS, with an opt-in for the self-signed certificates EFnet and IRCnet still use.

Modern IRCv3

message-tags, server-time, multi-prefix, extended-join, away-notify, chghost, echo-message, labeled-responses, batch, setname, standard-replies, and more — negotiated automatically.

SASL Authentication

PLAIN, EXTERNAL, and SCRAM-SHA-256, negotiated to the strongest mechanism the server offers, plus ordinary server passwords.

Tabs and Source List

Networks in a source list, channels and private messages as tabs along the bottom. A dozen conversations stay one keystroke apart.

History That Survives a Quit

Conversations are stored locally in SQLite with full-text search and jump-to-line, plus a “new messages” marker showing where you stopped reading.

CHATHISTORY Replay

A bouncer fills in what was said while you were offline instead of leaving a silent gap. MONITOR powers the notify list.

Full Formatting Support

Colours, bold, italic, underline, strikethrough, monospace, and the hex-colour extension — rendered, and typed with the usual control keys.

Sandboxed Scripting

JavaScript event handlers, custom /commands, timers, and per-script storage. No filesystem, no network, no shell — a script you were sent cannot reach past IRC.

Credentials in the Keychain

Passwords live in the login Keychain, never in the message database — a file that gets backed up, synced, and attached to bug reports.

DCC File Transfer

Sending and receiving, with offers never accepted automatically and an outgoing offer opening a port only while it is outstanding.

Around Fifty Commands

The usual /join, /msg, and /me, plus server queries, /ctcp, services shorthands (/ns, /cs), and operator tools. /raw covers anything missing.

Documentation in the App

Help (⌘?) carries getting started, keyboard shortcuts, the scripting API, and a command reference generated from the parser itself, so it cannot drift.

Four layers, one direction

The lower three layers are a separate package with no UI dependency, so they build and test from the command line without launching an app.

Layer 1

IRCKit

The protocol layer, with no I/O at all. It consumes parsed messages and returns the effects that should follow — which is what lets the whole registration handshake be exercised by replaying a recorded transcript.

Layer 2

IRCTransport

The only place that touches a socket: TLS via Network.framework, line framing, flood-control pacing, reconnection, and wake-from-sleep recovery.

Layer 3

NexWireStore

GRDB-backed persistence for messages and networks, so scrollback and the unread marker survive a quit. Credentials are deliberately absent.

Layer 4

NexWire

The SwiftUI app itself — views, view models, text colour resolution, the JavaScriptCore scripting sandbox, and the in-app documentation.

Get the source

There is no signed binary release yet — notarisation needs a Developer ID certificate. Clone the repository and build it in a couple of commands.

git clone https://github.com/PermanentWaves/NexWire.git
cd NexWire
./build-app.sh release
open .build/NexWire.app

Requires macOS 14 or later · Swift 6.2 to build. The script compiles, assembles the bundle, generates the icon, and code-signs with the App Sandbox and Hardened Runtime enabled.

PermanentWaves/NexWire

Frequently asked questions

Is NexWire free?

Yes. NexWire is open source under the GPL-3.0 license. The source is on GitHub and you can build it yourself.

Where do I download it?

There is no signed binary release yet — notarisation needs a Developer ID certificate. For now, clone the repository and run ./build-app.sh release to produce NexWire.app.

What do I need to build it?

macOS 14 or later and Swift 6.2 (Xcode 26 or the matching toolchain). There is no Xcode project — it builds with Swift Package Manager and a shell script that assembles the bundle.

Where is my data stored?

Messages and networks go in a local SQLite database inside the app’s sandbox container. Passwords are kept in the login Keychain, deliberately absent from the database — a test asserts the network record carries no secret field.

Are scripts safe to run?

Scripts get no filesystem, network, or shell access, and a handler that overruns its time budget is interrupted and eventually unloaded. Holding Shift while launching skips all scripts for that launch.

Does it support DCC chat?

No, and it is not planned. DCC file transfer — sending and receiving — is supported.