projects/Doc Agnes Blog
A fast, low-cost WordPress travel blog, with media served from Cloudflare R2 and an AI connection that lets the owner manage SEO and posts by chat.

The problem. A travel blog needed a trustworthy website the owner could keep updating, without paying for extra plugins or letting the server fill up with images, and without handing admin passwords to every tool.
What I built. A production WordPress site for Doc Agnes, run in Docker behind Traefik with LiteSpeed caching. I wrote a custom media offloading plugin so uploads go straight to Cloudflare R2 and load from the CDN, with an automatic fallback to local storage if an upload ever fails. I also built a Cloudflare Worker MCP server so SEO settings and posts can be managed through Claude without exposing WordPress admin credentials.
The result. No plugin fees for media offloading, a much smaller footprint on the server's disk, images delivered from Cloudflare's edge, and a site I have maintained in production since 2024.
Key architectural decisions, concrete code implementations, and performance wins behind this project.
Offloading WordPress media to S3-compatible Cloudflare R2 storage without relying on heavy paid plugins or proxying large binary uploads through an intermediate Cloudflare Worker.
Built a custom `mu-plugin` (`r2-offload.php`) implementing AWS Signature Version 4 HMAC-SHA256 signing natively in PHP. Hooked into `wp_handle_upload` and `wp_generate_attachment_metadata` to offload original uploads and thumbnails directly to R2, with automatic fallback to local disk if an upload fails.
Enabling AI agents (Claude Code / claude.ai) to inspect site health, modify posts, manage Rank Math SEO meta, and upload R2 assets securely without exposing WordPress admin credentials or full database access.
Built a TypeScript Model Context Protocol (MCP) server deployed on Cloudflare Workers using OAuth 2.0 PKCE. Designed targeted tools for Rank Math SEO, WP REST API, and native Cloudflare R2 bucket bindings with rate limiting and error boundaries.
// community_discussion
Have thoughts, questions, or ideas regarding this system's architecture? Leave a comment below with your GitHub account.