This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans. Current status Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at callisto.liw.fi . Radicle CI use metrics I now track Radicle CI use by counting job COBs that reach a public seed node run by Adrian. The data…
The Software Freedom Conservancy has yesterday published recommendations for using large language models / generative AI for free and open source contributions. It's better than I thought it was, based on initial reactions from my peers, but I am disappointed. They make 14 recommendations. I have notes on each, with my summary. I won't quote the whole thing, but you can refer to the original to…
This month in Radicle CI, June 2026 This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans. Current status Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at callisto.liw.fi . Radicle CI use metrics I now track Radicle CI use by counting job COBs that reach a public…
This month in Radicle CI, May 2026 This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans. Current status Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at callisto.liw.fi . Radicle CI use metrics I now track Radicle CI use by counting job COBs that reach a public…
This month in Radicle CI, April 2026 This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans. Current status Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at https://callisto.liw.fi/ . Radicle CI use metrics I now track Radicle CI use by counting job COBs that reach…
This month in Radicle CI, March 2026 This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans. Current status Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at https://callisto.liw.fi/ . Radicle CI use metrics I now track Radicle CI use by counting job COBs that reach…
My computing life has often been difficult and complicated. I've gone against the mainstream for most of it. In the very early 1990s I chose to use Linux, when it was very new and have stuck with it. I could've chosen MS-DOS and then Windows, or a Mac, and had the benefit of more things working more of the time. It would have been easier to collaborate with people. It would have been easier to do…
A Rust function that takes a string argument might look like this: fn foo(s: &str) { ... } This works well, if the the function merely uses the string. If the string is needed after the function returns, e.g., because it's stored somewhere, either the function needs to manage lifetimes, or make a copy. Correctly managed lifetimes are good for avoiding unnecessary copies, but they can be tricky to…
This month in Radicle CI, 2026-02 This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans. Current status Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at https://callisto.liw.fi/ . Issues and patches As of 2026-02-17. Repository Open issues Oldest issue Open…
Goal Last time I added positional parameters to directives. Since then I've added a type to represent shortcuts. The goal for today is to add metadata to the Site type, which will include site shortcuts. Plan Add a SiteMetadata type, initially empty, and corresponding field to Site . Change directives so they get a reference to Site so that they have a way to update site metadata. Add shortcuts to…
Goal Last time I tried, but failed, to implement the shortcut directive. I failed, because I was trying to change many things at a time. One of the problems was that riki currently assumes parameters to directives are always named. That is not actually true for all directives, including shortcut . My goal today is to change riki so that parameters can be named without a value, valued without a…
This month in Radicle CI, 2026-01 This is a monthly newsletter about the current state of Radicle CI, what has happened recently, and near future plans. Current status Radicle CI is in production use. There are several CI nodes, and Lars runs a public one for open source Rust projects at https://callisto.liw.fi/ . After the Ambient release in December, the Ambient adapter for Radicle CI needs a…
Goal My goal for today is to implement the shortcut directive from ikiwiki in riki. The plugin allows the page shortcuts in the site define shortcuts that can be used on page. A shortcut is defined like this: [[!shortuct wikpedia https://en.wikipedia.org/wiki/%W]] [[!wikipedia War_of_1812]] The shortcut directive defines a new directive, which can be invoked as if it were a normal directive. The…
Goal I had code and test for internal linking. I rewrote the code to be in a Site type, but lost the tests, as they were hard to add. Now I don't know if my code works. Actually, I know there's problem. The goal for today is to add tests for internal linking, following the specification in doc/linking.md . Plan I have helper functions to produce candidate pages for resolving a link on a page. Add…
I'm making progress with riki , although very slowly. It's a program I'd really like to have, but it's so far down my priorities that I don't work on it often. But I'm currently on holiday and have more degrees of freedom. Here are notes from today's develoment session. Goal My goal today is to make riki be able to render a simple site. I want this so that I can start trying riki on my various…
sartorial (comparative more sartorial , superlative most sartorial ) (not comparable) Of or relating to the tailoring of clothing. Synonym: vestiary Of or relating to the quality of dress. In his smart suit Jacob was by far the most sartorial of our party. (anatomy) Of or relating to the sartorius muscle. (From Wiktionary ) Three years ago over the Christmas holidays I embarked on a sartorial…
This is a summary of the current state of Radicle CI and near future plans. The goal is to make it a monthly newsletter. Radicle is an open source, peer-to-peer code collaboration stack built on Git. Unlike centralized code hosting platforms, there is no single entity controlling the network. Repositories are replicated across peers in a decentralized manner, and users are in full control of their…
This blog post is a reaction to a blog post on Stopping bad guys . (I've shortened the title. Please follow link to read original.) I write open source software for the sake of humanity. I want to live off my work, certainly, but more importantly, I want the software I build to make life better for other people in the future. I don't think open source developers should use licenses to combat bad…
Ambient CI is the CI engine I'm building for myself, and tentatively for Radicle CI . I last blogged about it as a project over a year ago . Since then, the focus and goal of the project has crystallized in my head as: You should be able to run CI for other people safely and securely, without much effort. We as software developers should be able to share our computing resources with each other to…
I've just released version 0.6.0 for sopass , my command line password manager that I use instead of pass . Version 0.6.0, released 2025-10-31 If I were of the American persuasion, this would be a spooky release. But I'm not, so it's a comfy release that doesn't scare anyone. The sopass value generate command generates a new random value for a name. There have also been other changes. A deb…
I've spent most Sundays for the past half a year implementing Obnam 3, the third generation of my backup program. I've posted a blog post of each three-hour session on the Obnam blog . It's way too much detail for anyone not passionately interested in this project. Here is a summary of what I've done. There is also an appeal for help. I've implemented the lowermost storage layer of storing…
Every program I write is in some sense a command line program, even if it transmogrifies itself into a server process or an interactive terminal user interface. It starts by doing the kinds of things a Unix command line program does: it parses the command line, maybe loads some configuration files, maybe runs some other programs. I've made a crate, clingwrap , which makes a couple of the common…
Last year I wrote a command line password manager, after deciding I didn't like pass any more, and didn't like anything else I found, either. It's called sopass . I've switched over to sopass entirely. I'm happy with it, for my simple needs. I've been thinking a lot about cross-device and group use. pass supports storing the encrypted secrets in Git and syncing them across computers, even between…
It is common to suggest to open source projects that they should ask for donations to fund development. My understanding is that this almost never works: very, very few people donate. I have other reasons to not do that. I live in Finland. We have a law that requires prior permission from the police to appeal to the public for donations. That's why I don't ask for donations. I also work full time,…
Summary: I'd like help maintaining vmdb2 , my software for creating virtual machine images with Debian installed. In 2011 I needed to create six similar Debian virtual machines, differing in Debian release and computer architecture. This was tedious, and so it needed to be automated. I wrote vmdebootstrap , which worked OK for a few years, but was not very flexible. It had a fixed sequence of…
I develop CI systems as a hobby and for work. I want to gain experience in running what I've built, by running a service for others. I've set up a Radicle CI instance with my Ambient engine to run CI for open source Rust projects that have a Radicle repository. See callisto.liw.fi . The offer: My server runs CI for your project for free. You get feedback on whether your project builds, and its…
Two of the original ideas about Unix is that each program should do one thing and that programs should be able to be combine so they consume each others' output. This led to the convention and tradition that Unix command line programs produce output that's relatively easy for other programs to parse. In practice, this meant that output was line based, one record per line, and columns on a line…
I've been using the Debian Linux distribution since the mid-1990s. I still use it. I had a brief exploration of Linux distributions, early on. It was brief partly, because there were so few of them. My first Linux installation was by Linus, to develop and test the installation method. He'd never installed Linux, because it grew on his PC on top of an existing Minix installation. He used my PC to…
I'm building riki, my partial ikiwiki clone, from the bottom up. My previous two attempt have been more top down. I'm now thining that for this project at least it makes sense to first build the fundamental building blocks that I know I'll be needing, and do the higher level logic on top of that later. The first building block is a way to represent page names, and to resolve references from one…
I'm going to try to re-implement part of ikiwiki . It's my third attempt, so the likelihood of failure is high. I'll blog about this for general amusements. "Software development as a comedic performance", if you will. The name of the new program is riki : it's part of ikiwiki and it's written in Rust. Motivation I've been using ikiwiki for wikis, web sites, and blogs for about two decades. These…
(This is a re-post to my own blog of the article we just posted on the Radicle blog .) In this blog post I show how I use Radicle and its CI support for my own software development. I show how I start a project, add it to Radicle, add CI support for it, and manage patches and issues. I have been working full time on Radicle CI for a couple of years now. All my personal Git repositories are hosted…
Here's a short description how I create command line programs in the Rust language. This post is something I can point people at when they ask questions. It will also inevitably provoke people to tell me of better ways. I write command line programs often, and these days mostly in Rust. By often I mean at least one per week. They're usually throwaway experiments: I usually start with cargo init…
In the hope that it helps anyone who hesitates on what dock to get for their Framework laptop: I have a 13-inch Framework AMD laptop, bought in 2024. It has two full USB4 ports (the rear extension module bays). It is not advertised as Thunderbolt, but seems to work. I bought an HP Thunderbolt4 Dock G4, and it works fine. I have two 4K monitors at 60 Hz connected to the dock, and both seem to work…
Debian is a large, complex operating system, and a huge open source project. It's thirty years old now. To many people, some of its aspects are weird. Most such things have a good reason, but it can be hard to find out what it is. This is an attempt to answer some such questions, without being a detailed history of the project. What Debian wants to be Debian wants to be a high-quality, secure…
When I wrote Why is Debian the way it is? , a year and a half ago, I was asked to also cover why Debian changes the software it packages. Here's a brief list of examples of why that happens: Software in Debian needs to follow certain policies as set by Debian over the years, and documented in the Debian Policy Manual . These are mostly mundane things like system wide configuration being in /etc ,…
I was interviewed on the Open Source Security podcast about Ambient CI and Radicle . The episode has a nice write-up, too. You can comment on this on the fediverse .
TL;DR I'm going to start implementing bits of backup software again. It may never become a usable program, certainly not in the near future, but it might if you help. Obnam 1, 2004-2017 In 2004 I started implementing my first backup program. I'd written various shell scripts around tar to make and restore backups to floppies and a floppy tape drive, but those weren't serious projects. I did not…
Docker ) is very popular software to build Linux container images and running software in them. I don't like it. Podman is a re-implementation of the concept, command line interface, and file formats that is very close to identical to Docker. I don't like that either. I know I'm in the minority about this, and that's OK. I'm not trying to get anyone else to stop using it, but I avoid it myself.…
This post is part of a series on backup software implementation. See the backup-impl tag for a list of all posts in the series. This is another grab bag of random topics. Snapshots vs deltas It is common to talk about "full backups" that are complete self-standing copy of the data versus "incremental backup" that only has the changes since the previous backup. Being someone who has implemented…
Solved: this works: -net nic,model=virtio -net user My goal I want to run a Debian cloud image with qemu-system-x86_64 so that the guest operating system has network access using user mode networking. Context I want to use this as part of my CI system (Ambient). I would prefer to not use TUN/TAP networking, or to set up a bridge on the host. I'm aware that user mode networking with QEMU is…
This post is part of a series on backup software implementation. See the backup-impl tag for a list of all posts in the series. For this part I have not been able to allocate enough time or energy to do deep thinking, so I'm going to list some ideas that I think are important. I may return to them later. Content sensitive chunking My understanding is that both Borg backup and Restic split files…
This post is part of a series on backup software implementation. See the backup-impl tag for a list of all posts in the series. Encrypting backups I want my backups to be encrypted at rest so that if someone gains access to the backup storage they can't see my data. I also want my backups to be signed so that I can trust the data I restore is the data I backed up. This is also called…
You may have seen the following error message on a Unix system: No such file or directory This comes from the Unix standard library for the C language. It's the textual representation of errno value ENOENT . errno is a global variable provided by the C standard library variable for the error code specifying the cause of failure for a system call. In Unix, when a program asks the operating system…
This post is part of a series on backup software implementation. See the backup-impl tag for a list of all posts in the series. Export and import of backups If one cares about the longevity of backed up data, it seems sensible to try to worry about the inevitable situation when fundamental decisions made for existing backups need to be changed: What backup software is used? How is data split into…
This post is part of a series on backup software implementation. See the backup-impl tag for a list of all posts in the series. Updates on previous points I had some useful feedback to my previous two posts. Hash function Ed Davies asked why the hash function needs to be cryptographically secure. I realized that I mixed up two things: accidental collisions, which doesn't need security, and…
I've made a new CI engine lets me run CI on untrusted code without having to worry. I call it Ambient , and it's quite awful to use, but works for me. The web site is also quite horrifyingly ugly. I'm a hacker, I don't understand marketing. Not sure if Ambient is of much interest to anyone else, but I would welcome help in making it nicer. There's a lot of low hanging fruit, I'm sure. Ambient runs…
This post is part of a series on backup software implementation. See the backup-impl tag for a list of all posts in the series. Very high level architectural assumptions The following assumptions of the software architecture of a backup system are less firmly set in stone than the table stakes in my first post . However, having spent two decades thinking about this, they make sense to me. If you…
Background I am a twice failed backup software developer. I'm not currently intending to write new backup software, but I keep thinking about the technical problems in implementing backup software. This is a first in a series of blog posts about that. In 2004 I set out to implement a new program for doing backups. This eventually became known as "Obnam version 1". (It's initial name was "backup…
I've bought a new laptop to more efficiently work when I'm away from home. It's a Framework 13 AMD , with plenty of RAM and storage. Some first impressions: I bought the DIY version, which meant some assemble was required. I've built desktop PCs from parts and I wasn't scared. The laptop came with the necessary screwdriver, and the Framework website has an excellent guide . With barely a quiver, I…
Computer programmers create computer programs, and somehow people get it and use it. This can be a complicated, thorny process, sometimes, and it can involve many people. I identify at least the following roles and responsibilities in this process. Note that that one person may have several roles or responsibilities. In the simplest extreme, one person makes software for themselves; in the other…