Something I’ve been wanting to do for a while: end-to-end testing of my email
infrastructure. A recent incident offered the opportunity. 
 The incident 
 Some days after re-installing servers to the latest FreeBSD version, some
acquaintance on Slack was kind enough to report that their messages to me were
not delivered:
My first CTF in years 1 ! Very spontaneous move 2 , didn’t find a team,
just for fun. 
 This is a quick writeup. Jump to conclusion for impressions. 
 Started with the “Beginner” category, in order. And Fuchs the level was high!
So high that I soon decided on going against the no-AI policy, in learning
mode 3 , trying not to spoil the solution (too much).
So I’ve built yet another web hosting platform 
 cough prototype cough . In an era of well-established Kubernetes (k8s)
that’s not very impressive. What’s interesting though is that it’s built on
FreeBSD jails: think docker + k8s from scratch—albeit still rudimentary. 
 So I’ve come to reflect and compare both worlds.
Last week a friend called me to share about their new Windows laptop: ARM-based
with some embedded “AI chip”. That came as a surprise for a consumer-grade PC.
So I decided to research and was indeed shocked to learn about the recent
(2020-2025) industry shift towards ARM.
While packaging booklore into a
FreeBSD jail last weekend, I ran into an issue that forced me to learn about
VNET. 
 The Booklore API is a Java application built with Gradle. During the build,
