A blog on software engineering by Trevor Brown

ZNC on WebFaction Shared Account

IRC is my preferred method of real-time communication. I love being able to spend time on IRC channels. With my schedule continuing to get busier and with less free time in general I’m not able to be on IRC all the time like I used to be. Being offline so much brings out the biggest weakness with IRC itself. Messages that are sent while you are offline are not queued. If someone sends you a message when you aren’t logged in the message will be lost forever. Only by staying logged in are you sure to get all your messages. That’s where bouncers come in. Bouncers stay logged into the IRC server for you and record all the messages you would have otherwise received had you been online. When you log in again the bouncer sends you all the messages you missed while you were away. ZNC is a popular open source bouncer that is easy to install and configure. In this blog post I’ll show how to get it running on a WebFaction hosting account.

Long Live IRC - xkcd comic

I use WebFaction’s shared hosting account. The price is unbeatable and the fact that it’s just a shared account and not a VM means it’s much faster than a VPS with equivalent specs. The best part is that you can install and run any software you want on your account as long as it doesn’t violate the terms of service. WebFaction terms of service allows things like ZNC so it’s the perfect place to install a bouncer. I highly recommend WebFaction. It’s only $10 a month for an account with 100GB of SSD storage, and it gets cheaper if you pay by the year. Here is an affiliate link if you are interested.


First login to your webfaction control panel and navigate to “Domains/Websites” > “Applications” and create a new application. For “App category” choose “Custom”. Give your app a name (I chose znc in this article). Then for “App type” choose “Custom App (listening on port)”. Then check the “Open port” checkbox and click save. You should be taken back to the applications index page. The applications page should show the application you just created along with the port number and IP address. Make a note of the IP and port, you’ll need them next.

SSH into your server and create a directory for the build:

mkdir -p $HOME/znc_build
cd $HOME/znc_build

Then download the ZNC source and extract the files out of the archive:

tar -xzf znc-1.4.tar.gz
cd znc-1.4

I had to use version 1.4 since the compiler on my server didn’t have support for C++11 and ZNC version 1.4 was the last version to not require C++1. Apparently other shared WebFaction servers have support for C++11 so if yours does it would be best to use the latest version of ZNC.

Next configure your ZNC build to run the directory that was created for custom app you created. Mine was $HOME/webapps/znc so I ran:

./configure --prefix=$HOME/webapps/znc/

Next compile:

make && make install

If all goes as expected you should see this message:

 ZNC was successfully installed.
 You can use '.../bin/znc --makeconf'
 to generate a config file.

 If you need help with using ZNC, please visit our wiki at:

Remove the build directory since ZNC is now installed:

cd ~
rm -rf ~/znc_build

Before configuration let’s add the ZNC bin directory to our $PATH so it’s available in the shell. This will make things a lot easier in the long run. With my server the command I ran looked like this:

echo "export PATH=$HOME/webapps/znc/bin:$PATH" >> $HOME/.bashrc
# Then reload the bashrc
source ~/.bashrc


Now we can configure ZNC. First generate the config file:

znc --makeconf

It will prompt you to enter a port number. Enter the port number you saw on the application page when you created the custom application in the WebFaction interface. After entering the port number follow the prompts to select your SSL and IPv settings. Then continue to follow the prompts and select the ZNC modules you want to enable. After that follow still more prompts to create a user. Make sure the user you create is an admin user. You will also be prompted to enter a “bind host”. Enter the IP address you saw listed on the applications page in the WebFaction interface. You can create as many users as you want during setup. Continue through the rest of the prompts. The last one should ask if you want to start ZNC. Choose yes. Make a note of the configuration file location since it contains everything you’ll need to know to connect to ZNC.


Now that ZNC is running you should be able to connect to it. Try connecting to ZNC with your IRC client.


Before connecting to your ZNC server you need to install the script as described on this page and place it in your ~/.irssi/scripts/autorun/ directory. This plugin allows you to use /znc in Irssi to send commands to ZNC. Once you have the file in place run /script load autorun/dispatch to load it. Then add your ZNC server:

