io7m.com
  • Contact
  • Software
  • Art
  • Documents
  • Keys
  • Links
  • Blog
  • GitHub
  • Quay
  • Funds

Hello! I'm Send mail 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


  • 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.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.

  • 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.

  • palace-webpub

    The Palace WebPub parser.

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.

  • northpike

    Continuous integration server.

  • 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.

  • usq

    Unsupervised persistent queues.

  • 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

Links


  • The Palace Project
  • LYRASIS
  • Immutables
  • JGraphT
  • LWJGL
  • Apache Maven
  • OpenJDK
  • Library For All
  • Dyn4j
  • Library Simplified
Last Updated 2025-09-01T14:20:34Z
Signature index.html.asc
Checksums checksum.asc