What is passcod working on now?


A reimplementation of the RF propagation model “ITM”

How I’m doing that / Some details:

Taking the original Fortran source and notes and memos etc and translating that in Rust, then re-referencing everything to the documents, changing all function and variable names to things that are legible and make sense, and adding lots of high-quality inline documentation. The end goal being to have a safe implementation that can be read entirely standalone to understand what the algorithm is doing. The secondary goal is to reimplement a subset of what the SPLAT! RF program does but more modern, e.g. taking in GDAL data as terrain input, outputting things in a more standard format, supporting arbitrary resolutions rather than hardcoding only two modes, and being able to be parallelisable.


Reviewing my Twitter blocklist

How I’m doing that / Some details:

Wrote a couple scripts to import it into a Postgres database, and then tried to go through.

Where I’m up to now:

Kinda gave up, but still want to keep at it... maybe later


(Roughly) quarterly updates for patrons/sponsors/followers

How I’m doing that / Some details:

Monthly didn't work, Yearly is too long, and I needed something to give financial supporters.


A batch of honeymead

How I’m doing that / Some details:

Mead is a pretty simple recipe, really: take honey, add water, optionally add something to help yeasting (I used pears), add six to twenty-four months of time. This batch follows a much earlier attempt in 2014.


A rewrite of rogare in Rust

How I’m doing that / Some details:

I want to get locales in there as well as voice, and the Ruby implementation just isn't solid enough for this kind of thing. There’s also a lot of cruft in rogare I’d like to avoid, bringing over only the Good Parts.

Where I’m up to now:

Pondering a refactor dumping the serenity framework for a setup where the entire command space is a single LALRPOP grammar, to both simplify development and add more power, such as typo resolution and expressive aliasing.


A store for queues

How I’m doing that / Some details:

I sketched this over a few days and the readme has more but I’m not entirely sure where its heart lies yet. It’s a low-level store focused around medium-scale queues with some added advanced features. Nothing too terribly exciting, but is being written to enable more stuff higher up.


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:

Lost interest

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.


Cargo Watch and Watchexec maintenance and development

How I’m doing that / Some details:

Triage and reviewing pull requests and cleaning up and implementing features and the works


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.


“Crackfic-taken-seriously in the form of an open-source project readme,” the configuration library.

How I’m doing that / Some details:

It started as a redesign of config-rs. Then I started adding stuff. Then I abandoned all pretense of this being at all realistic and started just going wild. Then I figured I might as well make document it all so thoroughly and consistently it could actually plausibly have an implementation. That's where I'm at. Maybe when I'm done I'll write the code. Or maybe not.

Where I’m up to now:

Starting on the configuration sources section


Keycasting: the return! Metal edition

How I’m doing that / Some details:

I’m very much not doing my own metal casting, thank you. Instead I’ll be navigating casting wax and foundries for a very small run of a very small piece. From cursory research, I ideally want to cast some copies in beeswax, send that to a foundry that can pour Nickel Silver (or brass as a fallback), and then get my keys!

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 various unsorted scenes


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:

I made a kinda sorta 50% implementation named Gearbox in Node.js for work, and I made plans for a custom queueing store based on Sled, as well as nailed down the necessary features of the core job queue.


A new library for interned path segments and paths with structural sharing.

How I’m doing that / Some details:

String interning is actually a few different programming techniques, which can go from static string interning, where a bunch of strings that will be used by the application are constants — generally this is on a larger and more systematic scale than defining a bunch of consts — to language-level (or VM-level) interning, like Ruby symbols which only exist once in the program, to fully-dynamic interning with a little runtime. IntPath is that last one. Or rather, IntSeg is that last one. IntSeg is based on a global concurrent hash map, which is initialised on program start. An IntSeg, an interned (path) segment, is an OsString that is stored uniquely but weakly inside the map, and where every “actual” copy is actually a strong pointer to that interned value. So every segment is only stored once, no matter where it’s created or accessed from, and unused segments take up no (actually some, but very little) space. Then IntPaths are built on top of that as, essentially, a Vec of IntSeg. That makes paths /a/b/c and /a/b/d use up only 4 path segments, instead of six. And 100 absolute paths with a common prefix of 10 segments and a unique suffix of 1 segment will only use 110 segments total. Additionally, segments don’t care about their position in the string, so the path /a/a/a/a/a uses one segment. There’s more, but that’s the general idea.


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.


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.


A little bit of custom furniture to support four restaurant-style glass hanger racks without damaging anything in my rented appartment.

How I’m doing that / Some details:

I designed it over a Saturday, went to buy the supplies that evening, built and assembled it the next day, then spent two evenings painting it.


A PR to Rust’s stdlib

How I’m doing that / Some details:

Someone in the community discord wanted a feature and I was like “hey, why not try to implement it, that could be fun” (based on an existing but obsoleted PR).


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:

The btrfs stuff added too many constraints; abandoned.

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:

I abandoned Notify and then gave it over to another team.

Notify Next Generation

Experiments and development for Notify’s next generation.

Where I’m up to now:

I abandoned Notify and then gave it over to another team.


Learning Irish

How I’m doing that / Some details:

Duolingo, fanfic, etc.


Putting some new fabric on the seat cushions

How I’m doing that / Some details:

I bought six chairs for pretty cheap, mostly because they're dirty and uncleanable. But the chairs themselves are okay, if not very good quality (probably made from recycled wood originally). So I'm going to reupholster them.

Where I’m up to now:

Finish date approximate


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.

In the end, I decided that instead of a public service, I would add tools to omelette. The cryptographic challenge is interesting, but the best way to keep data private is to not actually put it on someone else’s cloud, really.


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 or two. In the end I decided there’s other tools and projects that do that and I’m not going to spend more time on it.


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.