Have you ever been frustrated with the bloated nature of todays favorite chat applications? I for one prefer the simplicity of a text based chat to all the bells and whistles provided by competitors.

On IRC you can browse thousands of publicly listed chatrooms, many tailored to the exact software or system you happen to be using. While IRC might not be a drop in substitute to more fleshed out teamchat programs, nothing beats hopping into a chat room full of strangers to troubleshoot and discuss whatever the topic of the room may be. Think subreddits, but in real time.

Now currently I’m not in a position where I’m forced to use a proprietary chat software at work. Thusly I have not yet been forced to configure my IRC clients to work with other protocols like Slack or Steam.

If and when I am put into that unfortunate position, you can expect a tutorial on configuring bitlbee!

The IRC Client

To keep consistency in my terminal workflow, I opt to use Weechat, a fast and configurable terminal IRC client.

The configuration for weechat is crazy complex, so I will leave the custom settings for another post. Let’s address the basics. On my left side there is a list of active buffers. A buffer can be a public channel, a PM with another user, or even a window to issue settings and commands.

The networks I am connected to are the farthest to the left, and indented under them are the channels to which I am connected.

If a channel is highlighted pink, it means there has been activity since I last saw it. The buffer I am currently attached to is denoted with the >> before it.

Adding networks

In today’s climate, the go to IRC network is freenode, having by far the most active channels.

I also opt to join the snoonet network, which hosts channels for many popular subreddits.

You can browse thousands of channels here, with topics spanning all hobbies and professions (with a heavy tech slant, seeing as this is IRC after all).

I will quickly break down how to get up and running with freenode and weechat.

/server add freenode chat.freenode.net

/connect freenode

You should be connected to freenode. Now we need to register a nickname.

Change the your nickname to your desired one with this command

/nick <nickname>

Assuming the nick is available, you can register it with

/msg NickServ REGISTER password youremail@example.com

Assuming you are only using IRC on one machine at a time, and only plan on using weechat, you can go ahead and start joining channels with /join #channel.


This wasn’t enough for me. I wanted to be able to access IRC on my phone, and see the history of conversations I had missed, or carry on a conversation if I had to leave the house. These are default features for any modern chat client.

As it stands now, you are only allowed to log in to your nickname from one client at a time, throwing a wrench in the above requirements. Even if I diligently logged in and out of each client anytime I went anywhere, I would be joining the channels without any context of the conversation currently in place.

That’s where an IRC bouncer comes in. A bouncer keeps a constant connection to your favorite networks and channels, allowing you to connect to your bouncer with as many clients as you please.

Not only that, there are a host of additional features such as logging and support for multiple users! The bouncer I am using is ZNC.

Normally, I would reverse proxy my ZNC traffic with Traefik. Unfortunately, Traefik seems to have a real tough time with TCP, and the documentation is just not there yet for me to get this working. Many others I talked to shared my frustrations.

Because of this, I am simply exposing the port on the container and then forwarding the port on my router to the IRC entrypoint.

The docker compose section for ZNC is as follows:

      image: linuxserver/znc
      container_name: znc
         - PUID=1000
         - PGID=1000
         - TZ=Europe/Los_Angeles
         - $HOME/data/programs/docker/znc/config/:/config
         - 4798:4798 # Port bind for IRC only traffic
         - 6501:6501 # Only exposed locally for web admin

I opted to create a second port bind in ZNC, which I expose to the web. This only allows IRC traffic, nobody will mess with the config page.

Here you can see the ZNC settings page, where you can configure users, the networks they belong to, and the channels they should connect to. Scrolling down even further we can see a list of modules, their arguments and their status.

Now we want to connect to our ZNC instance from Weechat! That can be done with the following command:

/server add ZNC-Network <znc address>/<port> -username=user/Network -password=<znc pass> -autoconnect

If you are connected to multiple IRC networks through ZNC, you need to add a separate ZNC connection for every network. For example for freenode, I would do the following:

/server add ZNC-Freenode irc.mydomain.tld/4798 -username=gideon/Freenode -password=<znc pass> -autoconnect

Note the name of the network (defined in ZNC settings) becomes part of the username argument. Different clients will have different ways of Handling this.

If everything works correctly, your client should rapidly connect to all the channels you configured. Grab your favorite mobile IRC client (there is a mobile version of Weechat) and connect to the ZNC! Now you can take all your conversations on the go.


IRC is a super valuable resource for discussing and troubleshooting various topics with knowledgeable people from around the world!

This guide is meant to outline the steps to creating a seamless IRC experience in the 21st century, while keeping what makes IRC special in the first place. In another tutorial I will go into some advanced Weechat configuration to bring out the best of the client!