Software

Here are some of the open-source software projects I maintain, other than for business purposes. Much of my professional work involves maintaining large open-source projects like Apache middleware, but I've written quite a lot of software for my own purposes as well. All this software is hosted on GitHub and, unless stated otherwise, is released under the terms of the GNU Public Licence, v3.0.

Most of my professional software work is in Java, but I retain an interest in C and C++ programming. I have a particular interest in extending the capabilities of the command line, especially on platforms like Android that don't offer extensive command-line environments.

For more information, see my GitHub page.

General command-line utilities

kzgrep (C)
kzgrep is a command-line utility with similar functionality to 'grep', but working on zipfiles. There are many similar utilities out there, implemented in a variety of different ways, but I've not been happy with any of them, so I decided to write my own. My main application for a tool like this is searching for text strings in compressed EPUB ebooks, although it also comes in useful with OpenDocument (LibreOffice, etc) documents.
linux-background-changer (C)
A slideshow background changer for a number of different Linux desktops, including gnome-shell. The problem with most built-in background changers is that they expect image files to be in particular places, or they can't cope with images in nested subdirectories. This one doesn't, and can.
dirsize (C)
A command-line utility for calculating the exact total size of a collection of files. This is more difficult to do than it would seem, because most utilities that appear similar are intended to calculate the amount of disk space used, which is not the same. The difference might be small, but sometimes it matters.
kcalc (C)
A console-based expression evaluator written in C and Lua. It supports complex numbers and has an extensible math library. kcalc is intended to bridge the gap between simple four-function calculators, and heavyweights like Octave.
wslrun (C)
A utility to simplify the integration between the Windows Subsystem for Linux and native Windows applications, for Windows 10
uconv (C)
A command-line unit converter that is able to parse unit expressions. This features gives the utility the ability to convert any units that have dimensions in common, without having to have an exhaustive list of conversion factors.
dbcmd (C)
A command-line utility for uploading files to and from Dropbox. dbcmd has broadly the same command line as rsync, so it should be familiar to many Unix/Linux users. I wrote this to use Dropbox to store large numbers of files that did not need to be kept in sync using the desktop client.
amqutil (Java)
A utility to exercise message brokers like Apache ActiveMQ and Artemis, as well as anything that uses the AMQP protocol. amqutil can send and receive from queues and topics using various kinds of message, with or without batching (local transactions). It can set arbitrary headers, apply message filters, and carry out timing and benchmarking operations.
augrep (C)
A utility that provides the same kind of search facilities as grep, but on the metadata (tags) of audio files. Currently augrep supports MP3, Ogg, FLAC, AAC, M4A, and M4B files.
gettags (C)
A simple command-line utility for extracting meta-data (tags) from a variety of different audio file types.
fkre (C)
A command-line utility for calculating the Fletcher-Kincaid readability score for a text or HTML document.

Utilities for working with ebooks

epub2txt2 (C)
A utility for extracting text from EPUB documents, and formatting it for reading on a console or processing by other utilities.
txt2epub (C)
A utility for converting plain text files, perhaps with simple markdown-style formatting, into an EPUB ebook.
kobo (C)
A command-line utility for managing the ebooks on Kobo e-readers. A light-weight alternative to Calibre for folks who prefer the command line.
ebookinfo (C)
A command-line utility for extracting meta-data and index information from ebooks in a variety of different formats.

Environmental and weather

bbcweather (C)
A utility to show BBC 3-day weather forecasts in the console.
Quick and dirty tide calculator (C)
Given the time of a recent high or low tide, predicts future tides. I wrote this utility because many of the places I like to spend time have no Internet access, so access to accurate tide predictions is difficult. The mechanism that qdtide uses is the same as specialist analogue watches with a 'tide hand' -- crude, but often effective over relatively short time periods.
solunar2 (C)
A utility for displaying solar and lunar ephemera for selectable locations and times. solunar also displays calendrical data like the dates of solstices and Easter. There is an experimental facility for estimating wildlife activity based on sun and moon alignment.
libopenweathermap (C)
A C library for getting weather predictions from Open Weather Map.

Android utilitiies

KBOX4 (C, Java) KBOX4 is a project to port a number of Linux command-line utilities to Android, in a way that they could be used without rooting the device. KBOX4 uses libchroot to provide a virtual Linux filesystem, thus making it possible to build many Linux utilities for Android with only minimal changes.
android-audio-sink (C)
A helper utility for providing audio playback capabilities for Android console-mode applications. This utility was originally part of the KBOX4 project, but it might be useful in its own right as a demonstration how to use the OpenSLES audio library on Android.
androidmusicserver (Java)
Kevin's Music Server for Android an Android App that provides a web browser interface to control playback of audio files stored on an Android devices. This allows the Android device to be used as a music server, in multi-room audio applications, among other things. Although I wrote this utility for Android 4.0, it still works with the latest Android releases.

Raspberry Pi

spi-oled (C)
A C library and sample code for the Raspberry Pi, for drawing on an SPI-connected OLED display panel. I wrote this code for the 128x128 panel made by Waveshare, based on the SSD1327 controller, but it might work with similar panels.
lcd8547 (C)
A C library and sample code for the Raspberry Pi, for displaying text on an alphanumeric LCD panel that uses the PCF8547 I2C-to-parallel converter.
pi-ina219 (C)
A C library and sample code for the Raspberry Pi, for reading battery charge status from an INA219 I2C charge controller. This controller is very widely used in Li-ion batter chargers. I wrote this software for monitoring battery status in a battery-powered Raspberry Pi installation.

