Public work of my own, grouped by the problem it solves. The common thread is getting old systems and new tooling to talk to each other.

Showcase

luckfox-ui

Source release pending.

A config-driven touchscreen dashboard for the Luckfox Pico (Rockchip RV1103, ARM Cortex-A7), written in pure Go with CGO disabled and no module dependencies beyond the standard library. It talks to the Linux framebuffer and evdev touchscreen directly through raw ioctls, polls a JSON API, and renders typed widgets onto pages you can define in a config file.

The interesting part is not the dashboard, it is the ABI detail underneath it. Scanline stride comes from FBIOGET_FSCREENINFO rather than being computed from width, because the kernel pads scanlines and on many panels the real stride is wider. The input_event struct is 16 bytes on ARM32, not the 24 you get on x86-64, and a compile-time assertion fails the build if that ever drifts. Touch events accumulate across ABS_X, ABS_Y and BTN_TOUCH and flush once per SYN_REPORT.

These are the traps that only show up on the target hardware, which is exactly why they are worth writing down.

Legacy meets AI

mcp-accessdb-go

MCP server in Go providing AI assistant access to legacy Access97 databases. Bridges 30-year-old data infrastructure with modern LLM tooling.

mcp-server-access-mdb-with-access97

Python MCP server supporting both modern Access/SQLite and legacy Access97 formats.

Hardware

NZ_Proto_PMod

KiCad hardware design for a protocol personality module — schematic, PCB layout, and separate master and slave boards. Adapts a fuel console to New Zealand pump protocols without changing the console itself.

esphome-custom-adc

Custom ADC component for ESPHome, written in C++.

Arduino-Custom-Streams

Enhanced version of the Arduino Streams class.

Tools

Linux_bin_utils

Shell utilities I use across my own machines.