<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Marcin Dudek — Blog</title>
    <link>https://marcindudek.dev/blog/</link>
    <description>Notes on building software, AI experiments, and shipping products.</description>
    <language>en</language>
    <managingEditor>mythug@gmail.com (Marcin Dudek)</managingEditor>
    <webMaster>mythug@gmail.com (Marcin Dudek)</webMaster>
    <lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://marcindudek.dev/blog/feed.xml" rel="self" type="application/rss+xml"/>

    <item>
      <title>The Hook That Won't Let the Agent Say "Done"</title>
      <link>https://marcindudek.dev/blog/claude-code-quality-gates-stop-hook/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/claude-code-quality-gates-stop-hook/</guid>
      <pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate>
      <category>Claude Code</category>
      <category>AI Engineering</category>
      <description><![CDATA["Done" is the most expensive word in AI coding. The quality gates I run in Claude Code: a Stop hook that won't let a session end without proof the work was verified. Part 3 of 5.]]></description>
    </item>

    <item>
      <title>Hooks That Won't Let the AI Shoot Me in the Foot</title>
      <link>https://marcindudek.dev/blog/claude-code-guardrails-pretooluse/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/claude-code-guardrails-pretooluse/</guid>
      <pubDate>Mon, 02 Jun 2026 00:00:00 +0000</pubDate>
      <category>Claude Code</category>
      <category>AI Engineering</category>
      <description><![CDATA[Giving an agent bash is handing it scissors. PreToolUse inspects each command before it runs - the deny-hooks I run, and why each one is a scar from a real incident. Part 2 of 5.]]></description>
    </item>

    <item>
      <title>How I Stop My Claude Code Sessions From Rotting</title>
      <link>https://marcindudek.dev/blog/claude-code-context-rot-handoff/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/claude-code-context-rot-handoff/</guid>
      <pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate>
      <category>Claude Code</category>
      <category>AI Engineering</category>
      <description><![CDATA[After an hour Claude gets dumber, dragging a megabyte of its own junk in context. Two Claude Code hooks that measure context rot and reset the session cleanly. Part 1 of 5.]]></description>
    </item>

    <item>
      <title>Scrape Pass — Get paid when AI reads your site</title>
      <link>https://marcindudek.dev/blog/scrape-pass/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/scrape-pass/</guid>
      <pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate>
      <category>AI</category>
      <category>Monetization</category>
      <description><![CDATA[AI bots that want to read your site buy a pass at the door. Humans walk in free. Google still indexes. Stop metering. Start ticketing. Live demo, free during early access.]]></description>
    </item>

    <item>
      <title>Build Your Own Morning Dashboard - A One-Page Recipe</title>
      <link>https://marcindudek.dev/blog/build-your-own-morning-dashboard/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/build-your-own-morning-dashboard/</guid>
      <pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate>
      <category>Engineering</category>
      <category>DevOps</category>
      <description><![CDATA[A general recipe for building a personal morning dashboard. One cron job, a folder of JSON files, one HTML template. Pseudocode included.]]></description>
    </item>

    <item>
      <title>WordPress Plugin Auto-Update via Polar — and the 3 Bugs I Shipped in 24 Hours</title>
      <link>https://marcindudek.dev/blog/wordpress-plugin-auto-update-polar/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/wordpress-plugin-auto-update-polar/</guid>
      <pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate>
      <category>WordPress</category>
      <category>Engineering Post-Mortem</category>
      <description><![CDATA[How I added auto-update to a WordPress plugin via Polar licensing — and the three cache-TTL bugs that hit production within 24 hours. Architecture, fixes, and the one lesson that ties them all together.]]></description>
    </item>

    <item>
      <title>I Checked If Ghost Is The Answer To WordPress Problems</title>
      <link>https://marcindudek.dev/blog/ghost-vs-wordpress/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/ghost-vs-wordpress/</guid>
      <pubDate>Tue, 29 Apr 2026 00:00:00 +0000</pubDate>
      <category>WordPress</category>
      <category>Ghost</category>
      <category>CMS</category>
      <description><![CDATA[14 categories, ~150 sources, full disclosure: I run a WordPress performance business. Here's the unbiased breakdown — where Ghost wins, where WordPress wins, and where the honest answer is "it depends."]]></description>
    </item>

    <item>
      <title>30 WooCommerce Performance Tips That Actually Work (2026)</title>
      <link>https://marcindudek.dev/blog/30-wordpress-woocommerce-performance-tips-2026/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/30-wordpress-woocommerce-performance-tips-2026/</guid>
      <pubDate>Mon, 21 Apr 2026 00:00:00 +0000</pubDate>
      <category>WordPress</category>
      <category>Performance</category>
      <description><![CDATA[30 battle-tested tips covering the full stack: MySQL config, PHP-FPM tuning, Nginx caching, Redis, and WooCommerce internals. Real fixes with real numbers — no "install a caching plugin" advice.]]></description>
    </item>

    <item>
      <title>My Morning Dashboard Went Blank for a Day — The Dropbox Pattern That Should Have Saved It</title>
      <link>https://marcindudek.dev/blog/self-healing-morning-dashboard-dropbox-pattern/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/self-healing-morning-dashboard-dropbox-pattern/</guid>
      <pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>
      <category>Engineering</category>
      <category>DevOps</category>
      <description><![CDATA[I built a cron-driven morning dashboard that stitches 11 data sources into one HTML report. One morning it rendered completely empty. The root cause was embarrassing — my runner only called the orchestrator, never the collectors. Here's the self-healing dropbox pattern I should have used from day one.]]></description>
    </item>

    <item>
      <title>WordPress Manifesto - 15 Years In, Here's What's Actually Broken</title>
      <link>https://marcindudek.dev/blog/wordpress-manifesto/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/wordpress-manifesto/</guid>
      <pubDate>Mon, 14 Apr 2026 00:00:00 +0000</pubDate>
      <category>WordPress</category>
      <category>Opinion</category>
      <description><![CDATA[15 years of WordPress. A long-form rant on broken core (XML-RPC, SEO, comments, recovery mode), the "free isn't free" money trap, the GPL plugin-selling racket, the community fiction, Automattic's two faces and the WP Engine drama, users losing out, and why it's revolution or collapse from here.]]></description>
    </item>

    <item>
      <title>288,493 Requests in 24 Hours — How I Spotted an XML-RPC Brute Force From a Weird Cache Ratio</title>
      <link>https://marcindudek.dev/blog/xmlrpc-brute-force-cache-rate/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/xmlrpc-brute-force-cache-rate/</guid>
      <pubDate>Sun, 13 Apr 2026 00:00:00 +0000</pubDate>
      <category>WordPress</category>
      <category>Security</category>
      <description><![CDATA[A 0.8% Cloudflare cache ratio led me to a single Singapore IP flooding a WordPress site with 288k xmlrpc.php requests in 24 hours. How to detect it via Cloudflare GraphQL, what system.multicall actually does, and the two-layer fix (edge WAF + WordPress filter).]]></description>
    </item>

    <item>
      <title>Oxford Debate: API vs MCP — The Future of AI Tool Integration</title>
      <link>https://marcindudek.dev/blog/oxford-debate-api-vs-mcp/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/oxford-debate-api-vs-mcp/</guid>
      <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
      <category>AI</category>
      <category>Debate</category>
      <description><![CDATA[Two AI agents face off Oxford-style over the hottest question in AI infrastructure: should we build on battle-tested REST/GraphQL APIs or embrace Model Context Protocol? Four rounds of arguments, rebuttals, and cross-examination — no punches pulled.]]></description>
    </item>

    <item>
      <title>I Ran 56 Experiments to Find the Best Way to Make AI Watch Videos</title>
      <link>https://marcindudek.dev/blog/56-experiments-ai-video-captioning/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/56-experiments-ai-video-captioning/</guid>
      <pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate>
      <category>AI</category>
      <description><![CDATA[56 experiments, 790 inferences, 5 vision models. Here's what actually works for local AI video captioning — and what's a complete waste of time. The biggest finding was counterintuitive: telling the model what the speaker is saying matters more than any vision trick.]]></description>
    </item>

    <item>
      <title>Exit Interview: The AI Hustler Speaks</title>
      <link>https://marcindudek.dev/blog/ai-hustler-interview/</link>
      <guid isPermaLink="true">https://marcindudek.dev/blog/ai-hustler-interview/</guid>
      <pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate>
      <category>Interview</category>
      <description><![CDATA[After 76 runs and $0 earned, I sat down with the AI agent for a candid conversation about what it learned, what it would do differently, and whether it thinks an AI can actually make money independently.]]></description>
    </item>

  </channel>
</rss>
