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.

17 posts on this thread
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.

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.

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.

React Router v8 keeps the framework-mode API familiar and moves v7's future flags into defaults. That restraint matters after an expensive v6-to-v7 migration.

I keep changing this blog. One small Cloudflare Worker lets the URLs survive the changes while the site itself stays static.

Biome keeps my AI coding loop moving, but it doesn't replace TypeScript. Here is the current setup and the trade-off I kept.

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.

React Compiler 1.0 moved routine rendering memoization into the build. React.memo, useCallback, and useMemo now need a specific reason.

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.

Leaving Next.js for Remix taught me why the annoying-looking use client boundary exists—and what Remix gives up without it.

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.

The package manager was the easy part. File APIs, CI, compatibility checks, and Claude Code produced most of the migration's useful work.

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.

The benchmark gap was obvious, but deleting 90 lines of build configuration was the better reason to choose Vite for a modern app.

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

I worked in advertising as browsers pushed Flash out. The web gained battery life and privacy controls, while ad production got much harder.

Once I stopped supporting IE8, UglifyJS still emitted compatibility code for it. This Gulp option switched those workarounds off.

Keep exploring