Your browser contains Google DRM

"Web Environment Integrity" is a Google euphemism for a DRM that is designed to prevent ad-blocking. In support of an open web, this website does not function with this DRM. Please install a browser such as Firefox that respects your freedom and supports ad blockers.

Please note that although other browsers such as Vivaldi, Opera, Microsoft Edge, Brave, and Chromium exist, they are all built from the same Google Chromium codebase and all inherit the problems of Google's web dominance. The only real options outside of Chrome are Firefox and Safari.


I'm an internet pinkliom with a fondness for types. Find me at the local coffee shop writing #rust and sometimes #elm. I also enjoy single-board computers. I run my services on a small cluster of boards from #pine64 out of my apartment over a residential internet connection. If this page took a while to load, that might be why.

I have many characters, most of whom are some kind of cat. Because of this, I have many names as well. People call me asonix (my username on most platforms), Aode (the pinkliom himself), Tavi, and Arlo, although there's more names that are less common.

Notable Projects


pict-rs on Forgejo

pict-rs is a simple image hosting service. It started in 2020 as a replacement for #pictshare in #Lemmy, a federated reddit alternative. While I have contributed to Lemmy in the past, and pict-rs grew out of a need for a better image hosting solution, pict-rs is an independent project that I maintain for use outside of Lemmy. One of my goals is to build a federated art gallery platform, and having solid image hosting is an important part of that goal.

The current stable series for pict-rs is 0.4, although 0.5 is well in development at this point. Plans for the 0.5 release include enabling high-availability with a postgres backend. The current backend for metadata is an embedded key-value store called #sled. Sled is not going away for pict-rs, but supporting multiple metadata repositories has been a goal I've been working towards for a while.


AodeRelay on Forgejo

AodeRelay was my first real fediverse project. It's an #ActivityPub server whose purpose is to forward posts between other subscribed servers. I built this initially to learn more about ActivityPub, while also contributing to the greater ActivityPub ecosystem. My own instance of this relay forwards about 7 messages every minute, which doesn't seem like much, but it translates to 700 outbound requests per minute (one for each subscribed server for each message), totalling around 1 million outbound requests per day. It does this with a limit of two CPUs on one of my single-board computers.

Safe Async

Safe Async on Forgejo

Safe Async is a collection of components that make up a full asynchronous runtime for rust, made without any unsafe code. This is more a demonstration of possibility rather than an attempt to build a real production-grade runtime. Safe Async achieves this by relying on #rustix, a library that provides safe bindings to posix APIs like poll.

Safe Async is made of multiple components. At the lowest level, the polldance library provides an abstraction for registering and deregistering IO sources and Timers from an underlying polling mechanism. Next up from that is foxtrot, a library that uses polldance to create and wake IO futures with polldance. Up from there are jitterbug and bachata, which are multithreaded and single-threaded async executors that can be driven as futures on another runtime. And finally, there's jive. A full async runtime that combines the above libraries to provide a unified API for spawning and running tasks with IO.

Safe Async also provides a number of utilities that are useful for working in async rust, like an implementation of select, join, join-all, notify, and mpsc. Simple integrations are provided with trust-dns (jive-dns) for asynchronous DNS resolution and hyper (hyperjive) for asynchronous HTTP clients and servers.


VectorDB on Forgejo

VectorDB is a simple database for storing and searching vectors in Rust, backed by #redb, an embedded key-value store for rust (similar to sled). My goal in building VectorDB was to implement reverse image search functionality for pict-rs, or maybe as a standalone application that works with pict-rs. While the database itself is pretty quick for finding similar vectors, actually computing those vectors using imagemagick takes a while. For this reason I am not currently pursuing reverse image search.

Various Libraries

In addition to the applications mentioned above, I maintain a few notable libraries:

  • activitystreams, a library for parsing and generating valid ActivityStreams JSON objects
  • actix-form-data, a library for handling uploaded multipart/formdata in actix-web
  • actix-webfinger, a library for making and serving requests for webfinger in actix-web
  • actix-ws, a library for managing websocket connections in actix-web without the actix actor framework
  • background-jobs, a library for managing retryable tasks that run in the background of an application
  • http-signature-normalization, a library implementing the HTTP Signatures IETF draft
  • tracing-awc, a library for adding traces to the awc HTTP client library

These libraries are mostly in service of building federated web applications, although the actix-ws library was created just to see if I could.