Software Software projects
Documents Documents and articles
Contact Contact information for the author
PGP PGP information
Public Domain Public domain dedications
Links Links to important third parties


Software projects of which I am (or have been) the primary author and/or maintainer:

Project Description
abstand Interval trees.
anethum Generic parser API specification
audiobook-android The NYPL audio book player API
blackthorne Functional streaming XML data extraction
bodyrecomp Body recomposition tools
boxwood EPUB parser
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.
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
coffeepick Java runtime retrieval API and shell
coffeepick-gui CoffeePick GUI
cxbutton Customizable embossed CSS buttons
datepicker Minimalist Android date picker
digal Java FX rotary dials
dixmont Dixmont Jackson extensions
epubsquash Java EPUB size reduction API and tools
ervilla JUnit 5 Podman container creation.
ethermaker Ethernet MAC address generator
fieldrush High-performance, low-allocation, type-safe, recovering stream JSON parser
flail DNS server stress testing tool
gatwick BOSS GT-1000 controller
genevan Generic protocol negotiation algorithm
gtyrell Git repository mirroring tool
halite Maven plugin to accumulate dependencies and artifacts
hibiscus RPC Client API Specification
http Tiny HTTP interface
idstore Identity server
idstore_gui GUI for idstore.
idstore_trafficgen Traffic generator for idstore.
ieee754b16 Functions for converting to/from IEEE754 binary16 values
immutables-vavr A set of Immutables encodings for Vavr
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
jcalcium 3D realtime skeletal animation package
jcamera Camera implementations for 3D simulations
jcathinone Apache Artemis message directory spooler
jcolorspace Color space conversions
jcoords Functions for specifying and converting between coordinate spaces
jcoronado Type-safe Vulkan wrapper
jdae JAXB COLLADA bindings
jdeferthrow Defer and combine exceptions
jdownload Resumable HTTP downloader library
jequality Equality handling
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
jorchard Mutable rose-tree types
jpismo OpenGL text renderer
jpita Simple text alignment algorithms
jpplib An improved fork of the unmaintained jpplib package
jpra Fast, mutable, packed records for Java
jproperties Typed property handling
jptbox Unicode box drawing
jpuddle Trivial object pooling
jqpage SQL pagination functions
jrai Apache Artemis → IRC relay bot
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
jspiel Java RIFF I/O
jstructural Java implementation of the structural document language
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
jwhere Disk cataloguing tool
jxe Hardened, boilerplate-free XML parsers
jxtrand Utility classes for XML string resources
kstructural Kotlin implementation of the structural document language
lanark Restricted dotted name specification
laurel Image caption management.
lfa-launcher LFA Android launcher application
looseleaf Minimalist transactional HTTP key/value store
lwjgl3-osgi LWJGL OSGi packages
medrina Role-based mandatory access control
mime RFC2045 MIME type parsing
mime2045 RFC 2045 MIME type parsing
minisite Tiny software project static site generator
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
opds1_2 OPDS 1.2 parser
opds2_0 OPDS 2.0 parser
opdsget OPDS feed retrieval tool
openjdk-api-java-client Java client for the AdoptOpenJDK API
oxicoco Embeddable Java IRC server component
palace The Android client for The Palace Project
pallene An ultra-minimal single-file static web server
percentpass Percent-passing extension for JUnit 5 tests
portero Matrix Homeserver invitation token service
primogenitor Ancestor POM for io7m projects
quarrel Strict, opinionated, typed command-line argument parser.
r2 Aggressively minimalist second-generation deferred rendering system
readme Tiny README generator
repetoir Service directory
scando Tiny japicmp command-line wrapper
seltzer A specification for structured, user-facing error values.
servitor Static podman/systemd service generator.
sigiltron Mysterious symbol generator
smfj Minimalist sequential mesh format
streamtime Input/output stream progress tracking.
sunburst Asset package system
tabla Plain text table rendering.
tavella Podman Java interface.
thoth Experimental, extensible OSGi-based IRC bot
timehack6435126 JVM high-resolution timer bug workaround
trasco SQL database schema revision system
verdant Binary protocol for HTTP endpoint version announcements
verona Semantic versioning types
waxmill FreeBSD BHyve manager
wendover Java NIO channel tools
xoanon JUnit 5 JavaFX test harness.
xstructural XSLT implementation of the structural document language
zelador JUnit 5 cleaning service.
zeptoblog Tiny, modular, static blog generator

