Personal projects, built for my own use and published in case they are useful to others.
I mainly code to try to serve personal needs, eg montitoring my personal backups, my server, managing my ebooks etc. Most of my projects have better professional solutions, but for one reason or another I've wanted something that I found was missing, so I made it myself tailored for my own needs.
Colophon — self-hosted e-book library and metadata manager with wireless Kobo sync, cover art fetching and an in-browser EPUB reader. Flask + Docker; a lightweight alternative to Calibre-Web that pairs with Komga and Kavita.
Its distinguishing feature is AI as a librarian's assistant — as far as I know, no other self-hosted book server has this. An LLM helps with the cataloguing problems regular metadata sources can't solve: series detection, metadata suggestions and author disambiguation. It is strictly propose-only — every suggestion lands in a review view where you approve field by field, and nothing is ever written to your library on the AI's say-so. Entirely optional, and works with any OpenAI-compatible provider or fully local Ollama for complete privacy.
SkitchG — Skitch-inspired image annotation tool for Linux: arrows, text, shapes and pixelate on existing images, copied straight to the clipboard. Python + Qt (PySide6).
Plugins for the Cockpit web console, written in plain HTML/JS without build steps or frameworks:
| Plugin | What it shows |
|---|---|
| 🌡️ cockpit-temps | Hardware temperature history (CPU/NVMe) with thresholds, 120 days of PCP archives |
| 💽 cockpit-smart | S.M.A.R.T. disk health for HDD/SSD/NVMe with history and trend detection |
| ☁️ cockpit-pcloud | pCloud storage quota, account status and backup folder health |
All plugins are listed under the
cockpit-plugin topic.
- Blueskybot — posts RSS feed updates to Bluesky. Node.js + Docker.
- Skysplitter — splits long texts into Bluesky-sized posts with thread numbering. Also available as a web app and a desktop app.
Reading, media and automation tools — see all repositories for the full list.




