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'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

Links


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