Gradle spawns a daemon process: To honour the JVM settings for this build a single-use Daemon process will be forked. The issue is that, no matter how
hard I tried to configure it (by…
Summary 
 You may not need Jupyter notebooks. As an Emacs user, IPython and Jupytext is
all I want. 
 Observations 
 After a couple of weeks of daily Jupyter notebook use (yes, I did learn most
keyboard shortcuts—why do you ask?), I really grew frustrated about the UX:
Ouch my raspberry Pi Zero became pretty much useless lately.😢 Yet another
update to the list of things degrading . 
 I won this Pi during a local CTF back in 2015 (2016?). But it’s only in 2019
that it found its purpose when a colleague suggested I install
 Pi-hole on it. It’s been since USB-attached to my
router (USB OTG mode / USB network connection) and running…
On 2024-12-06 around 18:45 CET my NAS died. It’s a HP MicroServer N40L from 2012. 
 I was out at that time and only noticed the incident after I got home a bit after 23:00. 
 Duration of the incident: 6 days !!
I’m now part of the elite! 🤣 I went through the rite of passage and wrote my
own FreeBSD jail manager . 🏆 
 While I started fiddling with FreeBSD jails early in my self-hosting journey
(2015), it took me a while to fully adopt them (2018). Ever since I’ve been
wondering what management tool people actually use. People always said “oh I
just use…
Today while writing an artist bio, as I was gazing at the concept of beauty, I searched for “ beauty ” in DuckDuckGo and Google. 
 😳 
 I was truly shocked to find results about cosmetics for pages and pages. Shops,
plastic surgery, SPAs, cosmetic studios, nail studios, you name it.
When I wrote in July 2024 about things degrading , I was not in a great mood. While the
substance of the post still holds, I wanted to write a follow-up post, as few
things have impoved since. I was able to work on some of the challenges, yet
sometimes with a significant effort. So there is hope. 😄
I like to customize and maintain my home lab and work station. Main motivations
are control (autonomy and purpose — privacy) and learning (mastery). But
recently I started finding it hard to keep up. Furthermore I fail to see a
clear path towards an improved situation.
I may be wrong, but in my view, Android is a Linux distribution . 
 Admittedly blended with lots of android-specific kernel code. But fundamentally
the operating system (OS) really is Linux. 
 Android should probably be called “Android/Linux”, same as we use “GNU/Linux”
to refer to other Linux distributions generally.
Watching Ruby on Rails: The Documentary ,
and hearing David Heinemeier Hansson sharing how he sucked at programming
reminded me of my own experience. 
 Learning — early struggles 
 It’s strange to recall how much I sucked at programming myself in
university. And I was in the computer science curriculum! I think I was simply
unable to write any functional program.…
This summer a friend came over with their 13 years old nephew for a
visit. Their nephew mentioned the Monty Hall
problem and we talked about
it for hours. Eventually I think we found a good intuition to explain the best
strategy.
While testing the name servers for my domain after its transfer , I suddenly realized I wasn’t sure to fully
understand DNS delegation anymore 1 , more specifically how precisely the zone
of the TLD registry (say .fr ) gets updated 2 . 
 Domain creation 
 You see, I can change the NS (name server) records of my zone ( foudil.fr ) at
my registrar, via the web console and…
Introduction 
 From 2018 to 2021 I had been a happy user of
 Simple-jails . I was feeling like I
understood and was in control 1 . But then it broke. 
 When this happened, I just went on and switched to the Salt jails
formula . Not understanding the
breakage nevertheless annoyed me, and this morning I woke up with an exciting
hypothesis, had time before me and was…
Problem 
 ssh remote zfs send zroot/some@snap | zfs receive fails with 
 cannot receive: invalid stream (bad magic number)
 
 Solution 
 The solution is to use the real ssh executable instead: /usr/bin/ssh … . 
 Explanation 
 The invoked ssh is not the ssh binary you expect.
Introduction 
 At high level, domain transfer, the process of moving the management of your
domain from one registrar (say Gandi, hereafter SRC) to another (say OVH,
hereafter DST), is easy™: 
 
 Make sure the domain is transferable at the SRC registrar 
 Request domain transfer at the DST registrar 
 
 Theory 
 Provided all transfer pre-conditions are fulfilled…
While many give up on self-hosting their email 1 , I actually just started
self-hosting mine. 
 Why 
 Because Gandi , a long-time trusted french registrar
and web hosting provider, recently changed direction and is basically forcing
me out. 
 I’ve been with Gandi since 2010-09-11, when I registered my first domain. But
it wasn’t until 2013 that I actually…
After experimenting with Salt’s jails-aware functions for about 2 weeks, I opted for
 BastilleBSD for jails management and configuration. 
 I initially wanted to go for: 
 
 Bastille for manual jail lifecycle management (create, update and upgrade mainly) 
 Salt for jail configuration 
 
 But… 
 Salt service.running is actually NOT jails-aware! 
 This came…
Hear ye, hear ye, Salt’s most important functions (aka “states”) are
jails/chroot-aware! 🎊🎉 
 Meaning when you define a service, install a package or copy a file, it is
possible to specify the jail in which that should happen! 
 What’s crazy is that I’ve been a salt user since at least 2014 (says my git
log) and, despite actively searching for…
According to my IRC client logs, I started self-hosting 1 sometime during 2013,
probably during the summer. 
 Origin, why and how 
 I can’t remember the exact motivations. I did have a minimal Wordpress blog and
my official music website hosted remotely already. I distinctly remember
setting up nginx with php which felt slightly weird after my long experience
with…
This post was written on 2023-01-02 and belongs to a
series of catch-up articles. 
 I love my home datacenter. 
 

 
 


 
 

 Sometime during 2016 I bought this piece of fourniture for 20€ on a flee
market.
This post was written on 2022-12-18 and belongs to a
series of catch-up articles. 
 Prerequisite : basic knowledge of email protocols. 
 Introduction 
 I always loved text-based email clients, fast and effective. 
 After my semi-deception with Mozilla , I decided it was time to try a
new email setup and maybe come back to my initial loves. I had heard of
 notmuch…
Summary 
 This is the story of me migrating from
 passwordstore to
 Bitwarden , the rationale, steps taken, and
gotchas encountered on the way. 
 The history of a migration 
 I have been a loyal user of passwordstore since around 2013 after using
Firefox’s password manager since 2011.
EDIT 2022-12-17: Minor language correction. 
 Developing Mozilla addons has been rewarding and fun. Participating to the Mozilla project (very modestly) has been a great experience. In my opinion, Mozilla is unique. It’s an important, open and non-profit tech company. It builds cutting-edge technology, and brings together high-profile developers. It has praiseworthy goals . And…
I tried recently to launch automatically some user programs with systemd , instead of say .xprofile . 
 I also happen to share some dotfiles across multiple users/environments. So I went ahead and created a /path/to/dotfiles/.config/systemd/user/afuse.service . But when creating a link in ~/.config/systemd/user to this file and enabling it, I got:
EDIT : emacs-25 is patched accordingly . 
 Using desktop-save-mode in emacs , I usually end up with tens and tens of open buffers after a long period, 100+ this time. 
 When cleaning up a bit, I want to select a region of buffers, and then mark them for deletion. Unfortunately, and although there is a vast variety of methods for selecting buffers in ibuffer , there is no such shortcut.
I’ve been putting encryption in place for sensitive data in our Salt configuration lately. In other words avoid storing passwords and private SSH keys in clear text in a git repository, but store them encrypted instead. 
 While doing so I came across the Intothesaltmine guide , and tried to use an encrypted key, which leads to use a gpg-agent in conjunction with Salt.
Today I had to setup a hastebin instance on a server where etherpad-lite was already running. 
 
 I had already written a basic init.d script for the RedHat server, inspired by a Fedora template . The problem was that it was now catching the other node instance:
 
 # ps aux | grep node 
 pastebin 3194 0.0 0.1 643752 28080 ? Sl Dec12 0:00 /soft/bin/node server.js
 etherpad…
I recently followed the functional programming in Scala course on Coursera. 
 The session ran during about two months. There are almost 2 hours lectures in videos, and an assignment every week. It’s said to represent 5-7 hours of work every week. It turned out to be a bit more for me, I’d say around 10 hours/week. Which means it’s sufficient an amount of time, that you need…
The problem with 
 36 * * * * pgrep -f 'puppetd' > /dev/null 2>& 1 || /etc/init.d/puppet restart
 is that the pgrep matches /bin/sh -c pgrep -f puppetd … when the whole line is launched by cron. 
 You need to use a more complex pattern like ^ruby.*/puppetd :
I couldn’t find any receipt to clone a WordPress blog. A user needed to have a test copy of his blog. 
 Here is mine. I hope it can be useful to others.

 While starting to write a completion function for systemctl, I found out there was already an existing completion script for bash shipped with systemd: systemctl-bash-completion.sh. I tried to use it in zsh (using bashcompinit) but encountered errors. So I finished my zsh completion function, now inspired from _yum …and bash-completion.sh. It should be reasonably helpful. Comments are very…

 Jazz trumpet player: Official site | SoundCloud 
 Software engineering: Github | LeadDev 
 Dancer: Open Studio 
 Berlin 💚 
 More