Microcontrollers

luapico (C)
luapico is a complete programming environment for Lua, that runs on the Raspberry Pi Pico. It includes a full-screen editor, and emulates a filesystem in the Pico's flash memory. Just add a terminal emulator to start programming in Lua. The Lua implementation includes additional functions for interfacing with peripherals on the GPIO and I2C bus, among other things.
Pico7219 (C)
A library and example program for using the Pico to drive a chain of LED matrix displays based on the MAX7219 controller.
PMBASIC (C)
A simple BASIC programming environment for the SparkFun Pro Micro, or similar microcontrollers. I've tried to replicate the BASIC programming of microcomputers of the 1970s -- the language is simple, and there is a semi-interactive program editor. Program code is stored in the microcontrollers EEPROM -- typically 1kB in the Pro Micro.

Embedded Linux

syslogd-lite (C)
A very lightweight, rolling system log daemon for embedded Linux systems. This daemon understands the traditional syslog protocol but, rather than logging to disk, uses a configurable buffer in RAM. This prevents wear on SD-card storage, and is very fast in operation.
fbclock (C)
A utility for drawing an analogue clock face directly on the Linux framebuffer.
fblife (C)
A utility for drawing an Conway's "Game of Life" directly on the Linux framebuffer. I wrote this to use in conjunction with console-idle to provide a screensaver for console-only Linux systems.
jpegtofb (C)
A utility for drawing JPEG images directly on the Linux framebuffer.
console-idle (C)
This is a screensaver control utility for the Linux framebuffer console. It monitors keyboard and mouse usage, and launches a selectable application that draws images on the screen when there has been no activity. This is a bit more subtle that the console blanking that has always been part of the console (but is no longer enabled by default on most Linux builds).

Amateur radio

mgridutil (C)
A simple command-line utility for performing calculations on Maidenhead grid locators, such as finding the great-circle distance between two grid squares. Maidenhead grid squares are widely used in digital amateur radio protocols.
cslocate (C)
A command-line utility for finding the country or region associated with an amateur radio callsign.

Math utilities

kjexpr and kjcalc (Java)
kjexpr is a Java library for parsing and evaluating math expressions using arbitrary-precision arithmetic. kjcalc is a command-line calculator that uses kjexpr.
kcrypt6 (C)
A command-line file encryptor and obfuscator, based on the IDEA encryption algorithm.

Audio utilities

JavaChimes This is a Java command-line program that attempts to simulate the sound of a wind chime. It has a configurable model of wind action, and it is possible to select the pitches of the chimes. This utility uses the Java Media Framework to create the audio output.
tonegen A simple utility for playing arbitrary musical tones and noises, for Raspberry Pi and embedded Linux application. Have hours of fun figuring out how many sounds effects from the days of 8-bit computing you can recreate.
xine-server A network-controllable audio stream player, primarily for embedded Linux applications. This player is based on the Xine audio engine, which is available for ARM-based Linux systems, among others, including Raspberry Pi). It can play most kinds of audio file or stream in current use. xine-server is the player component of xine-server-x and gxsradio.
xine-server-x xine-server-x, also known as XSX, is an HTTP-enabled front end to the xine-server distributed audio player. Together these components make up a browser-controllable audio player, for both local files and Internet radio streams. Both are intended to run on embedded Linux appliances, typically based on Raspberry Pi 3/4.
gxsradio A GTK3-based, graphical Internet radio stream manager and selector for use with the xine-server network-controllable stream player. Together these components form an Internet radio player with multiple points of control. gxsradio has a simple user interface, optimized to be used with 5-7" touch panels; it has a number of other features that make it suitable for embedded applications.

CP/M utilities and emulation

cpicom An emulator for CP/M 2.2 that runs on the Raspberry Pi Pico microcontroller. This emulator implements a dual-disk CP/M system with storage in the Pico flash memory, so no external hardware is needed to run it.
cpmbox A set of simple file management utilities for CP/M 2.2, loosely based on the standard Unix utilities (cat, find, etc.)
KCalc-CPM A fully-featured scientific calculator for the CP/M 2.2 platform. This implementation has full algebraic notation, user-defined variables, trig and log functions, and a WordStar-like line editor.

Miscellaneous

Battery-saving analogue watch face (Monkey C)
A watch face for the Garmin Vivoactive 3/4 and other similar smart watches with round dials. It is optimised to provide an analogue face with the barest minimum of computation. This is to maximise the battery life of the watch -- most custom watch faces look very smart, but over-exercise the CPU to the detriment of battery life.
grotz (C)
grotz is a GKT2-based for Infocom-style interactive fiction games like Zork. Being a graphical application, it supports (to some extent) the use of variable-pitch fonts, which can make the text more agreeable to use. grotz can be built for Linux and, with a bit of fiddling, as a native Windows application.
JGemini (Java)
A Java (Swing)-based browser for Gemini capsules. Gemini is a lightweight protocol for delivering text and media content, similar to Gopher.