Darkman portal configuration

Since early 2022, darkman supports exposing the dark mode / light mode preference via the appropriate xdg-desktop-portal API. While this works quite well, it’s been a constant source of questions, since setting it up and actually understanding how it works is far from trivial. Th … | Continue reading


@whynothugo.nl | 1 month ago

Vdirsyncer status update, March 2024

Sync status[permalink] As I mentioned before, when synchronising two storages, the sync algorithm keeps around a local “status” with some basic metadata. Future executions use this metadata to understand which side has changed and which side needs updating. I had to re-write most … | Continue reading


@whynothugo.nl | 1 month ago

Notes on s6

s6 is a collection of programs that can be used for service supervision and service management. It is composed of multiple simple tools that can be used individually or together. The s6 suite of programs can be used to supervise and manage system service, user-session service, or … | Continue reading


@whynothugo.nl | 1 month ago

My 'lock-and-sleep' script

For the last months, I have used my lock-and-sleep script that locks the system and then puts it to sleep. As long as the system stays locked, the script will put it back to sleep after 10 seconds of idle. Locking the system before going to sleep ensures that the system never sho … | Continue reading


@whynothugo.nl | 2 months ago

vdirsyncer: rewriting status management

Current state[permalink] Vdirsyncer keeps a “status” file locally. The status file contains metadata from items on both storages the last time they were synchronised. My current implementation runs the synchronisation process, and then returns a new status, which should be saved … | Continue reading


@whynothugo.nl | 3 months ago

Nine months of Xendmail

Last year I wrote xendmail, a tool based on the proposal mentioned in my thoughts on sendmail in 2023 article. Xendmail exposes the same interface as sendmail1, it takes an email as input, reads credentials from the user’s secret store, and dispatches the email via an the appropr … | Continue reading


@whynothugo.nl | 4 months ago

Setting up an IRC bouncer (soju) on OpenBSD

Given the outage at sourcehut right now1, I need an alternative bouncer to use IRC without leaving a client running 24/7. Running my own seems like a simple enough choice. I opted to run soju (mirror) on my personal server running OpenBSD. soju is what powers chat.sr.ht. It is we … | Continue reading


@whynothugo.nl | 4 months ago

Extended usages of the primary selection

When some text is selected, it becomes the primary selection. Other applications can then access this primary selection. The most common usage is to paste it by middle clicking elsewhere, but that’s really the full extent of the interactions that are currently available1. There i … | Continue reading


@whynothugo.nl | 4 months ago

vdirsyncer: preparing for alpha version

I’ve been synchronising my calendars with the still-experimental rewrite of vdirsyncer lately. vdirsyncer --sync --daemon has been running for about three days now. The --daemon flag makes it run continuously, synchronising changes every five minutes. Eventually I want --daemon t … | Continue reading


@whynothugo.nl | 4 months ago

Specification and development status for valarmd

I have made a few mentions to valarmd, a project of mine which is paused for the moment. It is a daemon used to show desktop notifications for alarms in calendar entries. This is its specification. I hope to continue working on it after completing my current work on vdirsyncer. S … | Continue reading


@whynothugo.nl | 5 months ago

vdirsyncer status update, November 2023

