Go Desktop Agent Part 1: Architecture and Problem Space

In this first part of our Go Desktop Agent series, we’ll explore the architectural decisions and the real-world problems this agent solves.

The Problem: Reaching Users Where They Are

System administrators, DevOps engineers, and IT professionals often face a critical challenge: how do you reliably notify users about important system events when they’re focused on their work? Email gets buried, Slack messages get missed, and web dashboards require active monitoring. What’s needed is a system that can break through the noise and deliver timely, actionable notifications directly to the desktop.

Read more →

Building Windows Services with Go: A Starting Point

A Generic Go Windows Service Template

I’m pleased to share go-windows-service.

What is go-windows-service?

The go-windows-service project is a template implementation that demonstrates how to create a proper Windows service using Go’s golang.org/x/sys/windows/svc package. Rather than being a feature-complete application, it’s designed as a reference implementation that you can clone, customize, and extend for your specific needs.

Why Use This Template?

Creating Windows services in Go can be tricky if you’re not familiar with the Windows service architecture. And let’s be honest, the Windows service API documentation sometimes feels like it was written during the Windows NT era and nobody bothered to update it since. This template handles all the boilerplate code for you - service control handlers, proper signal handling, event log integration, and all that fun stuff.

Instead of spending three days figuring out why your service won’t start (spoiler: it’s always the event log permissions), you can focus on implementing your actual business logic.

Read more →

Introducing the Go Desktop Agent Series

A New Series on Building Cross-Platform Desktop Applications with Go

I’m excited to announce a new series of blog posts focused on building a multiplatform desktop notification agent using Go. This series will walk you through the architecture, implementation details, and design decisions behind the Go Desktop Agent project. It is meant to be inspirational, and used as a starting point to build your own.

What is the Go Desktop Agent?

The Go Desktop Agent is a cross-platform desktop notification system that uses Redis pub/sub for message delivery and reply handling. It runs as a background service with a system tray presence, allowing applications to send desktop notifications across Windows, macOS, and Linux platforms. We worked on this idea at a client but we used Python libraries and AWS services as backend. Java also came up as an idea, but I also really liked the idea of trying this with Go.

Key Features

The agent provides several powerful features:

  • Cross-platform desktop notifications - Works seamlessly..(well almost, or at least better than expected!) on Windows, macOS, and Linux
  • System tray integration - Gopher-branded icon with interactive menu, which is not my best creation (sorry!)
  • Redis pub/sub messaging - Scalable message delivery using Redis
  • Interactive notifications - True OK/Cancel dialog buttons with response handling
  • Reply channel mechanism - Machine-specific response channels based on hostname
  • Zero configuration - Works out of the box with sensible defaults
  • Platform-specific native dialogs - Uses native UI components on each platform

Read more →

Pi5 time

Getting Started with the Raspberry Pi 5

Recently, I acquired a Raspberry Pi 5. I have been working with several generations of Raspberry Pi’s for a while now, and I have always been impressed with the capabilities. As I am heavily involved in Kubernetes and programming, I am eager to see how the Raspberry Pi 5 will perform in those areas. I am planning on doing some hands-on testing and writing a blog post about my experiences.

Read more →

Setting it up

Hardware and OS

The mission for the weekend to set up my Raspberry Pi 5 as was an nice exercise filled with a few challenges and learning experiences. Here’s a detailed walkthrough of how I managed to get everything up and running smoothly.

Read more →

Kubecon Europe experiences

Keynotes

The keynotes were a mix of technical talks and inspirational speeches. Some examples of the keynotes were:

  • Into the black box observability in the age of llms

    About observability in the age of large language models (LLMs). The speaker, Christine Yen, talked about how LLMs are changing the way we think about observability and how they can be used to improve our understanding of complex systems. She also discussed some of the challenges that come with using LLMs for observability.

  • Evolving the Kubernetes user experience

    About the evolution of the Kubernetes user experience. The speaker, Andrew Randall, talked about how the Kubernetes user experience has changed over the years and what the future holds for it. He also discussed some of the challenges that come with designing a good user experience for Kubernetes.

  • Rust in the linux kernel, a new era for cloud native performance and security

    About the use of Rust in the Linux kernel. The speaker, Greg Kroah-Hartman, talked about how Rust is being used to improve the performance and security of the kernel. He also discussed some of the challenges that come with using Rust in a large codebase like the Linux kernel.

The CloudNative Computing Foundation (CNCF) had a strong presence at the conference (of course), and they talked about the importance of open source software and how it is changing the way our industry works.

Read more →

Kubecon Europe 2025 London

We are excited to announce that we will be attending Kubecon Europe 2025 in London! This is a great opportunity for us to connect with the Kubernetes community, learn about the latest developments in the ecosystem, and share our experiences with others. No talks yet to share but we are working on it.

Read more →

What did we see?

Below you will find a list of the presentations I attended, with a link to the summary of the talk and the video(once they’re finished rendering them).

Read more →

