<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Justin Scroggins</title>
    <description>Thoughts on software development, engineering, and building products.</description>
    <link>https://justinscroggins.dev</link>
    <atom:link href="https://justinscroggins.dev/feed.xml" rel="self" type="application/rss+xml"/>
    <language>en-us</language>
    <lastBuildDate>Mon, 29 Jun 2026 16:21:20 GMT</lastBuildDate>
    
    <item>
      <title><![CDATA[CI/CD Platforms Are Becoming the AI Control Plane]]></title>
      <description><![CDATA[In the age of AI agents, CI/CD is no longer just where code gets built. It is where intent, identity, policy, feedback, and deployment all meet.]]></description>
      <link>https://justinscroggins.dev/blog/ci-cd-control-planes-ai</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ci-cd-control-planes-ai</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
      <category>ci-cd</category>
      <category>github-actions</category>
      <category>bitbucket</category>
      <category>ai-agents</category>
      <category>devops</category>
      <category>control-plane</category>
    </item>
    <item>
      <title><![CDATA[Kimi K2.6 Max in OpenCode With Devcontainers and Local Ollama Workers]]></title>
      <description><![CDATA[Kimi K2.6 Max just landed, and my early OpenCode testing with a devcontainer-first workflow plus background delegation to local Ollama workers is promising enough that it feels like a real glimpse of where hybrid AI coding stacks are headed.]]></description>
      <link>https://justinscroggins.dev/blog/kimi-k2-max-opencode-local-delegation</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/kimi-k2-max-opencode-local-delegation</guid>
      <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
      <category>opencode</category>
      <category>kimi</category>
      <category>ollama</category>
      <category>devcontainers</category>
      <category>ai-agents</category>
      <category>fullstack</category>
      <category>local-models</category>
    </item>
    <item>
      <title><![CDATA[Building ai-hooks: Guardrails for AI Coding Agents]]></title>
      <description><![CDATA[The real challenge with AI coding agents is not code generation. It is making sure they act with the right product context, boundaries, and feedback loops.]]></description>
      <link>https://justinscroggins.dev/blog/ai-hooks-guardrails-for-coding-agents</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ai-hooks-guardrails-for-coding-agents</guid>
      <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
      <category>ai-hooks</category>
      <category>ai-agents</category>
      <category>guardrails</category>
      <category>mcp</category>
      <category>developer-tools</category>
    </item>
    <item>
      <title><![CDATA[Evaluating AI Coding Agents in Practice]]></title>
      <description><![CDATA[Most AI agent evaluations are measuring optimism, not capability. Useful evaluation starts with real tasks, explicit acceptance criteria, and a hard look at where autonomy actually breaks down.]]></description>
      <link>https://justinscroggins.dev/blog/evaluating-ai-coding-agents-in-practice</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/evaluating-ai-coding-agents-in-practice</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>ai-agents</category>
      <category>evaluation</category>
      <category>developer-tools</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title><![CDATA[AI Coding Agents Need Product Context, Not Just Repo Context]]></title>
      <description><![CDATA[Giving an AI agent access to your codebase is useful. Giving it access to the why behind the code is what makes it consistently effective.]]></description>
      <link>https://justinscroggins.dev/blog/ai-coding-agents-need-product-context</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ai-coding-agents-need-product-context</guid>
      <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
      <category>ai-agents</category>
      <category>product-management</category>
      <category>context-engineering</category>
      <category>mcp</category>
      <category>plannable</category>
    </item>
    <item>
      <title><![CDATA[Stateful Agent Workflows and Recovery]]></title>
      <description><![CDATA[The hard part of agent automation is not making the first step happen. It is making the tenth step recover cleanly when the seventh step partially succeeded.]]></description>
      <link>https://justinscroggins.dev/blog/stateful-agent-workflows-and-recovery</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/stateful-agent-workflows-and-recovery</guid>
      <pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate>
      <category>ai-agents</category>
      <category>automation</category>
      <category>workflow-design</category>
      <category>reliability</category>
      <category>state-machines</category>
    </item>
    <item>
      <title><![CDATA[Building Plannable: Autonomous PM-AI Agent]]></title>
      <description><![CDATA[How I'm building an autonomous PM-AI agent that syncs issues, PRs, and conversations from your tools into a semantic knowledge base, with 5 AI agents continuously analyzing your work.]]></description>
      <link>https://justinscroggins.dev/blog/plannable-autonomous-pm-ai-agent</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/plannable-autonomous-pm-ai-agent</guid>
      <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
      <category>plannable</category>
      <category>ai-agents</category>
      <category>product-management</category>
      <category>autonomy</category>
    </item>
    <item>
      <title><![CDATA[Arcium Examples Reference - Complete Source Code]]></title>
      <description><![CDATA[Complete source code reference from Arcium's official examples repository covering Blackjack, Sealed Bid Auction, Voting, Coinflip, and more.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Examples-Reference</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Examples-Reference</guid>
      <pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>arcium</category>
      <category>examples</category>
      <category>reference</category>
      <category>source-code</category>
    </item>
    <item>
      <title><![CDATA[ArcInfer Build Journal]]></title>
      <description><![CDATA[A chronological log of what I built, in what order, and what I learned at each step.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Build-Journal</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Build-Journal</guid>
      <pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>build-journal</category>
      <category>tutorial</category>
      <category>mpc</category>
      <category>solana</category>
    </item>
    <item>
      <title><![CDATA[Arcium Developers Docs - RAG Notes]]></title>
      <description><![CDATA[Condensed, query-friendly notes from Arcium's official documentation for debugging ArcInfer.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Arcium-RAG-Notes</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Arcium-RAG-Notes</guid>
      <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>arcium</category>
      <category>documentation</category>
      <category>reference</category>
    </item>
    <item>
      <title><![CDATA[Setup, Deploy, and Operate]]></title>
      <description><![CDATA[Quick start guide, prerequisites, localnet dev loop, devnet deployment, and critical implementation notes for ArcInfer.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Setup-Deploy</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Setup-Deploy</guid>
      <pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>deployment</category>
      <category>solana</category>
      <category>arcium</category>
      <category>devnet</category>
    </item>
    <item>
      <title><![CDATA[Quantization, PCA, and the Classifier]]></title>
      <description><![CDATA[The three modules that sit on top of the math foundation — weight quantization, PCA dimensionality reduction, and the production classifier architecture.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Quantization-PCA-Classifier</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Quantization-PCA-Classifier</guid>
      <pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>quantization</category>
      <category>pca</category>
      <category>machine-learning</category>
      <category>rust</category>
    </item>
    <item>
      <title><![CDATA[The Client-Side Inference Pipeline]]></title>
      <description><![CDATA[Everything in this doc runs on the user's machine, before encryption. It's the bridge between human-readable text and the encrypted 16-dimensional input that enters the MPC cluster.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Inference-Pipeline</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Inference-Pipeline</guid>
      <pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>inference</category>
      <category>onnx</category>
      <category>tokenizers</category>
      <category>rust</category>
    </item>
    <item>
      <title><![CDATA[Fixed-Point Arithmetic: The Foundation of MPC Inference]]></title>
      <description><![CDATA[How and why I built Q16.16 fixed-point from scratch, what each operation costs in MPC, and why I chose accumulate-then-truncate for dot products.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Fixed-Point-Arithmetic</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Fixed-Point-Arithmetic</guid>
      <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>fixed-point</category>
      <category>mpc</category>
      <category>rust</category>
      <category>math</category>
    </item>
    <item>
      <title><![CDATA[Neural Network Layers: From Linear Algebra to MPC Circuits]]></title>
      <description><![CDATA[Building Linear layers with const generics, the square activation lesson that broke my first test, and why argmax replaces softmax.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Neural-Network-Layers</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Neural-Network-Layers</guid>
      <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
      <category>arcinfer</category>
      <category>neural-networks</category>
      <category>mpc</category>
      <category>rust</category>
      <category>square-activation</category>
    </item>
    <item>
      <title><![CDATA[Building ArcInfer: Confidential AI Inference on Arcium's MPC Network]]></title>
      <description><![CDATA[How I built a confidential sentiment analysis demo that runs neural network inference on encrypted data using Arcium's Multi-Party Computation network.]]></description>
      <link>https://justinscroggins.dev/blog/ArcInfer-Overview</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ArcInfer-Overview</guid>
      <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
      <category>arcium</category>
      <category>mpc</category>
      <category>ai-inference</category>
      <category>privacy</category>
      <category>solana</category>
      <category>rust</category>
    </item>
    <item>
      <title><![CDATA[Building MCP Servers: Giving AI Agents Real Tools]]></title>
      <description><![CDATA[How Model Context Protocol servers let Claude and GPT interact with your actual systems, not just talk about them.]]></description>
      <link>https://justinscroggins.dev/blog/mcp-servers-ai-agents</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/mcp-servers-ai-agents</guid>
      <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
      <category>AI</category>
      <category>MCP</category>
      <category>agents</category>
      <category>LLM</category>
      <category>Claude</category>
    </item>
    <item>
      <title><![CDATA[Building s3cli: A CLI for Any S3-Compatible Storage]]></title>
      <description><![CDATA[With the CLI vs MCP debate heating up, I built s3cli - a lean CLI tool that AI agents can use directly instead of requiring an MCP server. Here's how it works.]]></description>
      <link>https://justinscroggins.dev/blog/s3cli-custom-aws-signature</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/s3cli-custom-aws-signature</guid>
      <pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate>
      <category>rust</category>
      <category>cli</category>
      <category>s3</category>
      <category>cloudflare</category>
      <category>backblaze</category>
      <category>minio</category>
    </item>
    <item>
      <title><![CDATA[Building ai-tools: Universal Configuration for AI Coding Tools]]></title>
      <description><![CDATA[How I built an open-source framework that lets you define hooks, MCP servers, agents, skills, and rules once — works across Claude Code, Cursor, Codex, Gemini CLI, and 9 others.]]></description>
      <link>https://justinscroggins.dev/blog/ai-tools-universal-engine</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/ai-tools-universal-engine</guid>
      <pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate>
      <category>ai-tools</category>
      <category>open-source</category>
      <category>typescript</category>
      <category>mcp</category>
      <category>guardrails</category>
      <category>premierstudio</category>
    </item>
    <item>
      <title><![CDATA[What Good MCP Tools Look Like]]></title>
      <description><![CDATA[Most MCP tool design problems are not protocol problems. They are interface problems. Good tools are narrow, legible, low-ambiguity, and designed around what models actually do well and badly.]]></description>
      <link>https://justinscroggins.dev/blog/what-good-mcp-tools-look-like</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/what-good-mcp-tools-look-like</guid>
      <pubDate>Fri, 22 Aug 2025 00:00:00 GMT</pubDate>
      <category>mcp</category>
      <category>ai-agents</category>
      <category>tooling</category>
      <category>developer-experience</category>
      <category>api-design</category>
    </item>
    <item>
      <title><![CDATA[AI-Powered E2E Testing: Shift-Left with Playwright CLI]]></title>
      <description><![CDATA[A practical series on direct API coverage, fluent seeding, and short UI tests that stay readable under real complexity.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing</guid>
      <pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>playwright</category>
      <category>ai-testing</category>
      <category>test-coverage</category>
      <category>series</category>
      <category>realworld</category>
    </item>
    <item>
      <title><![CDATA[Building Agentful: Parallel Agent Orchestration for Claude Code]]></title>
      <description><![CDATA[How I built a pre-configured development toolkit that orchestrates specialized agents in parallel with inter-agent communication to build features from product specs.]]></description>
      <link>https://justinscroggins.dev/blog/agentful-parallel-agent-orchestration</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/agentful-parallel-agent-orchestration</guid>
      <pubDate>Sat, 15 Mar 2025 00:00:00 GMT</pubDate>
      <category>agentful</category>
      <category>claude-code</category>
      <category>ai-agents</category>
      <category>mcp</category>
      <category>typescript</category>
    </item>
    <item>
      <title><![CDATA[Putting It Together: 2-Line E2E Tests That Stay Honest]]></title>
      <description><![CDATA[The point is not literally two lines. The point is small, readable tests whose setup is deliberate because lower layers already did their jobs.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/12-two-line-tests</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/12-two-line-tests</guid>
      <pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>2-line-tests</category>
      <category>fluent</category>
      <category>aaa</category>
    </item>
    <item>
      <title><![CDATA[Inline Data Seeding: The .as() Method]]></title>
      <description><![CDATA[Seed test data inline before page interactions - the .as() method that makes 2-line tests possible.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/11-as-seeding</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/11-as-seeding</guid>
      <pubDate>Sat, 25 Jan 2025 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>seeding</category>
      <category>data-preparation</category>
      <category>test-data</category>
    </item>
    <item>
      <title><![CDATA[Fluent Form Builders: The FormBuilder Pattern]]></title>
      <description><![CDATA[Form builders are the UI-side equivalent of seeding builders: they turn repetitive browser input into a small, readable vocabulary.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/10-form-builders</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/10-form-builders</guid>
      <pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>form-builders</category>
      <category>fluent-interface</category>
      <category>automation</category>
    </item>
    <item>
      <title><![CDATA[Page Components: Beyond Simple POM]]></title>
      <description><![CDATA[Once setup is handled elsewhere, page objects can get smaller, clearer, and much more honest about what the browser layer is actually doing.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/09-page-components</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/09-page-components</guid>
      <pubDate>Sun, 05 Jan 2025 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>page-object-model</category>
      <category>pom</category>
      <category>components</category>
    </item>
    <item>
      <title><![CDATA[Expanding Coverage: CommentBuilder & UserBuilder]]></title>
      <description><![CDATA[Once setup is local, you need more than one builder. Add user and comment seeding so higher-level API and UI tests stay short and readable.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/08-more-builders</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/08-more-builders</guid>
      <pubDate>Sun, 15 Dec 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>builder-pattern</category>
      <category>comments</category>
      <category>users</category>
    </item>
    <item>
      <title><![CDATA[One-Line Cleanup: The destroyWithAllDeps Pattern]]></title>
      <description><![CDATA[Safe cascade deletion with proper ordering. Ensure no orphaned data remains in your test database.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/07-destroywithalldeps</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/07-destroywithalldeps</guid>
      <pubDate>Sun, 01 Dec 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>cleanup</category>
      <category>cascade-delete</category>
      <category>teardown</category>
    </item>
    <item>
      <title><![CDATA[Builders as Seeding: Replace beforeEach Sprawl with One Line]]></title>
      <description><![CDATA[Once lower-level APIs are covered directly, builders can do what they are actually good at: local, fluent setup for higher-level tests.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/06-withalldeps</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/06-withalldeps</guid>
      <pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>builder-pattern</category>
      <category>seeding</category>
      <category>automation</category>
    </item>
    <item>
      <title><![CDATA[Negative Cases, Boundary Coverage, and a bugs.md That Actually Helps]]></title>
      <description><![CDATA[Negative tests should not be an afterthought. Split them out, drive them from data, and keep a bug ledger that helps the next person.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/05-category-builder</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/05-category-builder</guid>
      <pubDate>Fri, 15 Nov 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>api-testing</category>
      <category>negative-testing</category>
      <category>bugs</category>
    </item>
    <item>
      <title><![CDATA[Stop Hand-Writing Giant API Specs]]></title>
      <description><![CDATA[Lower-level API coverage gets better when request helpers, validations, types, and scenarios stop living in one giant spec file.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/04-post-builder</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/04-post-builder</guid>
      <pubDate>Fri, 08 Nov 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>api-testing</category>
      <category>data-driven</category>
      <category>playwright</category>
    </item>
    <item>
      <title><![CDATA[The Foundation: TestDefaults & TestDataHelper]]></title>
      <description><![CDATA[Building the random data generation foundation with TestDefaults and cleanup management with TestDataHelper.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/03-testdefaults</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/03-testdefaults</guid>
      <pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>test-data</category>
      <category>faker</category>
      <category>utilities</category>
    </item>
    <item>
      <title><![CDATA[Installing Playwright and Building Our Test Foundation]]></title>
      <description><![CDATA[Setting up Playwright with TypeScript, configuring projects for API and UI testing, and writing our first baseline test.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/02-playwright-setup</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/02-playwright-setup</guid>
      <pubDate>Tue, 22 Oct 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>playwright</category>
      <category>setup</category>
      <category>typescript</category>
    </item>
    <item>
      <title><![CDATA[Why We're Building a 2-Line E2E Testing Framework]]></title>
      <description><![CDATA[The real problem is not builders. It is giant bespoke API specs, hidden setup in before hooks, and UI tests written without an API-first strategy.]]></description>
      <link>https://justinscroggins.dev/blog/e2e-testing/01-vision</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/e2e-testing/01-vision</guid>
      <pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate>
      <category>e2e-testing</category>
      <category>playwright</category>
      <category>test-automation</category>
      <category>api-testing</category>
    </item>
    <item>
      <title><![CDATA[FHIR APIs in Practice: Lessons from Healthcare Interoperability]]></title>
      <description><![CDATA[Building FHIR-compliant APIs taught me more about REST design than any other project. Here's what I learned.]]></description>
      <link>https://justinscroggins.dev/blog/fhir-api-healthcare-lessons</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/fhir-api-healthcare-lessons</guid>
      <pubDate>Thu, 10 Oct 2024 00:00:00 GMT</pubDate>
      <category>healthcare</category>
      <category>FHIR</category>
      <category>API</category>
      <category>interoperability</category>
      <category>HIPAA</category>
    </item>
    <item>
      <title><![CDATA[Designing Multi-Tenant Systems Without Regret]]></title>
      <description><![CDATA[Multi-tenancy problems usually start as small convenience decisions. The systems that age well are the ones that treat tenant boundaries as architecture from day one, not a filter added later.]]></description>
      <link>https://justinscroggins.dev/blog/designing-multi-tenant-systems-without-regret</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/designing-multi-tenant-systems-without-regret</guid>
      <pubDate>Sat, 03 Aug 2024 00:00:00 GMT</pubDate>
      <category>multi-tenancy</category>
      <category>architecture</category>
      <category>postgresql</category>
      <category>backend</category>
      <category>saas</category>
    </item>
    <item>
      <title><![CDATA[Kubernetes Homelab: From Zero to GitOps in a Weekend]]></title>
      <description><![CDATA[Building a production-grade K8s cluster on consumer hardware with ArgoCD, Prometheus, and zero cloud costs.]]></description>
      <link>https://justinscroggins.dev/blog/kubernetes-homelab-gitops</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/kubernetes-homelab-gitops</guid>
      <pubDate>Sat, 20 Jul 2024 00:00:00 GMT</pubDate>
      <category>kubernetes</category>
      <category>infrastructure</category>
      <category>homelab</category>
      <category>gitops</category>
    </item>
    <item>
      <title><![CDATA[Building Logarr: Mission Control for Media Server Stacks]]></title>
      <description><![CDATA[How I built a unified logging, intelligent issue detection, and AI-powered analysis platform for Plex, Jellyfin, Emby, Sonarr, Radarr, and more.]]></description>
      <link>https://justinscroggins.dev/blog/logarr-media-server-mission-control</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/logarr-media-server-mission-control</guid>
      <pubDate>Sat, 15 Jun 2024 00:00:00 GMT</pubDate>
      <category>logarr</category>
      <category>media-server</category>
      <category>nestjs</category>
      <category>nextjs</category>
      <category>postgresql</category>
      <category>docker</category>
    </item>
    <item>
      <title><![CDATA[From Manual to Autonomous: Building Self-Healing E2E Tests]]></title>
      <description><![CDATA[How I built test suites that fix themselves when UI changes break them, reducing maintenance time by 73%.]]></description>
      <link>https://justinscroggins.dev/blog/self-healing-e2e-tests</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/self-healing-e2e-tests</guid>
      <pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate>
      <category>testing</category>
      <category>playwright</category>
      <category>automation</category>
      <category>SDET</category>
    </item>
    <item>
      <title><![CDATA[Zero-Downtime PostgreSQL Migrations in Real Systems]]></title>
      <description><![CDATA[Most database migration outages are self-inflicted. The fix is usually not fancy tooling. It is sequencing, patience, and a strict expand-contract workflow.]]></description>
      <link>https://justinscroggins.dev/blog/zero-downtime-postgres-migrations</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/zero-downtime-postgres-migrations</guid>
      <pubDate>Thu, 16 Nov 2023 00:00:00 GMT</pubDate>
      <category>postgresql</category>
      <category>database</category>
      <category>migrations</category>
      <category>backend</category>
      <category>reliability</category>
    </item>
    <item>
      <title><![CDATA[Contract-First API Testing with OpenAPI]]></title>
      <description><![CDATA[Hand-written API tests drift for the same reason hand-written docs drift. The contract needs to become the source of truth for coverage, validation, and scenario planning.]]></description>
      <link>https://justinscroggins.dev/blog/contract-first-api-testing-openapi</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/contract-first-api-testing-openapi</guid>
      <pubDate>Thu, 08 Jun 2023 00:00:00 GMT</pubDate>
      <category>api-testing</category>
      <category>openapi</category>
      <category>qa</category>
      <category>backend</category>
      <category>automation</category>
    </item>
    <item>
      <title><![CDATA[Structured Logging for Real Root Cause Analysis]]></title>
      <description><![CDATA[Most logging is optimized for writing, not debugging. Structured logging forces teams to log in a way that makes production problems actually traceable.]]></description>
      <link>https://justinscroggins.dev/blog/structured-logging-for-root-cause-analysis</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/structured-logging-for-root-cause-analysis</guid>
      <pubDate>Wed, 14 Sep 2022 00:00:00 GMT</pubDate>
      <category>logging</category>
      <category>observability</category>
      <category>debugging</category>
      <category>backend</category>
      <category>distributed-systems</category>
    </item>
    <item>
      <title><![CDATA[Docker Compose for Real Development Stacks]]></title>
      <description><![CDATA[Docker Compose is still one of the fastest ways to create a dependable local platform, as long as you treat it like an integration contract instead of a pile of containers.]]></description>
      <link>https://justinscroggins.dev/blog/docker-compose-for-real-dev-stacks</link>
      <guid isPermaLink="true">https://justinscroggins.dev/blog/docker-compose-for-real-dev-stacks</guid>
      <pubDate>Thu, 28 Apr 2022 00:00:00 GMT</pubDate>
      <category>docker</category>
      <category>docker-compose</category>
      <category>developer-experience</category>
      <category>local-dev</category>
      <category>infrastructure</category>
    </item>
  </channel>
</rss>