/server add -net myserver -auto -ssl <hostname or ip> <port> <username>:<password>

Replace myserver with the name you want to give to your ZNC server. The name will be used when you connect to ZNC. Be sure to enter the same IP and port you got from the WebFaction interface just like with ZNC. Then connect by running /connect myserver. Once you are connected use /znc to issue ZNC commands. /znc help should be enough to get you started.


Connecting to ZNC is even simpler in WeeChat. Just add the server and tell it to autoconnect:

/server add myserver <hostname or ip>/<port> -ssl -username=<username> -password=<password>
/set irc.server.myserver.autoconnect on

Again, replace myserver with whatever name you want to give your server. You may also need to turn ssl_verify off if you aren’t using it:

/set irc.server.myserver.ssl_verify off

Then you should be able to connect by running /connect myserver or restarting WeeChat. Once again you can use /znc to issue ZNC commands once you are connected.


Getting ZNC setup is just the beginning. There is still more that needs to be done in order to have ZNC recording everything you care about while you are offline. That’s too much for this blog post though. Checkout the documentation on ZNC website or run /znc help to learn more about configuring your ZNC account.

As you have seen ZNC is simple to install and configure. With WebFaction it’s also very economical to run. I’m really glad I set up ZNC as it has really helped me get more out of IRC. Hopefully this blog post has inspired you to try out ZNC or another bouncer. As always, if you have any questions or suggestions don’t hesitate to send me an email.



Lua Version Management With Asdf-lua

I’ve written asdf in a past blog post but I haven’t covered asdf-lua in depth yet. In this blog post I’ll talk about the advantages of asdf-lua over existing version managers and show how it’s used.

Lua version management is a pretty small niche. The most popular Lua version manager on GitHub has only 91 stars. asdf-lua isn’t a self-contained Lua version manager but rather a plugin for asdf, and extendable version manager with support for over a dozen languages. Unless you are already using asdf chances are you have several version managers already installed. Rather than installing yet another version manager you can use asdf to manage all the languages you rely on in development. But asdf will work fine with your existing version managers too so you don’t need to worry about uninstalling anything to use asdf-lua. While it might seem like asdf-lua is more complex than other version managers it’s really not. asdf-lua itself is only two short Bash scripts and both asdf and asdf-lua are easy to install and configure as we will see.


If you don’t have asdf installed already you will need to install it. It’s easy:

# Clone the repo, currently the latest release is 0.2.1
git clone ~/.asdf --branch v0.2.1

# Then add two lines to your bashrc or bash_profile if you are on OSX
echo -e '\n. $HOME/.asdf/' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

That’s it. After reloading your .bashrc you should be able to run asdf in your shell and see the help printed out. Next install asdf-lua:

asdf plugin-add lua

You will also need a C compiler to compile Lua. Refer to the readme for instructions on getting gcc installed on your OS.

Now that we have asdf-lua and it’s dependencies installed using it to install Lua versions is easy.


To see the Lua versions that are available to install run:

asdf list-all lua

This command will print out a list of all the Lua versions. Find one you want to install and run the installation command. I’ve chosen to install lua 5.3.2:

asdf install lua 5.3.2

After Lua is compiled you can run asdf list lua and you should see the Lua version you just installed. Now that you have a Lua version installed you just need to tell asdf when to use it.

Specifying Lua Versions

asdf looks for a .tool-version file in the current directory and reads it to figure out which version should be used when lua or luac is invoked in that directory. If the file doesn’t exist in the current directory asdf navigates up to the parent directory and checks for it again. This is repeated until a .tool-version file is found on the root directory is reached. Typically you want to set the Lua version on a per-project basis, but you may also want to set a global Lua version so it is available everywhere.

###Setting the Lua version for a project

To set a Lua version for a project cd into the project’s root directory and create the tool version file:

echo "lua 5.3.2" > .tool-version

