PGPE379 5957 1613 1DB4 E7AB 87DD 67B1 8CC1 F9AC E345


softwareSoftware projects
documentsDocuments and articles
contactContact information for the author
pgpPGP information
public domainPublic domain dedications
linksLinks to important third parties


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

project description
audiobook-android The NYPL audio book player API
blackthorne Functional streaming XML data extraction
cantoria Java 9+ API analysis tool
changelog Software changelogs
checkstyle_rules Common Checkstyle rules for io7m projects
coffeepick Java runtime retrieval API and shell
epubsquash Java EPUB size reduction API and tools
fieldrush High-performance, low-allocation, type-safe, recovering stream JSON parser
flail DNS server stress testing tool
gtyrell Git repository mirroring tool
halite Maven plugin to accumulate dependencies and artifacts
http Tiny HTTP interface
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
jaffirm Simple and fast contract checking
jbssio Java bytestream structural I/O
jcalcium 3D realtime skeletal animation package
jcamera Camera implementations for 3D simulations
jcathinone Artemis message directory spooler
jcoords Functions for specifying and converting between coordinate spaces
jcoronado Type-safe Vulkan wrapper
jdae JAXB COLLADA bindings
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
jpra Fast, mutable, packed records for Java
jproperties Typed property handling
jptbox Unicode box drawing
jpuddle Trivial object pooling
jrai Mindlessly simple 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
jwhere Disk cataloguing tool
jxe Hardened, boilerplate-free XML parsers
kstructural Kotlin implementation of the structural document language
lfa-launcher LFA Android launcher application
lwjgl3-osgi LWJGL OSGi packages
mime RFC2045 MIME type parsing
minisite Tiny software project static site generator
modulechaser Maven plugin for reporting on the modularization status of dependencies
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
pallene An ultra-minimal single-file static web server
primogenitor Ancestor POM for io7m projects
r2 Aggressively minimalist second-generation deferred rendering system
readme Tiny README generator
servicedirectory Android-oriented lazy application service directory
sigiltron Mysterious symbol generator
simplified The Android client for Library Simplified
smfj Minimalist sequential mesh format
thoth Experimental, extensible OSGi-based IRC bot
timehack6435126 JVM high-resolution timer bug workaround
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
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
sombrero Shader management and preprocessing system


Support for the packages here is also available from #io7m on Please be patient, it's most likely that all channel users are in different time zones and may be asleep.


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-19A Brief History Of Vertex Specification In OpenGL
2012-04-252D GPU Displacement Mapping
2012-04-26Lightweight Static Exceptions
2012-06-18Type Tricks 0 - Propositions In Constructors Of Immutable Objects
2012-06-19Type Tricks 1 - Phantom Types
2012-07-29Crash Course In Algebraic Types
2012-07-30Glow Maps
2013-07-24Type Tricks 2 - Interfaces As Capabilities
2014-06-28Fragment Shader Outputs - Through The Ages
2015-06-03Type Tricks 3 - Generic Visitors
2016-01-19Algebraic Types On The JVM
2016-08-20Reliable UDP Algorithms
2016-09-03A Brutal Approach To Logging In An Embedded Apache Felix
2018-09-11Aeron For The Working Programmer


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:


Alternatively, there's always IRC.


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
33E7 E23B F949 E558 A333 38E3 562B F636 4C42 DA2E 2019 maven-rsa-key (RSA key to sign Maven Central releases)
DD3E 9631 2A83 748C B4B3 73A5 91A8 14E2 EAF7 50A3 2019 release-signing
D345 CCB7 187B C973 BDD4 9192 BEC8 33E4 DCAA 5330 2019 android commit signing
E379 5957 1613 1DB4 E7AB 87DD 67B1 8CC1 F9AC E345 2019 personal
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

The following keys have either expired or have been revoked:

key status comment
B84E 1774 7616 C617 4C68 D5E5 5C1A 7B71 2812 CC05 Expired 2018 personal key
F8C3 C5B8 C86A 95F7 42B9 36D2 97E0 2011 0410 DFAF Expired 2018 release signing key
E134 3512 A805 115A C1A0 1D15 C578 C3C0 C9B1 2BFF Expired 2018 android commit signing key
29FB 7908 CFC3 2F18 3D39 63D2 A3E8 3E72 D8A5 C856 Expired 2018 maven release signing key
8168 DAE2 2B15 D3ED C722 C23D 0F15 B7D0 6FA8 0CB8 Expired 2017 personal key
9522 485E 761B 94D5 F98B 4259 2866 9282 EDBB 1971 Expired 2017 release signing key
0045 13A0 36B0 CC0C 1522 9298 02AD DA75 7E46 0478 Expired 2016 personal key
70F8 92EF E93D F62A 0932 47A6 1611 A16B 44B1 A3D9 Expired 2016 release signing key
2852 08CD EA52 43CE 0AFC 4845 AB99 78DB 38AB 74C4 Expired 2015 personal key
6F5B B84E 2D32 3F61 E5D4 1501 1C61 65A3 1016 1791 Expired 2015 release signing key
AC7F 360E 1C07 2C47 00EB 566E E801 55B7 1982 CC07 Expired 2014 personal key
14F0 A524 8273 4791 55C4 1574 E936 2A12 2FE7 EC66 Expired 2014 release signing key
D888 CA9C 04F4 6734 7E27 E0C5 18AA A506 6082 4220 Expired 2013 personal key
42D2 06D4 F928 C8C2 A45A F938 4F47 F254 8FB0 2F3F Expired 2013 release signing key
277E 24F7 B6D4 F684 5A66 A37A 7A45 3572 0297 BB27 Expired 2012 personal key
098E EF85 1E84 43A9 BBD7 50C1 1A78 101E 09E7 56BB Expired 2012 release signing key
1E47 D42C A0F4 2576 4D98 1642 CBB9 BC80 492F 580C Revoked 2011 release signing key
2EF5 6FF0 DEA1 1C9C CC5E 5C5D F4F3 4B44 5535 2F86 Revoked 2011 personal key
3898 ED48 93C0 C9B8 8087 A11A 5149 8BCC 7C76 927C Revoked Coreland release signing key

public domain

This section records public domain dedications as they occur.

name date file
jspatial 2014-12-23 jspatial.asc
jrpack 2015-08-23 jrpack.asc
timehack6435126 2016-04-27 timehack6435126.asc
unbolted_frontiers 2019-03-21 unbolted.asc