Hello! I'm
Mark Raynsford.
I'm interested in computer science, electronics, industrial design, the arts... In particular, the list of
crimes and punishments include:
- I enjoy logic and the formal specification and verification of software and protocols. Examples here may include: calino, medrina, cedarbridge, aurantium, etc.
- I'm very interested in software correctness, and I try to apply lessons learned from functional programming and languages with rich static type systems (in particular, languages with dependent types) to everyday programming tasks. I've written articles on this (such as the Type Tricks series). I tend to believe that wrapping an existing weakly-typed or error-prone API in a layer of strong types is time well-spent (jcanephora, jcoronado, etc).
- I work heavily with the Java programming language and have published hundreds of software packages written in Java. I am part of the Project Amber expert group at OpenJDK.
- I enjoy working with relational databases (PostgreSQL and SQLite in particular), have written many software packages that use them, and have also written software packages to manage them (schema versioning, etc). Examples here may include: cardant, darco, trasco, etc.
- I'm interested in the study of software modularity. I currently work with the Java platform module system, and have worked with other systems such as OSGi. According to a census of the Java module ecosystem, I seem to have the dubious honour of having published more Java modules than any other individual. I've also assisted numerous open source projects with respect to modularization.
- I maintain hundreds of active projects using the Apache Maven build system, and have written dozens of plugins for the system. I have used just about every C and Java build system in existence (including several that I developed), and Maven remains the one system out of all of them that I would consider sane, and the only one that can be relied upon for stable builds, year after year.
- I help build software that patrons are using to read library books all over North America. The same software has also been used in the past to deliver library books to schools in countries with limited access to education (Ethiopia, Papua New Guinea, etc).
- I have over a decade of experience with developing Android applications, and have maintained the appropriate levels of cynicism, loathing, and disgust throughout.
- I have over 25 years of experience working with and administering Unix-like operating systems (Linux, BSD, SunOS/Solaris, etc). I'm experienced at building aggressively partitioned and locked-down systems with mandatory access control (SELinux, in particular).
- I'm very interested in information security, and rigorously follow secure coding practices. I'm interested in building systems with a paranoid mindset that incorporate multiple layers of security, and are intended to be secure-by-design. Examples may include: idstore, dixmont, etc.
-
I maintain my own infrastructure for work and play on
real hardware
and
VPS hosting, and self-host
my own services extensively. I have a lot
of experience running
containerized workloads with Podman
and Docker, package my own software as OCI images, and have built tools such as Waxmill to manage virtual machines on the FreeBSD platform. I'm a proponent of dogfooding. - I appreciate software observability and typically integrate OpenTelemetry into my own software. I've built and maintained large monitoring setups with Grafana and Prometheus. In the process, I've discovered that there is almost nothing that cannot be transformed into a continuous signal and then used to interrupt your sleep at 4AM.
- I enjoy writing technical documentation and have designed many systems to facilitate the production of books and documents in formats that can be trusted to endure for decades at a time. The most recent example would be xstructural. I usually won't release software (with some exceptions) unless the documentation has been completed to a high standard.
- I'm interested in generative artificial intelligence for image generation, although currently remain deeply skeptical of the utility of large language models for most tasks. I've investigated tools and workflows for producing better images.
- I enjoy 3D rendering and design, and have produced numerous artistic (?) works using software such as Blender. I have, in the past, written 3D rendering engines. I have extensive experience with Vulkan and, unfortunately, OpenGL.
- In a past life, I worked with a lot of C, C++, and Ada. I no longer (frequently) wake up in a cold sweat.
- I make music despite the best efforts of the software industry to prevent it.
- I think the world would have been a lot better off had we not invented anti-aliasing.
- I maintain a blog where you can get more of this kind of thing in an even less coherent form.
Software
This section lists software projects for which I am (or have been) the primary author and/or maintainer. Projects are grouped somewhat arbitrarily, with the Core group being the projects that I'm actively maintaining on my own time. Other groups may indicate projects that that I'm either being paid to work on or have been paid to work on in the past. Other groups may be purely for historical interest.
Core
-
Interval trees.
-
Better ActiveMQ/Artemis OCI images.
-
Generic parser API specification.
-
Modular programmable synthesis.
-
Aurantium audio sample map format.
-
JMS → Matrix relay.
-
Functional streaming XML data extraction.
-
Unbound blocklist maintenance.
-
Body recomposition tools.
-
EPUB parser.
-
JavaFX waveform display component.
-
Nexus Pro staging repository API and command-line tool.
-
Strongly-specified 3D texture file format.
-
Directory-based Java Keystore.
-
Inventory server.
-
Cardant JavaFX GUI.
-
Generic, strongly-typed, versioned message protocol compiler.
-
ACME client.
-
Software changelogs.
-
Common Checkstyle rules for io7m projects.
-
Opinionated builds of Apache Artemis for small-scale deployments.
-
Customizable embossed CSS buttons.
-
Minimalist, opinionated database access.
-
Java FX rotary dials.
-
Dixmont Jackson extensions.
-
Sectional binary file format library.
-
JUnit 5 Podman container creation.
-
Ethernet MAC address generator.
-
Simple, reliable, automated S3 uploads for Android.
-
DNS server stress testing tool.
-
A JSR203 overlay binding filesystem.
-
AlertManager → Matrix Alert Relay.
-
BOSS GT-1000 controller.
-
Generic protocol negotiation algorithm.
-
Git repository mirroring tool.
-
RPC Client API Specification.
-
Identity server.
-
GUI for idstore.
-
Traffic generator for idstore.
-
Functions for converting to/from IEEE754 binary16 values.
-
Immutables.org annotations for io7m projects.
-
JavaFX piano component.
-
Java library to assist with musical analysis.
-
Java application directory etiquette.
-
Simple and fast contract checking.
-
Type-safe OpenAL wrapper.
-
Observable, functional, mutable variables.
-
Java bytestream structural I/O.
-
Camera implementations for 3D simulations.
-
Clean-room JCIP annotations.
-
Color space conversions.
-
Functions for specifying and converting between coordinate spaces.
-
Type-safe Vulkan wrapper.
-
Defer and combine exceptions.
-
Resumable HTTP downloader library.
-
Unicode codepoint reader.
-
Finite state machines.
-
Integer handling.
-
Interpolation functions.
-
Lexer types.
-
Collective try-with-resources.
-
Java implementation of the Murmur hash function.
-
Trivial mutable numbers.
-
Normalized fixed-point value functions.
-
SoundFont® I/O.
-
Java Wavefront OBJ parser.
-
Coffee-flavoured source code generation.
-
Mutable rose-tree types.
-
Simple text alignment algorithms.
-
An improved fork of the unmaintained jpplib package.
-
Typed property handling.
-
Unicode box drawing.
-
SQL pagination functions.
-
Range handling.
-
Immutable area types.
-
Audio sample buffer types.
-
Tiny JMS text message sender.
-
Serial number arithmetic.
-
Spatial data structures.
-
SPIR-V toolkit.
-
Java RIFF I/O.
-
S-expression parser.
-
OpenGL GUI library.
-
Vector/matrix math package.
-
Exception types for marking unreachable/unimplemented code.
-
Missing unsigned value conversions.
-
Type-safe HTTP servlet parameter validation.
-
JavaFX file chooser.
-
Hardened, boilerplate-free XML parsers.
-
Utility classes for XML string resources.
-
Kotlin port of the Abstand package.
-
Restricted dotted name specification.
-
Image caption management.
-
Minimalist transactional HTTP key/value store.
-
Role-based mandatory access control.
-
RFC 2045 MIME type parsing.
-
Tiny software project static site generator.
-
UI error dialogs.
-
Application packaging tools.
-
Platform-specific packaging for Northpike.
-
Packaged and shaded Amazon S3 SDK.
-
Percent-passing extension for JUnit 5 tests.
-
Ancestor POM for io7m projects.
-
Strict, opinionated, typed command-line argument parser.
-
Tiny embedded web server for unit testing.
-
RenderDoc FFM API.
-
Service directory.
-
Tiny japicmp command-line wrapper.
-
A specification for structured, user-facing error values.
-
Mysterious symbol generator.
-
Minimalist sequential mesh format.
-
A device location server.
-
Input/output stream progress tracking.
-
String Template Maven plugin.
-
Asset package system.
-
Plain text table rendering.
-
UI task recorder.
-
Podman Java interface.
-
JVM high-resolution timer bug workaround.
-
SQL database schema revision system.
-
JSON protocol for HTTP endpoint version announcements.
-
Binary protocol for HTTP endpoint version announcements.
-
Semantic versioning types.
-
Java NIO channel tools.
-
JUnit 5 JavaFX test harness.
-
XSLT implementation of the structural document language.
-
Repackaged xerial sqlite-jdbc binaries.
-
JUnit 5 cleaning service.
-
Tiny, modular, static blog generator.
-
Liveness checker.
Irradia Components
-
Minimalist Android date picker.
-
High-performance, low-allocation, type-safe, recovering stream JSON parser.
-
Tiny HTTP interface.
-
RFC2045 MIME type parsing.
-
OPDS 1.2 parser.
-
OPDS 2.0 parser.
-
Android-oriented lazy application service directory.
Adoptium
-
Java client for the AdoptOpenJDK API.
Immutables
-
A set of Immutables encodings for Vavr.
Library For All
-
Java EPUB size reduction API and tools.
-
LFA fork of SimplyE.
-
LFA Android launcher application.
-
OPDS feed retrieval tool.
-
A lightweight repository generator for the LFA Updater.
-
Application to download and install LFA applications.
LWJGL
-
LWJGL OSGi packages.
Palace Project
-
The Android client for The Palace Project.
-
The Palace audiobook player API.
-
The Palace continuous integration scripts.
-
The Palace DRM API.
-
The opinionated Palace HTTP client.
-
A replacement navigator for Readium 2.
-
The Palace WebPub parser.
End-Of-Life / Unmaintained
-
End-user automated junit test runner.
-
Java 9+ API analysis tool.
-
JCommander conventions for io7m projects.
-
Java runtime retrieval API and shell.
-
CoffeePick GUI.
-
Fossil → Git replayer.
-
Maven plugin to accumulate dependencies and artifacts.
-
Area types.
-
Auxiliary library.
-
Box types.
-
Generic cache algorithms.
-
Run-time configurable JVM sandboxing.
-
3D realtime skeletal animation package.
-
OpenGL plus static safety.
-
Apache Artemis message directory spooler.
-
JAXB COLLADA bindings.
-
Equality handling.
-
Java fixed-point code generator.
-
Server for synchronizing Fossil repositories.
-
Functional types.
-
FreeBSD jail management tools.
-
High-performance, memory and type-safe bindings to the JACK API.
-
Hierarchical logging.
-
Null pointer handling.
-
Minimalist, pure functional shading language.
-
OpenGL text renderer.
-
Fast, mutable, packed records for Java.
-
Trivial object pooling.
-
Apache Artemis → IRC relay bot.
-
Restricted class loader.
-
Rectangle packing algorithms.
-
Java implementation of the structural document language.
-
Generic timeline package.
-
Virtual filesystem.
-
Disk cataloguing tool.
-
Kotlin implementation of the structural document language.
-
Maven plugin for reporting on the modularization status of dependencies.
-
Continuous integration server.
-
Minimalist article schema and stylesheet.
-
OSGi bundle I/O and analysis.
-
OCI images for various projects.
-
Embeddable Java IRC server component.
-
An ultra-minimal single-file static web server.
-
Boring Maven site skin.
-
Matrix Homeserver invitation token service.
-
Aggressively minimalist deferred rendering system.
-
Aggressively minimalist second-generation deferred rendering system.
-
Tiny README generator.
-
Simple XSLT processing with Saxon.
-
Static podman/systemd service generator.
-
Shader management and preprocessing system.
-
Experimental, extensible OSGi-based IRC bot.
-
Unsupervised persistent queues.
-
FreeBSD BHyve manager.
Art
Works of questionable artistic merit.
-
Baguette (2016-10-18Z)
-
Corn (2016-10-19Z)
-
Pillow (2016-10-20Z)
-
Rabbit (2016-10-24Z)
-
Workbot (2016-10-29Z)
-
Chemriver (2017-08-31Z)
-
Pine (2017-09-08Z)
-
Unbolted Frontiers (2019-03-14Z)
-
Convenience (2019-09-07Z)
-
Dimenec (2019-12-30Z)
-
The Vanishing Path 1 (2020-03-19Z)
-
The Sleep Of The Engineer (2020-08-23Z)
-
Heavy Water Station (2020-09-11Z)
-
A 3D-printable shell for the MakerHawk OV5647 webcam module (2020-09-27Z)
-
Dust Yard (2021-04-04Z)
-
Calais (2022-04-08Z)
-
Turnwise Broadway (2022-04-08Z)
-
OpenPose rigs for Blender (2023-12-30Z)
-
Low carb 3D models for Stable Diffusion (2024-01-07Z)
-
Wide outpainting workflow for ComfyUI (2024-04-14Z)
-
Star Path (2024-07-28Z)
Documents
Why use one word when a thousand will do? Information has a half-life, may have been true when I wrote it, and may no longer be true.
-
A Brief History Of Vertex Specification In OpenGL (2012-01-19Z)
-
2D GPU Displacement Mapping (2012-04-25Z)
-
Lightweight Static Exceptions (2012-04-26Z)
-
Type Tricks 0 - Propositions In Constructors Of Immutable Objects (2012-06-18Z)
-
Type Tricks 1 - Phantom Types (2012-06-19Z)
-
Crash Course In Algebraic Types (2012-07-29Z)
-
Glow Maps (2012-07-30Z)
-
Type Tricks 2 - Interfaces As Capabilities (2013-07-24Z)
-
Fragment Shader Outputs - Through The Ages (2014-06-28Z)
-
Type Tricks 3 - Generic Visitors (2015-06-03Z)
-
Algebraic Types On The JVM (2016-01-19Z)
-
Reliable UDP Algorithms (2016-08-20Z)
-
A Brutal Approach To Logging In An Embedded Apache Felix (2016-09-03Z)
-
Aeron For The Working Programmer (2018-09-11Z)
-
The ATMega328P From (Almost) Nothing (2021-08-29Z)
-
Simple GPU Outline Shaders (2022-10-30Z)
Keys
This section provides public keys of various forms. All packages released on Maven Central are signed by the current release key. Personal correspondence may be signed by the current personal key. The current key policy is yearly-expiring keys, with each new set of keys being signed by the previous set. Expired/revoked keys are archived here in order to allow for the verification of old signatures.
Key | Comment |
---|---|
EEB8AB46 | 2025 personal |
DCC06058 | 2025 maven-rsa-key |
12BC7CF4 | 2025 github-ci-maven-rsa-key |
FD46A5BE | 2025 android APK signing key |
The following keys have either expired or have been revoked:
Key | Comment |
---|---|
54004CFD | 2024 android APK signing key |
E362BB4F | 2024 personal |
37A997D5 | 2024 maven-rsa-key |
E288E54A | 2024 github-ci-maven-rsa-key |
B61D1DAE | 2023 personal |
567B7EA4 | 2023 jenkins-maven-rsa-key |
62AB091D | 2023 maven-rsa-key (RSA key to sign Maven Central releases) |
2680A50E | 2022 personal |
3CCE5942 | 2022 maven-rsa-key |
8EAE10EA | 2022 jenkins-maven-rsa-key |
2C8311D5 | 2021 personal |
B32FA649 | 2021 maven-rsa-key [RSA key to sign Maven Central releases] |
FDE93549 | 2021 jenkins-maven-rsa-key |
3E104C4C | 2021 android signing |
E36981ED | 2020 personal |
406D6CE4 | 2020 maven-rsa-key [RSA key to sign Maven Central releases] |
E5AC62F5 | 2020 jenkins-maven-rsa-key |
2AE31C58 | 2020 android signing |
33E7E23B | 2019 maven-rsa-key (RSA key to sign Maven Central releases) |
DD3E9631 | 2019 release-signing |
D345CCB7 | 2019 android commit signing |
E3795957 | 2019 personal |
5A84144A | 2019 android-maven-rsa-key |
092505DB | 2019 jenkins-maven-rsa-key |
B84E1774 | 2018 personal key |
F8C3C5B8 | 2018 release signing key |
E1343512 | 2018 android commit signing key |
29FB7908 | 2018 maven release signing key |
8168DAE2 | 2017 personal key |
9522485E | 2017 release signing key |
004513A0 | 2016 personal key |
70F892EF | 2016 release signing key |
285208CD | 2015 personal key |
6F5BB84E | 2015 release signing key |
AC7F360E | 2014 personal key |
14F0A524 | 2014 release signing key |
D888CA9C | 2013 personal key |
42D206D4 | 2013 release signing key |
277E24F7 | 2012 personal key |
098EEF85 | 2012 release signing key |
2EF56FF0 | 2011 personal key |
1E47D42C | 2011 release signing key |
3898ED48 | Coreland release signing key |