<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Fuzail Shareef — The log</title><description>Short notes and the occasional deep-dive — knowledge dumped while building.</description><link>https://fuzail-portfolio.pages.dev/</link><item><title>Astro view transitions quietly break your scripts</title><link>https://fuzail-portfolio.pages.dev/blog/</link><guid isPermaLink="true">https://fuzail-portfolio.pages.dev/blog/</guid><description>Adding Astro&apos;s ClientRouter for page transitions broke two things silently. Bundled &lt;script&gt;s stop re-executing on a swap — so a form&apos;s submit handler bound on first load never attaches on a page you navigate *into*; it just does nothing. And a React island holding global state (a Lenis scroll instance) leaks a second copy per navigation, because the view-transition DOM swap bypasses React&apos;s unmount, so cleanup never runs. Fixes: rebind handlers on `astro:page-load`, and `transition:persist` any island that owns global state.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>astro</category><category>view-transitions</category><category>lenis</category></item><item><title>Hiding a button isn&apos;t access control</title><link>https://fuzail-portfolio.pages.dev/blog/</link><guid isPermaLink="true">https://fuzail-portfolio.pages.dev/blog/</guid><description>Made admin accounts &apos;management-only&apos; on a storefront (they manage, they don&apos;t buy). It took two layers: a server-side guard that 403s any admin cart/order/wishlist write — the actual gate — and frontend hooks that hide add-to-cart/checkout and redirect admins off the shopping routes. The frontend half is pure UX; a crafted API call still has to clear the guard. Easy to conflate the two and ship only the cosmetic half. Verified both: admin gets 403 on the API, and sees zero shopping controls in the browser.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>nestjs</category><category>remix</category><category>rbac</category><category>security</category></item><item><title>A billboard inside a rotated group isn&apos;t a billboard</title><link>https://fuzail-portfolio.pages.dev/blog/</link><guid isPermaLink="true">https://fuzail-portfolio.pages.dev/blog/</guid><description>Made a hero&apos;s glass orb scroll-reactive by rotating its group — and the portrait plane inside it, a flat billboard meant to always face the camera, sheared into noise as you scrolled. Obvious in hindsight: a camera-facing plane stops facing the camera the instant a parent transform rotates it. Keep billboards out of any rotated parent — rotate the shell, not the group holding the face. Translation and uniform scale are safe; rotation isn&apos;t.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>three.js</category><category>r3f</category><category>webgl</category></item><item><title>When `make stop` won&apos;t stop: the watcher is respawning your server</title><link>https://fuzail-portfolio.pages.dev/blog/</link><guid isPermaLink="true">https://fuzail-portfolio.pages.dev/blog/</guid><description>Spent a while baffled that `make stop` freed port 3000 yet the dev server kept logging requests. The culprit: `nest start --watch` (and `vite`/`remix vite:dev`) are watcher *parents*. Killing the process bound to the port just makes the watcher respawn a fresh child and re-bind the port. Fix: kill the watcher first — `pkill -f &quot;nest start --watch&quot;` — then free the ports. A bare port-kill against a live watcher is futile.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>make</category><category>nestjs</category><category>vite</category><category>dx</category></item><item><title>Cloudflare Pages branch aliases are not separate projects</title><link>https://fuzail-portfolio.pages.dev/blog/</link><guid isPermaLink="true">https://fuzail-portfolio.pages.dev/blog/</guid><description>Deploying with `--branch x` gives you `x.&lt;project&gt;.pages.dev`, but it lives inside the same project. To get a clean `project-t.pages.dev` hostname you need a whole separate Pages project — and deleting the old branch deployment needs `--force` if it has an active alias.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>cloudflare</category><category>devops</category><category>wrangler</category></item><item><title>Why this log exists</title><link>https://fuzail-portfolio.pages.dev/blog/welcome/</link><guid isPermaLink="true">https://fuzail-portfolio.pages.dev/blog/welcome/</guid><description>A low-friction place to dump what I learn while building — short notes by default, an occasional deep-dive when something deserves one.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>meta</category></item><item><title>R3F MeshTransmissionMaterial chokes SwiftShader</title><link>https://fuzail-portfolio.pages.dev/blog/</link><guid isPermaLink="true">https://fuzail-portfolio.pages.dev/blog/</guid><description>Headless Chromium falls back to SwiftShader (software GL), and a transmission orb at samples=8/detail=18 just renders black with no error. Dropping to samples=6/detail=14 keeps it alive on low-end GPUs — and always test the reduced-motion fallback separately.</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><category>three.js</category><category>r3f</category><category>webgl</category></item></channel></rss>