What am I working on now?


A utility to swap two files atomically, or as close as

How I’m doing that / Some details:

On Linux 3.15+, the renameat2 call. On macOS, the exchangedata call. On Windows that supports Transactional NTFS, that. On WSL2 (potentially), the renameat2 call. On other platforms, a fallback method using memory mapping for small files, hardlinks otherwise, and renaming as a last resort.


A deploy tool / experiment using Btrfs volume archives.

How I’m doing that / Some details:

The actual deploy tool is a client/server/agent suite with some neat features but aiming to be extremely light on resources, at least compared to many other tools I’ve tried. But the core underpinning, the main idea, comes from playing around with btrfs volumes/snapshots and the export/import commands on the tool. Essentially you can ask for an export of a volume, and you can ask for an export of a volume based on another volume, then on import, which can be on a completely different filesystem/disk/machine, as long as you have that same base volume, you can restore. So you can have filesystem-level diff archives on demand, with no awareness from the application being built/deployed, and everything is already in standard linux tools. It just needs some wrapping and managing.

Where I’m up to now:

Proper implementation on pause while waiting for some dependencies to mature, but a proofing of the core technology is getting built and will be in production soon.


An everything-encrypted database and service of reasons for actions on twitter.

How I’m doing that / Some details:

This is both about this frustration with not having reasons for following, or blocking, or not following, or muting, etc... accounts on Twitter, and a challenge to design and write a service with the most amount of encryption while still being able to offer something that works. Really, the philosophy is that I don’t want to be able, as an admin operator, to read any of the reasons, or any of the people affected by the reasons, or even if possible, the social media usernames of the people using the service, at least not without some willful modifications to the service, or a trace on the process, something like that. Someone obtaining an entire copy of the database should not be able to determine anything beyond the number of users, and the number of reasons. Someone otaining that plus either the source or the binary of the service should also have that same amount of access. That means layering and chaining, and careful design thought, especially as putting all user data in one encrypted blob is not going to work efficiently with potentially tens or hundred of thousands of reasons per. Making data queryable without looking inside is an interesting challenge.

Where I’m up to now:

On pause as I wait for dependencies to mature.


A job system for a wonderful world.

How I’m doing that / Some details:

This is about building a job system that offers rich workflow potential and excellent monitoring/auditability while also being very lightweight. Scalability and partition-tolerance are secondary concerns at the moment. Inspired by Gearman, but aiming to be a superset.

Where I’m up to now:

On pause while waiting for stable async/await in Rust.


A Discord bot for a local writer/nanowrimo group.

How I’m doing that / Some details:

It’s a custom Ruby bot with its own custom framework. Originally it grew from an IRC bot using the Cinch framework, but when the community moved to Discord the framework got adapted, and then refactored. The bot has a low key sassy attitude, provides a bunch of common small tools (like dice, random pickers and choosers, writing prompts, etc), but also has a pretty good “wordwar” implementation, and its prized jewel: a name generator seeded from some 150 000 actual names from various sources.

Where I’m up to now:

Mostly just doing maintenance.


Learning Irish

How I’m doing that / Some details:

Duolingo, fanfic, etc.

percy w.: witch

A Harry Potter fanfic centered around Percy Weasley

How I’m doing that / Some details:

A bit crack-taken-seriously, a bit riff on badass/lazy tropes, a bit inspired by Agnes Nutter: Witch, a bit taken with the utter madness of some Hobbit fics I’ve read recently. It has the potential to be fairly funny even if I’m being a downer and writing super-sad character development up front (because Percy was a child during the wizarding war, and that can’t have been all fucking sunny days and happy occasions).

Where I’m up to now:

Writing chapter 3.

Notify Next Generation

Experiments and development for Notify’s next generation.

Earthquake Sky

An experimental art piece representing a map of all earthquakes around Aotearoa like a star atlas.

How I’m doing that / Some details:

The substrate is an A0 piece of white cardboard/foamboard. On it I'm placing hundreds of dots of varying sizes using clear nail polish, in the rough locations of all earthquakes since 1900 (as much data as is available) in the land and sea around Aotearoa. Once done, I will splash blue inks over the board, then wash lightly. The result should be that where the polish is, the ink slides off, resulting in a dark blue background with white dots peeking out. Ultimately, this is expected to be an experience both near and afar, with the polish providing a tactile feel.

