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.
Writing on Performance, newest first.
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 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.
GPT-4.1's benchmark jump showed up in my Windsurf and Cursor use as cleaner diffs and fewer back-and-forth retries.
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.
Related subjects
Topics that appear alongside Performance in these articles.
Back to the index