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.