Writing

Notes from the work.

Technical decisions, working software, and what I learned after the documentation stopped being enough. Begin with a curated route, or choose your own path through the archive.

Trailhead

Start here

Four pieces that show the range of the journal without asking you to scan all 92 entries.

Mapped routes

Follow a series

Related notes read better together. These routes connect recurring work across years.

The full journal

Choose your path.

Showing all 92 notes

Optimizing Cubbly After Moving Away from SSR

Removing SSR simplified Cubbly but delayed useful inventory. I compared four client-loading compositions and kept the one that made real route content 31–42% faster.

AI Pricing Is Becoming UX

GPT-5.6 turns capability into a price ladder, while Codex Spark turns speed into a separate button. AI pricing is becoming part of the interface.

Evaluating a TanStack Table v9 Upgrade

I wanted to keep a shared table component current without accepting migration work on faith. A side-by-side benchmark made the trade-off much easier to judge.

Claude’s Guardrails End at Claude

Closed-model guardrails remain tied to the provider, even as comparable open weights spread. Public safety needs controls that survive that reality.

GLM Is Cheap. Steering It Isn't.

GLM costs a fraction of Opus per token. OpenCode's Plan/Build toggle doesn't cut that cost back down — it just moves it.

I Can't Avoid the Price Gap Anymore

My company merged separate AI tool budgets into one shared pool. That's when Opus versus GLM stopped being an abstract question.

Grouping Lights in Home Assistant

How to group color lights in Home Assistant using Helpers — and why the old YAML platform approach stopped working in 2026.5.

Tripsy Now Has a CLI (and an MCP)

Tripsy released an official CLI and MCP server in May 2026. The CLI is the better tool. Everything I documented for the SQLite approach is now unnecessary.

One Claude Code Install Is Enough

My machine has one Claude Code executable and one updater. Here is how I check the path, remove conflicts, and keep it that way.

Claude Code Comes to the Web and iOS

Claude Code on the web changes coding from an editor interaction into delegated work. That matters more than adding another interface.

Sora Isn't the Problem: It's the Mirror

Using Sora in a TikTok-style feed made social media's incentive problem hard to ignore: fabricated video is now cheaper than recording reality.

Claude Haiku 4.5: Cheap and Fast

I use Claude Haiku for small refactors, review, and debugging. Its lower cost and faster responses matter more there than deeper reasoning.

What SwiftUI's Tab APIs Actually Do

I rebuilt SwiftUI's TabView examples to separate the iOS 18 navigation APIs from the iOS 26 Liquid Glass redesign—and to see where the system takes control.

Fix Cloudflare 525 Errors with Fly.io

Cloudflare 525 errors on Fly.io usually mean the origin certificate is wrong. Fix the custom domain cert before blaming DNS.

AI Is the New Backdoor Layoff

Companies can shrink teams without announcing layoffs. They call it AI efficiency, lower hiring needs, and let attrition do the rest.

How Claude Code Built This Blog - Part 2

Claude Code helped build the parser, generator, templates, and Cloudflare deployment. Syntax highlighting and timezones took more work.

How Claude Code Built This Blog - Part 1

I paid about $10 to see whether Claude Code could scaffold the TypeScript static-site generator behind this blog. Most of its choices held up.

Bitcoin ATMs Are Not Financial Inclusion

Bitcoin ATMs charge steep fees and are frequently used in scams. Their placement in vulnerable neighborhoods makes the business model hard to defend.

Why I Built a Static Blog

A personal blog should be fast on a phone and boring to host — Markdown to static HTML on Cloudflare, no app server.