<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Matt Wynne</title><description>Building real things on Cloudflare&apos;s edge — an AI retail platform, edge security and agents, documented as they ship.</description><link>https://blog.mattwynne.solutions/</link><item><title>I built an entire retail platform on Cloudflare&apos;s edge — here&apos;s the map</title><link>https://blog.mattwynne.solutions/blog/01-edge-retail-platform/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/01-edge-retail-platform/</guid><description>Two Workers, one D1 database, twelve Cloudflare products. The architecture behind the Lumina retail demo, why it is built this way, and what each product actually does in it.</description><pubDate>Tue, 29 Sep 2026 09:00:00 GMT</pubDate></item><item><title>Oversell-proof checkout: D1, anonymous carts and conditional updates</title><link>https://blog.mattwynne.solutions/blog/02-d1-storefront-checkout/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/02-d1-storefront-checkout/</guid><description>How the Lumina demo does e-commerce on Workers + D1: HttpOnly cookie carts, stock validation at every step, and a conditional UPDATE that makes the checkout race safe — with compensation when a race is lost.</description><pubDate>Tue, 29 Sep 2026 09:10:00 GMT</pubDate></item><item><title>Bot defense with Turnstile: one widget, three forms, honest failure</title><link>https://blog.mattwynne.solutions/blog/03-turnstile-bot-defense/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/03-turnstile-bot-defense/</guid><description>Turnstile on signup, sign-in and checkout in the Lumina demo — the sitekey/secret split, the re-challenge UX pattern, rate limits behind it, and why test keys make local dev painless.</description><pubDate>Tue, 29 Sep 2026 09:20:00 GMT</pubDate></item><item><title>Semantic product search: Vectorize embeddings with a SQL safety net</title><link>https://blog.mattwynne.solutions/blog/04-vectorize-semantic-search/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/04-vectorize-semantic-search/</guid><description>How the Lumina demo answers &apos;something elegant for a night out&apos; with real products: Workers AI embeddings, a Vectorize index, D1 re-hydration for fresh stock, and an honest SQL fallback.</description><pubDate>Tue, 29 Sep 2026 09:30:00 GMT</pubDate></item><item><title>AI Gateway: model selection as configuration, not code</title><link>https://blog.mattwynne.solutions/blog/05-ai-gateway-dynamic-routing/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/05-ai-gateway-dynamic-routing/</guid><description>The Lumina demo&apos;s free and paid chat tiers hit one AI Gateway dynamic route that picks the model per request from metadata — with a war story about the day the old mechanism was retired.</description><pubDate>Tue, 29 Sep 2026 09:40:00 GMT</pubDate></item><item><title>The AI stylist: an agent loop with its own MCP tool server</title><link>https://blog.mattwynne.solutions/blog/06-ai-stylist-agent-mcp/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/06-ai-stylist-agent-mcp/</guid><description>How the Lumina demo&apos;s chat bot becomes an agent: an intent heuristic, a bounded tool loop over the MCP protocol, a purpose-built tool Worker, grounded answers with citations — and GenAI spans so you can watch it all in the dashboard.</description><pubDate>Tue, 29 Sep 2026 09:50:00 GMT</pubDate></item><item><title>Governing agent tools with the MCP Server Portal (the flagship demo)</title><link>https://blog.mattwynne.solutions/blog/07-mcp-portal-governance/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/07-mcp-portal-governance/</guid><description>Toggle a tool off in Cloudflare&apos;s MCP Server Portal and watch the AI agent lose the capability live. How the Lumina demo does governed tool access with Access service tokens, portal tool toggles and one control plane.</description><pubDate>Tue, 29 Sep 2026 10:00:00 GMT</pubDate></item><item><title>Realtime retail with Durable Objects: live viewers, stock broadcasts and atomic reservations</title><link>https://blog.mattwynne.solutions/blog/08-durable-objects-realtime/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/08-durable-objects-realtime/</guid><description>One Durable Object coordinates WebSockets presence, live availability pushes and checkout reservations with an alarm-backed release — plus the D1-first design that keeps it honest.</description><pubDate>Tue, 29 Sep 2026 10:10:00 GMT</pubDate></item><item><title>Product media on R2: validated uploads, immutable caching and AI-generated photos</title><link>https://blog.mattwynne.solutions/blog/09-r2-media-ai-images/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/09-r2-media-ai-images/</guid><description>The Lumina demo&apos;s media pipeline: admin uploads validated by magic bytes, Worker-served images with immutable cache headers, and every catalog photo generated in-Worker by Workers AI.</description><pubDate>Tue, 29 Sep 2026 10:20:00 GMT</pubDate></item><item><title>Protecting the admin panel: Cloudflare Access SSO — and verifying the JWT inside the Worker</title><link>https://blog.mattwynne.solutions/blog/10-access-admin-jwt/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/10-access-admin-jwt/</guid><description>How the Lumina demo gates /admin with Access SSO and fully verifies the Cf-Access-Jwt-Assertion in the Worker — including the war story of the authentication bypass that trusting the header&apos;s presence caused.</description><pubDate>Tue, 29 Sep 2026 10:30:00 GMT</pubDate></item><item><title>Customer sign-in done properly: PBKDF2, D1 sessions — and a WAF rule that knows leaked passwords</title><link>https://blog.mattwynne.solutions/blog/11-customer-login-leaked-credentials/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/11-customer-login-leaked-credentials/</guid><description>The Lumina demo&apos;s customer login: Turnstile-gated, rate-limited, PBKDF2-hashed roster, D1-backed sessions with hash-at-rest and rotation — plus the compromised-credential WAF rule that edge-blocks breached passwords, and the day it proved itself right.</description><pubDate>Tue, 29 Sep 2026 10:40:00 GMT</pubDate></item><item><title>A layered prompt firewall: edge WAF + AI Gateway Guardrails + DLP</title><link>https://blog.mattwynne.solutions/blog/12-layered-prompt-firewall/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/12-layered-prompt-firewall/</guid><description>Before the Lumina demo&apos;s chat model runs, prompts pass two dashboard-configured screening layers — the zone WAF&apos;s AI Security for Apps rules and the AI Gateway&apos;s Guardrails + DLP. How the layers divide the work, and the response-side gap only the gateway can cover.</description><pubDate>Tue, 29 Sep 2026 10:50:00 GMT</pubDate></item><item><title>The attack lab: proving what the edge blocks — on your own zone</title><link>https://blog.mattwynne.solutions/blog/13-attack-lab-waf-ddos/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/13-attack-lab-waf-ddos/</guid><description>An admin-gated page that fires scanner probes, SQLi, XSS, path traversal, credential stuffing and a rate-limit burst at the Lumina demo from a real browser — plus a DDoS simulator that showed the managed ruleset catching marker traffic at 300 rps.</description><pubDate>Tue, 29 Sep 2026 11:00:00 GMT</pubDate></item><item><title>The agent-ready storefront: one Worker, two audiences</title><link>https://blog.mattwynne.solutions/blog/14-agent-ready-storefront/</link><guid isPermaLink="true">https://blog.mattwynne.solutions/blog/14-agent-ready-storefront/</guid><description>The Lumina demo serves humans a SPA and AI agents a crawlable information architecture — Content-Signal robots policy, a sitemap generated from D1, llms.txt, an OpenAPI contract, JSON-LD product pages and Markdown negotiation. Plus the crawler-validation story that needed GraphQL forensics.</description><pubDate>Tue, 29 Sep 2026 11:10:00 GMT</pubDate></item></channel></rss>