Projects

Open Source gave me my career.

I have always learned and contributed in public. In fact, free and open source software directly allowed me to quit my 'day job' and start consulting for a living! Most of my projects below started because a recurring problem was annoying enough that I wanted a reusable solution, and one I could contribute back.

The workbench

Python
Heckle

Bring an existing git forge into Terraform or OpenTofu

Existing forges accumulate repos, teams, protections and webhooks that nobody wants to re-create by hand. Heckle reads a GitHub, GitLab, Gitea or Forgejo namespace and generates maintainable Terraform or OpenTofu HCL.

Python
Enroll

Bring existing servers into Ansible

Production systems are often too important to rebuild merely because they pre-date configuration management. Enroll harvests their state and creates a practical starting point for reproducible Ansible roles and playbooks.

Rust
Stef

Grep that also sees through SOPS encryption

A native ripgrep-style search tool for ordinary files and SOPS-encrypted files, with an encrypted history that answers the question grep cannot: what used to match, but does not match now?

Python
CSPresso

Build a CSP from what a site really loads

Content Security Policy is valuable but tedious to assemble by hand. cspresso uses headless Chromium to observe page behaviour and produce a draft policy you can inspect, tighten, and deploy.

Python
DumpTales

Compare database snapshots offline

Find added, removed and changed rows in SQL dumps or SQLite snapshots, with readable terminal and machine-readable output, without needing to execute any SQL or have access to a database instance itself.

Python
Gills

Swimming upstream for new deb/rpm packages

Gills watches upstream APT and RPM repositories for new releases, so your local mirror is refreshed the moment packages land — and prunes its own completed history when you are done.

Python
Bouquin

Local-first encrypted notebook & planner

A Python + Qt notebook and personal organiser built around keeping personal data local, encrypted with SQLCipher, and useful without requiring somebody else's cloud service.

Python
JinjaTurtle

Turn config files into templates and inventory

Generate Jinja2 templates and Ansible variables from native configuration files, reducing the repetitive work involved in turning hand-maintained systems into managed ones.

PHP
SQLCipher for PHP

Encryption-at-rest for PHP's SQLite

Build scripts and packages that compile PHP against the SQLCipher extension across Debian, Ubuntu and PHP versions, so applications get an encrypted database without leaving the PDO API behind.

And one that isn't work

SYNCity — just for fun

SYN City: a pocket-sized packet adventure

Bounce a packet across SYN City: open TCP connections, complete TLS handshakes, dodge scans, climb the stack, queue the mail, survive kernel I/O, and close cleanly with FIN. Best played on a phone, at a desk you should probably be working at.