I build plugins, extensions, and operations tooling — for WordPress, Linux servers, and the hardware around my house.
Most of what I make comes out of running into the same problem twice. A migration that shouldn't need a staging disk. An upload that shouldn't have to pass through a browser. A fleet of servers that should answer one command instead of nine.
The tools below are the ones that stuck around after the problem was solved.
A WordPress migration plugin that never builds an archive. The source streams database rows and files straight to the destination's REST endpoints, in pull, push, or package mode. Written after UpdraftPlus and WPvivid both failed on a host with 59 MB free — they need room to zip a site before they can move it, and there wasn't any. This one keeps source disk usage at essentially zero.
Imports files from Google Drive directly into the WordPress Media Library, with none of the browser's upload ceilings. The server fetches the file itself, so a 2 GB video is no harder than a 2 MB image, and nothing depends on a client connection staying up for twenty minutes.
Builds a sanitized transfer archive of a WordPress site — database, files, and a README — for handing off to another host or agency. Excludes wp-config.php, caches, backup-plugin archives, and logs, so you aren't shipping your database password to someone along with the site.
Pulls large files from a shared Google Drive link onto a Linux server over SSH, skipping the slow round trip down to an office network and back up again. One command — gdrive — and the server downloads at its own bandwidth instead of yours. The API key is read at runtime from a root-owned file, never baked into the script.
One command to archive a folder on a server and drop it somewhere you can actually get at over FTP or SCP. Prompts for the folder and the archive name, then puts the zip in a known location — so there's no hunting for a writable path or arguing with permissions at the moment you just want the file.
Orchestrates power for a Plex server and four NAS boxes. The Plex server goes down first and alone — the SSH session conveniently blocks until the machine is actually off, since powering down kills the daemon holding it — so nothing is still mid-read from the NAS shares when those follow. It also calls WD's own compiled shutdown binary rather than the BusyBox applet of the same name, which does not do the same thing, as I found out the hard way.
A packaged add-on for WD My Cloud NAS boxes, with its own web UI in the device's app center. Root's authorized_keys lives on the data volume, and an init script restores it into /home/root/.ssh at every boot — otherwise the keys disappear on restart and you're back to the console to get in again.
Puts an Edit Backup Job screen back into WD My Cloud OS 3's Remote Backups app. The stock version will happily create a job or delete one, but never change it — so a single wrong path means deleting the job and rebuilding it from scratch. Adds the edit button, form population, and the save path behind it.
A Chrome extension that collapses every tab group in every window, or expands them all again, from a single button. Manifest V3, ninety-six lines of code, one permission. It does the one thing and asks for nothing else.
An interactive picker that moves and locks the macOS Dock to a specific display. A thin wrapper around the lockdock formula, which does the pinning well but can't tell three identical monitors apart — on this desk all of them report back as “LG UltraFine,” so its own list is a coin flip. This adds the disambiguation the bare tool is missing.
Finds and genuinely removes personal information from PDFs, including PDFs buried inside ZIP archives. Most “redaction” draws a filled black rectangle over the text and leaves the characters sitting in the content stream, where select-and-copy or any text extractor recovers them in a second. This applies real redaction annotations and deletes the glyphs from the page before saving, so what's gone is gone.
Nothing here yet.