Blog
Notes on building CardPath, platform engineering, and whatever else is on my mind.
2026
-
Projecting creepy Halloween eyes onto my window with Home Assistant
How I projected creepy animated eyes onto my window for Halloween with a cheap projector, open-source JavaScript, and Home Assistant over MQTT.
-
My temporary PHP fix from 2014 has nearly 20M installs. Today I'm deprecating it.
In 2014 I wrote http_build_url, a temporary PHP polyfill for AOL's CMS. Twelve years and nearly 20 million installs later, I'm deprecating it.
-
Claude Code skill for TP-Link's Omada SDN
A Claude Code skill for managing a self-hosted TP-Link Omada controller through its OpenAPI, with a helper script that skips per-call approvals.
-
Running a vLLM LXC on Proxmox 9
Notes on running vLLM in an Ubuntu LXC on Proxmox 9 with an RTX 3050: host drivers, device passthrough, and a first model over the CLI and API.
2016
2013
-
Vagrant: The guest machine entered an invalid state
A vagrant up that died in the 'poweroff' state, and the fix that worked: repairing disk permissions on the host Mac.
-
Getting phpmd to play nice in Composer
phpmd installed through Composer failed on a missing PHP/Depend autoloader until PHP Depend was pinned explicitly in require-dev.
-
Python Meetup
Notes from a Miami Python meetup that turned into an impromptu panel on Django: setup time, opinions, deployment, and Pyramid as the alternative.
-
google.maps.geocoder undefined is not a function
Why the Google Maps geocoder broke under RequireJS and AngularJS, and how the async plugin from requirejs-plugins fixes it.
-
Session Locking in PHP with Memcached
Why dozens of Magento tabs hung and then loaded all at once: PHP session locking, and why memcached-backed sessions lock too.
2012
-
Auto Tweeting Quality Links
How I kept a steady stream of curated links on Twitter in 2012: Google Reader folders and stars, a public Atom feed, and Pluggio's Dripfeed.
-
Javascript Frameworks
A 2012 look at data binding and the JavaScript frameworks competing on it: Backbone, Spine, Knockout, Ember, and Angular.
-
IPv6 is here (and how it screwed me)
Why a .local development domain on OS X took exactly 5 seconds to resolve, and the one-line /etc/hosts fix.