Designing the low level icalendar parser took longer than it should have taken. To be sincere, part of the problem was my trying to be too ambitious in its scope and growing beyond the strictly necessary requirements. Requirements[permalink] The main goal of this parser (now call … | Continue reading


@whynothugo.nl | 5 months ago

Measuring test coverage in Rust

I want to measure test coverage for the vparser library, and this is my first time measuring coverage with Rust. Some notes for future reference. First, run the tests with instrumentation enabled: > RUSTFLAGS="-C instrument-coverage" cargo test -p vparser Compiling vparser v0.1.0 … | Continue reading


@whynothugo.nl | 5 months ago

Setting a battery charge threshold

Modern batteries degrade faster if continuously charged to 100%. Some vendors provide software implementations to avoid continuously feeding the battery when full to avoid overloading it. Usually this is tricky, since they have to invent some kind of mechanism to determine whethe … | Continue reading


@whynothugo.nl | 5 months ago

Setting up an Alpine Linux workstation

In the upcoming months I will travel to visit family and friends. I intend to work remotely during some of those weeks (and will take some other weeks off too). In preparation for this, I’ve set up a new1 ThinkPad T14s Gen 2i laptop that I’ll be using to work remotely. This artic … | Continue reading


@whynothugo.nl | 6 months ago

vdirsyncer status update, October 2023

After having an initial version of the configuration parser, I’ve moved on to working on the actual command line for vdirsyncer itself. Replacing Box with Arc This section is pretty technical and requires some understanding of Rust. In my synchronisation algorithm, the type repre … | Continue reading


@whynothugo.nl | 6 months ago

A configuration format for vdirsyncer v2

Settling down a configuration format for the upcoming vdirsyncer v2 has taken more than I anticipated. These is a summary of my journey, considerations and the current state. The previous format My first approach was to retain the existing configuration format. I’ll call this one … | Continue reading


@whynothugo.nl | 7 months ago

Debugging a non-functional pylsp

pylsp wasn’t working today for some reason. It wasn’t jumping to definitions, offering any auto-completions, nor formatting code. I had to figure out why. Usually, LSPs are executed directly by the IDE with stdin/stdout piped directly into an LSP client, which means that logging … | Continue reading


@whynothugo.nl | 8 months ago

vdirsyncer status update, August 2023

I had family visiting during this past month, so I’ve taken some time off to spend with them. Progress has therefore been slower than usual. Sub-tasks missing from planning As I mentioned a few months ago, the NLnet foundation is currently funding my work rewriting on vdirsyncer. … | Continue reading


@whynothugo.nl | 8 months ago

Building and running sway-master

I wanted to run sway from upstream master branch to tests the yet-unreleased fractional scaling support. This recipe also works for trying to build sway with custom patches. First, I needed to clone sway itself and wlroots as a subproject. Building wlroots as a subproject is requ … | Continue reading


@whynothugo.nl | 9 months ago

vdirsyncer status update, July 2023

CardDav support This month I’ve worked on missing CardDav support in existing libraries. Regarding libdav itself, this has helped tidy up parts of the code that are shared between the CalDav and CardDav. This wasn’t very complicated; the latter is very similar to the former, so i … | Continue reading


@whynothugo.nl | 10 months ago

Extending an expired GPG key

Slightly over a year ago, I set up a new hardware-backed GPG key on my yubikey device. Today I needed to sign a release, and noticed my key expired two days ago. It’s time to renew it. Possible approaches When a key expires, there are three alternatives on how to address this: Ge … | Continue reading


@whynothugo.nl | 10 months ago

senpai: a modern IRC terminal client

I’ve been writing some IRC-related experiments using a bouncer lately. I don’t have anything useful yet. My code so far connects to a bouncer, enumerates bouncer networks, opens a second connection to the bouncer (you need an additional connection per upstream network), and then … | Continue reading


@whynothugo.nl | 10 months ago

vdirsyncer status update, June 2023

This month started out rather slow, with me taking a week off on vacation and then coming back home only to be sick in bed for another week. But it ended up being rather productive after all. Configuration parsing My initial goal since last month was to implement a small binary t … | Continue reading


@whynothugo.nl | 10 months ago

Understanding the XDG access portal

The upcoming version of Firefox 116 will use Pipewire for camera access. This sparked my curiosity and I wanted to know if my setup would work for this. In recent times, Firefox has been moving rather quickly, adding dependency on these Flatpak portals (even in scenarios where Fl … | Continue reading


@whynothugo.nl | 11 months ago

vdirsyncer status update, May 2023

So far, libdav seems to be working pretty solid for interacting with CalDav server, and davcli has been handy for interactively inspecting remote collections. There are a few reported issues for the previous vdirsyncer implementation that are related URL decoding. These can proba … | Continue reading


@whynothugo.nl | 11 months ago

Introducing davcli

I mentioned in the past that libdav (the library which I’ve written to interact with caldav and carddav servers) implements DNS-based discovery. This should make any tools built on this library a lot easier to configure for end users. One such tool so far is davcli, a simple comm … | Continue reading


@whynothugo.nl | 1 year ago

DNS-based discovery for CalDav and CardDav

rfc6764 describes a mechanism for caldav service providers to expose exactly where their server is located while requiring minimal input from the user. The main intent here is that if you are hosting your email and calendar for example.com, your users only need to provide their c … | Continue reading


@whynothugo.nl | 1 year ago

libdav live test results

One of my goals for re-writing vdirsyncer was to write “live tests”. These tests are series of operations against a real CalDav server, failing if the server doesn’t behave as expected (or if it doesn’t support a specific feature). I’ve had this working for a couple of weeks now, … | Continue reading


@whynothugo.nl | 1 year ago

Tracking dotfiles

The term dotfiles refers to files with filenames starting with a dot. These are treated as “hidden” files and usually not listed by default in most tools unless an extra flag is provided, a “show hidden files” checkbox is checked or some similar mechanism. Additionally, the term … | Continue reading


@whynothugo.nl | 1 year ago

Installing postmarketOS on a OnePlus 6 with an encrypted filesystem

I’ve been experimenting with postmarketOS for a long time now. My long-term aspiration is to set up a phone that I can use as a daily driver. I need to overcome a lot of obstacles to achieve this. Today, my goal is to encrypt the main partition. So if I lose the phone, it doesn’t … | Continue reading


@whynothugo.nl | 1 year ago

Thoughts on sendmail in 2023

Sendmail is a classic mail transfer agent (MTA) in the world of Unix-like systems. It’s design is simple, and worked well for many setups for decades. For many scenarios it still works. For others, it does not. Sendmail as a system-wide tool Sendmail is typically set up by a syst … | Continue reading


@whynothugo.nl | 1 year ago

vdirsyncer status update 2023-03

This is a long overdue update on the status on vdirsyncer’s rewrite. I keep thinking “I’ll just finish this one bit before publishing it”, but that always seems to be a day or two in the future, so here goes. Funding I’m very happy to announce that the NLnet foundation has agreed … | Continue reading


@whynothugo.nl | 1 year ago

AI-assisted computer interfaces of the future

I’ve been rewatching Star Trek TNG lately, and a question that often comes to mind is: If they have all these computerised sensors, and they have a computer capable of converting information into voice, why do they need technicians constantly interacting with each terminal to rea … | Continue reading


@whynothugo.nl | 1 year ago

Notes on Podman

Podman is an alternative implementation of Docker which addresses some design issues in Docker. The most obvious/notable difference is that Podman doesn’t require a daemon running permanently, which is nice, but not a huge deal. It also has other design differences, but most of t … | Continue reading


@whynothugo.nl | 1 year ago

Using a Yubikey for both GPG and TOTP

I’ve written before on how I use a Yubikey for hardware-based GPG and 2FA on the web. I also use it for TOTP. That is, the Yubikey itself generates those common “authenticator codes” like many other Authenticator apps. But the secret seed is saved into hardware that does not supp … | Continue reading


@whynothugo.nl | 1 year ago

In praise of Alpine and apk

Since the change of year, I’ve been using Alpine Linux on my main computing device (a new desktop PC that I assembled in December). These are some notes on in, some niceties and caveats. I used ArchLinux for over a decade before, so keep in mind that my main point of reference/ba … | Continue reading


@whynothugo.nl | 1 year ago

OpenWrt with KPN fibre optics

I’ve always preferred to use my own router at home when possible, and was pleasantly surprised to learn that the EU actually has rules around router freedom. That is, each user is allowed to use their own hardware at home, rather than being imposed which hardware they can use by … | Continue reading


@whynothugo.nl | 1 year ago

vdirsyncer: looking for hosted Dav servers

Current state of affairs As part of vdirsyncer’s test suite, I currently run tests against a multiple CalDav/CardDav servers. The CI pipeline does this by downloading dockerised versions of all the servers, starting them up and then running tests. This isn’t ideal. On CI, the rad … | Continue reading


@whynothugo.nl | 1 year ago

icalendar bug at NS International

Today I purchased train tickets to FOSDEM on NS International. The site has a handy option to “Add to Agenda”, which generates an icalendar file which one can add to their calendar agenda. I downloaded it and tried to import it into my calendar tool of choice, khal. It crashed. I … | Continue reading


@whynothugo.nl | 1 year ago

Setting up IRC redirects

A few weeks ago I wanted to set up a few redirects on IRC. Mainly, I wanted to redirect #vdirsyncer, #khal and #todoman to the #pimutils channel (given that pimutils is the umbrella project for both of these). These are the commands I had to run after authenticating: /msg ChanSer … | Continue reading


@whynothugo.nl | 1 year ago

Notes on ruff

ruff is a tool to check and lint Python code. It’s written in Rust and it really is blazing fast. The first time I ran it on a real codebase I immediately got an error and, for a split-second, though it was an execution error. It had actually run successully in a few milliseconds … | Continue reading


@whynothugo.nl | 1 year ago

Notes on pre-commit

pre-commit is a tool to configure git pre-commit hooks. It allows defining hooks in a simply syntax and runs them only if files of a specific type change (e.g.: run mypy only if *.py files have changed). Additionally, it’ll stash unstaged changes when running, so any files that a … | Continue reading


@whynothugo.nl | 1 year ago

Selection cheatsheet

There’s multiple selections: PRIMARY: is the old-school Unix one; select text to copy it. Middle-click to paste it. Three-finger tap on a touchpad also pastes it. CLIPBOARD: the well-known ctrl-c and ctrl-v (or Super+c). SECONDARY: historical, irrelevant, don’t worry about this o … | Continue reading


@whynothugo.nl | 1 year ago

Copying with Super+C

Historically, Ctrl+c has been used to interrupt a process on terminals. This applies on Linux, but also applied to BSDs and Unixes before it. This is still true, even today, on pretty much any terminal emulator. When mice became a thing, one could simply select text and then clic … | Continue reading


@whynothugo.nl | 1 year ago

Systemd, locking and sleeping

Locking the system logind (part of systemd) emits events when the system is about to be locked or go into sleep. Typically, one can configure logind so that closing the laptop lid triggers a “lock the session” event. However, this just emits a D-Bus signal and doesn’t provide fac … | Continue reading


@whynothugo.nl | 1 year ago

How the Clipboard Works

Continue reading


@whynothugo.nl | 1 year ago

Shotman 0.2 development update part 2

After the initial proof of concept of the shotman rewrite, my next goal was to have an implementation that could fully replace the previous version for daily usage. My main use of shotman is “take screenshot of current window”, and I have two other (less frequent) use cases. They … | Continue reading


@whynothugo.nl | 1 year ago

Shotman 0.2 development update part 1

Update: This article was renamed to “part 1” when publishing part 2. These last couple of week I’ve been putting a lot of time into shotman. Shotman is a small GUI tool I wrote a few months ago. It shows a small preview window when a screenshot is saved, and has controls to copy … | Continue reading


@whynothugo.nl | 1 year ago