We will be at FOSDEM

This weekend, the Free and Open Source Software Developers’ European Meeting (FOSDEM) will be held in Brussels, Belgium. FOSDEM is an annual, volunteer-organized conference that brings together thousands of developers, enthusiasts, and advocates of free and open-source software from around the world. This two-day event, typically held in early February, offers a unique opportunity for attendees to participate in talks, workshops, and networking sessions covering a wide range of topics in the open-source ecosystem.

Read more →

Adventures in chromebookland

Chromebooks are interesting if you need a low budget computer. They are even nicer if you can run Linux or another operation system on it. I tried this on an older one that was still around in the house.

Read more →

New version of the Terraform-provider-leostream

Introducing Terraform Provider for Leostream v0.1.3

We are excited to announce the release of version 0.1.3 of the Terraform Provider for Leostream. This release brings enhancements and stability improvements that enable you to efficiently manage your Leostream environments with Infrastructure as Code (IaC). Whether you’re provisioning resources, managing configurations, or automating your workflows, this provider empowers you to integrate Leostream seamlessly into your Terraform-powered deployments.

Read more →

Next step: Terraform-provider-leostream

Another Leostream project has been released! This time it is a Terraform provider for Leostream. This provider allows you to manage Leostream resources using Terraform. It makes use of the Leostream Golang client library that we created.

Read more →

Introducing the Leostream Admin CLI as well!

I have also been working on a command-line interface (CLI) tool that can be used to manage Leostream resources. It makes use of the Leostream Golang client library that I have created.

It was created to help with issues like:

  • looping through pools to update the pool settings
  • seeing the status of the pools
  • checking which desktops are in a pool
  • taking a backup of Leostream
  • restore a backup of Leostream
  • checking the status of an individual desktop

You can find the code on my company GitLab instance.

Quick start:

% go install gitlab.hocmodo.nl/community/leostream-admin-cli@latest
% export GOPATH=$HOME/go
% export PATH=$PATH:$GOPATH/bin
% leostream-admin-cli --help

Read more →

Introducing the Leostream Golang client

I have been working on a Leostream client in Golang.

More information about Leostream can be found on Wikipedia:

It is basically a broker for connecting users to remote desktops and applications. These desktops can be running in a variety of environments, including cloud, on-premises, and hybrid environments.

The client I created is a wrapper around the Leostream REST API. It is still in development but I have already implemented some basic functionality. The client is available on my company GitLab instance.

Read more →

Playing around with NICE DCV Part 5

The Solution

It’s solution time! NICE DCV has a very excellent support team, and after some email back and forth, it started to work.

My Mistakes

Mea culpa, I made a couple of mistakes during installation.

  • I forgot to configure the NICE DCV server to use the session-manager for external authentication. When a client connects to the NICE DCV server port, it needs to receive an authentication token that is generated and passed through to the DCV client.
  • I had misconfigured my AWS Security Group that is in use for my VPC to let the DCV client access other machines (DCV gateway, Broker) on ports other than the Agent port.

Read more →

Playing around with NICE DCV Part 3

Connecting Through the Gateway

In part 1 I could get the DCV Session manager to answer with a list of sessions (which was empty at first). In part 2 I installed the DCV connection gateway.

In this part of the series, I will use the DCV client on my desktop to make a connection to a Linux DCV server through a DCV connection gateway.

Read more →

Playing around with NICE DCV Part 2

Installing the DCV Connection Gateway

In this part of our “Playing around with NICE DCV” we will install and configure the DCV connection gateway. Downloading it from the NICE site is easy peasy as well as yum installing it.

The devil is mostly in the details, also here when you start integrating this component in your architecture.

Read more →

Playing around with NICE DCV Part 1

Starting the Experiment

All NICE products are free of charges on AWS which I think is a smart move to speed up adoption. So I decided to start an experiment!

My goal was to test if the DCV connection gateway and DCV session manager could setup a session with a Linux DCV server.

Read more →

NiceDCV, whats that?

Introduction to NICE DCV

As of last year I have worked quite a bit with NICEDCV in my professional life.

NICE DCV is a 3D-capable Remote Graphics protocol server that provides a securely authenticated channel for users to setup and use a virtual desktop with 3D applications that can stay running even if no client is actually connected to it. Think of RDP (remote desktop graphics) that is standard with Microsoft Windows, but with better tunable performance because of a different way of handling things.

In a nutshell it is capable of really utilizing the graphics hardware remotely and send the data compressed to the client where it is unpacked again and presented on the viewer desktop. So it uses a ‘server’ part that is running on the remote workstation, and a ‘client’ part that the user runs on their personal desktop.

Session Manager and Connection Gateway

Since last year NICE also provides a session manager/broker and connection gateway specifically to be used in cloud environments, where scaling your installation up and down is of great importance. This is all about money.

Imagine spinning up hundreds of desktops with unique hostnames and IPs and users who need to connect to their authorized machine.

DCV car

Read more →