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'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
-
abstand
Interval trees. -
adelaide
Better ActiveMQ/Artemis OCI images. -
anethum
Generic parser API specification. -
aradine
Modular programmable synthesis. -
aurantium
Aurantium audio sample map format. -
bishopsgate
JMS → Matrix relay. -
blackthorne
Functional streaming XML data extraction. -
blockhead
Unbound blocklist maintenance. -
bodyrecomp
Body recomposition tools. -
boxwood
EPUB parser. -
brackish
JavaFX waveform display component. -
brooklime
Nexus Pro staging repository API and command-line tool. -
calino
Strongly-specified 3D texture file format. -
canonmill
Directory-based Java Keystore. -
cardant
Inventory server. -
cardant_gui
Cardant JavaFX GUI. -
cedarbridge
Generic, strongly-typed, versioned message protocol compiler. -
certusine
ACME client. -
changelog
Software changelogs. -
checkstyle_rules
Common Checkstyle rules for io7m projects. -
chione
Opinionated builds of Apache Artemis for small-scale deployments. -
cxbutton
Customizable embossed CSS buttons. -
darco
Minimalist, opinionated database access. -
digal
Java FX rotary dials. -
dixmont
Dixmont Jackson extensions. -
entomos
Sectional binary file format library. -
ervilla
JUnit 5 Podman container creation. -
ethermaker
Ethernet MAC address generator. -
exfilac
Simple, reliable, automated S3 uploads for Android. -
flail
DNS server stress testing tool. -
fsbind
A JSR203 overlay binding filesystem. -
garriga
AlertManager → Matrix Alert Relay. -
gatwick
BOSS GT-1000 controller. -
genevan
Generic protocol negotiation algorithm. -
gtyrell
Git repository mirroring tool. -
hibiscus
RPC Client API Specification. -
idstore
Identity server. -
idstore_gui
GUI for idstore. -
idstore_trafficgen
Traffic generator for idstore. -
ieee754b16
Functions for converting to/from IEEE754 binary16 values. -
immutables-style
Immutables.org annotations for io7m projects. -
ivoirax
JavaFX piano component. -
jaccord
Java library to assist with musical analysis. -
jade
Java application directory etiquette. -
jaffirm
Simple and fast contract checking. -
jarabica
Type-safe OpenAL wrapper. -
jattribute
Observable, functional, mutable variables. -
jbssio
Java bytestream structural I/O. -
jcamera
Camera implementations for 3D simulations. -
jcip
Clean-room JCIP annotations. -
jcolorspace
Color space conversions. -
jcoords
Functions for specifying and converting between coordinate spaces. -
jcoronado
Type-safe Vulkan wrapper. -
jdeferthrow
Defer and combine exceptions. -
jdownload
Resumable HTTP downloader library. -
jeucreader
Unicode codepoint reader. -
jfsm
Finite state machines. -
jintegers
Integer handling. -
jinterp
Interpolation functions. -
jlexing
Lexer types. -
jmulticlose
Collective try-with-resources. -
jmurmur
Java implementation of the Murmur hash function. -
jmutnum
Trivial mutable numbers. -
jnfp
Normalized fixed-point value functions. -
jnoisetype
SoundFont® I/O. -
jobj
Java Wavefront OBJ parser. -
jodist
Coffee-flavoured source code generation. -
jorchard
Mutable rose-tree types. -
jpita
Simple text alignment algorithms. -
jpplib
An improved fork of the unmaintained jpplib package. -
jproperties
Typed property handling. -
jptbox
Unicode box drawing. -
jqpage
SQL pagination functions. -
jranges
Range handling. -
jregions
Immutable area types. -
jsamplebuffer
Audio sample buffer types. -
jsay
Tiny JMS text message sender. -
jserial
Serial number arithmetic. -
jspatial
Spatial data structures. -
jspearmint
SPIR-V toolkit. -
jspiel
Java RIFF I/O. -
jsx
S-expression parser. -
jsycamore
OpenGL GUI library. -
jtensors
Vector/matrix math package. -
junreachable
Exception types for marking unreachable/unimplemented code. -
junsigned
Missing unsigned value conversions. -
jvindicator
Type-safe HTTP servlet parameter validation. -
jwheatsheaf
JavaFX file chooser. -
jxe
Hardened, boilerplate-free XML parsers. -
jxtrand
Utility classes for XML string resources. -
kabstand
Kotlin port of the Abstand package. -
lanark
Restricted dotted name specification. -
laurel
Image caption management. -
looseleaf
Minimalist transactional HTTP key/value store. -
medrina
Role-based mandatory access control. -
mime2045
RFC 2045 MIME type parsing. -
minisite
Tiny software project static site generator. -
miscue
UI error dialogs. -
montarre
Application packaging tools. -
northpike
Continuous integration server. -
northpike.packaging
Platform-specific packaging for Northpike. -
peixoto
Packaged and shaded Amazon S3 SDK. -
percentpass
Percent-passing extension for JUnit 5 tests. -
primogenitor
Ancestor POM for io7m projects. -
quarrel
Strict, opinionated, typed command-line argument parser. -
quixote
Tiny embedded web server for unit testing. -
renderdoc_jffm
RenderDoc FFM API. -
repetoir
Service directory. -
scando
Tiny japicmp command-line wrapper. -
seltzer
A specification for structured, user-facing error values. -
sigiltron
Mysterious symbol generator. -
smfj
Minimalist sequential mesh format. -
stonesignal
A device location server. -
streamtime
Input/output stream progress tracking. -
string-template-maven-plugin
String Template Maven plugin. -
sunburst
Asset package system. -
tabla
Plain text table rendering. -
taskrecorder
UI task recorder. -
tavella
Podman Java interface. -
timehack6435126
JVM high-resolution timer bug workaround. -
trasco
SQL database schema revision system. -
usq
Unsupervised persistent queues. -
ventrad
JSON protocol for HTTP endpoint version announcements. -
verdant
Binary protocol for HTTP endpoint version announcements. -
verona
Semantic versioning types. -
wendover
Java NIO channel tools. -
xoanon
JUnit 5 JavaFX test harness. -
xstructural
XSLT implementation of the structural document language. -
xyloid
Repackaged xerial sqlite-jdbc binaries. -
zelador
JUnit 5 cleaning service. -
zeptoblog
Tiny, modular, static blog generator. -
zugorum
Liveness checker.
Irradia Components
-
datepicker
Minimalist Android date picker. -
fieldrush
High-performance, low-allocation, type-safe, recovering stream JSON parser. -
http
Tiny HTTP interface. -
mime
RFC2045 MIME type parsing. -
opds1_2
OPDS 1.2 parser. -
opds2_0
OPDS 2.0 parser. -
servicedirectory
Android-oriented lazy application service directory.
Adoptium
-
openjdk-api-java-client
Java client for the AdoptOpenJDK API.
Immutables
-
immutables-vavr
A set of Immutables encodings for Vavr.
Library For All
-
epubsquash
Java EPUB size reduction API and tools. -
lfa-android
LFA fork of SimplyE. -
lfa-launcher
LFA Android launcher application. -
opdsget
OPDS feed retrieval tool. -
repomaker
A lightweight repository generator for the LFA Updater. -
updater
Application to download and install LFA applications.
LWJGL
-
lwjgl3-osgi
LWJGL OSGi packages.
Palace Project
-
palace
The Android client for The Palace Project. -
palace-audiobook-android
The Palace audiobook player API. -
palace-ci
The Palace continuous integration scripts. -
palace-drm-core
The Palace DRM API. -
palace-http
The opinionated Palace HTTP client. -
palace-r2
A replacement navigator for Readium 2.
End-Of-Life / Unmaintained
-
blueberry
End-user automated junit test runner. -
cantoria
Java 9+ API analysis tool. -
claypot
JCommander conventions for io7m projects. -
coffeepick
Java runtime retrieval API and shell. -
coffeepick-gui
CoffeePick GUI. -
ftgr
Fossil → Git replayer. -
halite
Maven plugin to accumulate dependencies and artifacts. -
jareas
Area types. -
jaux
Auxiliary library. -
jboxes
Box types. -
jcache
Generic cache algorithms. -
jcage
Run-time configurable JVM sandboxing. -
jcalcium
3D realtime skeletal animation package. -
jcanephora
OpenGL plus static safety. -
jcathinone
Apache Artemis message directory spooler. -
jdae
JAXB COLLADA bindings. -
jequality
Equality handling. -
jfppg
Java fixed-point code generator. -
jfprop
Server for synchronizing Fossil repositories. -
jfunctional
Functional types. -
jguard
FreeBSD jail management tools. -
jjacob
High-performance, memory and type-safe bindings to the JACK API. -
jlog
Hierarchical logging. -
jnull
Null pointer handling. -
jparasol
Minimalist, pure functional shading language. -
jpismo
OpenGL text renderer. -
jpra
Fast, mutable, packed records for Java. -
jpuddle
Trivial object pooling. -
jrai
Apache Artemis → IRC relay bot. -
jrcl
Restricted class loader. -
jrpack
Rectangle packing algorithms. -
jstructural
Java implementation of the structural document language. -
jtimeline
Generic timeline package. -
jvvfs
Virtual filesystem. -
jwhere
Disk cataloguing tool. -
kstructural
Kotlin implementation of the structural document language. -
modulechaser
Maven plugin for reporting on the modularization status of dependencies. -
oakleaf
Minimalist article schema and stylesheet. -
oatfield
OSGi bundle I/O and analysis. -
oci-images
OCI images for various projects. -
oxicoco
Embeddable Java IRC server component. -
pallene
An ultra-minimal single-file static web server. -
plain-site-skin
Boring Maven site skin. -
portero
Matrix Homeserver invitation token service. -
r1
Aggressively minimalist deferred rendering system. -
r2
Aggressively minimalist second-generation deferred rendering system. -
readme
Tiny README generator. -
saxon-plugin
Simple XSLT processing with Saxon. -
servitor
Static podman/systemd service generator. -
sombrero
Shader management and preprocessing system. -
thoth
Experimental, extensible OSGi-based IRC bot. -
waxmill
FreeBSD BHyve manager.
Art
Works of questionable artistic merit.
-
baguette
Baguette (2016-10-18Z) -
corn
Corn (2016-10-19Z) -
pillow
Pillow (2016-10-20Z) -
rabbit
Rabbit (2016-10-24Z) -
workbot
Workbot (2016-10-29Z) -
chemriver
Chemriver (2017-08-31Z) -
pine
Pine (2017-09-08Z) -
unbolted_frontiers
Unbolted Frontiers (2019-03-14Z) -
convenience
Convenience (2019-09-07Z) -
dimenec
Dimenec (2019-12-30Z) -
vanishing_path1
The Vanishing Path 1 (2020-03-19Z) -
engineer_sleep
The Sleep Of The Engineer (2020-08-23Z) -
heavywater
Heavy Water Station (2020-09-11Z) -
icms
A 3D-printable shell for the MakerHawk OV5647 webcam module (2020-09-27Z) -
kit.dust_yard
Dust Yard (2021-04-04Z) -
kit.calais
Calais (2022-04-08Z) -
dw.broadway
Turnwise Broadway (2022-04-08Z) -
openpose_rig
OpenPose rigs for Blender (2023-12-30Z) -
lowcarb
Low carb 3D models for Stable Diffusion (2024-01-07Z) -
comfyui.wideoutpaint
Wide outpainting workflow for ComfyUI (2024-04-14Z) -
starpath
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.
-
history-vertex-spec
A Brief History Of Vertex Specification In OpenGL (2012-01-19Z) -
displacement2d
2D GPU Displacement Mapping (2012-04-25Z) -
lightweight-static-exceptions
Lightweight Static Exceptions (2012-04-26Z) -
tt0-pcio
Type Tricks 0 - Propositions In Constructors Of Immutable Objects (2012-06-18Z) -
tt1-pt
Type Tricks 1 - Phantom Types (2012-06-19Z) -
ccat
Crash Course In Algebraic Types (2012-07-29Z) -
glow-maps
Glow Maps (2012-07-30Z) -
tt2-intcap
Type Tricks 2 - Interfaces As Capabilities (2013-07-24Z) -
fso-tta
Fragment Shader Outputs - Through The Ages (2014-06-28Z) -
tt3-genvis
Type Tricks 3 - Generic Visitors (2015-06-03Z) -
adt-jvm
Algebraic Types On The JVM (2016-01-19Z) -
udp-reliable
Reliable UDP Algorithms (2016-08-20Z) -
brutal-felix-logging
A Brutal Approach To Logging In An Embedded Apache Felix (2016-09-03Z) -
aeron-guide
Aeron For The Working Programmer (2018-09-11Z) -
atmega328p-fn
The ATMega328P From (Almost) Nothing (2021-08-29Z) -
outline-glsl
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 |