+++ title = "Weechat and Emacs" author = ["Elia el Lazkani"] date = 2020-09-03T21:00:00+02:00 lastmod = 2021-06-28T00:01:47+02:00 tags = ["weechat", "emacs", "weechat-el"] categories = ["irc"] draft = false +++ In the last few blog posts, I mentioned a few migrations caused by my _VSCode_ discovery a few weeks ago [Emacs and Org-mode]({{< relref "emacs-and-org-mode" >}}). As I was configuring _Doom_, I noticed that there was a configuration for _weechat_ in there. I checked it out very briefly and found that it was a _[weechat.el](https://github.com/the-kenny/weechat.el)_ package for _Emacs_. At the time, I didn't have too much time to spend on this so I quickly passed it over with plans to come back to it, _eventually_. The time has come for me to configure and try this at least ! I already have my _weechat_ installation running remotely behind an _nginx_ **reverse proxy**. I tried to connecting using that endpoint, unfortunately no dice. ## The Problem {#the-problem} As I was asking in _#weechat.el_ on **freenode** for help, the very quick to help _[FlashCode](https://github.com/flashcode)_ sprung into action. He wasn't able to help me but he pointed me in the right direction. I asked why would _Glowing Bear_ work but not _weechat.el_ ? The answer was along the line that _Glowing Bear_ uses a _websocket_. Alright that made sense. Maybe _weechat.el_ does not do _websocket_. ## The Solution {#the-solution} So, we are behind an _nginx_ **reverse proxy** instance. What we need to do is expose our service as a _TCP reverse proxy_ instead of our usual _HTTP_ one. We are moving down networking layers to the **TCP/IP** instead of **HTTP**. What we need to do is add a _stream_ section to our _nginx_ to accomplish this. ```text stream { server { listen 9000 ssl; ssl_certificate /path/to/chain.pem; ssl_certificate_key /path/to/cert.pem; proxy_pass 127.0.0.1:9000; } } ```

warning

The `stream` section has to be outside the `http` section. If you add this configuration next to your other `server` sections, it will fail.
In the previous block we make a few assumptions. - We are behind SSL: I use the _nginx_ reverse proxy for _SSL termination_ as it handles reloading certificates automatically. If I leave it to _weechat_, I have to reload the _certificates_ manually and often. - Weechat is listening on port 9000 locally: The _weechat_ relay needs to be configured to listen on **localhost** and on port **9000** for this configuration to work. Make sure to change it to fit your needs. Now that the configuration is out of the way, let's test it. Open emacs and run `M-x` followed by `weechat-connect`. This should get you going. ## Conclusion {#conclusion} It was a nice path down the road of packets. It's always a good day when you learn new things. I have never used _TCP_ forwarding with _nginx_ before but I'm glad it is supported. Now that you know how to do the same as well, I hope you give both projects a try. I think they are worth it. I'm also thankful to have so many different awesome projects created by the open source community.