Uplink app icon
v2026.8.1 · Qt6 / C++ · GPLv3 · 30+ IRCv3 caps

IRC, with everything
the protocol can do today.

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++.

Uplink in Gruvbox Dark theme Uplink in Flexor Dark theme Uplink joined to #kde on Libera Uplink joined to #archlinux on Libera

Native builds for every desk

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 ↗


The modern protocol, fully wired in

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.

Chat history replay

Join a channel and the last 100 messages load via CHATHISTORY, dimmed with their original timestamps. No more joining blind.

Typing indicators

draft/typing shows who's mid-thought as a quiet overlay on the chat. Your own state is sent debounced to avoid spam.

Reactions & replies

React to any message with an emoji via draft/react; reply threading shows ↩ origNick inline. IRC, but it understands context.

Message deletion

draft/message-redaction lets you delete your own messages properly, across every client that supports it.

Account tracking

account-notify, account-tag, extended-join, and WHOX keep NickServ identities visible in real time. Hover any nick to see who's actually there.

Netsplit collapse

Server batch support folds netsplits and netjoins into a single summary line instead of a wall of quits. Your scrollback stays readable.

multi-prefix away-notify server-time message-tags batch chathistory labeled-response draft/typing echo-message chghost draft/react sasl account-notify account-tag extended-join invite-notify setname userhost-in-names draft/message-redaction sts standard-replies draft/multiline draft/metadata-2/-3 cap-notify draft/read-marker no-implicit-names draft/persistence

297 built-in themes. Stop looking.

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.

Uplink in Gruvbox Dark Uplink in Dracula Uplink in Gruvbox Light Uplink in Nord Uplink in Flexor Dark Uplink in Acton Uplink in Zenburn Uplink in Harmonic16 Uplink in Humanoid Light

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 →


Paranoid by default

Security is built into the connection layer, the config file, and the rendering pipeline.

TLS by default, verified

Every connection runs through QSslSocket. Invalid or self-signed certs disconnect immediately. There is no silent bypass.

OS keychain storage

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.

SASL PLAIN + EXTERNAL

Full CAP-flow SASL, including certificate-based EXTERNAL auth with RSA and ECDSA keys. Log in without ever sending a password.

Credential redaction

PASS, OPER, AUTHENTICATE, and NickServ payloads never appear in the raw log or any visible panel.

DoS resistance

Inbound data capped at 64 KB, batches bounded, scrollback block count limited. A hostile server can't eat your RAM.

Link preview privacy

Auto-previews skip loopback, RFC 1918, link-local, and .local addresses. Nobody can make your client probe your LAN.


Your scripts, your commands

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.

/music

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

/weather [city]

Current weather from wttr.in. Pass a city name or leave blank for your IP-detected location.

🌤 Portland: Sunny +88°F 25% humidity

/uptime

System uptime. Works on Linux, macOS, and Windows with no dependencies.

⏱ up 4 hours, 58 minutes

/roll [NdS]

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.


Built by someone who lives in IRC

The details that matter when IRC is open all day, every day.

First-class bouncer support

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.

Channel panes & pop-out windows

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.

Watch list & logging

IRCv3 MONITOR tells you when someone comes online. Per-channel logs land in ~/.config/uplink/logs/, toggleable in Preferences.

DCC file transfer

Active and passive DCC send with live progress, standard ACK protocol, and sanitized filenames that shut down CTCP injection.

Plain-text config

Everything lives in a single config.toml: mode 0600, atomic saves, openable straight from the File menu. Your setup is greppable and versionable.

mIRC formatting & CTCP

Bold, italic, all 16 IRC colors, /ping round-trips, rate-limited CTCP replies. The classics, done right.

Touch-friendly

Kinetic flick-to-scroll on touchscreens and tablets. Chat, sidebar, and nick list all respond to touch with natural momentum.

Profiles, avatars & channel icons

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.

Scrollback that doesn't need the server

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.

Come say hi

/server irc.libera.chat:6697  →  /join #uplinkirc

Uplink ships pointed at its home network. Fire it up and you're one /join away from the people who build and use it.


Up and running in under a minute

Three steps. Everything else is optional; the full guide covers SASL, bouncers, DCC, and more.

① Download & run

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.

② Set your nick

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.

③ You're in

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/uplink/config.toml
[[server]]
name = "LiberaChat"
host = "irc.libera.chat"
port = 6697
ssl = true
nick = "alice" # ← change this
user = "uplink"
realname = "Uplink User"
channels = "#uplinkirc"

Config file location

PlatformPath
Linux / FreeBSD~/.config/uplink/config.toml
macOS~/.config/uplink/config.toml
Windows%USERPROFILE%\.config\uplink\config.toml

Essential slash commands

CommandWhat it does
/join #channelJoin a channel
/partLeave the current channel
/nick newnickChange your nickname
/msg nick textSend a private message
/me actionCTCP action (/me waves)
/whois nickFull user info, lands in active channel
/away messageSet away · /back to return
/ignore nickSuppress a nick · /unignore nick to lift
/server host[:port]Connect to any server on the fly
/disconnectClose the current server
/clearClear the chat buffer
/raw lineSend a raw IRC protocol line
/quit [msg]Disconnect
/helpList all commands

Keyboard shortcuts

KeyAction
TabCycle through nick completions alphabetically
/ Scroll input history
Ctrl+FSearch the chat buffer
Ctrl+Shift+FSearch full logged history
Ctrl+WMinimize to system tray
PgUp / PgDnScroll 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.


Or compile it yourself

CMake + Qt6 is all it takes. FreeBSD users: install qt6-base, qt6-websockets, and cmake from ports or pkg first.

clone & build
git clone https://github.com/noderelay/UplinkIRC.git
cd UplinkIRC
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc) # BSD: -j$(sysctl -n hw.ncpu)
run
./build/Uplink