Uplink is a fast, secure, native IRC client with full IRCv3 support: chat history, reactions, typing indicators, message deletion, all in a clean Qt6 interface. No Electron, no web view, just C++.
Pre-built binaries straight from the releases page. One codebase, four platforms, zero web runtime.
All builds are on the releases page ↗ · New? Start with the quick start ↓ or the full how-to guide ↗
IRCv3 is the whole point of this client. Uplink implements more than 30 capabilities and extensions and turns them into features you can actually see.
Join a channel and the last 100 messages load via CHATHISTORY, dimmed with their original timestamps. No more joining blind.
draft/typing shows who's mid-thought as a quiet overlay on the chat. Your own state is sent debounced to avoid spam.
React to any message with an emoji via draft/react; reply threading shows ↩ origNick inline. IRC, but it understands context.
draft/message-redaction lets you delete your own messages properly, across every client that supports it.
account-notify, account-tag, extended-join, and WHOX keep NickServ identities visible in real time. Hover any nick to see who's actually there.
Server batch support folds netsplits and netjoins into a single summary line instead of a wall of quits. Your scrollback stays readable.
57 hand-picked originals plus the entire base16 catalog: Catppuccin, Dracula, Nord, Gruvbox, Tokyo Night, Rosé Pine, Solarized, One Dark, and 289 others. At this point, your favorite is already in here. Browse with arrow keys, apply with Enter. Or let it follow your desktop: Auto mode pairs a day theme with a night theme and switches live when your OS flips its color scheme.
297 more in Preferences → Theme. Per-widget font sizes, hanging indent toggle, and a collapsible sidebar round out the fit-and-finish.
Want your own? Drop a .toml file into ~/.config/uplink/themes/ and it shows up in the list on next launch. Copy any shipped theme as a starting point. Full guide →
Security is built into the connection layer, the config file, and the rendering pipeline.
Every connection runs through QSslSocket. Invalid or self-signed certs disconnect immediately. There is no silent bypass.
Passwords live in Secret Service, macOS Keychain, or Windows Credential Manager. The config file only holds a sentinel, so no plaintext secrets end up on disk.
Full CAP-flow SASL, including certificate-based EXTERNAL auth with RSA and ECDSA keys. Log in without ever sending a password.
PASS, OPER, AUTHENTICATE, and NickServ payloads never appear in the raw log or any visible panel.
Inbound data capped at 64 KB, batches bounded, scrollback block count limited. A hostile server can't eat your RAM.
Auto-previews skip loopback, RFC 1918, link-local, and .local addresses. Nobody can make your client probe your LAN.
Link any executable to a custom slash command. Write scripts in bash, python, ruby, whatever you want. Four scripts ship out of the box, ready to use on first launch.
Show what you're listening to. Uses MPRIS2/D-Bus on Linux, nowplaying-cli on macOS, and Windows media controls via PowerShell.
♫ Now playing: Flesh and Bone — Landon Wilks
Current weather from wttr.in. Pass a city name or leave blank for your IP-detected location.
🌤 Portland: Sunny +88°F 25% humidity
System uptime. Works on Linux, macOS, and Windows with no dependencies.
⏱ up 4 hours, 58 minutes
Tabletop dice roller. /roll 2d6, /roll 1d20, or just /roll for a quick d6.
🎲 2d6: 3 + 5 = 8
Add your own in Preferences → Scripts: set a command name, browse to any executable, done. Scripts receive UPLINK_NICK, UPLINK_SERVER, UPLINK_CHANNEL, and UPLINK_ARGS as environment variables. Deleted a bundled script? Click Restore Defaults to bring it back.
The details that matter when IRC is open all day, every day.
ZNC and soju are native citizens: znc.in/playback, soju.im/bouncer-networks, read markers, and self-message echo all work out of the box.
Open up to four channels at once. Each pane gets its own history, nick list, topic bar, search, and input. Auto-layout from side-by-side to a 2×2 grid, or pop any channel out into its own window.
IRCv3 MONITOR tells you when someone comes online. Per-channel logs land in ~/.config/uplink/logs/, toggleable in Preferences.
Active and passive DCC send with live progress, standard ACK protocol, and sanitized filenames that shut down CTCP injection.
Everything lives in a single config.toml: mode 0600, atomic saves, openable straight from the File menu. Your setup is greppable and versionable.
Bold, italic, all 16 IRC colors, /ping round-trips, rate-limited CTCP replies. The classics, done right.
Kinetic flick-to-scroll on touchscreens and tablets. Chat, sidebar, and nick list all respond to touch with natural momentum.
On servers with draft/metadata, hover a nick for their display name, status text and avatar. Ops give a channel its own icon with /chanavatar and it shows in everyone's sidebar. Both switch off — per server, or images only, since an avatar URL is somebody else's host.
Where the network speaks chathistory, older messages come from it. Where it doesn't — Libera, EFnet, most of IRC — Uplink pages back through its own logs instead, so buffers open with context rather than blank.
Uplink ships pointed at its home network. Fire it up and you're one /join away from the people who build and use it.
Three steps. Everything else is optional; the full guide covers SASL, bouncers, DCC, and more.
Grab the binary for your platform from the download section above. The Linux AppImage runs anywhere: chmod +x Uplink-*.AppImage then run it. No install, no package manager.
First launch connects to Libera.Chat with a placeholder nick. Open File → Open Config, change nick = "yournick" to your actual nick, save, then click File → Reload Config.
Uplink auto-joins #uplinkirc on irc.libera.chat:6697. To add any server: File → Manage Servers. To join a channel: /join #channel.
Minimal config block
Config file location
| Platform | Path |
|---|---|
| Linux / FreeBSD | ~/.config/uplink/config.toml |
| macOS | ~/.config/uplink/config.toml |
| Windows | %USERPROFILE%\.config\uplink\config.toml |
Essential slash commands
| Command | What it does |
|---|---|
/join #channel | Join a channel |
/part | Leave the current channel |
/nick newnick | Change your nickname |
/msg nick text | Send a private message |
/me action | CTCP action (/me waves) |
/whois nick | Full user info, lands in active channel |
/away message | Set away · /back to return |
/ignore nick | Suppress a nick · /unignore nick to lift |
/server host[:port] | Connect to any server on the fly |
/disconnect | Close the current server |
/clear | Clear the chat buffer |
/raw line | Send a raw IRC protocol line |
/quit [msg] | Disconnect |
/help | List all commands |
Keyboard shortcuts
| Key | Action |
|---|---|
| Tab | Cycle through nick completions alphabetically |
| ↑ / ↓ | Scroll input history |
| Ctrl+F | Search the chat buffer |
| Ctrl+Shift+F | Search full logged history |
| Ctrl+W | Minimize to system tray |
| PgUp / PgDn | Scroll chat |
That's the surface. The full how-to guide → covers connecting to any server, SASL PLAIN & EXTERNAL auth, ZNC / soju bouncer setup, chat history, DCC transfers, avatars, themes, and troubleshooting.
CMake + Qt6 is all it takes. FreeBSD users: install qt6-base, qt6-websockets, and cmake from ports or pkg first.