The following software packages will no longer be receiving updates:

Project Description
blueberry End-user automated junit test runner
cantoria Java 9+ API analysis tool
claypot JCommander conventions for io7m projects
ftgr Fossil → Git replayer
jareas Area types
jaux Auxiliary library
jboxes Box types
jcache Generic cache algorithms
jcage Run-time configurable JVM sandboxing
jcanephora OpenGL plus static safety
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
jrcl Restricted class loader
jrpack Rectangle packing algorithms
jtimeline Generic timeline package
jvvfs Virtual filesystem
plain-site-skin Boring Maven site skin
r1 Aggressively minimalist deferred rendering system
saxon-plugin Simple XSLT processing with Saxon
servicedirectory Android-oriented lazy application service directory
sombrero Shader management and preprocessing system


All packages on the site use semantic versioning. Please consult the referenced site for the exact rules. Informally, this means that backwards-incompatible changes, new functionality, and bug fixes are unambiguously indicated by version number changes.


Date Title
2012-01-19 A Brief History Of Vertex Specification In OpenGL
2012-04-25 2D GPU Displacement Mapping
2012-04-26 Lightweight Static Exceptions
2012-06-18 Type Tricks 0 - Propositions In Constructors Of Immutable Objects
2012-06-19 Type Tricks 1 - Phantom Types
2012-07-29 Crash Course In Algebraic Types
2012-07-30 Glow Maps
2013-07-24 Type Tricks 2 - Interfaces As Capabilities
2014-06-28 Fragment Shader Outputs - Through The Ages
2015-06-03 Type Tricks 3 - Generic Visitors
2016-01-19 Algebraic Types On The JVM
2016-08-20 Reliable UDP Algorithms
2016-09-03 A Brutal Approach To Logging In An Embedded Apache Felix
2018-09-11 Aeron For The Working Programmer
2021-08-29 The ATMega328P From (Almost) Nothing
2022-10-30 Simple GPU Outline Shaders


Using PGP (and therefore, the email addresses contained within the PGP keys) is preferable. But if this is not an option, the author can be contacted at:

Contact address


All packages released on Maven Central are signed by the current release key. Personal correspondence is 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 releases.

Key Comment
37A9 97D5 970E 145A B9DB 1409 A203 E72A D3BB E1CE 2024 maven-rsa-key
E362 BB4F 16A9 981D E781 2F6E 10E4 AAD0 B00D 6CDD 2024 personal

The following keys have either expired or have been revoked:

