diff --git a/blog/irc-stuff-nixos-2021-05-29.markdown b/blog/irc-stuff-nixos-2021-05-29.markdown
new file mode 100644
index 0000000..ab64b5a
--- /dev/null
+++ b/blog/irc-stuff-nixos-2021-05-29.markdown
@@ -0,0 +1,502 @@
+---
+title: "How to Set Up WeeChat on NixOS"
+date: 2021-05-29
+tags:
+ - irc
+ - nixos
+ - devops
+---
+
+# How to Set Up WeeChat on NixOS
+
+[Internet Relay Chat (IRC)](https://en.wikipedia.org/wiki/Internet_Relay_Chat)
+is the king of chats. It is the grandfather of nearly every chat protocol and
+program you use today. It has been a foundation of the internet for over 30
+years and is likely to outlive most of the chat apps you use today. IRC is used
+heavily by the people that make the software that you use daily, and has been
+catalytic to careers the world over.
+
+However, because of its age IRC can be a bit hard for newcomers to get into. It
+has its own cultural norms that will seem alien. In this article we're going to
+show you how to set up an IRC client and a persistent bouncer (something that
+stays connected for you) with a web UI on [NixOS](https://nixos.org/). For the
+sake of simplicity we well be connecting to [Libera Chat](https://libera.chat/).
+
+# Installing WeeChat
+
+IRC is an open protocol and it has been one for many years. As such there are
+many clients to pick from. However, you're reading an article on my blog and
+that means I get to let my opinions about IRC clients influence you. So, here's
+how to set up [WeeChat](https://weechat.org/) (not to be confused with WeChat,
+the chat program mainly used in China), my IRC client of choice.
+
+### Installing on NixOS
+
+[Even though this article is focusing on NixOS, WeeChat has been around for many
+years and is likely to be present in your distribution of choice's package
+manager.](conversation://Mara/hacker)
+
+You can install WeeChat by adding it to your configuration.nix like this:
+
+```nix
+environment.systemPackages = with pkgs; [ weechat ];
+```
+
+Then you can rebuild your configuration with the normal `nixos-rebuild` command:
+
+```console
+$ sudo nixos-rebuild switch
+```
+
+And WeeChat should be visible in your `$PATH`:
+
+```console
+$ which weechat
+/run/current-system/sw/bin/weechat
+```
+
+Then run WeeChat like this:
+
+```console
+$ weechat
+```
+
+And you should see the default UI:
+
+![The default WeeChat UI](https://cdn.christine.website/file/christine-static/blog/20210529_11h43m43s_grim.png)
+
+### Customization
+
+First let's change how WeeChat groups server buffers. Normally it lumps
+everything into one big merged buffer, however most other clients will have
+independent buffers per network. I like the behaviour where each server has its
+own buffer. To make the server buffers independent, paste this line into the
+input bar:
+
+```weechat
+/set irc.look.server_buffer independent
+```
+
+Enable mouse control with the `/mouse` command:
+
+```weechat
+/mouse enable
+```
+
+#### Colorscheme
+
+WeeChat has a very primitive colorscheme system through various settings. For
+most people the defaults will be fine. However certain color schemes (like the
+one I use, [Gruvbox Dark](https://github.com/morhetz/gruvbox)) can make the top
+titlebar hard to read. WeeChat's website has a [themes
+page](https://weechat.org/themes/) where you can get some ideas.
+
+[The files that the themes page offers are intended for a WeeChat script that
+hasn't been included in the normal script repository for some reason, however
+you can obviate that need by a little massaging with
+vim!](conversation://Mara/hacker)
+
+You can convert a theme to a bunch of `/set` commands with vim. Find a theme you
+like such as [nils_2](https://weechat.org/themes/source/nils_2.theme.html/) and
+copy the theme to a file. The theme script outputs something that looks like
+WeeChat configuration by default.
+
+[If you want the theme I use, download it from here.](conversation://Cadey/enby)
+
+Then open that file in vim and we will munge it in a few steps.
+
+First, put `/set ` at the beginning of every line:
+
+```vim
+:%s%^%/set %
+```
+
+Then remove the ` =` from each line:
+
+```vim
+:%s/ =//
+```
+
+And finally remove all of the quotation marks (make sure to include the global
+flag here because otherwise only one of the quote marks will be removed):
+
+```vim
+:%s/"//g
+```
+
+And then paste it all into your input line and then run `/save`:
+
+```weechat
+/save
+```
+
+The result should look like this:
+
+![My WeeChat theme in action](https://cdn.christine.website/file/christine-static/blog/20210529_12h05m05s_grim.png)
+
+### Plugins
+
+WeeChat has a rich scripting layer that you can read more about
+[here](https://weechat.org/files/doc/stable/weechat_scripting.en.html). It has
+bindings for most languages you could care about. I have a few plugins that I
+use to make my WeeChat experience polished. I'm going to go over them in their
+own sub-sections. You can install scripts using the `/script` command.
+
+[Newer versions of WeeChat require permission before they will be allowed to
+download scripts from the script repository. To give it permission, run this
+command:
/set script.scripts.download_enabled on
](conversation://Mara/hacker)
+
+#### `autosort.py`
+
+Normally WeeChat will put buffers in the order that you opened them. I have a
+slight case of CDO, so I prefer having the buffers in the correct alphabetical
+order. `autosort.py` will do this. To install it, run this command:
+
+```weechat
+/script install autosort.py
+```
+
+It will kick in automatically when you create new buffers, however if you want
+to manually run it, use this command:
+
+```weechat
+/autosort
+```
+
+The autosort plugin has a lot of configuration, take a look at `/help autosort`
+if you want to dig deeper.
+
+#### `autojoin.py`
+
+WeeChat doesn't remember what channels you were in when you close your client
+and restart it later. `autojoin.py` fixes this by saving the list of channels
+you are in when you quit WeeChat. It also gives you a command to save all of the
+channels regardless. To install it, run this command:
+
+```weechat
+/script install autojoin.py
+```
+
+If you ever want to save your list of joined channels, run this command:
+
+```weechat
+/autojoin --run
+/save
+```
+
+[The `/save` isn't strictly needed there, however it may help you feel
+better!](conversation://Mara/happy)
+
+#### `confversion.py`
+
+WeeChat normally stores its configuration as a bunch of text files in
+`~/.weechat`. It doesn't version these files at all, which makes it slightly
+hard to undo changes. `confversion.py` puts these changes into a git repository.
+To install it, run this command:
+
+```weechat
+/script install confversion.py
+```
+
+It will automatically run every time you change settings. You don't need to care
+about it, however if you want to care about what it does, see the its settings
+with this command:
+
+```weechat
+/set plugins.var.python.confversion.*
+```
+
+#### `emoji.lua`
+
+WeeChat is a terminal program. As such it is not the easiest to input emoji and
+sometimes you absolutely need to call something 💩. This script converts the
+emoji shortcodes you use on Discord, GitHub and Slack into emoji for you. To
+install it, run this command:
+
+```weechat
+/script install emoji.lua
+```
+
+Then you can 💩post to your heart's content.
+
+#### `go.py`
+
+If you become a hyperlurker like I am, you tend to build up buffers. A lot of
+buffers. So many buffers that it gets hard to keep track of them all. `go.py`
+lets you search buffers by name and then go to them. To install it, run this
+command:
+
+```weechat
+/script install go.py
+```
+
+Then you should bind a key to call `/go` for you. I suggest `meta-j`:
+
+```weechat
+/key bind meta-j /go
+```
+
+[On some terminals, you can use the alt-key for this. On others you will need to
+press escape and then j. You can change this to control-j with something like
+`/key bind ctrl-j /go`.](conversation://Mara/hacker)
+
+#### `listbuffer.py`
+
+One of the main ways to discover new channels to talk in on IRC is by using the
+`/list` command. By default this output gets spewed to the server buffer and
+isn't particularly useful. `listbuffer.py` collects all of the channels into a
+buffer and then sorts them by user count. To install it, run this command:
+
+```weechat
+/script install listbuffer.py
+```
+
+This will fire automatically when you do `/list` on an IRC server connection:
+
+#### `screen_away.py`
+
+This one may not be super relevant if you don't run an IRC client in screen or
+tmux, but I do. This script will automatically mark you as "away" when you
+detach from screen/tmux and mark you as "back" when you attach again. To install
+it, run this command:
+
+```weechat
+/script install screen_away.py
+```
+
+## Connecting to an IRC Network
+
+Now that things are set up, let's actually connect to an IRC network. For this
+example, we will connect to [Libera Chat](https://libera.chat/). In WeeChat's
+model, you need to create a server and then set things in it. However, let's set
+some default settings first.
+
+[At this point it may be a good idea to start running WeeChat in tmux or a
+similar program. This will let you detach WeeChat and come back to it
+later.](conversation://Mara/hacker)
+
+Here's how you set the default nickname, username and "real name":
+
+```weechat
+/set irc.server_default.nicks Mara,MaraH4Xu,[Mara]
+/set irc.server_default.username mara
+/set irc.server_default.realname Mara Sh0rka
+```
+
+### Setting Up Libera Chat
+
+Add the Libera Chat connection with the `/server` command:
+
+```weechat
+/server add liberachat irc.libera.chat/6697 -ssl -auto
+```
+
+Then you can check the settings with `/set irc.server.liberachat.*`:
+
+![](https://cdn.christine.website/file/christine-static/blog/20210529_13h16m23s_grim.png)
+
+More than likely the defaults are fine, however you can customize them with
+`/set` if you want.
+
+Next, let's connect to Libera Chat with this command:
+
+```weechat
+/connect liberachat
+```
+
+### Registration
+
+Once you are connected, register an account with NickServ:
+
+[IRC is a bit primitive, most networks use services like `NickServ` to help
+handle persistent identities on IRC.](conversation://Mara/hacker)
+
+```weechat
+/q NickServ help register
+```
+
+Then set a password (make sure it's a good one!) and email address, then run the
+command. You will get an email from the Libera Chat services daemon with a
+verification command. Run it and then your account will be set up. For the rest
+of this article we are going to assume that your account name is `[Mara]`.
+
+```weechat
+/msg NickServ register hunter2 mara@best.shork
+```
+
+Now you can configure WeeChat to automatically identify with NickServ on
+connection by using [SASL](https://libera.chat/guides/sasl). To configure SASL
+with WeeChat, do this:
+
+```weechat
+/set irc.server.liberachat.sasl_mechanism plain
+/set irc.server.liberachat.sasl_username [Mara]
+/set irc.server.liberachat.sasl_password hunter2
+```
+
+[If you aren't using `confversion.py`, now is a good time to run
+`/save`.](conversation://Mara/hacker)
+
+Then run `/reconnect` and look for this line in your Libera Chat buffer:
+
+```weechat
+-- SASL authentication successful
+```
+
+If you see this, then you are successfully identifying with NickServ when you
+connect to Libera Chat.
+
+### Getting a Cloak
+
+IRC attaches your public IP or DNS hostname to every message you send. Some
+people may not want to have this happen. A cloak lets you hide your public IP
+address and put something else there instead. It allows you to show up as
+something like `user/xe` instead of `chrysalis.cetacean.club`.
+
+To get a cloak, join `#libera-cloak`:
+
+```weechat
+/j #libera-cloak
+```
+
+Then send `!cloakme` to the channel. The bot will kick you once your cloak is
+set.
+
+### Joining Channels
+
+From here you can join channels and talk around places like normal. Here are
+some of my main haunts on Libera Chat:
+
+- [`#xeserv`](https://web.libera.chat/#xeserv) -> The official channel for this
+ blog
+- [`#lobsters`](https://web.libera.chat/#lobsters) -> The official channel for
+ [Lobsters](https://lobste.rs), a news aggregation site that I really like
+- [`##hntop`](https://web.libera.chat/##hntop) -> A feed of new articles that
+ are posted to [Orange Site](https://news.ycombinator.com/)
+- [`##furry`](https://web.libera.chat/##furry) -> Encounters of the furred kind
+
+I am `Xe` on Libera Chat.
+
+## WeeChat Relay and Glowing Bear
+
+If you run WeeChat in tmux, you can attach to that tmux session later and then
+continue chatting wherever you end up. If you are on your phone or a tablet,
+this may not be the most useful thing in the world. It is somewhat difficult to
+use a shell on a phone. WeeChat has a
+[relay](https://weechat.org/files/doc/stable/weechat_relay_protocol.en.html)
+protocol setting that lets you connect to your chats on the go. You can use
+[Glowing Bear](https://www.glowing-bear.org/) to work with WeeChat. The public
+instance at [glowing-bear.org](https://www.glowing-bear.org/) will work fine for
+many cases, but I prefer running it myself so I don't have to give my WeeChat
+instance access to a blessed TLS certificate pair.
+
+To set this up, you will need to choose a relay password. I personally use
+type-4 UUIDs generated with `uuidgen`:
+
+```console
+$ uuidgen
+73b4d63d-ef7f-40a5-ab6e-01dfa4298a28
+```
+
+Then you can configure the relay port:
+
+```weechat
+/set relay.network.bind_address 127.0.0.1
+/set relay.network.password 73b4d63d-ef7f-40a5-ab6e-01dfa4298a28
+/relay add weechat 9001
+```
+
+Now that you have the relay set up, you can check to see if it's working with
+netcat:
+
+```console
+$ nc -v 127.0.0.1 9001
+Connection to 127.0.0.1 9001 port [tcp/etlservicemgr] succeeded!
+```
+
+This should also trigger a message in WeeChat:
+
+```weechat
+relay: new client on port 9001: 1/weechat/127.0.0.1 (waiting auth)
+```
+
+Now that you know WeeChat is listening, you can set up Glowing Bear with a NixOS
+module. Here's how I do it:
+
+```nix
+# weechat.nix
+{ config, pkgs, ... }:
+
+{
+ # Mara\ Set up an nginx vhost for irc-cadey.chrysalis.cetacean.club:
+ services.nginx.virtualHosts."irc-cadey.chrysalis.cetacean.club" = {
+ # Mara\ "gently encourage" clients to use HTTPS
+ forceSSL = true;
+
+ # Mara\ Proxy everything at `/weechat` to WeeChat
+ locations."^~ /weechat" = {
+ # Mara\ Replace the host and port with whatever you configured
+ # instead of this.
+ proxyPass = "http://127.0.0.1:9001";
+ # Mara\ WeeChat has websocket support for the relay protocol,
+ # this tells nginx to expect that.
+ proxyWebsockets = true;
+ };
+
+ # Mara\ Serve glowing bear's assets at the root of the domain.
+ locations."/".root = pkgs.glowing-bear;
+
+ # Mara\ Use the ACME cert for `cetacean.club` for this
+ useACMEHost = "cetacean.club";
+ };
+}
+```
+
+You can add this to your `imports` in your server's `configuration.nix` using
+[the layout I described in this
+post](https://christine.website/blog/morph-setup-2021-04-25). This would go in
+the host-specific configuration folder.
+
+Once you've deployed this to a server, try to open the page in your browser:
+
+![](https://cdn.christine.website/file/christine-static/blog/20210529_14h26m57s_grim.png)
+
+Then enter in the following details:
+
+- For the relay hostname, enter `irc-cadey.chrysalis.cetacean.club`
+- For the port, enter `443`
+- For the password, enter the UUID from earlier
+
+Then click "Save" and "Automatically connect" you will be connected to your
+chats!
+
+## IRC Norms and Netiquette
+
+IRC is a unique side of the internet. Here are some words of advice that may
+help you adjust to it:
+
+- Most channels will go silent unless there is something to say. The channel
+ being silent is a good thing.
+- Don't [ask to ask](https://dontasktoask.com/). If you have a question, just
+ ask it.
+- Lurk for a bit in a social channel before chatting.
+- Always have an exit strategy.
+- Be wary of links from strangers.
+- Furries, LGBT and neurodivergent people wrote the software you are using. Do
+ not anger the furries.
+- Befriend but be wary of rabbits.
+- Don't run weird commands if people you don't know ask you to run them.
+- Power is a curse.
+- Be kind to those who answer your questions. This may be a repeat question for
+ them.
+- Tell people what documentation you read and what you tried.
+- Don't paste code snippets into the chat directly. Use a pastebin or [GitHub
+ gists](https://gist.github.com).
+- Write things in longer sentences instead of sending lots of little lines.
+
+---
+
+Drop in [`#xeserv`](https://web.libera.chat/#xeserv)! There's a small but
+somewhat active community there. I would love to hear any feedback you have
+about my articles.