After reviewing and testing many different chat solutions the clear winner (at least for my taste) is IRC. More precisely via those softwares:
How to chat in 2019? Certainly with slack, or via a social media app in the browser or mobile phone app.
How geeks should chat in 2019?
This post is about my opinion on the subject after having tried many different chat solutions1. Here is a list of the features I think a modern solution should have:
I am quite disappointed by modern chat applications.
Their major problems are:
Finally, IRC + ZNC with replay module is the winner. It was the easiest and best solution.
Here is how to have a great private self-hosted IRC server to share with a small group of people.
If this appear to be too much work for you, you should simply use a service that host a znc bouncer for you (I found some apparently free services doing that) and find an IRC server allowing you to create some private channel.
You might use an external IRC server. But it is a lot safer to self-host it.
Self-hosting might not be easy if you are not familiar about how to do that.
I couldn't find a nice resource to link to with all those details. This is certainly a call to write such an article myself.
This is how I create new reverse proxies with nginx using a template: reverse-proxy-template.m4.
That I use with the following script: new-reverse-proxy.sh
#!/usr/bin/env zsh
(($#<3)) && {
print "usage: $0:t SUB DOMAIN PORT"
exit 1
} >&2
SUB="$1"
DOMAIN="$2"
PORT="$3"
m4 -D SUB=$SUB -D DOMAIN=$DOMAIN -D PORT=$PORT reverse-proxy-template.m4 > $SUB.$DOMAIN
The script will generate a reverse proxy nginx conf that I put in /etc/nginx/sites-available/
and I link it in /etc/nginx/sites-enabled
.
There are multiple IRC server. I gave my preference to ngircd because it appeared lightweight, easy to install and configure.
So use your preferred package manager to install it:
sudo apt-get install ngircd
Configure the /etc/ngircd/ngircd.conf
file. I only show the really interesting lines for a private small IRC for a team.
[Global]
Name = irc.your.domain
Info = My Incredible IRC
Password = privateIRCSecretPassword
[Options]
# prevent channel creation
AllowedChannelTypes =
[SSL]
Certfile = /etc/letsencrypt/live/your.domain/fullchain.pem
Keyfile = /etc/letsencrypt/live/your.domain/privkey.pem
Ports = 6667,9999
[Channel]
# predefined channel
Name = #general
Topic = Main team channel
MaxUsers = 23
[Channel]
Name = #status
Topic = Status update channel
MaxUsers = 23
Install ZNC from sources or via your package manager. I choose sources. Choose the latest version if you can.
> wget https://znc.in/releases/archive/znc-1.7.5.tar.gz
> tar xzf znc-1.7.5.tar.gz
> cd znc-1.7.5
> mkdir build
> cd build
> make
> make install
Then create your config file for example via:
> znc --makeconf
For the question, keep buffers after replay, you should certainly answer yes. To use znc web interface behind an nginx reverse proxy:
<Listener listener0>
AllowIRC = false
AllowWeb = true
Host = localhost
IPv4 = true
IPv6 = false
Port = 10001
SSL = false
URIPrefix = /
</Listener>
<Listener listener1>
AllowIRC = true
AllowWeb = false
IPv4 = true
IPv6 = true
Port = 10002
SSL = true
URIPrefix = /
</Listener>
Now you can put your ZNC behind a reverse proxy.
In order not to miss any message in your clients you should keep a bouncer running for you that will keep all IRC messages. But in order to sync this history correctly among all your different IRC clients you should install the playback module. And if you wish to receive push notification you should also add a module for your application (in my case palaver).
In order not to miss any messages in all your clients you should add this ZNC playback module.
> cd ~/.znc/modules
> wget https://raw.githubusercontent.com/jpnurmi/znc-playback/master/playback.cpp
> znc-buildmod playback.cpp
Should create a playback.so
in ~/.znc/modules
.
You should find the ZNC push palaver module here:
https://github.com/cocodelabs/znc-palaver
> git clone https://github.com/cocodelabs/znc-palaver znc-palaver
> cd znc-palaver
> znc-buildmod palaver.cpp
> cp palaver.so ~/.znc/modules/
Now you should be able to reach znc.my.domain
. You should see something like
Login with your admin user (set during the configuration or znc). Then go to your Global settings
And if you scroll down you should see a list of modules. Select the playback and palaver modules and save your preferences.
Then under the global settings, go to your User settings and scroll down to see the Flags:
Take care to unselect the "Auto Clear Chan Buffer", "Auto Clear Query Buffer" and to select "Multi Clients". If you forget to do that, the playback plugin will not work as expected.
Finally add your IRC server to via the Network block (in your User Settings):
From now on, you should always appear as a connected user to your IRC server. This is your ZNC bouncer reading all the messages for you even when you are not here.
Weechat the IRC client I use the most. It is terminal based, use very few resources, it is fast, dense and very nice to use.
add the weechat znc playback script
in weechat, set server capabilities
/set irc.server_default.capabilities "account-notify,away-notify,cap-notify,multi-prefix,server-time,znc.in/server-time-iso,znc.in/self-message,znc.in/playback
add your server
/server add zncnetwork znc.my.domain/6697 -ssl -username=username/zncnetwork -password=password -autoconnect
/connect zncnetwork
save your confi with /save
More details here: https://wiki.znc.in/Weechat
Here are the infos for installing it.
https://thelounge.chat/docs/install-and-upgrade
You can use my reverse proxy scripts to put the lounge behind a reverse proxy from your host. So you'll be able to reach thelounge.my.domain
. Of course, connect the lounge via ZNC not directly to your IRC server.
Using palaver should be straightfoward. There is a very clear ZNC configuration choice.
Here is its website: https://palaverapp.com
I previously used the app mutter, but it stopped to work after the iOS 13 update.
Quite often you want to share images/files in your chat. Instead of using a public channel, I preferred to create a minimalist (223 lines of haskell) private server for this purpose only.
It is highly inspired from the image uploader example of the Yesod web framework. It is a single self-executable file + one css and jquery. The only dependency is stack.
So to install it:
git clone https://gitlab.esy.fun/yogsototh/ymgur .