Key Comment
2EF5 6FF0 DEA1 1C9C CC5E 5C5D F4F3 4B44 5535 2F86 2011 personal key
1E47 D42C A0F4 2576 4D98 1642 CBB9 BC80 492F 580C 2011 release signing key
277E 24F7 B6D4 F684 5A66 A37A 7A45 3572 0297 BB27 2012 personal key
098E EF85 1E84 43A9 BBD7 50C1 1A78 101E 09E7 56BB 2012 release signing key
D888 CA9C 04F4 6734 7E27 E0C5 18AA A506 6082 4220 2013 personal key
42D2 06D4 F928 C8C2 A45A F938 4F47 F254 8FB0 2F3F 2013 release signing key
AC7F 360E 1C07 2C47 00EB 566E E801 55B7 1982 CC07 2014 personal key
14F0 A524 8273 4791 55C4 1574 E936 2A12 2FE7 EC66 2014 release signing key
2852 08CD EA52 43CE 0AFC 4845 AB99 78DB 38AB 74C4 2015 personal key
6F5B B84E 2D32 3F61 E5D4 1501 1C61 65A3 1016 1791 2015 release signing key
0045 13A0 36B0 CC0C 1522 9298 02AD DA75 7E46 0478 2016 personal key
70F8 92EF E93D F62A 0932 47A6 1611 A16B 44B1 A3D9 2016 release signing key
8168 DAE2 2B15 D3ED C722 C23D 0F15 B7D0 6FA8 0CB8 2017 personal key
9522 485E 761B 94D5 F98B 4259 2866 9282 EDBB 1971 2017 release signing key
E134 3512 A805 115A C1A0 1D15 C578 C3C0 C9B1 2BFF 2018 android commit signing key
29FB 7908 CFC3 2F18 3D39 63D2 A3E8 3E72 D8A5 C856 2018 maven release signing key
B84E 1774 7616 C617 4C68 D5E5 5C1A 7B71 2812 CC05 2018 personal key
F8C3 C5B8 C86A 95F7 42B9 36D2 97E0 2011 0410 DFAF 2018 release signing key
D345 CCB7 187B C973 BDD4 9192 BEC8 33E4 DCAA 5330 2019 android commit signing
5A84 144A 3B3E 11A1 83E5 F44F 6CEE 651E E6CA C870 2019 android-maven-rsa-key
0925 05DB EFCD B64B 9097 39BE DD07 2DA2 0842 C772 2019 jenkins-maven-rsa-key
33E7 E23B F949 E558 A333 38E3 562B F636 4C42 DA2E 2019 maven-rsa-key (RSA key to sign Maven Central releases)
E379 5957 1613 1DB4 E7AB 87DD 67B1 8CC1 F9AC E345 2019 personal
DD3E 9631 2A83 748C B4B3 73A5 91A8 14E2 EAF7 50A3 2019 release-signing
2AE3 1C58 EB0A C10F A8BC D579 6211 C01D F095 2649 2020 android signing
E5AC 62F5 ECDD 8F5C 389E F3F0 CD92 45F1 A9A6 2A8B 2020 jenkins-maven-rsa-key
406D 6CE4 6463 FA78 8ABB 63A3 6AF3 0ECF 4211 F11C 2020 maven-rsa-key [RSA key to sign Maven Central releases]
E369 81ED 130D B4F6 8D42 0248 BBFF DB75 5BAE D95D 2020 personal
3E10 4C4C AE29 C040 1A26 6247 177C 64B8 7BA5 CD8A 2021 android signing
FDE9 3549 7094 0B4D 5637 2157 53A8 207B C03F 0ACE 2021 jenkins-maven-rsa-key
B32F A649 B192 4235 A6F5 7B99 3EBE 3ED3 C53A D511 2021 maven-rsa-key [RSA key to sign Maven Central releases]
2C83 11D5 E344 626A E76E B866 CB39 C234 E824 F9EA 2021 personal
8EAE 10EA 3E8D F42F E58F CFD2 7863 6912 E065 EAD3 2022 jenkins-maven-rsa-key
3CCE 5942 8B30 462D 1045 9909 C560 7DA1 46E1 28B8 2022 maven-rsa-key
2680 A50E FD03 2007 FABE 8C87 B0E4 322E EE81 8BDE 2022 personal
567B 7EA4 703E D530 5B73 3FBC 10C3 9A85 438F 996F 2023 jenkins-maven-rsa-key
62AB 091D 563E 51BE 9E54 B680 7E20 DC73 5505 FE84 2023 maven-rsa-key (RSA key to sign Maven Central releases)
B61D 1DAE 9E4D B4B7 B575 7356 EFBD C8D0 6064 EF5C 2023 personal
3898 ED48 93C0 C9B8 8087 A11A 5149 8BCC 7C76 927C Coreland release signing key

Public Domain

This section records public domain dedications as they occur.

Date Name File
2014-12-23 jspatial jspatial.asc
2015-08-23 jrpack jrpack.asc
2016-04-27 timehack6435126 timehack6435126.asc
2019-03-21 unbolted_frontiers unbolted_frontiers.asc