The single biggest complaint about IRC from people who use modern chat platforms is this: "When I close my client, I miss everything." It's a fair criticism. IRC was designed in 1988 for a world where your terminal was always on and connected. The idea that someone might want to read messages sent while they were offline simply wasn't part of the original design.
ZNC solves this. It's an IRC bouncer — a proxy that stays connected to IRC on your behalf, records what happens while you're away, and plays it back when you reconnect. I've been running ZNC since 2009, and at this point, I consider it as essential as the IRC client itself.
What Is a Bouncer?
An IRC bouncer (BNC) is a middleman between your IRC client and the IRC server. Instead of connecting directly to the IRC network, your client connects to the bouncer, and the bouncer connects to the network. The bouncer maintains a permanent connection, even when your client disconnects.
Without bouncer:
[Your Client] ←→ [IRC Server]
Client disconnects → You're gone. Messages lost.
With bouncer:
[Your Client] ←→ [ZNC Bouncer] ←→ [IRC Server]
Client disconnects → ZNC stays connected. Buffers messages.
Client reconnects → ZNC plays back buffered messages.
The bouncer also presents a consistent identity to the IRC network — same nickname, same hostmask, same connection. From the network's perspective, you never disconnect. This means you maintain channel operator status, your away status persists, and other users see you as permanently online.
Why ZNC?
ZNC isn't the only IRC bouncer — there's also soju, pounce, and others. But ZNC has the largest user base, the most modules, the best documentation, and the longest track record. It's been actively developed since 2004 and handles edge cases that newer bouncers haven't encountered yet.
Key features:
- Multi-network support — connect to EFnet, Libera.Chat, and your private server simultaneously through one ZNC instance
- Multi-client support — connect from your desktop, laptop, and phone at the same time
- Module system — extend functionality with C++, Python, or Perl modules
- Web interface — configure everything through a browser if you prefer
- SASL support — authenticate to networks that require it
- Playback buffer — configurable message history per channel and per query
Installation
On Debian/Ubuntu:
sudo apt install znc znc-dev # znc-dev needed if you want to compile modules
On CentOS/RHEL:
sudo dnf install znc znc-devel
From source (for the latest version):
wget https://znc.in/releases/znc-1.9.1.tar.gz
tar xzf znc-1.9.1.tar.gz
cd znc-1.9.1
./configure --prefix=$HOME/znc
make
make install
Create a dedicated user:
sudo useradd -m -s /bin/bash znc
sudo su - znc
Initial Configuration
Run the first-time configuration wizard:
znc --makeconf
The wizard walks you through the essential settings. Key decisions:
- Listen port: Pick something above 1024 (e.g., 6501). This is the port your IRC client will connect to.
- TLS: Yes. Generate a self-signed certificate or use Let's Encrypt. Your client-to-ZNC connection should always be encrypted.
- Admin username: This will be your ZNC account name.
- IRC network: Configure at least one network (e.g., Libera.Chat at irc.libera.chat:6697 with TLS).
- Channels: List the channels you want to auto-join.
After the wizard, your config file lives at ~/.znc/configs/znc.conf. You can edit it directly, but the web interface (accessible at https://your-server:listen-port) is often easier for ongoing changes.
Multi-Network Setup
ZNC handles multiple IRC networks elegantly. Each network is a separate section in your config with its own servers, channels, and settings:
<User marco>
<Network liberachat>
Server = irc.libera.chat +6697
<Chan #linux>
</Chan>
<Chan #python>
</Chan>
</Network>
<Network efnet>
Server = irc.efnet.org +6697
<Chan #networking>
</Chan>
</Network>
<Network private>
Server = irc.myserver.com +6697
<Chan #staff>
</Chan>
</Network>
</User>
To connect to a specific network from your client, append the network name to your username when connecting: marco/liberachat, marco/efnet, etc. Or connect without a network suffix to get all networks through a single connection (if your client supports it).
Essential Modules
ZNC's power comes from its modules. Here are the ones I run on every installation:
chansaver: Automatically saves your channel list so you rejoin everything after a ZNC restart.
controlpanel: Manage ZNC settings from within IRC using commands like /msg *controlpanel help.
log: Logs all messages to disk. Essential for searchable history that persists beyond the playback buffer.
nickserv: Automatically authenticates with NickServ when connecting to a network. Configure with /msg *nickserv set password YourNickServPassword.
sasl: SASL authentication for networks that support it (Libera.Chat, OFTC). More reliable than NickServ-based authentication.
playback: Enhanced playback module that tracks what each client has already seen. If you read messages on your phone, they won't replay on your desktop. This is the module that makes multi-client ZNC actually usable.
clientbuffer: Similar to playback — gives each connected client its own buffer, preventing duplicate message playback.
route_replies: Routes server replies to the correct client when multiple clients are connected. Without this, a WHOIS reply might go to your phone when you typed the command on your desktop.
Load modules either in the web interface or via IRC:
/msg *status loadmod chansaver
/msg *status loadmod log
/msg *status loadmod sasl
Playback and History
ZNC's buffer settings control how much history is kept per channel:
# In znc.conf or via web interface:
Buffer = 500 # Lines per channel buffer
AutoClearChanBuffer = false # Don't clear buffer on client connect
# (let playback module handle it)
Setting AutoClearChanBuffer = false combined with the playback or clientbuffer module is the recommended configuration for multi-device usage. The module tracks which client has seen which messages, so each device gets exactly the messages it missed — no more, no less.
For permanent, searchable history, use the log module. It writes logs to ~/.znc/moddata/log/ in a format that's easy to grep:
grep -r "kernel panic" ~/.znc/moddata/log/liberachat/#linux/
Client Configuration
Configuring your IRC client to connect through ZNC instead of directly to an IRC network:
WeeChat:
/server add znc-libera your.znc.server.com/6501 -ssl -username=marco/liberachat -password=YourZNCPassword
/connect znc-libera
irssi:
/network add ZNC-Libera
/server add -auto -tls -network ZNC-Libera your.znc.server.com 6501 marco/liberachat:YourZNCPassword
HexChat: Add a new network in the server list. Set the server to your.znc.server.com/6501, enable SSL, and set the password to marco/liberachat:YourZNCPassword.
For mobile clients like Revolution IRC (Android) or Palaver (iOS), the setup is similar — point them at your ZNC server instead of the IRC network directly.
Once configured, the experience is seamless. You open your client, and all the messages you missed are already there, timestamped and in order. It's not quite Slack-level history, but it's close enough to eliminate the "I missed everything" problem that drives people away from IRC.
Frequently Asked Questions
Does ZNC use a lot of resources?
No. A ZNC instance serving one user on 2-3 networks with moderate buffer sizes uses around 20-30 MB of RAM and negligible CPU. Even a cheap VPS can run ZNC for a small group of users without issues.
Can multiple people share one ZNC instance?
Yes. ZNC supports multiple users, each with their own networks, channels, and settings. The admin user can add and manage other users. This is common in hackerspaces and friend groups — one person runs ZNC on a server, and several people use it.
What's the difference between ZNC and soju?
soju is a newer bouncer that implements the IRCv3 chathistory extension natively, making it more transparent to modern clients. ZNC has a larger module ecosystem and broader client compatibility. soju is simpler and more focused; ZNC is more feature-rich but more complex. For most users in 2026, either works well.
Can I use ZNC with a free IRC network like Libera.Chat?
Yes. Libera.Chat and most other IRC networks allow bouncer connections. Some networks limit the number of connections per IP, so if multiple ZNC users share a server, you might need to request an IP exemption from the network's staff.
FAQ
What is an IRC bouncer?
A bouncer is a proxy that stays connected to IRC 24/7 on your behalf. When you connect to the bouncer, you see messages and events that occurred while you were away. ZNC is the most popular bouncer.
Does ZNC support multiple networks?
Yes. A single ZNC instance can connect to multiple IRC networks simultaneously, each with its own configuration, nick, and channel list.
Is ZNC hard to set up?
Basic setup takes about 15 minutes. Run znc --makeconf, answer the prompts, and connect your client. Advanced features like the webadmin module, playback, and clientbuffer modules take more time to configure.