Winter wallpapers without the performance hit
A client dropped 8MB 4K PNGs into the media library for holiday backgrounds and the LCP went red within the hour. Here is what fixed it: a 200KB cap on hero images, one file per breakpoint, and WebP.
A client dropped 8MB 4K PNGs into the media library for holiday backgrounds and the LCP went red within the hour. Here is what fixed it: a 200KB cap on hero images, one file per breakpoint, and WebP.
A fleet dashboard flashed so hard that a broken-down truck went unnoticed for twenty minutes. Faster polling made it worse. What helped: delta indicators, sparklines, skeleton screens, an honest last-sync label and ARIA live regions.
Trimming a legacy site cut page weights by 80%, and the same work cut its energy use. Five steps: pick one journey, benchmark it, set a page weight target, strip the WordPress junk nobody needs, then keep checking.
A 10,000 SKU WooCommerce import kept hanging, and the previous dev’s answer was a 2GB memory limit. Advent of Code puzzles point at the real fix: sketch the logic first, validate the input, batch the writes.
A client paid thousands for an AI accessibility overlay and still got complaints from deaf users. Notes on what does help: text-based contact options, human captions, visual and haptic cues in place of sound, and accessibility handled before launch instead of after.
A client thought their WooCommerce recommendation engine was broken because accuracy at a 0.5 threshold read 51%. The ranking was fine, the threshold was not. This walks through checking AUC in a spreadsheet with sorted scores and the trapezoidal rule.
A WooCommerce recommendation engine kept timing out the server, and the weights oscillated instead of settling. Swapping the basic update rule for Momentum and then Adam is what fixed it, and this explains why adaptive step sizes matter on messy data.
A hero illustration that looked right at 16:9 and collapsed on mobile. Instead of shipping two SVG files, I moved the artwork into a hidden symbol library and referenced it from two wrappers with different viewBox values, then animated the use elements.
I inherited a landing page with 450 lines of IDs, duplicate selectors and !important flags everywhere. Notes on moving it onto cascade layers: the five-layer order I settled on, where media queries belong, and why !important inverts layer priority.
A client handed me an MVP he had built over a weekend in Cursor. It looked polished until I tried to add one calculation and found no schema underneath any of it. This is the case for settling the data model before you open a coding assistant.