Code

Projects, plugins, and tools - mostly solving problems I ran into on client sites.

AI Data Stream - chat with your analytics using your own AI keys

AI Data Stream

Connect GA4, Search Console, Google Ads, PageSpeed Insights, WordPress, Pipedrive, and HubSpot to your own AI - with zero markup on API costs. Most AI analytics tools charge 3-10x what the underlying API calls cost. AI Data Stream lets you bring your own keys from OpenAI, Anthropic, Google, or DeepSeek, and chat with your data directly.

Open source

Elementor CSS Regenerator

WordPress plugin that automatically regenerates missing Elementor CSS files on demand. When Elementor clears its CSS cache, cached pages still reference deleted stylesheets - leaving visitors with broken layouts until the cache expires. This intercepts the 404, rebuilds the file, and serves it immediately.

GitHub Blog post WordPressElementorPHP

CF7 Origin Protection

Blocks Contact Form 7 submissions made through the WordPress REST API, which bypasses reCAPTCHA and other front-end spam protection. Validates that submissions come from the actual site origin.

GitHub WordPressSecurityPHP

Link Shortener

A full-featured URL shortening service with analytics dashboard, A/B testing, geo-targeting, QR codes, link health monitoring, and a drag-and-drop report builder. Built with Laravel 12 and Filament 3.

GitHub LaravelPHPFilament

Remove Yoast Sitelinks Search Box Schema

Removes the SiteLinksSearchBoxMarkup piece from Yoast's schema output. Google deprecated their sitelinks search box (which was never part of the open schema.org spec) but Yoast still outputs it, causing unnecessary warnings in Search Console. I suggested removing it upstream but was told there was "no harm" in keeping it.

GitHub Blog post WordPressSEOPHP

W3 Total Cache Page Clearer

Adds a dashboard widget and admin bar link to clear W3 Total Cache by URL. The built-in "clear this page" link only works on posts with an ID - this works on any URL, including archive and taxonomy pages.

Fix Yoast Organization Schema

Fixed a widespread issue introduced in Yoast SEO 11.0 where organization and logo data stopped being recognised by Google. The update nested organization schema inside WebPage blocks, causing logo enhancements to silently disappear from Search Console.

GitHub Blog post WordPressSEOPHP

CF7 Form Auto Class

Automatically adds a Contact Form 7 form's slug as a CSS class to its output. Useful for distinguishing form submissions in CRM systems like HubSpot, where all CF7 forms otherwise appear identical.

Joomla JSON Database Check

Diagnostic script that finds and repairs corrupted JSON data in Joomla databases after the breaking changes in version 3.6.3. My most-starred repo - it helped a lot of people at the time.