<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Kristian Papadakis Blog</title><description>News and Updates from Kristian Papadakis</description><link>https://kristianpapadakis.com/</link><language>en-GB</language><item><title>The file that exists only for machines, that no machine could read</title><link>https://kristianpapadakis.com/writing/the-file-only-machines-read</link><guid>https://kristianpapadakis.com/writing/the-file-only-machines-read</guid><description>An audit that found a machine-readable file no parser could read, contrast failing at 2.76 against a 4.5 minimum, and dead URLs in the one file LLMs actually fetch. None of it was visible in a browser.</description><pubDate>Sun, 26 Jul 2026 09:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>Seven review rounds on a payments path, and not one broken feature</title><link>https://kristianpapadakis.com/writing/bugs-about-the-world</link><guid>https://kristianpapadakis.com/writing/bugs-about-the-world</guid><description>Seven review rounds on a ticketing and refunds path - quantity handling, refund scope, idempotency keys, a DST test that passed against two wrong implementations, and two features worth refusing to build.</description><pubDate>Sat, 25 Jul 2026 11:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>The migration ran against the wrong database and reported failure</title><link>https://kristianpapadakis.com/writing/the-migration-that-hit-the-wrong-database</link><guid>https://kristianpapadakis.com/writing/the-migration-that-hit-the-wrong-database</guid><description>How a mismatch between DATABASE_URL and DB_URL sent a staging migration to a local dev database, why the error message pointed the wrong way, and why fallbacks belong nowhere near migration tooling.</description><pubDate>Fri, 24 Jul 2026 18:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>A 403 from an API is not necessarily from the API</title><link>https://kristianpapadakis.com/writing/the-403-that-was-not-from-the-vendor</link><guid>https://kristianpapadakis.com/writing/the-403-that-was-not-from-the-vendor</guid><description>How a default Python user agent triggered a Cloudflare bot ban on an email API, why the blast radius was wider than the reported symptom, and what a transport-layer test double stops you from ever testing.</description><pubDate>Fri, 17 Jul 2026 20:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>Building an MCP Server People Actually Use</title><link>https://kristianpapadakis.com/writing/building-an-mcp-server-people-actually-use</link><guid>https://kristianpapadakis.com/writing/building-an-mcp-server-people-actually-use</guid><description>The design of a production MCP server that lets a customer&apos;s own AI drive your software - tool granularity, naming, recoverable errors, auth, and where to put the human. Product meets protocol.</description><pubDate>Fri, 17 Jul 2026 16:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>The Filesystem Is My Database</title><link>https://kristianpapadakis.com/writing/the-filesystem-is-my-database</link><guid>https://kristianpapadakis.com/writing/the-filesystem-is-my-database</guid><description>Why the AI operator running my business stores everything in plain markdown files instead of a database - three-tier memory, wikilinks, no app server, no build step, and the case for the boring storage layer.</description><pubDate>Fri, 17 Jul 2026 14:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>How My Company Runs From My Phone on Claude Code</title><link>https://kristianpapadakis.com/writing/how-my-company-runs-from-my-phone-on-claude-code</link><guid>https://kristianpapadakis.com/writing/how-my-company-runs-from-my-phone-on-claude-code</guid><description>The daily reality of running a business through an AI operator on Claude Code - the morning brief, five execution lanes, an overnight dream cycle, and approving instead of doing, all from a phone.</description><pubDate>Fri, 17 Jul 2026 12:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>I Built an AI Operator That Runs a Company End to End</title><link>https://kristianpapadakis.com/writing/i-built-an-ai-operator-that-runs-a-company-end-to-end</link><guid>https://kristianpapadakis.com/writing/i-built-an-ai-operator-that-runs-a-company-end-to-end</guid><description>How I built an agent OS on Claude Code that runs a real B2B business end to end - routing, roles, memory, MCP, human-in-the-loop approvals - and the architecture decisions behind it.</description><pubDate>Fri, 17 Jul 2026 09:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>The migration shipped green with every redirect broken</title><link>https://kristianpapadakis.com/writing/redirects-that-were-never-there</link><guid>https://kristianpapadakis.com/writing/redirects-that-were-never-there</guid><description>Moving a site from Rails to Astro: why redirect files are host-specific dialects, how to verify a cutover by diffing behaviour rather than counting 200s, and the failure modes that never surface in a build log.</description><pubDate>Mon, 06 Jul 2026 19:00:00 GMT</pubDate><author>Kristian Papadakis</author></item><item><title>The CI bill was not a capacity problem</title><link>https://kristianpapadakis.com/writing/ci-was-running-everything-twice</link><guid>https://kristianpapadakis.com/writing/ci-was-running-everything-twice</guid><description>Why three workflows ran the full test suite twice per push, how a local-first gating model cut Actions usage to near zero, and the one job that should never move to a self-hosted runner.</description><pubDate>Tue, 23 Jun 2026 17:00:00 GMT</pubDate><author>Kristian Papadakis</author></item></channel></rss>