You should now be able to run lua -v in the directory to see the Lua version being set. You can also use asdf current lua to see the Lua version as well as the path to the .tool-version file that set it. Rather than creating a .tool-version file manually for every project you can the asdf local command to create it for you:

asdf local lua 5.3.2

###Setting a global Lua version

Since asdf is relying on the presence of a .tool-version file in the current directory or one of the parent directories all you need to do to set a global Lua version is to create .tool-version file in your home directory. There is a command that makes this easy:

asdf global lua 5.3.2

This command works just like asdf local only it creates a .tool-version file in your home directory. You can see what it’s written by running less ~/.tool-version. You should now be able to use Lua in any directory under your home directory.


asdf-lua is comparable to other version managers in many ways. The real benefit to asdf-lua is asdf itself. With asdf there is no need to learn the quirks of yet another version manager just to be able to install multiple versions of Lua. The commands I’ve shown here are the exact same for asdf-ruby, asdf-elixir, and all the other asdf plugins.

Feedback is always welcome so if you have any questions about asdf-lua or this blog post feel free to contact me. I’m always looking for ways of improving asdf-lua and asdf so don’t hesitate to contact me if you have any suggestions.


  • asdf:
  • asdf-lua:
  • asdf-ruby:
  • asdf-elixir:

Building ZealDocs for OSX

ZealDocs is an open source Qt app that provides offline documentation browsing. It’s cross-platform but not supported on OSX. I’ve been using ZealDocs for a while now on my Ubuntu machine and wanted to use on OSX too. I figured it was possible to get it compiled on OSX, so after some trial and error I finally figured it out. I was using OSX 10.10 when I came up with these steps, so tweaks to this process may be necessary if you are running the latest version of OSX.


First you will need to install all the ZealDocs dependencies. If your using Homebrew it’s easy:

brew install qt5 qt5-qtwebengine qt5-sqlite-plugin libarchive

If you’re not using Homebrew you will need to either find the equivalent packages in your own package manager or install these packages by hand.

Download ZealDocs

cd to the directory you want to build ZealDocs in (you can move it to /Applications after it’s compiled) and clone it down and enter the project directory:

git clone
cd zeal


You will need to add the include and lib paths for the sqlite and libarchive libraries to the src/libs/core/core.pri file. You can find the versions of each package you have installed by running brew info <package name>. The command I ran looked like this:

cat << EOF >> src/libs/core/core.pri
macx: {
    INCLUDEPATH += /usr/local/Cellar/libarchive/3.2.2/include
    LIBS += -L/usr/local/Cellar/libarchive/3.2.2/lib -larchive
    INCLUDEPATH += /usr/local/Cellar/sqlite/3.15.2/include
    LIBS += -L/usr/local/Cellar/sqlite/3.15.2/lib -lsqlite3


Of course your sqlite and libarchive versions may be different. Note that this is a critical step, if any of these paths are wrong the build will fail.


Now that we have everything configured we can build ZealDocs:

/usr/local/opt/qt5/bin/qmake -makefile

If all goes well you should see a directory inside of the projects bin/ directory.


Copy the directory into your /Applications directory to install it.

cp bin/ /Applications

Once you have it in your /Applications directory you will have to tell OSX to run the app even though it can’t identify the developer. Once you have done this you should be able to open the app and begin using it.

Finally, ZealDocs can be started from the command line with a search term. You could add the appropriate path to your $PATH, but I’ve found an alias to be a little easier. Add this to your .bashrc if you want to make zeal available as an alias in your shell:

alias zeal='/Applications/'

When you start a new shell session you should be able to use zeal:

zeal erlang:ping


I’ve been pretty happy we ZealDocs so far, and it’s nice I can now run it on OSX as well as all my other linux distros. Since Zeal is cross platform it doesn’t really integrate with anything OSX-specific so your looking for something a little nicer you should check out Dash. Dash is a proprietary app that has some extra features that make it a little easier to use on OSX.

Update 12/15/2016 - Automation

After writing this post I realized it would be nice to have a Bash script do all this. I wrote one and checked it into my dotfiles repository.