Where I’m up to now:

Picked it back up after many months, starting on the mass concentrations of the North part of the image.


A personal finance tool for the budgetless.

How I’m doing that / Some details:

Or, rather, a finance/budgetting tool for me, who absolutely doesn’t work with budgets or comprehensive ledgers or putting my household into Xero or anything like that. I’ve tried. I’ve failed. I don’t really need a tool that will track things on a day to day basis, and I don’t need a tool to help me save. But I do need a tool that understands personal finance: incomes, expenses, tax; costs that are always the same on some kind of schedule, costs that are within a range on average, one-off purchases, etc. I’m interested in knowing how much I’m putting away every month, quarter, year; in seeing how much the model differs from the reality; and in having a bird’s eye view of everything I gain and spend, normalised and denormalised, graphed, smoothed, and averaged, to be used as a tool to make informed decisions about the future. In the end, this is what I’m trying for: a tool to empower.

Where I’m up to now:

Drafting a first prototype.

notify 5.0

The next release of the Notify file monitor library.

How I’m doing that / Some details:

I’m refactoring: the event system (using the new system from the next branch and by this same act unifying the raw and debounced events), configuration (introducing runtime config, moving some notify features to opt-in instead of being always on), some naming (“raw” mode is not very descriptive in hindsight, so I’m calling it “immediate” mode now).

Where I’m up to now:

Nearly done the first pass of adapting the debouncing to the new events.


Updating Omelette’s archive importer for the new format

How I’m doing that / Some details:

Omelette is a suite of personal archiving tools for tweets. The current version reads the old “slim” archive format, with only few details... I plan to upgrade that tool to the “full” archive format, which is reported to contain a lot more details.

Where I’m up to now:

Requested my archive in the new format, waiting for it to get ready.


A browser extension companion to track and manage the fanfic I read.

How I’m doing that / Some details:

The idea so far is to track both what I want to read, what I’m reading, following, etc, all with a minimal amount of interactions. Simply visiting a fanfic page should track it, and some work with the Intersection Observer API should yield a pretty accurate detection of actively reading a fic vs just having it open or looking through it without really reading.

Where I’m up to now:

Scaffolding the UI and trying to figure out the data layer.


Setting up an IKEA table I’d ordered a while ago.

How I’m doing that / Some details:

It’s an IKEA thing. How hard can it be? cue laugh track


A small tool to show off what I’m working on.

How I’m doing that / Some details:

It’s a Node script that creates a small static site from a TOML file. On push of its git repo, a Travis build kicks off, and pushes the result to its gh_pages branch, which updates the site.


Adorning my car with a line of rainbow

How I’m doing that / Some details:

The original idea was to add a decoration that would distract from the various scratches and DIY repairs on my car. I started by calculating the length I’d need, then designing and ordering about five metres of rainbow “bumper” stickers in 30cm lengths. Then I mocked up the shape of the line with masking tape, and sat on it for a few days. In the end I went with a diagonal line rather than horizontal. It needed lots of adjustments to look straight from a distance, while dealing with the reality of curved surfaces. Once I received the stickers, careful application took three afternoons.


Repairing a deep scratch on my car

How I’m doing that / Some details:

DIY: some resin to fill the gap, lots of sanding, applying colour, more sanding, clear coats, some buffing.


My house key is uncopyable crap. I tried to make my own.

How I’m doing that / Some details:

Experimenting using epoxy casting in silicon moulds. In the end it wasn’t strong enough for daily use, but I learned lots and even managed to produce something okay!


A suite of personal archiving tools for tweets.


A simple certificate tool

How I’m doing that / Some details:

Mostly just binding to OpenSSL and creating/inspecting certificates with the least user interaction possible. There are other tools that take a similar approach but they either do too little (only self-signed certs, no self-CA-signed ones) or too much (install themselves by default into various system certificate stores). Plus it was an interesting way to learn more about the OpenSSL APIs and certificates.