<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>renderlog</title><description>Blogs on React, performance, and big-tech optimizations. Written from the middle of learning. By Ashish.</description><link>https://renderlog.in/</link><language>en-us</language><item><title>JSON.parse() Errors: What Each Message Actually Means</title><link>https://renderlog.in/blog/json-parse-errors-debugging/</link><guid isPermaLink="true">https://renderlog.in/blog/json-parse-errors-debugging/</guid><description>What each JSON.parse() SyntaxError actually means, how to find the real cause fast, and when parsing large JSON becomes a main thread performance problem.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>javascript</category><category>debugging</category><category>json</category><category>developer-tools</category><category>performance</category><author>Ashish</author></item><item><title>What Is Preact and Why Does a 3KB Version of React Exist</title><link>https://renderlog.in/blog/preact-vs-react-why-3kb-alternative-exists/</link><guid isPermaLink="true">https://renderlog.in/blog/preact-vs-react-why-3kb-alternative-exists/</guid><description>React&apos;s 45KB comes from synthetic events and compatibility layers Preact drops. At 3KB, it calls native DOM directly. Here is what that trade-off means.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>react</category><category>preact</category><category>javascript</category><category>frontend</category><author>Ashish</author></item><item><title>Service Worker Caching Strategies: Cache-First, Network-First, and SWR</title><link>https://renderlog.in/blog/service-worker-caching-strategies-workbox/</link><guid isPermaLink="true">https://renderlog.in/blog/service-worker-caching-strategies-workbox/</guid><description>The best network request never happens. Service workers intercept and serve from cache. Here are the three Workbox caching strategies and when to use each.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>javascript</category><category>caching</category><category>browser</category><category>workbox</category><author>Ashish</author></item><item><title>Preload vs Prefetch vs Preconnect: When to Use Each Resource Hint</title><link>https://renderlog.in/blog/preload-prefetch-preconnect-resource-hints-guide/</link><guid isPermaLink="true">https://renderlog.in/blog/preload-prefetch-preconnect-resource-hints-guide/</guid><description>Three resource hints, three different jobs. Using the wrong one wastes bandwidth and slows the current page. How each one works and when to apply it.</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>browser</category><category>network</category><category>LCP</category><category>frontend</category><author>Ashish</author></item><item><title>Critical CSS: What Render-Blocking Means and How Inlining Fixes It</title><link>https://renderlog.in/blog/critical-css-inlining-render-blocking-explained/</link><guid isPermaLink="true">https://renderlog.in/blog/critical-css-inlining-render-blocking-explained/</guid><description>The browser cannot paint until it builds the CSSOM. CSS in an external file means a round trip before the first pixel. Inlining critical CSS removes that.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>css</category><category>browser</category><category>LCP</category><category>rendering</category><author>Ashish</author></item><item><title>How HTTP/2 Made Five Frontend Performance Best Practices Obsolete</title><link>https://renderlog.in/blog/http2-multiplexing-frontend-performance-changes/</link><guid isPermaLink="true">https://renderlog.in/blog/http2-multiplexing-frontend-performance-changes/</guid><description>Domain sharding, CSS sprites, and JS concatenation were correct for HTTP/1.1. HTTP/2 turned them into anti-patterns. Here is what changed and why.</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>network</category><category>browser</category><category>javascript</category><category>frontend</category><author>Ashish</author></item><item><title>React.lazy() Route Code Splitting Explained</title><link>https://renderlog.in/blog/react-lazy-route-code-splitting-guide/</link><guid isPermaLink="true">https://renderlog.in/blog/react-lazy-route-code-splitting-guide/</guid><description>React.lazy() makes a 5MB app&apos;s first load equal to just the landing route cost. Here is how route code splitting works and where it silently fails.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>react</category><category>bundling</category><category>javascript</category><category>code-splitting</category><author>Ashish</author></item><item><title>Skeleton Screens vs Spinners: Perceived Load Time</title><link>https://renderlog.in/blog/skeleton-screens-vs-spinners-perceived-performance/</link><guid isPermaLink="true">https://renderlog.in/blog/skeleton-screens-vs-spinners-perceived-performance/</guid><description>Perceived and measured performance diverge more than most developers expect. LinkedIn&apos;s skeleton screen research explains why, and when skeletons hurt.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>frontend</category><category>ux</category><category>react</category><category>rendering</category><author>Ashish</author></item><item><title>srcset and sizes: How the Browser Picks Images</title><link>https://renderlog.in/blog/srcset-sizes-responsive-images-explained/</link><guid isPermaLink="true">https://renderlog.in/blog/srcset-sizes-responsive-images-explained/</guid><description>The correct image for any device depends on viewport width, pixel density, and connection speed. srcset and sizes make that computable at the HTML level.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>images</category><category>browser</category><category>frontend</category><category>LCP</category><author>Ashish</author></item><item><title>What loading=lazy Does: Browser Lazy Loading</title><link>https://renderlog.in/blog/loading-lazy-html-attribute-how-it-works/</link><guid isPermaLink="true">https://renderlog.in/blog/loading-lazy-html-attribute-how-it-works/</guid><description>Google&apos;s profiling found 30-50% of bandwidth goes to below-fold images. loading=&quot;lazy&quot; defers them, but two cases where it actively hurts LCP.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>images</category><category>browser</category><category>LCP</category><category>frontend</category><author>Ashish</author></item><item><title>Frontend Performance: Series Hub and Quick Reference Guide</title><link>https://renderlog.in/blog/frontend-performance-how-why-hub/</link><guid isPermaLink="true">https://renderlog.in/blog/frontend-performance-how-why-hub/</guid><description>All blogs in the React &amp; JS Performance series in reading order, plus quick reference on layout thrashing, will-change, passive listeners, and INP.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>javascript</category><category>frontend</category><category>react</category><category>web</category><author>Ashish</author></item><item><title>How to Answer Frontend Performance Questions in Interviews</title><link>https://renderlog.in/blog/frontend-performance-interview-approach/</link><guid isPermaLink="true">https://renderlog.in/blog/frontend-performance-interview-approach/</guid><description>How to answer practical frontend performance interviews in React: a seven-area framework—rendering, network, mobile, bundles, assets, memory, and measurement.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>interview</category><category>react</category><category>frontend</category><category>javascript</category><author>Ashish</author></item><item><title>Lighthouse 100 and Still Crashes: OOM Explained</title><link>https://renderlog.in/blog/lighthouse-100-still-crashes-memory/</link><guid isPermaLink="true">https://renderlog.in/blog/lighthouse-100-still-crashes-memory/</guid><description>Why a perfect Lighthouse score doesn&apos;t prevent out-of-memory tab crashes in long-running SPAs — and how to build apps that survive 8-hour sessions.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>memory</category><category>lighthouse</category><category>mobile</category><category>debugging</category><author>Ashish</author></item><item><title>Tree Shaking and Code Splitting in JavaScript</title><link>https://renderlog.in/blog/build-bundles-treeshaking-code-splitting/</link><guid isPermaLink="true">https://renderlog.in/blog/build-bundles-treeshaking-code-splitting/</guid><description>Your 2MB bundle isn&apos;t fate. How bundlers merge modules, why tree shaking fails silently, and how to split code so users only load what they need.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>bundling</category><category>javascript</category><category>code-splitting</category><category>frontend</category><author>Ashish</author></item><item><title>Images, Fonts, Third-Party Scripts: LCP and CLS</title><link>https://renderlog.in/blog/images-fonts-third-party-performance/</link><guid isPermaLink="true">https://renderlog.in/blog/images-fonts-third-party-performance/</guid><description>How image formats, font loading, and third-party tag managers silently destroy LCP and CLS scores, and the exact fixes for each that actually work.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>images</category><category>fonts</category><category>LCP</category><category>frontend</category><author>Ashish</author></item><item><title>JavaScript GC: Pauses, Allocation Rate, Frontend Jank</title><link>https://renderlog.in/blog/javascript-garbage-collection-frontend/</link><guid isPermaLink="true">https://renderlog.in/blog/javascript-garbage-collection-frontend/</guid><description>How V8&apos;s generational garbage collector works, why high allocation rate causes jank, and practical strategies to reduce GC pressure in frontend code.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><category>javascript</category><category>performance</category><category>memory</category><category>v8</category><category>frontend</category><author>Ashish</author></item><item><title>React Memory Leaks: Closures and Object Graphs</title><link>https://renderlog.in/blog/react-memory-retained-graphs-leaks/</link><guid isPermaLink="true">https://renderlog.in/blog/react-memory-retained-graphs-leaks/</guid><description>How WebSocket subscriptions, stale closures, and unbounded caches create memory leaks in React apps — and how to find and fix them with Chrome DevTools.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><category>react</category><category>performance</category><category>memory</category><category>leaks</category><category>javascript</category><author>Ashish</author></item><item><title>DOM Performance on Mobile: Lab vs Real Device Reality</title><link>https://renderlog.in/blog/mobile-web-dom-performance/</link><guid isPermaLink="true">https://renderlog.in/blog/mobile-web-dom-performance/</guid><description>Budget Android devices run your JS 5-10x slower than your MacBook. Content-visibility, CSS containment, touch scroll, and real debugging on low-end hardware.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>mobile</category><category>DOM</category><category>css</category><category>frontend</category><author>Ashish</author></item><item><title>Network Optimization in React SPAs: Prefetching</title><link>https://renderlog.in/blog/network-optimization-spa-react/</link><guid isPermaLink="true">https://renderlog.in/blog/network-optimization-spa-react/</guid><description>Why React SPAs refetch data you already have, and how to fix it: HTTP cache headers, stale-while-revalidate, request deduplication, and prefetch strategies.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>network</category><category>react</category><category>caching</category><category>frontend</category><author>Ashish</author></item><item><title>OPFS: The Browser&apos;s Built-in Filesystem Explained</title><link>https://renderlog.in/blog/origin-private-file-system-opfs/</link><guid isPermaLink="true">https://renderlog.in/blog/origin-private-file-system-opfs/</guid><description>Origin Private File System gives browsers a real sandboxed filesystem. How it compares to IndexedDB, Cache API, and why it&apos;s the right tool for 200MB+ assets.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>OPFS</category><category>storage</category><category>web-workers</category><category>javascript</category><author>Ashish</author></item><item><title>Web Workers in React: Heavy Work Off Main Thread</title><link>https://renderlog.in/blog/web-workers-frontend-react/</link><guid isPermaLink="true">https://renderlog.in/blog/web-workers-frontend-react/</guid><description>CPU-heavy tasks block the UI — Web Workers fix that. Integrate Workers in React with Comlink, custom hooks, and Vite, with before/after profiling results.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>web-workers</category><category>javascript</category><category>react</category><category>frontend</category><author>Ashish</author></item><item><title>React List Virtualization: Pagination vs Virtual Scroll</title><link>https://renderlog.in/blog/large-lists-virtualization-trade-offs/</link><guid isPermaLink="true">https://renderlog.in/blog/large-lists-virtualization-trade-offs/</guid><description>10,000 DOM nodes is slow even if they&apos;re not visible. When to paginate, when to infinite scroll, when to virtualize — and the real cost of each approach.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><category>performance</category><category>react</category><category>virtualization</category><category>lists</category><category>frontend</category><author>Ashish</author></item><item><title>React Concurrent Features: Urgent vs Deferred UI Updates</title><link>https://renderlog.in/blog/react-concurrent-features-performance/</link><guid isPermaLink="true">https://renderlog.in/blog/react-concurrent-features-performance/</guid><description>How startTransition and useDeferredValue fix frozen inputs and laggy UIs by separating urgent updates from deferred ones — with real before/after examples.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><category>react</category><category>performance</category><category>concurrent</category><category>startTransition</category><category>frontend</category><author>Ashish</author></item><item><title>React.memo, useMemo, useCallback: When They Help vs Hurt</title><link>https://renderlog.in/blog/react-memo-usememo-usecallback/</link><guid isPermaLink="true">https://renderlog.in/blog/react-memo-usememo-usecallback/</guid><description>Most React memoization is premature. This breaks down when memo, useMemo, and useCallback actually help and when they add memory overhead with no real gain.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><category>react</category><category>performance</category><category>useMemo</category><category>useCallback</category><category>frontend</category><author>Ashish</author></item><item><title>React Re-rendering: When and Why Component Trees Update</title><link>https://renderlog.in/blog/react-rerendering-when-trees-update/</link><guid isPermaLink="true">https://renderlog.in/blog/react-rerendering-when-trees-update/</guid><description>Render phase vs commit phase, reconciliation and fibers, what triggers re-renders, referential equality traps, context pitfalls, and React 18 batching.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><category>react</category><category>performance</category><category>rendering</category><category>reconciliation</category><category>frontend</category><author>Ashish</author></item><item><title>How Aadhaar Deduplicates Biometrics at Billion Scale</title><link>https://renderlog.in/blog/aadhaar-deduplication-billion-scale/</link><guid isPermaLink="true">https://renderlog.in/blog/aadhaar-deduplication-billion-scale/</guid><description>How Aadhaar&apos;s ABIS deduplicates biometrics at billion scale: fingerprint templates, iris codes, sharded search, multi-engine consensus, and score fusion.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><category>aadhaar</category><category>identity</category><category>scale</category><category>engineering</category><category>infrastructure</category><author>Ashish</author></item><item><title>Long Tasks and Main Thread Blocking: Breaking Up the Work</title><link>https://renderlog.in/blog/long-tasks-main-thread-blocking/</link><guid isPermaLink="true">https://renderlog.in/blog/long-tasks-main-thread-blocking/</guid><description>What &gt;50ms Long Tasks are, why they destroy INP, and how to chunk work with scheduler.yield(), postTask(), and Web Workers to keep the UI responsive.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><category>performance</category><category>javascript</category><category>long-tasks</category><category>INP</category><category>scheduling</category><author>Ashish</author></item><item><title>Lottie: How Airbnb Replaced GIFs with JSON Animation</title><link>https://renderlog.in/blog/lottie-airbnb-json-animation/</link><guid isPermaLink="true">https://renderlog.in/blog/lottie-airbnb-json-animation/</guid><description>How Lottie works: JSON After Effects timelines rendered by cross-platform runtimes. Why Airbnb chose vector JSON over GIF and video for UI animations.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><category>lottie</category><category>animation</category><category>frontend</category><category>mobile</category><category>design</category><author>Ashish</author></item><item><title>Core Web Vitals and Lighthouse: What the Scores Mean</title><link>https://renderlog.in/blog/core-web-vitals-lighthouse-explained/</link><guid isPermaLink="true">https://renderlog.in/blog/core-web-vitals-lighthouse-explained/</guid><description>LCP, CLS, INP, and TTFB explained at the technical level. What lab scores miss about real users, how CrUX data differs, and what to fix when metrics look green.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>performance</category><category>core-web-vitals</category><category>lighthouse</category><category>LCP</category><category>INP</category><author>Ashish</author></item><item><title>DRM PiP Loophole: How Picture-in-Picture Bypasses DRM</title><link>https://renderlog.in/blog/drm-pip-loophole/</link><guid isPermaLink="true">https://renderlog.in/blog/drm-pip-loophole/</guid><description>Why Picture-in-Picture can bypass DRM black-screen protection in browsers: compositor paths, Widevine L3 vs L1 decode routing, and why 4K stays stubborn.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>drm</category><category>widevine</category><category>streaming</category><category>web-platform</category><category>chrome</category><author>Ashish</author></item><item><title>Meta StyleX: Moving CSS-in-JS From Runtime to Build Time</title><link>https://renderlog.in/blog/meta-stylex-compile-time-styling/</link><guid isPermaLink="true">https://renderlog.in/blog/meta-stylex-compile-time-styling/</guid><description>How Meta StyleX compiles JS-authored styles into atomic static CSS. No runtime injection, smaller bundles, and why the build-time approach matters at scale.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>stylex</category><category>css</category><category>frontend</category><category>javascript</category><category>meta</category><author>Ashish</author></item><item><title>Why Rapido Uses a Static PIN (Rapid OTP Trade-offs)</title><link>https://renderlog.in/blog/rapido-rapid-pin-static-otp/</link><guid isPermaLink="true">https://renderlog.in/blog/rapido-rapid-pin-static-otp/</guid><description>Rapido&apos;s fixed 4-digit Rapid PIN vs dynamic OTP: UX, SMS cost, and why physical pickup context matters more than brute-force odds.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>ux</category><category>product</category><category>security</category><category>engineering</category><category>mobility</category><author>Ashish</author></item><item><title>The 16.6ms Frame Budget: Why Fast Loads Still Feel Slow</title><link>https://renderlog.in/blog/16ms-frame-budget-60fps/</link><guid isPermaLink="true">https://renderlog.in/blog/16ms-frame-budget-60fps/</guid><description>At 60Hz the browser has ~16.6ms per frame for JS, layout, and paint. Why load scores miss jank and what it means for trading and live data UIs.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><category>performance</category><category>javascript</category><category>frontend</category><category>rendering</category><category>react</category><author>Ashish</author></item><item><title>How Google Maps Predicts Traffic in Real Time</title><link>https://renderlog.in/blog/google-maps-traffic-live-prediction/</link><guid isPermaLink="true">https://renderlog.in/blog/google-maps-traffic-live-prediction/</guid><description>Live traffic in Google Maps: how probe data, graph routing, Waze-style reports, and historical speed curves combine to show jams and update ETAs at huge scale.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><category>google-maps</category><category>traffic</category><category>gps</category><category>data-engineering</category><category>mapping</category><author>Ashish</author></item><item><title>Redux vs Zustand vs Jotai vs Valtio Compared</title><link>https://renderlog.in/blog/react-state-management-patterns/</link><guid isPermaLink="true">https://renderlog.in/blog/react-state-management-patterns/</guid><description>Redux, Zustand, Jotai, and Valtio compared from the inside. Centralized, atomic, and proxy-based React state patterns and when each one wins on scale.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><category>react</category><category>state-management</category><category>javascript</category><category>frontend</category><category>redux</category><author>Ashish</author></item><item><title>Why React Error Boundaries Are Still Class Components</title><link>https://renderlog.in/blog/why-react-error-boundaries-class-components/</link><guid isPermaLink="true">https://renderlog.in/blog/why-react-error-boundaries-class-components/</guid><description>React error boundaries use class lifecycles, not hooks: what render errors they catch, what async and event errors they skip, and how to structure fallbacks.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><category>react</category><category>javascript</category><category>frontend</category><category>error-handling</category><category>react-hooks</category><author>Ashish</author></item><item><title>Browser Rendering Pipeline: How JS and CSS Become Pixels</title><link>https://renderlog.in/blog/browser-main-thread-rendering-pipeline/</link><guid isPermaLink="true">https://renderlog.in/blog/browser-main-thread-rendering-pipeline/</guid><description>Parse → DOM → CSSOM → Layout → Paint → Composite. What the main thread does each frame, what jank physically is, and how to stop causing it.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><category>performance</category><category>browser</category><category>rendering</category><category>javascript</category><category>frontend</category><author>Ashish</author></item><item><title>Why JioHotstar Goes Black When You Screen Share</title><link>https://renderlog.in/blog/drm-screen-capture-jiohotstar/</link><guid isPermaLink="true">https://renderlog.in/blog/drm-screen-capture-jiohotstar/</guid><description>Why streaming apps go black on screen capture: EME, CDMs, Widevine L1 vs L3, and the secure compositor paths that keep decrypted frames off the capture surface.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><category>drm</category><category>streaming</category><category>web-platform</category><category>security</category><category>widevine</category><author>Ashish</author></item><item><title>Why CSS Never Matches Figma: Browser vs Canvas Pipelines</title><link>https://renderlog.in/blog/why-css-never-matches-figma/</link><guid isPermaLink="true">https://renderlog.in/blog/why-css-never-matches-figma/</guid><description>Browsers share one CSS model; Figma uses WASM and GPU shaders. Where design-to-code breaks: radius, strokes, blur, gap, and what to verify before you build.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><category>figma</category><category>css</category><category>design-handoff</category><category>frontend</category><category>web-platform</category><author>Ashish</author></item></channel></rss>