2026-25
A new spindle engine
The spindle codebase now includes a new engine, microvm.
This engine utilizes qemu's microVMs as its isolation layer,
as opposed to containers in nixery. Under the hood, it is
still very nix-heavy, but that is not too apparent in the
user-facing components:
Packages are still specified as usual:
dependencies:
- pnpm
- github:nixos/nixpkgs#hello
You can specify services too:
services:
postgresql:
enable: true
ensureDatabases: ["spindle-workflow"]
ensureUsers:
- name: spindle-workflow
ensureDBOwnership: true
The syntax here are just translations of nix module specifications into YAML. They are passed straight through to the underlying nixos base image's configuration. Unlike approaches taken by other CI offerrings, this does not require a sidecar VM or contianer for services!
You can build docker containers inside the VM, by setting
the virtualization field:
virtualisation:
docker: true
steps:
- name: build
command: |
docker build ...
Finally, you can use non-nixos images! Namely, alpine:
image: alpine
steps:
- name: install golang
command: apk add go
The nixery-based engine aimed to solve the following goals: provide some form of isolation (containers), and cache some part of each workflow (dependencies) to make successful runs fast. The two concerns were not separated too well however, and the microvm engine addresses that quite well.
Feedback on the new engine is most welcome, you can already
poke around with it by setting your repository's runner to
spindle.tangled.sh and setting the engine to microvm.
You can find some common workflow setups in the recipes
section
of the docs. Almost all existing nixery-based workflow files
are compatible with the microvm based engine.
Decorating my site with ornaments
I found myself once again on a flight with not much to do, so loaded up the interactive pattern viewer on https://djr.com/fern to generate a pattern for my site. Fern Ornaments is a regular font that overloads the Basic ASCII section with some pretty ornaments:

The pattern on the homepage of this site is what I ended up with! I do wonder if overloading the Basic ASCII section might interact poorly with screen readers, Private Use Area seems more appropriate.