Modern society faces a paradox: the more efficient we become, the fewer workers we need to sustain ourselves. Yet we still demand that people work long hours just to earn survival. If 50 people working full-time can produce enough for 100, why do we deny the other 50 access to th … | Continue reading
For the last several years, I’ve been using mutetab, a Firefox extension which mutes new tabs by default. This changes the typical paradigm from “tabs can play audio by default” to “tabs need to be un-muted to play audio”. I mostly needed this because of how many crappy websites … | Continue reading
After a system update last night, I noticed that Firefox and several other applications were using a different font for their UI. The new font renders larger glyphs, making all UIs look cramped, fit less text, and it’s somehow not as comfortable to read as the previous default (t … | Continue reading
One of the most popular features present in vdirsyncer and still missing in pimsync is support for Google’s CalDAV service. While CalDAV itself is standard, Google’s implementation is unique in a couple fo ways (while still technically being standards-compliant). There are two ma … | Continue reading
I have published and tagged an initial release of ab-bday (address book birthday), a small tool which reads a directory full of vCard files, and writes an iCalendar event for each one. It’s a simple tool, yet I find it immensely useful. Given my usage of existing standards and co … | Continue reading
Pimsync “owner of calendar” metadata [permalink] Pimsync synchronises a few metadata attributes for calendars (displayname, colour, description, order). I had an intent to add owner to this list. This turns out to be impractical. A WebDAV server exposes a calendar-user-address-se … | Continue reading
This morning I read about foot implementing gamma-correct font rendering, and while all those words sound familiar, I still didn’t know exactly what “gamma correcting” meant in this context. This drove me into a reading journey to better understand the topic, and the following is … | Continue reading
Early last year, I disabled web fonts in my browser. Several sites and blogs which I follow use a custom font that the author thought was pretty but has quite poor legibility. Some make it hard to tell apart the m and the n. Others use thin fonts which are hard to focus on visual … | Continue reading
Modern dependency practices often feel like an endless treadmill of updates, churn and bloat driven by huge dependency trees. I find great value in tools and libraries with minimal dependencies. Simple code is a sign of good design. Too many layers of abstraction overcomplicate s … | Continue reading
Modern dependency practices often feel like an endless treadmill of updates, churn and bloat driven by huge dependency trees. I find great value in tools and libraries with minimal dependencies. Simple code is a sign of good design. Too many layers of abstraction overcomplicate s … | Continue reading
I’ve recently tagged v0.2.0 of pimsync. With pimsync being in a rather stable state, I’m aspiring to make more frequent releases with small sets of changes. I’ll be publishing release notes in the pimutils.org blog, so packagers have a lower-volume RSS feed to track releases. Opt … | Continue reading
I’ll present this idea with an example… Context [permalink] todoman optionally depends on py3-repl. If the latter is installed, then todoman gains a new repl command which starts an interactive console. One way of indicating that todoman optionally depends on py3-repl is to add i … | Continue reading
In many ways, I think TikTok is pretty good. It’s learnt my tastes, knows my preferences and how to curate for my tastes. Whenever I have an idle moment, I can open the app and immediately be presented with some video that I’d find interesting or entertaining. If at a given momen … | Continue reading
From the logs (wrapped for readability): Jan 9 14:52:37 anchor soju[71321]: 2025/01/09 14:52:37 listener 0.0.0.0:6697: accept error (retrying in 1s): accept tcp 0.0.0.0:6697: accept4: too many open files Sounds like soju needs more file descriptors that the current limit. I need … | Continue reading
My initial approach on libdav was to always decode percent-encoded paths, and return them un-encoded. Likewise, paths passed as arguments should be provided un-encoded , and libdav would deal with encoding them itself. My mindset was “consumers should not need to worry about perc … | Continue reading
Copying photos out of an iPhone another device is not trivial. The approach suggested by Apple seems to be to copy your photos onto their servers, but actually downloading them is a pain. You can either download them one at a time, or request request a takeout, which takes about … | Continue reading
When re-using the name vdirsyncer, versioning for this new project was a bit messy. Now that this new project has its own name, pimsync, versioning can start from zero. I have published a new tag, v0.1.0, which can be used be early adopters. I also submitted a new package to the … | Continue reading
Applications typically need to embed their version into binaries, for things like --version to work as expected. The exact version will usually be stored in version control (e.g.: git). The recipe presented here ensures that source tarballs include the right version string (even … | Continue reading
The vdirsyncer rewrite on which I have been working these last months will be named pimsync, not vdirsyncer v2. The idea of a different name originally came to mind due to difficulty pronouncing the original name, and having to spell it out every time I spoke about it in person. … | Continue reading
snooze is a program to run scheduled tasks, and its design matches exactly what I’d been wanting: snooze parses the schedule, sleeps until the desired time and finally executes the specified command. Each task is an individual process which can be managed with the usual process m … | Continue reading
The folks from Radically Open Security recently completed their security audit. This was sponsored by the NGI0 Entrust Fund via the NLnet foundation. My deepest appreciation for this opportunity. The audit uncovered four minor findings, but no huge security issues. I remain confi … | Continue reading
I believe that this rewrite of vdirsyncer is stable enough to warrant a stable release. Initially, I wanted to reach feature parity with the previous implementation before calling this stable, but I don’t think that’s the right mentality: the new version is stable enough for dail … | Continue reading
I wanted a quick setup where I can speak to my laptop, and it will record the audio and then give me a text transcript of what I have said. My intention is to produce long text by speaking it out loud and then doing some minor refinement by changing potential cycles. Preparation … | Continue reading
Today I started work on emoji-im, an input method to type emoji. The general ideal is pretty simple, when the input method is active, I type a word, and the input method pop-up suggests emoji based on the word typed. Pressing space inserts that emoji. By implementing this as an i … | Continue reading
A few years ago I moved to the Netherlands. Offices and houses here have large windows, and we can enjoy a lot of sunlight during the long summer days. With so much sunlight shining into my working environment, I need to use my computing devices on light mode. Black text on white … | Continue reading
Vdirsyncer in its current state has been working for me reliable for quite some time now, and I’m very happy how this has shaped up. Since the last status update, a lot of polishing has happened, and I’ve completed support for failure scenarios that could lead to data corruption. … | Continue reading
I have two seemingly conflicting goals with vdirsyncer: I want to keep the scope and code simple, reach a stable state, and stop adding new features. I want to support a variety of use cases, like being able to use client TLS certificates, custom http transports, etc. After think … | Continue reading
I often want to copy URLs or text or other data from my laptop/desktop on a phone. Sometimes it’s my own phone, sometimes it’s someone else’s phone, and sometimes it’s a phone that isn’t even set up yet. My solution works as follows: I copy into my CLIPBOARD selection the data th … | Continue reading
These are different ways of typing non-English characters on computers. Alternative Graph[permalink] The AltGr (Alternative Graph) key is typically located on the right of the space bar. Some keyboard don’t have an AltGr key but have a second Alt key instead. In this case, the ri … | Continue reading
In theory I’ve been resting in bed with COVID these last days, but it’s hard for me to sit my entirely idle, so I wrote a invested some of this time in familiarising myself with hare-wayland and hare-ev. wlhc is a small program to enable “hot corners” on wayland desktops. It take … | Continue reading
I have a list with ideas of “useful tools that I want to write someday” that would likely take hundreds of years to complete. Finding out that somebody has already written one the tools in this list pleases me immensely, not only because I can use the tool in this lifetime, but a … | Continue reading
Renaming items[permalink] Last month I mentioned a bug when items are renamed in a collection. After renaming an item, vdirsyncer would check the entire content on both sides during every single execution. I have now fixed this. I have now renamed all my vcard files to match the … | Continue reading
IRC is great for public rooms or public meeting points. I like to imagine IRC servers as virtual co-working spaces. The kind of co-working space with lots of meeting rooms. Each channel is a one of these meeting room, and anyone can walk in at any time. If you were there first in … | Continue reading
When programs crash in certain specific ways, the kernel can generate a core dump file. A core dump is a file containing an image of the process’s memory at the moment when it was terminated. A core dump can later be used with tools such as gdb to generate a backtrace of the prog … | Continue reading
A major caveat in tools like sudo and doas for that matter is that they rely on setuid binaries and privilege escalation in order to run commands as root. The design is not ideal, and also drags in a few limitations: The whole user session needs to retain capabilities to perform … | Continue reading
This has been a slow month. I took a short vacation the last days of April, and as soon as I got back had some health issues which got in the way of me doing anything productive or fun. vdirsyncer alpha release[permalink] I have finally tagged an alpha release of vdirsyncer 2. Th … | Continue reading
When I initially set up my laptop, I created a 16GB swap partition on it. The large size is so that I can suspend to disk (aka: hibernate) onto it. Resuming from hibernation from this partition doesn’t entirely work. Alpine’s initfs can’t re-use the same passphrase to unlock more … | Continue reading
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
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
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
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
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
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
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
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
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
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
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