Photo by Ben Griffiths

SlackView: Slack Bot opening Modals

Overview Modals are popup dialogs that collect structured input from users. They appear as an overlay on top of Slack’s interface and can contain text inputs, date pickers, checkboxes, radio buttons, and more. Unlike messages that flow passively through a channel, modals are interactive forms that your Bot presents to a user and then processes when submitted. If you are familiar with Slack Bolt, you have probably opened modals using client.views_open(). In Bolt Python you would write: ...

May 16, 2026 · 12 min · Loki Astari, (C)2026
Photo by Oscar Nilsson

SlackActions: Slack Bot handling Slash commands

Overview Slash commands let users trigger your Bot by typing a command like /todo or /deploy directly into the Slack message box. Unlike message handlers that passively listen for text, slash commands are explicit invocations — they feel like calling a function. The user types the command, optionally followed by arguments, and your Bot receives the request and responds. If you are familiar with the Slack Bolt Python library, the interface should feel familiar. In Bolt Python you would write: ...

May 6, 2026 · 7 min · Loki Astari, (C)2026
Photo by Roman Synkevych

SlackHandlers: Slack Bot handling events

Overview In the previous article I walked through creating a Slack Bot and registering it with Slack. That article simply verified that events coming from Slack were correctly received by the Bot. This article will expand on that and show how to respond to these events using the message() and event() methods provided by the NisseBolt library. If you are familiar with the Slack Bolt Python library, the interface should feel familiar. In Bolt Python you would write: ...

May 2, 2026 · 10 min · Loki Astari, (C)2026
Photo by Ken Blode

SlackMug: A Mug plugin for a Slack bot

Overview This article will walk through the steps of creating a Mug plugin that implements a Slack Bot. It utilizes NisseBolt, a C++ library designed to be similar to the Slack Bolt Python libraries. You will create three files: a Makefile to build a shared library, a Bot.cpp that defines your Slack Bot as a Mug plugin, and a config.plugin file that tells the Mug server how to load and configure your Bot. Once built, the Mug server handles all the networking and threading — you just write the bot logic. After that, you will register your bot with Slack so it can start receiving events. ...

April 21, 2026 · 7 min · Loki Astari, (C)2026
Photo by ThisisEngineering RAEng

Mug: A C++ server with hot-reloadable plugins

I like Python’s Bottle/Flask development loop: change code, hit refresh, keep moving. In C++ we traditionally pay for “real builds” with server restarts, cold state, and the mental overhead of wiring a server skeleton for every prototype. Mug is my attempt to keep the runtime production grade, while making the development loop feel lightweight: build a shared library, Mug loads it, and when you rebuild the library Mug hot-reloads it. ...

March 4, 2026 · 6 min · Loki Astari, (C)2026
Photo by ThisisEngineering RAEng

NeoVim Config on Apple Silicon

NeoVim I want to use neovim as my build environment for C++. Couple of pre-requisites before you even start. Install XCode (Download from the AppStore) Install the command line tools xcode-select --install Install brew from brew.sh Installing Though you can install NeoVim by package from neovim.io I don’t recommend this. This is because it will install an application built with the Intel CPU instruction set (this runs because of the emulation mode). This is fine for most operations, but when you use NeoVim as an IDE, it will build the code for the Intel processor. The better option is to install NeoVim from Brew.sh as this will install the appropriate version of NeoVim for the current CPU. ...

March 5, 2025 · 2 min · Loki Astari, (C)2025
Photo by ThisisEngineering RAEng

Multi Threading

Nisse In the first three articles, we created a very basic Web Server. A significant issue with this simplistic server is that it can only handle connections serially. This article introduces a thread pool that will handle the actual requests. The main thread will accept new requests and create the work items to be handled by the thread pool. NisseV4 All the code for this article is in the directory V4 directory. It uses standard libraries and thors-mongo. If you have a Unix-like environment, this should be easy to build; if you use Windows, you may need extra work. A “Makefile” is provided just as an example. ...

November 12, 2024 · 8 min · Loki Astari, (C)2024
Photo by Possessed Photography

SSL Certificates

Nisse In the previous article, “C++ Sockets,” I mentioned that Thors-mongo had built-in support for SLL connections but glossed over the details. In this article, we will review the necessary additions. From the server side, you need an SSL certificate. But what is an SSL certificate, and how do you obtain one? SSL Certificates The SSL certificate has two primary purposes. Securely encrypt all traffic between the client and server. Provides trust that you are talking to a server on the requested domain. The Basics Trusted certificate authorities issue SSL certificates and contain information that validates the certificate cryptographically. When a browser connects to a website, the server returns the certificate, which includes crucial information such as the issuing company. Before establishing a secure connection, the browser validates the certificate against the issuing company’s SSL certificate to ensure it is not forged. If the issuing company is a subsidiary, it recursively looks up the parent company that issued the certificate and validates their certificates until it reaches a root certificate. This process creates a chain of trust leading to a known trusted root certificate. ...

November 10, 2024 · 6 min · Loki Astari, (C)2024
Photo by Roman Synkevych

C++ Sockets

Nisse In the previous article “A Web Server,” I created the simplest web server possible. This article covers the next stage by addressing the issues related to low-level socket programming. To be honest, we are going to take a shortcut. Dealing with ‘*nix’ variants is complex enough, but adding Windows systems makes the process exceedingly complicated (and thus beyond the scope of this article). Here, we will introduce a C++ library to abstract the socket layer and provide a higher-level interface. ...

November 8, 2024 · 3 min · Loki Astari, (C)2024
Photo by Ken Blode

A Web Server

Nisse Describing all aspects of Nisse in a single article would be complex and overwhelming. I want to start with a beginner’s perspective and address a real-world problem many beginners attempt. I will identify some of the issues and introduce solutions one at a time, ultimately leading to the final library, which is Nisse. The simplest web application I can build is a web server. A web server maintains no state between calls, and the interface is straightforward. The client sends an HTTP message and, in return, receives an HTTP response. ...

November 6, 2024 · 6 min · Loki Astari, (C)2024