<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Brian Crabtree — Field Notes</title>
    <link>https://briancrabtree.me/journal/</link>
    <description>Field Notes: technical journal, build notes, and engineering logs from Brian Crabtree.</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 02 Jun 2026 18:00:00 GMT</lastBuildDate>
    <atom:link href="https://briancrabtree.me/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Why PageSpeed Scores Change Every Run (And What to Fix First)</title>
      <link>https://briancrabtree.me/journal/why-pagespeed-scores-change-every-run/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/why-pagespeed-scores-change-every-run/</guid>
      <pubDate>Tue, 02 Jun 2026 18:00:00 GMT</pubDate>
      <description>PageSpeed and Lighthouse scores jump between runs on the same URL—that is normal lab behavior. Here is what moves the number, what to fix first, and how to verify scores honestly.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Performance Checks Before Handoff</title>
      <link>https://briancrabtree.me/journal/performance-checks-before-handoff/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/performance-checks-before-handoff/</guid>
      <pubDate>Mon, 01 Jun 2026 07:54:38 GMT</pubDate>
      <description>Before handoff I run Lighthouse and Core Web Vitals on the real URL, fix what hurts mobile users, and document what changed—no invented scores, no vanity badges.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>How This Site Is Built (Reference Stack)</title>
      <link>https://briancrabtree.me/journal/how-this-site-is-built/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/how-this-site-is-built/</guid>
      <pubDate>Mon, 01 Jun 2026 07:54:38 GMT</pubDate>
      <description>This site is the working reference build: React 19, a public API layer, Firestore admin, and a deploy path you can inspect yourself—not a theme demo with fake proof.</description>
      <category>Engineering</category>
    </item>
    <item>
      <title>Monorepo vs Split Repos for Small Product Teams</title>
      <link>https://briancrabtree.me/journal/monorepo-vs-split-repos-small-teams/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/monorepo-vs-split-repos-small-teams/</guid>
      <pubDate>Thu, 28 May 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve wrestled with frontend/backend splits and consolidated projects for small teams. Deciding between a monorepo vs split repos for small teams isn&apos;t dogma; it&apos;s about practical friction. Here&apos;s what I learned building and maintaining both.</description>
      <category>Engineering</category>
    </item>
    <item>
      <title>CSS-in-JS Runtime Cost: When Global CSS Wins</title>
      <link>https://briancrabtree.me/journal/css-in-js-runtime-cost/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/css-in-js-runtime-cost/</guid>
      <pubDate>Mon, 25 May 2026 18:00:00 GMT</pubDate>
      <description>Runtime styling trades build simplicity for main-thread work. I measure injection, hydration, and cache behavior before picking CSS-in-JS.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>API Rate Limiting Patterns Frontends Depend On</title>
      <link>https://briancrabtree.me/journal/api-rate-limiting-frontend-patterns/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/api-rate-limiting-frontend-patterns/</guid>
      <pubDate>Thu, 21 May 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve shipped more rate limit errors than I care to admit. Building frontends that respect API boundaries was a hard lesson, but it means users get what they expect. Here&apos;s how I approach it.</description>
      <category>Backend</category>
    </item>
    <item>
      <title>When Frameworks Are Worth It: My Decision Framework</title>
      <link>https://briancrabtree.me/journal/when-frameworks-are-worth-it/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/when-frameworks-are-worth-it/</guid>
      <pubDate>Mon, 18 May 2026 18:00:00 GMT</pubDate>
      <description>Frameworks are leverage or tax depending on problem shape. I score interaction density, team skill, and lifecycle before recommending React or static HTML.</description>
      <category>Engineering</category>
    </item>
    <item>
      <title>TypeScript Strict Mode in Production Codebases</title>
      <link>https://briancrabtree.me/journal/typescript-strict-mode-production/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/typescript-strict-mode-production/</guid>
      <pubDate>Thu, 14 May 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve shipped a lot of TypeScript code, some strict, some not. This post is about why I push for full TypeScript strict mode in production codebases now, despite the initial pain. It&apos;s about reducing runtime surprises and building more reliable systems.</description>
      <category>JavaScript</category>
    </item>
    <item>
      <title>Fetch Waterfalls: Why Parallel Requests Still Feel Slow</title>
      <link>https://briancrabtree.me/journal/fetch-waterfalls-parallel-requests/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/fetch-waterfalls-parallel-requests/</guid>
      <pubDate>Mon, 11 May 2026 18:00:00 GMT</pubDate>
      <description>Parallel fetch is not enough if chains start late. I flatten dependencies, colocate data, and cache at the edge.</description>
      <category>JavaScript</category>
    </item>
    <item>
      <title>React 19 Server Components for Marketing Sites (When They Help)</title>
      <link>https://briancrabtree.me/journal/react-19-server-components-marketing-sites/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/react-19-server-components-marketing-sites/</guid>
      <pubDate>Thu, 07 May 2026 18:00:00 GMT</pubDate>
      <description>React 19 Server Components offer a practical solution for specific marketing site challenges. They optimize static content delivery and SEO by shifting rendering to the server, but introduce new tradeoffs and are not a universal fix. It&apos;s about strategic application where they truly shine, not blanket adoption.</description>
      <category>React</category>
    </item>
    <item>
      <title>Interaction to Next Paint: What INP Measures and How I Fix It</title>
      <link>https://briancrabtree.me/journal/interaction-to-next-paint-inp-guide/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/interaction-to-next-paint-inp-guide/</guid>
      <pubDate>Mon, 04 May 2026 18:00:00 GMT</pubDate>
      <description>INP replaced FID as the responsiveness metric that hurts. I trace long tasks on clicks and cut main-thread debt before chasing bytes.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Lighthouse CI in Deploy Pipelines (Catch Regressions Before Users Do)</title>
      <link>https://briancrabtree.me/journal/lighthouse-ci-deploy-pipelines/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/lighthouse-ci-deploy-pipelines/</guid>
      <pubDate>Thu, 30 Apr 2026 18:00:00 GMT</pubDate>
      <description>I got tired of seeing performance numbers degrade after every major release. Setting up Lighthouse CI in our deploy pipelines catches regressions before they hit production, giving us hard data to back up decisions.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Mobile-First Local Search for Service Businesses (Technical, Not Fluff)</title>
      <link>https://briancrabtree.me/journal/mobile-first-local-search-service-businesses/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/mobile-first-local-search-service-businesses/</guid>
      <pubDate>Tue, 28 Apr 2026 18:00:00 GMT</pubDate>
      <description>For service businesses, local search success is tied directly to mobile performance. I&apos;ve seen too many sites lose leads because they treat mobile as an afterthought. This post details the technical steps I take to ensure mobile-first indexing actually translates to client calls, not just good desktop rankings.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>CSS Custom Properties as Design Tokens That Survive Redesigns</title>
      <link>https://briancrabtree.me/journal/css-custom-properties-design-tokens/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/css-custom-properties-design-tokens/</guid>
      <pubDate>Mon, 27 Apr 2026 18:00:00 GMT</pubDate>
      <description>Tokens in JavaScript objects die on framework change. Tokens on :root cascade through vanilla CSS and every shell I ship.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>Google Tag Manager Performance Tax (What Marketing Adds to TBT)</title>
      <link>https://briancrabtree.me/journal/tag-manager-performance-tax/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/tag-manager-performance-tax/</guid>
      <pubDate>Thu, 23 Apr 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve seen Google Tag Manager add significant overhead, especially to Total Blocking Time. It&apos;s often where marketing&apos;s drive for data clashes with engineering&apos;s need for a fast site. My experience shows ignoring the google tag manager performance impact is expensive.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Arizona SMB Headless Rebuild — When WordPress Stops Scaling</title>
      <link>https://briancrabtree.me/journal/arizona-smb-headless-wordpress-rebuild/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/arizona-smb-headless-wordpress-rebuild/</guid>
      <pubDate>Tue, 21 Apr 2026 18:00:00 GMT</pubDate>
      <description>I recently rebuilt a client&apos;s critical but sluggish Arizona SMB WordPress site into a performant headless React application. The old setup was failing under increased traffic, causing frustratingly slow page loads. The new architecture shipped with a tangible performance boost and a much more resilient foundation.</description>
      <category>Backend</category>
    </item>
    <item>
      <title>Static Prerender Shells: SPAs That Paint Before JavaScript</title>
      <link>https://briancrabtree.me/journal/static-prerender-shells-spa/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/static-prerender-shells-spa/</guid>
      <pubDate>Mon, 20 Apr 2026 18:00:00 GMT</pubDate>
      <description>I ship HTML shells with real copy and LCP images before the bundle hydrates. Users and crawlers get substance, not a spinner.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Image srcset and Sizing for LCP (Stop Shipping Desktop Pixels to Mobile)</title>
      <link>https://briancrabtree.me/journal/image-srcset-lcp-sizing/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/image-srcset-lcp-sizing/</guid>
      <pubDate>Thu, 16 Apr 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve seen too many sites ship massive desktop images to mobile devices. Getting srcset and sizes right is essential for Largest Contentful Paint. Stop wasting user bandwidth on pixels nobody can actually see.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Phoenix Metro Local SEO Technical Foundation (NAP, Schema, CWV)</title>
      <link>https://briancrabtree.me/journal/phoenix-metro-local-seo-technical-foundation/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/phoenix-metro-local-seo-technical-foundation/</guid>
      <pubDate>Tue, 14 Apr 2026 18:00:00 GMT</pubDate>
      <description>When a client asked for a deep dive on their Phoenix local SEO technical foundation, I found the usual suspects: NAP inconsistency, missing schema, and Core Web Vitals dragging. This post breaks down what we fixed and how it impacted their local visibility.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Framework Churn: What Survives When the Hype Cycle Moves</title>
      <link>https://briancrabtree.me/journal/framework-churn-what-survives/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/framework-churn-what-survives/</guid>
      <pubDate>Mon, 13 Apr 2026 18:00:00 GMT</pubDate>
      <description>New frameworks ship weekly. HTML, HTTP, CSS, and SQL outlive all of them. I bet on boundaries and boring ops.</description>
      <category>Engineering</category>
    </item>
    <item>
      <title>Service Worker Caching Mistakes on Marketing Sites</title>
      <link>https://briancrabtree.me/journal/service-worker-caching-mistakes/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/service-worker-caching-mistakes/</guid>
      <pubDate>Thu, 09 Apr 2026 18:00:00 GMT</pubDate>
      <description>I learned the hard way that aggressive service worker caching on marketing sites causes more problems than it solves. Stale content and broken deployments are a headache. This is how I fixed my service worker caching mistakes.</description>
      <category>JavaScript</category>
    </item>
    <item>
      <title>Gilbert AZ Business Website Speed — What Owners Miss</title>
      <link>https://briancrabtree.me/journal/gilbert-az-business-website-speed/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/gilbert-az-business-website-speed/</guid>
      <pubDate>Tue, 07 Apr 2026 18:00:00 GMT</pubDate>
      <description>I often see Gilbert AZ businesses losing customers before their site even loads. Many owners miss the real culprits behind their slow websites, thinking a pretty design is enough. It&apos;s about profit, not just aesthetics. I&apos;ll break down the technical debt costing them conversions and what to actually fix.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Java and Spring Content APIs for Headless Frontends</title>
      <link>https://briancrabtree.me/journal/java-spring-content-apis-headless/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/java-spring-content-apis-headless/</guid>
      <pubDate>Mon, 06 Apr 2026 18:00:00 GMT</pubDate>
      <description>Spring Boot still powers serious content backends. I expose JSON that React and static sites can cache without fighting JPA on every request.</description>
      <category>Backend</category>
    </item>
    <item>
      <title>Critical CSS Without a Build Tool Religion</title>
      <link>https://briancrabtree.me/journal/critical-css-without-build-tool-religion/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/critical-css-without-build-tool-religion/</guid>
      <pubDate>Thu, 02 Apr 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve spent years shaving milliseconds off page loads. Getting critical CSS right, especially for smaller sites or those purposefully avoiding heavy tooling, doesn&apos;t have to be a nightmare. This is my blunt take on how to do it manually and effectively.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>Form Spam Without CAPTCHA Friction</title>
      <link>https://briancrabtree.me/journal/form-spam-without-captcha-friction/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/form-spam-without-captcha-friction/</guid>
      <pubDate>Tue, 31 Mar 2026 18:00:00 GMT</pubDate>
      <description>Form spam is a constant headache, but I hate making users jump through hoops with CAPTCHAs. I&apos;ve been refining a set of invisible defenses that effectively block bots without adding any friction for real humans. It&apos;s about smart server-side checks and client-side deception.</description>
      <category>HTML</category>
    </item>
    <item>
      <title>Mobile-First CSS That Scales Up Without Rewriting</title>
      <link>https://briancrabtree.me/journal/mobile-first-css-that-scales/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/mobile-first-css-that-scales/</guid>
      <pubDate>Mon, 30 Mar 2026 18:00:00 GMT</pubDate>
      <description>Mobile-first is write small screen rules first, enhance with min-width, not shrink desktop comps in a panic on Friday.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>Brotli vs Gzip for Static Sites (What I Enable in Production)</title>
      <link>https://briancrabtree.me/journal/brotli-vs-gzip-static-sites/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/brotli-vs-gzip-static-sites/</guid>
      <pubDate>Thu, 26 Mar 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve configured compression for static sites for years. The brotli vs gzip static site debate isn&apos;t new, but my production approach has become very clear. I&apos;ll lay out exactly what I enable on my servers today and why it works best for client projects.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Firebase vs Self-Hosted for Small Business Dashboards</title>
      <link>https://briancrabtree.me/journal/firebase-vs-self-hosted-smb-dashboards/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/firebase-vs-self-hosted-smb-dashboards/</guid>
      <pubDate>Tue, 24 Mar 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve built dashboards for small businesses, grappling with backend choices. Deciding between Firebase and self-hosted isn&apos;t theoretical; it&apos;s about budgets, sleepless nights, and shipping features. Here&apos;s what I&apos;ve learned.</description>
      <category>Backend</category>
    </item>
    <item>
      <title>Hydration and CLS: React Fixes That Survive the Next Deploy</title>
      <link>https://briancrabtree.me/journal/hydration-cls-react-fixes/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/hydration-cls-react-fixes/</guid>
      <pubDate>Mon, 23 Mar 2026 18:00:00 GMT</pubDate>
      <description>Layout shift after hydration is a logic bug, not a metric curse. I align server HTML, reserve space, and defer DOM surgery.</description>
      <category>React</category>
    </item>
    <item>
      <title>Cloudflare Cache and Stale Assets After Deploy</title>
      <link>https://briancrabtree.me/journal/cloudflare-cache-stale-assets-after-deploy/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/cloudflare-cache-stale-assets-after-deploy/</guid>
      <pubDate>Thu, 19 Mar 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve wrestled with Cloudflare caching keeping old assets alive after a deploy. This post covers the specific headaches, what went wrong in my setup, and the concrete steps I took to finally get new files showing up consistently. It details advanced cache control, targeted purging, and asset fingerprinting for reliable </description>
      <category>Performance</category>
    </item>
    <item>
      <title>Spring Boot Content API Pagination for Headless Frontends</title>
      <link>https://briancrabtree.me/journal/spring-boot-content-api-pagination/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/spring-boot-content-api-pagination/</guid>
      <pubDate>Tue, 17 Mar 2026 18:00:00 GMT</pubDate>
      <description>I often deal with paginating content APIs for headless clients. Getting spring boot content api pagination right means balancing backend efficiency with frontend flexibility, avoiding common pitfalls like slow offsets and data inconsistencies.</description>
      <category>Backend</category>
    </item>
    <item>
      <title>Third-Party Scripts: The Performance Cost Marketing Underestimates</title>
      <link>https://briancrabtree.me/journal/third-party-scripts-performance-cost/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/third-party-scripts-performance-cost/</guid>
      <pubDate>Mon, 16 Mar 2026 18:00:00 GMT</pubDate>
      <description>Analytics, chat widgets, and A/B snippets run on your main thread, not theirs. I inventory, defer, and delete with data.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Lab vs Field Data — When PageSpeed Scores Mislead You</title>
      <link>https://briancrabtree.me/journal/lab-vs-field-data-pagespeed/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/lab-vs-field-data-pagespeed/</guid>
      <pubDate>Thu, 12 Mar 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve seen too many teams celebrate perfect Lighthouse scores while real users suffer. Lab vs field data in PageSpeed Insights tells two different stories. Relying only on synthetic tests is a quick way to miss actual performance problems.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Headless WordPress When Plugins Become the Product</title>
      <link>https://briancrabtree.me/journal/headless-wordpress-when-plugins-become-product/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/headless-wordpress-when-plugins-become-product/</guid>
      <pubDate>Tue, 10 Mar 2026 18:00:00 GMT</pubDate>
      <description>I pushed a WordPress site to its limits by over-relying on plugins, and it eventually buckled. The spiraling performance cost and relentless maintenance overhead made me ask: headless WordPress, when to switch? Here’s a blunt look at what broke and how we navigated away from the plugin ecosystem.</description>
      <category>Backend</category>
    </item>
    <item>
      <title>Container Queries: Responsive Components Without Breakpoint Guessing</title>
      <link>https://briancrabtree.me/journal/container-queries-responsive-components/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/container-queries-responsive-components/</guid>
      <pubDate>Mon, 09 Mar 2026 18:00:00 GMT</pubDate>
      <description>Viewport media queries lie inside grids and sidebars. I size components from their parent box with container queries and stay sane.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>Fixed-Price Web Project vs Hourly (What SMBs Should Ask)</title>
      <link>https://briancrabtree.me/journal/fixed-price-web-project-vs-hourly/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/fixed-price-web-project-vs-hourly/</guid>
      <pubDate>Thu, 05 Mar 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve seen enough web projects go sideways to know pricing isn&apos;t simple. Fixed-price vs hourly web development contracts each have sharp edges. Small businesses especially need to know what questions to ask before signing on. I&apos;ll explain what I&apos;ve learned from both sides of the table.</description>
      <category>Engineering</category>
    </item>
    <item>
      <title>prefers-reduced-motion Beyond a Media Query Checkbox</title>
      <link>https://briancrabtree.me/journal/prefers-reduced-motion-beyond-checkbox/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/prefers-reduced-motion-beyond-checkbox/</guid>
      <pubDate>Tue, 03 Mar 2026 18:00:00 GMT</pubDate>
      <description>I thought prefers-reduced-motion was a simple media query checkbox. It&apos;s not. I&apos;ve shipped features that broke accessibility for users who need it most, and learned that best practices mean more than just fading out animations. Here&apos;s what I actually do now.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>HTML Forms Without Framework Magic: What Still Works in 2026</title>
      <link>https://briancrabtree.me/journal/html-forms-without-framework-magic/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/html-forms-without-framework-magic/</guid>
      <pubDate>Mon, 02 Mar 2026 18:00:00 GMT</pubDate>
      <description>Native forms with server actions and honest validation beat heavy client kits on most marketing sites. I wire them without losing UX.</description>
      <category>HTML</category>
    </item>
    <item>
      <title>Staging to Production Checklist Before You Launch</title>
      <link>https://briancrabtree.me/journal/staging-to-production-checklist/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/staging-to-production-checklist/</guid>
      <pubDate>Thu, 26 Feb 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve seen too many launches go sideways because critical steps were missed. This post covers the non-negotiable checks I run when moving from staging to production, ensuring a smooth deployment and fewer surprises for both the client and the users.</description>
      <category>Engineering</category>
    </item>
    <item>
      <title>Responsive Tables Without Horizontal Scroll Hell</title>
      <link>https://briancrabtree.me/journal/responsive-tables-without-scroll-hell/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/responsive-tables-without-scroll-hell/</guid>
      <pubDate>Tue, 24 Feb 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve shipped a lot of tables that broke on small screens. Horizontal scrollbars are a user experience crime. Here&apos;s how I build responsive tables without relying on JavaScript or making users pinch and zoom.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>WordPress Plugin Tax: Performance Debt I Remove First</title>
      <link>https://briancrabtree.me/journal/wordpress-plugin-performance-tax/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/wordpress-plugin-performance-tax/</guid>
      <pubDate>Mon, 23 Feb 2026 18:00:00 GMT</pubDate>
      <description>Every plugin is PHP, SQL, CSS, and JS on every request until proven otherwise. I audit active plugins like credit card statements.</description>
      <category>Backend</category>
    </item>
    <item>
      <title>GA4 and Core Web Vitals Reporting Owners Actually Read</title>
      <link>https://briancrabtree.me/journal/ga4-core-web-vitals-reporting/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/ga4-core-web-vitals-reporting/</guid>
      <pubDate>Thu, 19 Feb 2026 18:00:00 GMT</pubDate>
      <description>I&apos;ve built a lot of Google Analytics dashboards. Most Core Web Vitals reports in GA4 are useless for owners and product managers. Here&apos;s how I set up GA4 to actually report on site performance metrics that matter.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Print Stylesheets Still Matter for Invoices and Spec Sheets</title>
      <link>https://briancrabtree.me/journal/print-stylesheets-invoices-specs/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/print-stylesheets-invoices-specs/</guid>
      <pubDate>Tue, 17 Feb 2026 18:00:00 GMT</pubDate>
      <description>I&apos;m still surprised by how many businesses struggle with printouts of their own data. Invoices, spec sheets, legal documents – these often look awful when printed directly from a browser. Ignoring print stylesheets means extra work fixing bad output, which is easily avoidable.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>Font Loading Without Layout Shift or Fake Bold</title>
      <link>https://briancrabtree.me/journal/font-loading-without-layout-shift/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/font-loading-without-layout-shift/</guid>
      <pubDate>Mon, 16 Feb 2026 18:00:00 GMT</pubDate>
      <description>Web fonts sell brand and steal stability. I limit families, subset glyphs, and match metrics so CLS stays quiet on mobile.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>JSON-LD Schema for Local Business Without Plugin Bloat</title>
      <link>https://briancrabtree.me/journal/json-ld-schema-local-business/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/json-ld-schema-local-business/</guid>
      <pubDate>Thu, 12 Feb 2026 18:00:00 GMT</pubDate>
      <description>I ditched schema plugins years ago after seeing them tank site performance and break structured data parsing. Now, I hand-code json-ld local business schema directly into the DOM, keeping full control and avoiding bloat. It&apos;s cleaner, faster, and works every time.</description>
      <category>HTML</category>
    </item>
    <item>
      <title>Skip Links and Keyboard Nav on SPAs</title>
      <link>https://briancrabtree.me/journal/skip-links-keyboard-nav-spa/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/skip-links-keyboard-nav-spa/</guid>
      <pubDate>Tue, 10 Feb 2026 18:00:00 GMT</pubDate>
      <description>I shipped a React SPA without proper skip links or keyboard navigation, and the accessibility report was brutal. We fixed it, but understanding how client-side rendering impacts focus management for assistive tech was key. Here&apos;s what actually worked.</description>
      <category>HTML</category>
    </item>
    <item>
      <title>WebP and AVIF: How I Ship Images Without Regret</title>
      <link>https://briancrabtree.me/journal/webp-avif-modern-image-delivery/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/webp-avif-modern-image-delivery/</guid>
      <pubDate>Mon, 09 Feb 2026 18:00:00 GMT</pubDate>
      <description>JPEG is not dead but it is not the default either. I pair modern formats with dimensions, lazy loading, and honest LCP preloads.</description>
      <category>Performance</category>
    </item>
    <item>
      <title>Managed Hosting vs Cheap Shared Hosting for Business Sites</title>
      <link>https://briancrabtree.me/journal/managed-hosting-vs-cheap-shared-hosting/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/managed-hosting-vs-cheap-shared-hosting/</guid>
      <pubDate>Thu, 05 Feb 2026 18:00:00 GMT</pubDate>
      <description>Bad hosting cripples good businesses. Managed hosting is vital for site security, speed, and avoiding constant issues. I&apos;ll explain why this upgrade is a critical investment for long-term reliability and growth.</description>
      <category>Engineering</category>
    </item>
    <item>
      <title>WCAG Color Contrast for Brutalist and Dark UIs</title>
      <link>https://briancrabtree.me/journal/wcag-contrast-brutalist-dark-ui/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/wcag-contrast-brutalist-dark-ui/</guid>
      <pubDate>Tue, 03 Feb 2026 18:00:00 GMT</pubDate>
      <description>I learned the hard way that aggressive dark UIs and brutalist designs often fail WCAG contrast without deliberate planning. Shipping accessible dark mode meant rethinking color systems, not just inverting values. This is how I tackled those compliance issues head-on.</description>
      <category>CSS</category>
    </item>
    <item>
      <title>Backend JSON APIs: Shapes I Design So Frontends Stay Fast</title>
      <link>https://briancrabtree.me/journal/backend-json-api-design-for-frontends/</link>
      <guid isPermaLink="true">https://briancrabtree.me/journal/backend-json-api-design-for-frontends/</guid>
      <pubDate>Mon, 02 Feb 2026 18:00:00 GMT</pubDate>
      <description>Chatty REST and bloated graphs both hurt. I design endpoints for one screen, stable keys, and pagination that does not punish mobile.</description>
      <category>Backend</category>
    </item>
  </channel>
</rss>
