<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>KahWee Teng — Field Notes</title><description>Writing about frontend systems, AI engineering, developer tools, and useful technology.</description><link>https://kahwee.com/</link><language>en-us</language><lastBuildDate>Sun, 06 Sep 2026 23:17:57 GMT</lastBuildDate><atom:link href="https://kahwee.com/feed.xml" rel="self" type="application/rss+xml"/><atom:link href="https://pubsubhubbub.appspot.com/" rel="hub"/><item><title>What’s There to Learn from WordPress?</title><link>https://kahwee.com/2026/what-to-learn-from-wordpress/</link><guid isPermaLink="true">https://kahwee.com/2026/what-to-learn-from-wordpress/</guid><description>The WP Engine fight, the Valkey fork, and agent-written code raise a harder question: what keeps an open-source project honest?</description><pubDate>Sun, 06 Sep 2026 16:00:00 GMT</pubDate><category>open-source</category><category>ai</category><category>corporate-strategy</category><category>web-development</category></item><item><title>Optimizing Cubbly After Moving Away from SSR</title><link>https://kahwee.com/2026/cubbly-lcp-waterfall/</link><guid isPermaLink="true">https://kahwee.com/2026/cubbly-lcp-waterfall/</guid><description>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.</description><pubDate>Thu, 20 Aug 2026 16:22:01 GMT</pubDate><category>technology</category><category>web-development</category><category>performance</category><category>react</category><category>vite</category><category>cloudflare</category></item><item><title>Removing React SSR from Cubbly to Simplify Lingui</title><link>https://kahwee.com/2026/cubbly-one-vite-pipeline-cloudflare-worker-ssr/</link><guid isPermaLink="true">https://kahwee.com/2026/cubbly-one-vite-pipeline-cloudflare-worker-ssr/</guid><description>I removed React SSR from Cubbly because maintaining Lingui across the Worker and browser was not worth the speed it bought on a private application.</description><pubDate>Thu, 20 Aug 2026 04:00:00 GMT</pubDate><category>technology</category><category>web-development</category><category>build-tool</category><category>cloudflare</category><category>vite</category><category>react</category><category>performance</category></item><item><title>Choosing When Hermes Agent Automations Need an LLM</title><link>https://kahwee.com/2026/five-things-learned-running-hermes-agent-automations/</link><guid isPermaLink="true">https://kahwee.com/2026/five-things-learned-running-hermes-agent-automations/</guid><description>I use Hermes Agent to interpret and configure automations, then let Home Assistant or a script execute repeatable actions with visible failure states.</description><pubDate>Wed, 19 Aug 2026 20:30:00 GMT</pubDate><category>applied-ai-systems</category><category>hermes-agent</category><category>automation</category><category>home-assistant</category><category>security</category></item><item><title>AI Pricing Is Becoming UX</title><link>https://kahwee.com/2026/ai-pricing-is-becoming-ux/</link><guid isPermaLink="true">https://kahwee.com/2026/ai-pricing-is-becoming-ux/</guid><description>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.</description><pubDate>Wed, 12 Aug 2026 19:00:00 GMT</pubDate><category>ai</category><category>coding</category><category>developer-tool</category><category>chatgpt</category><category>codex</category><category>software-engineering</category></item><item><title>Evaluating a TanStack Table v9 Upgrade</title><link>https://kahwee.com/2026/migrating-tanstack-table-v8-to-v9/</link><guid isPermaLink="true">https://kahwee.com/2026/migrating-tanstack-table-v8-to-v9/</guid><description>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.</description><pubDate>Sat, 08 Aug 2026 19:00:00 GMT</pubDate><category>technology</category><category>web-development</category><category>react</category><category>performance</category></item><item><title>React Router v8 Learned to Make Upgrades Boring</title><link>https://kahwee.com/2026/react-router-v8-upgrade-cost-benefits/</link><guid isPermaLink="true">https://kahwee.com/2026/react-router-v8-upgrade-cost-benefits/</guid><description>React Router v8 keeps the framework-mode API familiar and moves v7&apos;s future flags into defaults. That restraint matters after an expensive v6-to-v7 migration.</description><pubDate>Fri, 31 Jul 2026 16:00:00 GMT</pubDate><category>technology</category><category>web-development</category><category>performance</category><category>vite</category></item><item><title>Claude’s Guardrails End at Claude</title><link>https://kahwee.com/2026/claude-guardrails-end-at-claude/</link><guid isPermaLink="true">https://kahwee.com/2026/claude-guardrails-end-at-claude/</guid><description>Closed-model guardrails remain tied to the provider, even as comparable open weights spread. Public safety needs controls that survive that reality.</description><pubDate>Wed, 29 Jul 2026 17:00:00 GMT</pubDate><category>ai</category><category>anthropic</category><category>claude</category><category>open-source</category><category>corporate-strategy</category></item><item><title>AI-Generated Code Review: What Reviewers Should Still Block</title><link>https://kahwee.com/2026/ai-code-quality-is-changing/</link><guid isPermaLink="true">https://kahwee.com/2026/ai-code-quality-is-changing/</guid><description>Models make awkward code cheaper to replace. Review should block future risk and leave private ideas of neat to automated conventions.</description><pubDate>Wed, 29 Jul 2026 16:00:00 GMT</pubDate><category>ai</category><category>coding</category><category>software-engineering</category><category>claude</category><category>openai</category></item><item><title>The Best Coding Agent Is the One You Can Keep Using</title><link>https://kahwee.com/2026/grok-from-tesla-to-coding-agent/</link><guid isPermaLink="true">https://kahwee.com/2026/grok-from-tesla-to-coding-agent/</guid><description>Grok Build produces useful patches, but its weekly limit changes how I use it. The harness and quota now matter more than the model.</description><pubDate>Tue, 28 Jul 2026 23:00:00 GMT</pubDate><category>ai</category><category>ai-tool</category><category>technology</category><category>software-engineering</category><category>web-development</category></item><item><title>Learning Rust with Claude Code Through Local Hardware Projects</title><link>https://kahwee.com/2026/claude-code-what-i-actually-use/</link><guid isPermaLink="true">https://kahwee.com/2026/claude-code-what-i-actually-use/</guid><description>Claude Code lowers the cost of being a Rust beginner. It kept two local-hardware projects moving while I learned the language inside them.</description><pubDate>Sat, 25 Jul 2026 21:00:00 GMT</pubDate><category>ai</category><category>claude</category><category>ai-tool</category><category>software-engineering</category><category>web-development</category><category>technology</category></item><item><title>Cloudflare Redirects for Static Blog URL Migrations</title><link>https://kahwee.com/2026/static-blog-cloudflare-stack/</link><guid isPermaLink="true">https://kahwee.com/2026/static-blog-cloudflare-stack/</guid><description>I keep changing this blog. One small Cloudflare Worker lets the URLs survive the changes while the site itself stays static.</description><pubDate>Thu, 23 Jul 2026 21:30:00 GMT</pubDate><category>web-development</category><category>cloudflare</category><category>performance</category><category>static-site-generator</category><category>technology</category></item><item><title>GLM Is Cheap. Steering It Isn&apos;t.</title><link>https://kahwee.com/2026/glm-opencode-harness-gap/</link><guid isPermaLink="true">https://kahwee.com/2026/glm-opencode-harness-gap/</guid><description>GLM costs a fraction of Opus per token. OpenCode&apos;s Plan/Build toggle doesn&apos;t cut that cost back down — it just moves it.</description><pubDate>Mon, 06 Jul 2026 16:05:00 GMT</pubDate><category>ai</category><category>claude</category></item><item><title>I Can&apos;t Avoid the Price Gap Anymore</title><link>https://kahwee.com/2026/ai-budget-pooling-cost-controls/</link><guid isPermaLink="true">https://kahwee.com/2026/ai-budget-pooling-cost-controls/</guid><description>My company merged separate AI tool budgets into one shared pool. That&apos;s when Opus versus GLM stopped being an abstract question.</description><pubDate>Wed, 01 Jul 2026 16:00:00 GMT</pubDate><category>ai</category><category>corporate-strategy</category><category>claude</category></item><item><title>Thread Claims Interoperability. Your Network Has Three Meshes.</title><link>https://kahwee.com/2026/thread-fragmentation-mdns/</link><guid isPermaLink="true">https://kahwee.com/2026/thread-fragmentation-mdns/</guid><description>dns-sd exposes what smart home apps hide: Apple, Amazon, and eero each run separate Thread meshes on the same network, and devices on different meshes route through Wi-Fi instead of communicating directly.</description><pubDate>Sat, 30 May 2026 16:00:00 GMT</pubDate><category>technology</category><category>smart-home</category><category>thread</category><category>matter</category><category>networking</category></item><item><title>Grouping Lights in Home Assistant</title><link>https://kahwee.com/2026/home-assistant-light-groups/</link><guid isPermaLink="true">https://kahwee.com/2026/home-assistant-light-groups/</guid><description>How to group color lights in Home Assistant using Helpers — and why the old YAML platform approach stopped working in 2026.5.</description><pubDate>Wed, 27 May 2026 16:00:00 GMT</pubDate><category>technology</category><category>tutorial</category><category>home-assistant</category><category>smart-home</category></item><item><title>Tripsy Now Has a CLI (and an MCP)</title><link>https://kahwee.com/2026/tripsy-mcp-cli/</link><guid isPermaLink="true">https://kahwee.com/2026/tripsy-mcp-cli/</guid><description>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.</description><pubDate>Tue, 19 May 2026 16:00:00 GMT</pubDate><category>technology</category><category>ai</category><category>developer-tool</category><category>claude</category></item><item><title>Papra Was Running. SQLite Still Couldn&apos;t Write.</title><link>https://kahwee.com/2026/self-hosting-papra-with-docker-compose/</link><guid isPermaLink="true">https://kahwee.com/2026/self-hosting-papra-with-docker-compose/</guid><description>Papra looked healthy on my NAS while registration failed. The browser hid the useful detail: SQLite belonged to the wrong user.</description><pubDate>Mon, 18 May 2026 07:30:00 GMT</pubDate><category>technology</category><category>tutorial</category><category>open-source</category><category>web-server</category></item><item><title>I Ordered a Fitbit Air Because I Won&apos;t Sleep in My Apple Watch</title><link>https://kahwee.com/2026/fitbit-air-sleep-tracker/</link><guid isPermaLink="true">https://kahwee.com/2026/fitbit-air-sleep-tracker/</guid><description>I ordered a Google Fitbit Air to test whether a lighter band can solve the sleep-data gap my Apple Watch leaves.</description><pubDate>Sat, 16 May 2026 04:00:00 GMT</pubDate><category>technology</category><category>wearable</category><category>google</category><category>personal</category></item><item><title>How to Connect Hermes Agent to Home Assistant</title><link>https://kahwee.com/2026/hermes-agent-home-assistant-integration/</link><guid isPermaLink="true">https://kahwee.com/2026/hermes-agent-home-assistant-integration/</guid><description>Two environment variables and a gateway restart. I said &apos;turn off all my lights&apos; and they went off two seconds later.</description><pubDate>Thu, 30 Apr 2026 16:00:00 GMT</pubDate><category>applied-ai-systems</category><category>hermes-agent</category><category>home-assistant</category><category>security</category></item><item><title>How to Run Hermes Agent on a UGREEN NAS with Docker</title><link>https://kahwee.com/2026/hermes-agent-ugreen-nas-docker/</link><guid isPermaLink="true">https://kahwee.com/2026/hermes-agent-ugreen-nas-docker/</guid><description>UGREEN said my Hermes container was running. The gateway couldn&apos;t read its config. Two user IDs explained the failure—and the fix.</description><pubDate>Thu, 30 Apr 2026 05:04:36 GMT</pubDate><category>applied-ai-systems</category><category>hermes-agent</category><category>ugreen</category><category>docker</category><category>security</category><category>technology</category></item><item><title>Your Linter Needs to Be as Fast as Your AI</title><link>https://kahwee.com/2026/biome-linting-for-ai-workflows/</link><guid isPermaLink="true">https://kahwee.com/2026/biome-linting-for-ai-workflows/</guid><description>Biome keeps my AI coding loop moving, but it doesn&apos;t replace TypeScript. Here is the current setup and the trade-off I kept.</description><pubDate>Wed, 22 Apr 2026 16:00:00 GMT</pubDate><category>web-development</category><category>developer-tool</category><category>performance</category><category>typescript</category><category>coding</category><category>ai-tool</category><category>build-tool</category></item><item><title>Reading and Writing Tripsy&apos;s SQLite Database on macOS</title><link>https://kahwee.com/2026/tripsy-sqlite-read-write/</link><guid isPermaLink="true">https://kahwee.com/2026/tripsy-sqlite-read-write/</guid><description>Tripsy stores all your trip data in a local SQLite file that iCloud syncs to your Mac. The file is already on your disk — no export needed.</description><pubDate>Sun, 22 Mar 2026 17:00:00 GMT</pubDate><category>ios</category><category>tutorial</category><category>developer-tool</category><category>technology</category><category>mobile-development</category></item><item><title>Why Adobe Animate&apos;s Flash-to-HTML5 Bridge Failed</title><link>https://kahwee.com/2026/why-adobe-animate-flash-bridge-failed/</link><guid isPermaLink="true">https://kahwee.com/2026/why-adobe-animate-flash-bridge-failed/</guid><description>Adobe Animate kept the Flash timeline alive for HTML5, but the web moved on. Maintenance mode confirms the bridge could not hold.</description><pubDate>Mon, 02 Feb 2026 17:00:00 GMT</pubDate><category>animation</category><category>flash</category><category>web-history</category><category>adobe</category><category>tools</category><category>technology</category></item><item><title>Getting a DBA in San Francisco: The Real Process and Costs</title><link>https://kahwee.com/2026/getting-a-dba-in-san-francisco/</link><guid isPermaLink="true">https://kahwee.com/2026/getting-a-dba-in-san-francisco/</guid><description>I registered a San Francisco DBA for $236. It took two City Hall stops, one newspaper email, and four weeks of publication.</description><pubDate>Wed, 21 Jan 2026 17:00:00 GMT</pubDate><category>san-francisco</category><category>business</category><category>personal</category><category>technology</category></item><item><title>Claude Code Plugins Turn Instructions Into Dependencies</title><link>https://kahwee.com/2026/claude-code-plugin-marketplace/</link><guid isPermaLink="true">https://kahwee.com/2026/claude-code-plugin-marketplace/</guid><description>I expected Claude Code plugins to be heavy infrastructure. The frontend-design plugin is mostly Markdown; the marketplace makes it installable and scoped.</description><pubDate>Tue, 20 Jan 2026 19:00:00 GMT</pubDate><category>claude</category><category>ai-tool</category><category>developer-tool</category><category>web-development</category></item><item><title>Vite’s ?url Import Gives You a URL, Not jQuery</title><link>https://kahwee.com/2026/vite-url-import-jquery/</link><guid isPermaLink="true">https://kahwee.com/2026/vite-url-import-jquery/</guid><description>In Vite, ?url changes a JavaScript import into an asset URL import. Here is the fix—and when the suffix is actually useful.</description><pubDate>Tue, 20 Jan 2026 17:00:00 GMT</pubDate><category>vite</category><category>web-development</category><category>build-tool</category><category>jquery</category></item><item><title>jQuery 4: I Can&apos;t Believe They Actually Did It</title><link>https://kahwee.com/2026/jquery-4-slim-build/</link><guid isPermaLink="true">https://kahwee.com/2026/jquery-4-slim-build/</guid><description>jQuery 4.0.0 shipped last week. I didn&apos;t expect to write about jQuery in 2026. The project has been around since 2006.</description><pubDate>Mon, 19 Jan 2026 17:00:00 GMT</pubDate><category>javascript</category><category>jquery</category><category>web-development</category></item><item><title>Document Your Quirks: Why CLAUDE.md Changes Everything</title><link>https://kahwee.com/2025/document-project-quirks/</link><guid isPermaLink="true">https://kahwee.com/2025/document-project-quirks/</guid><description>I spent 45 minutes teaching Claude a fix I already knew. Putting that project quirk in CLAUDE.md stopped the same rediscovery next time.</description><pubDate>Sat, 15 Nov 2025 17:00:00 GMT</pubDate><category>claude-ai</category><category>developer-tool</category><category>software-engineering</category><category>ai-assistant</category><category>productivity</category><category>ai</category></item><item><title>Tailwind v4 Missed Every Class in My Shared Package</title><link>https://kahwee.com/2025/tailwind-v4-pnpm-monorepo/</link><guid isPermaLink="true">https://kahwee.com/2025/tailwind-v4-pnpm-monorepo/</guid><description>Tailwind v4 rendered my shared components without their utility classes. One @source directive fixed three hours of monorepo debugging.</description><pubDate>Sat, 15 Nov 2025 16:00:00 GMT</pubDate><category>web-development</category><category>build-tool</category><category>developer-tool</category></item><item><title>Origin Made Me Review Work Copilot Already Handles</title><link>https://kahwee.com/2025/origin-financial-vs-copilot-money-comparison/</link><guid isPermaLink="true">https://kahwee.com/2025/origin-financial-vs-copilot-money-comparison/</guid><description>I tried Origin as an alternative to Copilot Money. More financial products did not make up for the transaction review it handed back to me.</description><pubDate>Mon, 10 Nov 2025 16:00:00 GMT</pubDate><category>finance</category><category>technology</category><category>personal</category><category>ai</category></item><item><title>I Default to React Router Loaders Until Caching Hurts</title><link>https://kahwee.com/2025/react-router-v7-loaders-vs-react-query/</link><guid isPermaLink="true">https://kahwee.com/2025/react-router-v7-loaders-vs-react-query/</guid><description>Six months with React Router loaders changed my default. I add React Query only when repeated fetching, shared data, or polling gives me a reason.</description><pubDate>Mon, 10 Nov 2025 16:00:00 GMT</pubDate><category>react</category><category>web-development</category><category>technology</category><category>performance</category></item><item><title>I Called This in June. October Proved Me Right.</title><link>https://kahwee.com/2025/october-layoffs-ai-excuse/</link><guid isPermaLink="true">https://kahwee.com/2025/october-layoffs-ai-excuse/</guid><description>I wrote in June that AI was becoming the new backdoor layoff. Companies would use &quot;AI efficiency gains&quot; as cover for not hiring people back.</description><pubDate>Sun, 09 Nov 2025 17:00:00 GMT</pubDate><category>ai</category><category>corporate-strategy</category><category>layoffs</category><category>workforce</category><category>technology</category><category>business</category></item><item><title>React Compiler Changes When to Reach for useMemo</title><link>https://kahwee.com/2025/react-compiler-automatic-memoization/</link><guid isPermaLink="true">https://kahwee.com/2025/react-compiler-automatic-memoization/</guid><description>React Compiler 1.0 moved routine rendering memoization into the build. React.memo, useCallback, and useMemo now need a specific reason.</description><pubDate>Sun, 09 Nov 2025 17:00:00 GMT</pubDate><category>web-development</category><category>technology</category><category>build-tool</category><category>performance</category><category>react</category></item><item><title>One Claude Code Install Is Enough</title><link>https://kahwee.com/2025/claude-code-native-installation/</link><guid isPermaLink="true">https://kahwee.com/2025/claude-code-native-installation/</guid><description>My machine has one Claude Code executable and one updater. Here is how I check the path, remove conflicts, and keep it that way.</description><pubDate>Fri, 31 Oct 2025 16:00:00 GMT</pubDate><category>developer-tool</category><category>cli</category><category>anthropic</category><category>ai</category></item><item><title>Meta is Cutting 600 AI Roles to Speed Up Decisions</title><link>https://kahwee.com/2025/meta-600-ai-layoffs/</link><guid isPermaLink="true">https://kahwee.com/2025/meta-600-ai-layoffs/</guid><description>Meta cut 600 AI roles while still hiring for its superintelligence lab. The move shows which AI work leadership wanted to fund—and which it did not.</description><pubDate>Wed, 22 Oct 2025 21:30:00 GMT</pubDate><category>ai</category><category>meta</category><category>corporate-strategy</category><category>layoffs</category><category>technology</category><category>product-development</category></item><item><title>ChatGPT Atlas Automates the Easy Part of Browsing</title><link>https://kahwee.com/2025/introducing-chatgpt-atlas/</link><guid isPermaLink="true">https://kahwee.com/2025/introducing-chatgpt-atlas/</guid><description>After using Comet for coupons, search, and summaries, I am not convinced putting an agent in the browser solves the hard part: judgment.</description><pubDate>Tue, 21 Oct 2025 16:00:00 GMT</pubDate><category>ai-assistant</category><category>browser</category><category>chatgpt</category><category>openai</category><category>perplexity</category><category>ai</category></item><item><title>Claude Code Comes to the Web and iOS</title><link>https://kahwee.com/2025/claude-code-web-and-ios-launch/</link><guid isPermaLink="true">https://kahwee.com/2025/claude-code-web-and-ios-launch/</guid><description>Claude Code on the web changes coding from an editor interaction into delegated work. That matters more than adding another interface.</description><pubDate>Mon, 20 Oct 2025 16:00:00 GMT</pubDate><category>ai-tool</category><category>claude</category><category>anthropic</category><category>developer-tool</category><category>software-engineering</category><category>ai</category></item><item><title>Sora Isn&apos;t the Problem: It&apos;s the Mirror</title><link>https://kahwee.com/2025/sora-isnt-the-problem/</link><guid isPermaLink="true">https://kahwee.com/2025/sora-isnt-the-problem/</guid><description>Using Sora in a TikTok-style feed made social media&apos;s incentive problem hard to ignore: fabricated video is now cheaper than recording reality.</description><pubDate>Sun, 19 Oct 2025 16:00:00 GMT</pubDate><category>ai</category><category>ai-tool</category><category>sora</category><category>openai</category><category>social-media</category><category>video-generation</category><category>disinformation</category></item><item><title>Samsung&apos;s Tiny Model Made Scale Look Wasteful</title><link>https://kahwee.com/2025/recursion-beats-scale/</link><guid isPermaLink="true">https://kahwee.com/2025/recursion-beats-scale/</guid><description>Samsung&apos;s 7-million-parameter TRM beat much larger models on specific reasoning benchmarks by revising its answer up to 16 times.</description><pubDate>Fri, 17 Oct 2025 16:00:00 GMT</pubDate><category>ai</category><category>technology</category><category>large-language-model</category><category>privacy</category></item><item><title>Claude Haiku 4.5: Cheap and Fast</title><link>https://kahwee.com/2025/claude-haiku-4-5/</link><guid isPermaLink="true">https://kahwee.com/2025/claude-haiku-4-5/</guid><description>I use Claude Haiku for small refactors, review, and debugging. Its lower cost and faster responses matter more there than deeper reasoning.</description><pubDate>Wed, 15 Oct 2025 16:00:00 GMT</pubDate><category>ai</category><category>ai-tool</category><category>claude</category><category>anthropic</category><category>large-language-model</category><category>coding</category><category>pricing</category></item><item><title>SwiftUI Toolbar Placement Is Intent, Not Coordinates</title><link>https://kahwee.com/2025/swiftui-declarative-toolbar-placement/</link><guid isPermaLink="true">https://kahwee.com/2025/swiftui-declarative-toolbar-placement/</guid><description>I tested SwiftUI toolbar placement, grouping, search, and overflow on iPhone and iPad. The useful mental model is intent—not fixed screen coordinates.</description><pubDate>Sun, 12 Oct 2025 17:00:00 GMT</pubDate><category>swiftui</category><category>ios</category><category>mobile-development</category><category>tutorial</category><category>technology</category></item><item><title>What SwiftUI&apos;s Tab APIs Actually Do</title><link>https://kahwee.com/2025/understanding-swiftui-tabview/</link><guid isPermaLink="true">https://kahwee.com/2025/understanding-swiftui-tabview/</guid><description>I rebuilt SwiftUI&apos;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.</description><pubDate>Sat, 11 Oct 2025 17:00:00 GMT</pubDate><category>swiftui</category><category>ios</category><category>mobile-development</category><category>tutorial</category><category>liquid-glass</category><category>technology</category></item><item><title>What VoiceOver Exposed in My Liquid Glass UI</title><link>https://kahwee.com/2025/swiftui-accessibility-reduce-motion-voiceover-part-2/</link><guid isPermaLink="true">https://kahwee.com/2025/swiftui-accessibility-reduce-motion-voiceover-part-2/</guid><description>VoiceOver read my compound views as a pile of unrelated elements. Grouping, labels, and combined accessibility testing fixed the experience.</description><pubDate>Thu, 09 Oct 2025 17:01:00 GMT</pubDate><category>mobile-development</category><category>technology</category><category>swiftui</category></item><item><title>I Had to Turn Down Liquid Glass to Test It Properly</title><link>https://kahwee.com/2025/swiftui-accessibility-reduce-motion-voiceover-part-1/</link><guid isPermaLink="true">https://kahwee.com/2025/swiftui-accessibility-reduce-motion-voiceover-part-1/</guid><description>The full Liquid Glass effect became distracting while I built with it. Here is how I handled Reduce Motion and Dynamic Type in SwiftUI.</description><pubDate>Thu, 09 Oct 2025 17:00:00 GMT</pubDate><category>mobile-development</category><category>technology</category><category>swiftui</category></item><item><title>Rewriting /tag/* to /tags/* with Cloudflare Workers</title><link>https://kahwee.com/2025/cloudflare-workers-redirect/</link><guid isPermaLink="true">https://kahwee.com/2025/cloudflare-workers-redirect/</guid><description>A small Cloudflare Worker can rewrite /tag/* to /tags/* without changing the main application or dropping query strings.</description><pubDate>Thu, 09 Oct 2025 16:00:00 GMT</pubDate><category>cloudflare</category><category>web-development</category></item><item><title>Cloudflare Pages to Workers: Do You Need to Move?</title><link>https://kahwee.com/2025/migrating-from-cloudflare-pages-to-workers/</link><guid isPermaLink="true">https://kahwee.com/2025/migrating-from-cloudflare-pages-to-workers/</guid><description>I moved a static site from Cloudflare Pages to Workers in five minutes. The config was easy; deciding whether a static blog benefits is harder.</description><pubDate>Wed, 08 Oct 2025 16:00:00 GMT</pubDate><category>cloudflare</category><category>web-development</category><category>performance</category></item><item><title>How I Connected a ZWA-2 to Home Assistant on My Ugreen NAS</title><link>https://kahwee.com/2025/setting-up-zwave-home-assistant/</link><guid isPermaLink="true">https://kahwee.com/2025/setting-up-zwave-home-assistant/</guid><description>My working setup for a Home Assistant Connect ZWA-2 on a Ugreen NAS, using Docker and Z-Wave JS UI.</description><pubDate>Tue, 07 Oct 2025 16:00:00 GMT</pubDate><category>personal</category><category>technology</category></item><item><title>Building a Modern Full-Stack Web Application - Part 2</title><link>https://kahwee.com/2025/building-modern-full-stack-web-application-part-2/</link><guid isPermaLink="true">https://kahwee.com/2025/building-modern-full-stack-web-application-part-2/</guid><description>How I deployed the React Router application with Fly.io, Cloudflare, Neon, Docker, and migration history I could roll back.</description><pubDate>Wed, 10 Sep 2025 16:01:00 GMT</pubDate><category>web-development</category><category>react</category><category>typescript</category><category>software-engineering</category><category>fly-io</category><category>cloudflare</category></item><item><title>Building a Modern Full-Stack Web Application: Part 1</title><link>https://kahwee.com/2025/building-modern-full-stack-web-application-part-1/</link><guid isPermaLink="true">https://kahwee.com/2025/building-modern-full-stack-web-application-part-1/</guid><description>The React Router, TypeScript, PostgreSQL, and authentication stack I chose after using LLMs to prototype the alternatives.</description><pubDate>Wed, 10 Sep 2025 16:00:00 GMT</pubDate><category>web-development</category><category>react</category><category>typescript</category><category>software-engineering</category></item><item><title>Fix Cloudflare 525 Errors with Fly.io</title><link>https://kahwee.com/2025/cloudflare-flyio-dns-ssl-troubleshooting/</link><guid isPermaLink="true">https://kahwee.com/2025/cloudflare-flyio-dns-ssl-troubleshooting/</guid><description>Cloudflare 525 errors on Fly.io usually mean the origin certificate is wrong. Fix the custom domain cert before blaming DNS.</description><pubDate>Thu, 04 Sep 2025 16:00:00 GMT</pubDate><category>cloudflare</category><category>web-development</category></item><item><title>Migrating from Remix to React Router v7 - Part 2</title><link>https://kahwee.com/2025/migrating-from-remix-to-react-router-v7-part-2/</link><guid isPermaLink="true">https://kahwee.com/2025/migrating-from-remix-to-react-router-v7-part-2/</guid><description>The migration took two focused sessions: dependencies first, then 40 files of imports and route types. Typegen was the part worth keeping.</description><pubDate>Tue, 26 Aug 2025 11:01:00 GMT</pubDate><category>technology</category><category>web-development</category><category>react</category></item><item><title>Migrating from Remix to React Router v7 - Part 1</title><link>https://kahwee.com/2025/migrating-from-remix-to-react-router-v7-part-1/</link><guid isPermaLink="true">https://kahwee.com/2025/migrating-from-remix-to-react-router-v7-part-1/</guid><description>My Remix-to-React Router v7 migration touched 40 files and removed 591 net lines. Imports were easy; TypeScript took the time.</description><pubDate>Tue, 26 Aug 2025 11:00:00 GMT</pubDate><category>technology</category><category>web-development</category><category>react</category></item><item><title>The Cost of Switching from Next.js to Remix</title><link>https://kahwee.com/2025/cost-of-switching-from-nextjs-to-remix/</link><guid isPermaLink="true">https://kahwee.com/2025/cost-of-switching-from-nextjs-to-remix/</guid><description>Leaving Next.js for Remix taught me why the annoying-looking use client boundary exists—and what Remix gives up without it.</description><pubDate>Sun, 24 Aug 2025 16:00:00 GMT</pubDate><category>web-development</category><category>react</category><category>performance</category></item><item><title>Vercel EMFILE Errors with Remix on Hobby Plan</title><link>https://kahwee.com/2025/vercel-promise-vs-reality-emfile-remix/</link><guid isPermaLink="true">https://kahwee.com/2025/vercel-promise-vs-reality-emfile-remix/</guid><description>My Remix app ran locally and failed on Vercel with EMFILE. The workarounds reduced file churn but could not expose or change the platform limit.</description><pubDate>Sat, 23 Aug 2025 16:00:00 GMT</pubDate><category>technology</category><category>web-development</category><category>performance</category><category>developer-tool</category></item><item><title>What Is a Website For When AI Gives the Answer?</title><link>https://kahwee.com/2025/google-ai-overviews-cutting-web-traffic-in-half/</link><guid isPermaLink="true">https://kahwee.com/2025/google-ai-overviews-cutting-web-traffic-in-half/</guid><description>AI search is turning websites from destinations into raw material. The web may survive that transition, but human voices will be harder to find.</description><pubDate>Wed, 23 Jul 2025 16:00:00 GMT</pubDate><category>ai</category><category>google</category><category>search</category><category>web-traffic</category><category>technology</category><category>user-experience</category></item><item><title>Anthropic&apos;s Fair-Use Win Did Not Excuse Its Pirated Library</title><link>https://kahwee.com/2025/anthropic-wins-major-fair-use-victory-but-still-liable-for-pirated-books/</link><guid isPermaLink="true">https://kahwee.com/2025/anthropic-wins-major-fair-use-victory-but-still-liable-for-pirated-books/</guid><description>The court treated AI training as transformative while leaving Anthropic exposed for keeping a library of pirated books.</description><pubDate>Sat, 28 Jun 2025 17:00:00 GMT</pubDate><category>ai</category><category>copyright</category><category>legal</category><category>anthropic</category><category>fair-use</category></item><item><title>We Rebuilt the UI Instead of Refactoring It</title><link>https://kahwee.com/2025/when-rebuilding-is-better-than-refactoring/</link><guid isPermaLink="true">https://kahwee.com/2025/when-rebuilding-is-better-than-refactoring/</guid><description>A new data-model entity touched several old pages. Rebuilding those UI components was faster than carrying their Flow types and old assumptions forward.</description><pubDate>Sat, 21 Jun 2025 16:00:00 GMT</pubDate><category>software-engineering</category><category>cursor</category><category>ai</category><category>typescript</category><category>react</category><category>web-development</category></item><item><title>AI Is the New Backdoor Layoff</title><link>https://kahwee.com/2025/ai-the-new-backdoor-layoff/</link><guid isPermaLink="true">https://kahwee.com/2025/ai-the-new-backdoor-layoff/</guid><description>Companies can shrink teams without announcing layoffs. They call it AI efficiency, lower hiring needs, and let attrition do the rest.</description><pubDate>Fri, 20 Jun 2025 17:00:00 GMT</pubDate><category>ai</category><category>corporate-strategy</category><category>layoffs</category><category>business</category><category>technology</category><category>workforce</category></item><item><title>How I Moved This Blog from Node.js to Bun</title><link>https://kahwee.com/2025/switching-from-node-to-bun-part-2/</link><guid isPermaLink="true">https://kahwee.com/2025/switching-from-node-to-bun-part-2/</guid><description>The package manager was the easy part. File APIs, CI, compatibility checks, and Claude Code produced most of the migration&apos;s useful work.</description><pubDate>Tue, 29 Apr 2025 16:01:00 GMT</pubDate><category>technology</category><category>performance</category><category>web-development</category><category>build-tool</category><category>typescript</category></item><item><title>Bun Cut This Blog&apos;s Build Time Nearly in Half</title><link>https://kahwee.com/2025/switching-from-node-to-bun-part-1/</link><guid isPermaLink="true">https://kahwee.com/2025/switching-from-node-to-bun-part-1/</guid><description>Moving this blog from Node.js to Bun cut its build from 37 seconds to 20. Native file and glob APIs also removed code I no longer needed.</description><pubDate>Tue, 29 Apr 2025 16:00:00 GMT</pubDate><category>technology</category><category>performance</category><category>web-development</category><category>build-tool</category><category>typescript</category></item><item><title>Windsurf Simplified Pricing While OpenAI Circled</title><link>https://kahwee.com/2025/windsurf-slashes-prices/</link><guid isPermaLink="true">https://kahwee.com/2025/windsurf-slashes-prices/</guid><description>Windsurf removed flow action credits and cut team pricing while OpenAI acquisition talks were being reported. I cared more about the simpler bill.</description><pubDate>Thu, 24 Apr 2025 19:00:00 GMT</pubDate><category>ai</category><category>coding</category><category>ai-tool</category><category>pricing</category><category>windsurf</category><category>cursor</category><category>github-copilot</category></item><item><title>Figma&apos;s Trademark Overreach: &apos;Dev Mode&apos;</title><link>https://kahwee.com/2025/figma-trademark-overreach-dev-mode/</link><guid isPermaLink="true">https://kahwee.com/2025/figma-trademark-overreach-dev-mode/</guid><description>Figma&apos;s dispute with Lovable over Dev Mode shows why common developer terms make weak trademarks and costly legal weapons.</description><pubDate>Wed, 23 Apr 2025 00:39:00 GMT</pubDate><category>technology</category><category>trademark</category><category>figma</category><category>lovable</category><category>developer-tool</category><category>legal</category></item><item><title>OpenAI Playing Catch-Up in the AI Coding Wars</title><link>https://kahwee.com/2025/openai-playing-catch-up-in-the-ai-coding-wars/</link><guid isPermaLink="true">https://kahwee.com/2025/openai-playing-catch-up-in-the-ai-coding-wars/</guid><description>OpenAI talked a ~$3B Windsurf deal. I use Claude Code and Cursor; the story that matters is who owns the IDE relationship, not the model API.</description><pubDate>Thu, 17 Apr 2025 05:39:00 GMT</pubDate><category>technology</category><category>ai-tool</category><category>web-development</category><category>openai</category><category>microsoft</category><category>windsurf</category></item><item><title>GPT-4.1 Needed Fewer Retry Loops in My Editors</title><link>https://kahwee.com/2025/gpt-4-1-swe-improvements/</link><guid isPermaLink="true">https://kahwee.com/2025/gpt-4-1-swe-improvements/</guid><description>GPT-4.1&apos;s benchmark jump showed up in my Windsurf and Cursor use as cleaner diffs and fewer back-and-forth retries.</description><pubDate>Tue, 15 Apr 2025 02:00:00 GMT</pubDate><category>ai</category><category>openai</category><category>coding</category><category>benchmark</category><category>windsurf</category><category>cursor</category></item><item><title>The Small Models Were the Interesting Part of OpenAI&apos;s Leak</title><link>https://kahwee.com/2025/breaking-down-openais-upcoming-model-lineup/</link><guid isPermaLink="true">https://kahwee.com/2025/breaking-down-openais-upcoming-model-lineup/</guid><description>A leaked OpenAI lineup showed five models, but the mini and nano pricing mattered more to me than another flagship.</description><pubDate>Mon, 14 Apr 2025 16:00:00 GMT</pubDate><category>ai</category><category>technology</category><category>openai</category><category>large-language-model</category></item><item><title>I Would Start with Vite and Make Webpack Prove Itself</title><link>https://kahwee.com/2025/switching-from-webpack-to-vite-in-2025/</link><guid isPermaLink="true">https://kahwee.com/2025/switching-from-webpack-to-vite-in-2025/</guid><description>The benchmark gap was obvious, but deleting 90 lines of build configuration was the better reason to choose Vite for a modern app.</description><pubDate>Sun, 13 Apr 2025 16:00:00 GMT</pubDate><category>web-development</category><category>build-tool</category><category>vite</category><category>webpack</category><category>performance</category></item><item><title>ChatGPT Came Within 30 Million Visits of X</title><link>https://kahwee.com/2025/chatgpt-is-going-to-surpass-x/</link><guid isPermaLink="true">https://kahwee.com/2025/chatgpt-is-going-to-surpass-x/</guid><description>Similarweb March 2025: ChatGPT at 4.55B visits, X at 4.58B. ChatGPT grew faster that month. Infrastructure, not a toy.</description><pubDate>Thu, 10 Apr 2025 16:00:00 GMT</pubDate><category>ai</category><category>web-traffic</category><category>chatgpt</category><category>x</category></item><item><title>GitHub Copilot Adds Agent Mode and Claude 3.5 Sonnet</title><link>https://kahwee.com/2025/github-copilot-upgrade-impact/</link><guid isPermaLink="true">https://kahwee.com/2025/github-copilot-upgrade-impact/</guid><description>Copilot shipped agent mode and more models. Microsoft also tightened extension licenses so some tools refuse to run in Cursor.</description><pubDate>Fri, 04 Apr 2025 16:00:00 GMT</pubDate><category>technology</category><category>ai</category><category>anthropic</category><category>github-copilot</category><category>cursor</category><category>software-engineering</category><category>ai-tool</category></item><item><title>AI Will Make the Digital Divide More Expensive</title><link>https://kahwee.com/2025/on-technological-stratification/</link><guid isPermaLink="true">https://kahwee.com/2025/on-technological-stratification/</guid><description>AI access is becoming another way to buy time, better service, and economic leverage. My son will grow up inside that divide.</description><pubDate>Sun, 30 Mar 2025 16:00:00 GMT</pubDate><category>ai</category><category>technology</category><category>user-experience</category><category>personal</category></item><item><title>Claude Code&apos;s Strengths and Weaknesses in March 2025</title><link>https://kahwee.com/2025/claude-code-strengths-and-weaknesses-mar-2025/</link><guid isPermaLink="true">https://kahwee.com/2025/claude-code-strengths-and-weaknesses-mar-2025/</guid><description>Claude Code for hobby refactors, Cursor at work — two tools, two jobs, and where each one still breaks.</description><pubDate>Sat, 22 Mar 2025 16:00:00 GMT</pubDate><category>ai</category><category>claude</category><category>anthropic</category><category>software-engineering</category><category>cursor</category><category>ai-tool</category><category>web-development</category></item><item><title>How Claude Code Built This Blog - Part 2</title><link>https://kahwee.com/2025/claude-code-built-this-blog-part-2/</link><guid isPermaLink="true">https://kahwee.com/2025/claude-code-built-this-blog-part-2/</guid><description>Claude Code helped build the parser, generator, templates, and Cloudflare deployment. Syntax highlighting and timezones took more work.</description><pubDate>Fri, 21 Mar 2025 16:01:00 GMT</pubDate><category>web-development</category><category>technology</category><category>ai</category><category>claude</category><category>typescript</category><category>cloudflare</category><category>software-engineering</category></item><item><title>How Claude Code Built This Blog - Part 1</title><link>https://kahwee.com/2025/claude-code-built-this-blog-part-1/</link><guid isPermaLink="true">https://kahwee.com/2025/claude-code-built-this-blog-part-1/</guid><description>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.</description><pubDate>Fri, 21 Mar 2025 16:00:00 GMT</pubDate><category>web-development</category><category>technology</category><category>ai</category><category>claude</category><category>typescript</category><category>cloudflare</category><category>software-engineering</category></item><item><title>Google Keeps Replacing Products Before Trust Can Compound</title><link>https://kahwee.com/2025/is-google-lost/</link><guid isPermaLink="true">https://kahwee.com/2025/is-google-lost/</guid><description>Replacing Assistant with Gemini fits Google&apos;s long pattern of abandoning products instead of earning trust through steady maintenance.</description><pubDate>Sun, 16 Mar 2025 16:00:00 GMT</pubDate><category>google</category><category>ai</category><category>technology</category><category>corporate-strategy</category></item><item><title>Public Code Gives AI More Context to Work With</title><link>https://kahwee.com/2025/open-source-as-a-advantage-in-ai-age/</link><guid isPermaLink="true">https://kahwee.com/2025/open-source-as-a-advantage-in-ai-age/</guid><description>Public libraries give coding agents examples, documentation, and discussions they can retrieve. Private APIs must supply that context themselves.</description><pubDate>Sat, 15 Mar 2025 16:00:00 GMT</pubDate><category>technology</category><category>open-source</category><category>ai</category><category>cursor</category><category>software-engineering</category><category>ai-tool</category></item><item><title>Chrome Started Disabling uBlock Origin, So I Switched to Brave</title><link>https://kahwee.com/2025/chrome-just-killed-ublock/</link><guid isPermaLink="true">https://kahwee.com/2025/chrome-just-killed-ublock/</guid><description>When Chrome began disabling uBlock Origin under Manifest V3, I stopped looking for another extension and moved my browsing to Brave.</description><pubDate>Sun, 09 Mar 2025 16:00:00 GMT</pubDate><category>technology</category><category>browser</category><category>privacy</category><category>google</category><category>web-development</category></item><item><title>Bitcoin ATMs Are Not Financial Inclusion</title><link>https://kahwee.com/2025/cryptocurrency-atms-claims-vs-reality/</link><guid isPermaLink="true">https://kahwee.com/2025/cryptocurrency-atms-claims-vs-reality/</guid><description>Bitcoin ATMs charge steep fees and are frequently used in scams. Their placement in vulnerable neighborhoods makes the business model hard to defend.</description><pubDate>Sat, 08 Mar 2025 16:00:00 GMT</pubDate><category>cryptocurrency</category><category>san-francisco</category><category>technology</category><category>finance</category></item><item><title>Why I Built a Static Blog</title><link>https://kahwee.com/2025/lightweight-fast-mobile-first-why-static-blog/</link><guid isPermaLink="true">https://kahwee.com/2025/lightweight-fast-mobile-first-why-static-blog/</guid><description>A personal blog should be fast on a phone and boring to host — Markdown to static HTML on Cloudflare, no app server.</description><pubDate>Fri, 07 Mar 2025 16:00:00 GMT</pubDate><category>web-development</category><category>performance</category><category>claude</category><category>cloudflare</category><category>technology</category></item><item><title>OpenAI Agent Pricing: $2k to $20k a Month</title><link>https://kahwee.com/2025/the-true-cost-of-ai/</link><guid isPermaLink="true">https://kahwee.com/2025/the-true-cost-of-ai/</guid><description>OpenAI&apos;s agent tiers run $2k–$20k a month. That is not &apos;AI is cheap labor&apos; pricing — it is closer to a contractor line item.</description><pubDate>Thu, 06 Mar 2025 16:00:00 GMT</pubDate><category>ai</category><category>openai</category><category>pricing</category><category>technology</category><category>chatgpt</category></item><item><title>Perplexity replaces Google Search and Apple News for me</title><link>https://kahwee.com/2025/perplexity-replaces-google-search-and-apple-news-for-me/</link><guid isPermaLink="true">https://kahwee.com/2025/perplexity-replaces-google-search-and-apple-news-for-me/</guid><description>I use Perplexity for most search and for a daily news skim. Google for the stubborn queries. Apple News lost the paywall fight.</description><pubDate>Mon, 03 Mar 2025 16:00:00 GMT</pubDate><category>ai</category><category>search</category><category>technology</category><category>news</category><category>perplexity</category><category>ai-tool</category></item><item><title>Back to Blogging: Web Development, AI, and SF</title><link>https://kahwee.com/2025/a-new-beginning/</link><guid isPermaLink="true">https://kahwee.com/2025/a-new-beginning/</guid><description>I started writing here again — web development, AI tools I actually run, and what SF startups taught me the expensive way.</description><pubDate>Sat, 01 Mar 2025 16:00:00 GMT</pubDate><category>personal</category><category>technology</category><category>web-development</category><category>san-francisco</category></item><item><title>Building HTML5 Components for Adobe Animate CC</title><link>https://kahwee.com/2017/introduction-to-animate-cc-components/</link><guid isPermaLink="true">https://kahwee.com/2017/introduction-to-animate-cc-components/</guid><description>Adobe barely documented custom HTML5 components in Animate CC, so I worked backward from its built-in Video component.</description><pubDate>Tue, 14 Feb 2017 16:00:00 GMT</pubDate><category>tutorial</category><category>coding</category><category>developer-tool</category><category>technology</category></item><item><title>AWS Lambda&apos;s Bad Interface Is Actually a Feature</title><link>https://kahwee.com/2016/thoughts-on-aws-lambda/</link><guid isPermaLink="true">https://kahwee.com/2016/thoughts-on-aws-lambda/</guid><description>Lambda&apos;s clunky deployment process forced me to think small. That constraint led me to better microservices design. Sometimes friction is good.</description><pubDate>Sun, 04 Sep 2016 16:00:00 GMT</pubDate><category>software-engineering</category><category>technology</category><category>developer-tool</category><category>personal</category><category>aws</category></item><item><title>Bash on Ubuntu on Windows: What Works and What Doesn&apos;t</title><link>https://kahwee.com/2016/bash-on-ubuntu-on-windows/</link><guid isPermaLink="true">https://kahwee.com/2016/bash-on-ubuntu-on-windows/</guid><description>Microsoft added Ubuntu&apos;s Bash to Windows. I tested it for real work and hit some rough edges.</description><pubDate>Mon, 15 Aug 2016 16:00:00 GMT</pubDate><category>developer-tool</category><category>tutorial</category><category>technology</category></item><item><title>Running PHP 5.6 with Apache on El Capitan</title><link>https://kahwee.com/2016/how-to-run-php-5-6-with-apache-in-el-capitan/</link><guid isPermaLink="true">https://kahwee.com/2016/how-to-run-php-5-6-with-apache-in-el-capitan/</guid><description>The Apache module path was the easy-to-miss part of running Homebrew&apos;s PHP 5.6 on macOS El Capitan. Here is the full setup.</description><pubDate>Thu, 11 Aug 2016 16:00:00 GMT</pubDate><category>tutorial</category><category>coding</category><category>web-server</category><category>technology</category></item><item><title>Why Browsers Killed Flash (And Why Designers Lost Out)</title><link>https://kahwee.com/2016/why-did-flash-have-to-die/</link><guid isPermaLink="true">https://kahwee.com/2016/why-did-flash-have-to-die/</guid><description>I worked in advertising as browsers pushed Flash out. The web gained battery life and privacy controls, while ad production got much harder.</description><pubDate>Wed, 10 Aug 2016 16:00:00 GMT</pubDate><category>browser</category><category>software-engineering</category><category>technology</category><category>performance</category><category>privacy</category></item><item><title>Understanding CORS: Basic vs. Preflight Requests</title><link>https://kahwee.com/2016/learnings-from-cors/</link><guid isPermaLink="true">https://kahwee.com/2016/learnings-from-cors/</guid><description>CORS failures that look unrelated often come down to request type, duplicate headers, or credentials. Here is how the browser treats each case.</description><pubDate>Fri, 05 Aug 2016 16:00:00 GMT</pubDate><category>web-development</category><category>tutorial</category><category>coding</category></item><item><title>Upgrading WordPress to PHP 7: Configuration Changes</title><link>https://kahwee.com/2016/making-wordpress-great-again/</link><guid isPermaLink="true">https://kahwee.com/2016/making-wordpress-great-again/</guid><description>Ubuntu 16.04 ships with PHP 7, which broke my WordPress. Here&apos;s how to upgrade PHP config and point nginx to the new php-fpm socket.</description><pubDate>Wed, 03 Aug 2016 16:00:00 GMT</pubDate><category>tutorial</category><category>web-development</category><category>web-server</category></item><item><title>Edge 14: Microsoft Finally Catches Up to Firefox</title><link>https://kahwee.com/2016/edge-14-to-be-released-tomorrow/</link><guid isPermaLink="true">https://kahwee.com/2016/edge-14-to-be-released-tomorrow/</guid><description>Edge 14 hit 460 points on the HTML5 Test. For the first time, Microsoft&apos;s browser was competitive with Firefox. Here&apos;s what that meant for web standards.</description><pubDate>Tue, 02 Aug 2016 16:00:00 GMT</pubDate><category>browser</category><category>technology</category><category>news</category></item><item><title>Mocha v3: Major Improvements to the Test Runner</title><link>https://kahwee.com/2016/mocha-v3-released/</link><guid isPermaLink="true">https://kahwee.com/2016/mocha-v3-released/</guid><description>I upgraded two repositories to Mocha v3. The migration was uneventful, and the fixed .only() behavior was reason enough to do it.</description><pubDate>Fri, 22 Jul 2016 16:00:00 GMT</pubDate><category>developer-tool</category><category>news</category><category>coding</category><category>testing</category><category>technology</category></item><item><title>Setting Up CORS Vary-Origin Headers in AWS S3</title><link>https://kahwee.com/2016/how-to-make-vary-origin-in-aws-s3/</link><guid isPermaLink="true">https://kahwee.com/2016/how-to-make-vary-origin-in-aws-s3/</guid><description>The exact S3 CORS configuration I used to make responses vary by origin instead of letting a CDN cache the wrong header.</description><pubDate>Sun, 12 Jun 2016 16:00:00 GMT</pubDate><category>web-development</category><category>tutorial</category><category>coding</category><category>aws</category></item><item><title>Using UglifyJS&apos;s screw-ie8 Option in Gulp</title><link>https://kahwee.com/2016/using-uglify-s-screw-ie8-option-in-gulp/</link><guid isPermaLink="true">https://kahwee.com/2016/using-uglify-s-screw-ie8-option-in-gulp/</guid><description>Once I stopped supporting IE8, UglifyJS still emitted compatibility code for it. This Gulp option switched those workarounds off.</description><pubDate>Fri, 27 May 2016 16:00:00 GMT</pubDate><category>build-tool</category><category>tutorial</category><category>performance</category><category>coding</category><category>technology</category></item></channel></rss>