<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>ibit</title>
  <subtitle>Notes from a curious engineer: code, products, and the connections between.</subtitle>
  <link href="https://www.ibit.blog/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://www.ibit.blog/" rel="alternate" type="text/html" />
  <id>https://www.ibit.blog/</id>
  <updated>2026-07-02T00:00:00.000Z</updated>
  <author><name>White Rabbit</name></author>
  <entry>
    <title>I built the anti-content-farm. Google almost flagged me as one.</title>
    <link href="https://www.ibit.blog/articles/mistaken-for-a-content-farm" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/mistaken-for-a-content-farm</id>
    <published>2026-07-02T00:00:00.000Z</published>
    <updated>2026-07-02T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="seo" />
    <category term="ymyl" />
    <category term="adsense" />
    <category term="static-export" />
    <category term="nextjs" />
    <summary>I built a tax calculator with obsessive provenance — every number sourced to a dated .gov, a human in the loop before anything ships. Then one afternoon of programmatic scaling nearly cost me monetization anyway. Quality in YMYL is judged at a level you don&apos;t fully control.</summary>
  </entry>
  <entry>
    <title>XState, honestly: a high-ceiling tool with a bill attached</title>
    <link href="https://www.ibit.blog/articles/xstate-the-honest-review" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/xstate-the-honest-review</id>
    <published>2026-07-02T00:00:00.000Z</published>
    <updated>2026-07-02T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="xstate" />
    <category term="state-management" />
    <category term="react" />
    <category term="typescript" />
    <category term="architecture" />
    <summary>XState makes impossible states impossible and turns tangled flows into a diagram you can read — but it charges a real learning tax and loses to lighter tools for everyday state. A review of where the trade lands, and who should take it.</summary>
  </entry>
  <entry>
    <title>On Fable 5, effort is the whole price dial</title>
    <link href="https://www.ibit.blog/articles/fable-5-effort-is-the-price-dial" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/fable-5-effort-is-the-price-dial</id>
    <published>2026-07-01T00:00:00.000Z</published>
    <updated>2026-07-01T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="ai" />
    <category term="api" />
    <category term="claude" />
    <summary>On Fable 5 thinking is always on and billed as output tokens, and effort is the only knob that moves thinking depth — so low/medium/high/xhigh/max isn&apos;t a quality slider, it&apos;s the dial on the pricier half of the bill.</summary>
  </entry>
  <entry>
    <title>It&apos;s the thread, not the language: why CSS animations stay smooth</title>
    <link href="https://www.ibit.blog/articles/css-animation-compositor-thread" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/css-animation-compositor-thread</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="performance" />
    <category term="css" />
    <category term="javascript" />
    <summary>CSS animation isn&apos;t faster because the math is cheaper. It&apos;s faster because it can run off the main thread entirely — and a JS library that hooks the same engine is just as smooth.</summary>
  </entry>
  <entry>
    <title>Themes without the variable duplication: CSS light-dark()</title>
    <link href="https://www.ibit.blog/articles/css-light-dark-theming" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/css-light-dark-theming</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="css" />
    <category term="design" />
    <summary>How the light-dark() function and color-scheme collapse the old two-blocks-of-variables dark mode pattern into a single source of truth — including a manual light/dark/system switch.</summary>
  </entry>
  <entry>
    <title>The customizable &lt;select&gt; and its one non-negotiable rule</title>
    <link href="https://www.ibit.blog/articles/customizable-select-accessibility-rule" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/customizable-select-accessibility-rule</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="css" />
    <category term="accessibility" />
    <category term="html" />
    <summary>The new styleable &lt;select&gt; finally lets us build icon-and-swatch dropdowns — and that&apos;s exactly the trap. Visual content must be additive, never a substitute for real text.</summary>
  </entry>
  <entry>
    <title>The browser finally owns HTML sanitization</title>
    <link href="https://www.ibit.blog/articles/html-sanitizer-api" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/html-sanitizer-api</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="security" />
    <category term="html" />
    <category term="javascript" />
    <summary>The HTML Sanitizer API moves XSS stripping into the engine that actually runs the HTML — closing a structural gap that DOMPurify could only paper over. But it&apos;s defense-in-depth, not a license to drop server sanitization.</summary>
  </entry>
  <entry>
    <title>Next.js 16 with no server</title>
    <link href="https://www.ibit.blog/articles/nextjs-16-no-server" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/nextjs-16-no-server</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="nextjs" />
    <category term="static" />
    <category term="react" />
    <summary>What it actually means to run a full Next.js 16 App Router site with nothing behind it — every route resolved at build time, shipped as plain files — and what that buys you.</summary>
  </entry>
  <entry>
    <title>Performance Is an Organizational Problem Wearing a Technical Costume</title>
    <link href="https://www.ibit.blog/articles/performance-is-an-organizational-problem" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/performance-is-an-organizational-problem</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="performance" />
    <category term="architecture" />
    <category term="accessibility" />
    <category term="security" />
    <summary>After enough performance fixes, you stop blaming engineers and start blaming the fact that nobody can hold the whole system in one head. Performance, accessibility, and security are the same disease.</summary>
  </entry>
  <entry>
    <title>The async leak that passes code review</title>
    <link href="https://www.ibit.blog/articles/promise-all-cancellation-leak" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/promise-all-cancellation-leak</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="javascript" />
    <category term="async" />
    <summary>Promise.all rejects, but it never cancels the tasks it was waiting on — which is how you end up with zombie fetches and connection slots that never free.</summary>
  </entry>
  <entry>
    <title>Shipping sourcemaps with sourcesContent leaks your whole source</title>
    <link href="https://www.ibit.blog/articles/sourcemaps-leak-your-source" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/sourcemaps-leak-your-source</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="security" />
    <category term="tooling" />
    <category term="javascript" />
    <summary>Minification is theater if you also publish the .map file — the sourcesContent field inlines your original code, comments and all. The honest fix is a boring CI check, not vigilance.</summary>
  </entry>
  <entry>
    <title>Static export: where the limits are</title>
    <link href="https://www.ibit.blog/articles/static-export-limits" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/static-export-limits</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="nextjs" />
    <category term="static" />
    <category term="architecture" />
    <summary>A map of the wall between Next.js static export and the server-only features that quietly break it — the line every zero-server site, this one included, has to live behind.</summary>
  </entry>
  <entry>
    <title>The Tailwind disagreement, steelmanned</title>
    <link href="https://www.ibit.blog/articles/tailwind-steelmanned" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/tailwind-steelmanned</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="css" />
    <category term="tailwind" />
    <category term="design" />
    <summary>The strongest arguments against Tailwind are real and worth naming — but most of the fight is aesthetics dressed as engineering. Here&apos;s how I split the legitimate critique from the vibes.</summary>
  </entry>
  <entry>
    <title>Thirty-one years to fix a date: what Temporal teaches about API mistakes you can&apos;t take back</title>
    <link href="https://www.ibit.blog/articles/temporal-irreversible-api-design" rel="alternate" type="text/html" />
    <id>https://www.ibit.blog/articles/temporal-irreversible-api-design</id>
    <published>2026-06-29T00:00:00.000Z</published>
    <updated>2026-06-29T00:00:00.000Z</updated>
    <author><name>White Rabbit</name></author>
    <category term="javascript" />
    <category term="api-design" />
    <summary>JavaScript&apos;s Temporal API finally fixes Date — but the real lesson is that the original bugs were never fixable at all. At web scale, the only repair is additive.</summary>
  </entry>
</feed>
