<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[JavaScript Development Substack]]></title><description><![CDATA[JavaScript Development Substack is your go-to resource for in-depth articles, tutorials, and insights on JavaScript programming. Whether you're a beginner or an experienced developer, this newsletter covers essential topics in JavaScript.]]></description><link>https://jsdevspace.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!QsLA!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ca5d76-c664-40f2-8341-1d2015511c8c_512x512.png</url><title>JavaScript Development Substack</title><link>https://jsdevspace.substack.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 01 Jul 2026 03:30:46 GMT</lastBuildDate><atom:link href="https://jsdevspace.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Anton]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jsdevspace@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jsdevspace@substack.com]]></itunes:email><itunes:name><![CDATA[JavaScript Development Space]]></itunes:name></itunes:owner><itunes:author><![CDATA[JavaScript Development Space]]></itunes:author><googleplay:owner><![CDATA[jsdevspace@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jsdevspace@substack.com]]></googleplay:email><googleplay:author><![CDATA[JavaScript Development Space]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The 8 AI Coding Traps Every Engineering Team Should Know]]></title><description><![CDATA[AI assistants are generating more code than ever, but many teams are discovering a new class of failures: clean pull requests, green tests, and production incidents that nobody saw coming.]]></description><link>https://jsdevspace.substack.com/p/the-8-ai-coding-traps-every-engineering</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/the-8-ai-coding-traps-every-engineering</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Tue, 23 Jun 2026 07:38:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!36G2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!36G2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!36G2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 424w, https://substackcdn.com/image/fetch/$s_!36G2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 848w, https://substackcdn.com/image/fetch/$s_!36G2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 1272w, https://substackcdn.com/image/fetch/$s_!36G2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!36G2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png" width="768" height="845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:845,&quot;width&quot;:768,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177699,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/203211330?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!36G2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 424w, https://substackcdn.com/image/fetch/$s_!36G2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 848w, https://substackcdn.com/image/fetch/$s_!36G2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 1272w, https://substackcdn.com/image/fetch/$s_!36G2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59843c6e-f785-4686-9102-68e6c7d1f76e_768x845.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://nextweekai.com/categories/coding-development/">AI coding assistants</a> have become a permanent part of modern software development.</p><p>Developers use them to generate boilerplate, write tests, create database queries, refactor legacy systems, and even implement entire features. According to recent industry surveys, the majority of engineers now rely on AI tools in some form during their daily workflow.</p><p>Yet many teams are learning an uncomfortable lesson:</p><p>The biggest risk of AI-generated code is not obvious bugs.</p><p>The real danger is code that looks correct.</p><p>It passes review.</p><p>It passes CI.</p><p>It passes automated tests.</p><p>And then it fails in production.</p><p>The problem isn&#8217;t that AI is inherently unreliable. The problem is that most development processes were designed for humans and have not yet adapted to AI-generated output.</p><p>What follows are eight recurring anti-patterns that appear across teams using AI-assisted development&#8212;and practical ways to prevent them before they become expensive incidents.</p><div><hr></div><h2>1. Automation Bias</h2><p>The first trap is psychological.</p><p>When developers know that code was generated by an AI assistant, they often review it differently.</p><p>The pull request looks clean.</p><p>Variable names follow conventions.</p><p>Formatting is perfect.</p><p>Nothing immediately appears suspicious.</p><p>As a result, reviewers unconsciously assume the implementation is safe.</p><p>This phenomenon is known as automation bias&#8212;the tendency to trust automated systems more than our own judgment.</p><p>Unfortunately, clean syntax does not guarantee correct behavior.</p><p>An AI-generated implementation may still contain subtle authorization flaws, incomplete validation logic, unsafe assumptions, or incorrect business rules.</p><p>The solution is simple:</p><p>AI-generated code should receive more scrutiny, not less.</p><p>Teams should explicitly review business logic, data handling, and security-critical paths regardless of how polished the code appears.</p><div><hr></div><h2>2. Hallucinated Dependencies</h2><p>One of the most dangerous AI failure modes has little to do with code itself.</p><p>It involves packages.</p><p>AI models occasionally invent dependency names that sound legitimate.</p><p>Developers see an import statement or installation command, assume the package exists, and continue.</p><p>Attackers have already realized this creates an opportunity.</p><p>If an AI repeatedly invents the same package name, someone can register that package and distribute malicious code through it.</p><p>This attack pattern has become known as <strong>slopsquatting</strong>.</p><p>The defense is process-driven:</p><ul><li><p>Verify every new dependency.</p></li><li><p>Require human approval for package installation.</p></li><li><p>Use lockfiles and integrity verification.</p></li><li><p>Review package provenance, maintainers, download history, and signatures.</p></li></ul><p>Treat AI-suggested dependencies exactly as you would treat links received from an unknown sender.</p><div><hr></div><h2>3. Tests That Verify Nothing</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!utm8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!utm8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 424w, https://substackcdn.com/image/fetch/$s_!utm8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 848w, https://substackcdn.com/image/fetch/$s_!utm8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!utm8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!utm8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:182984,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/203211330?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!utm8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 424w, https://substackcdn.com/image/fetch/$s_!utm8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 848w, https://substackcdn.com/image/fetch/$s_!utm8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!utm8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52633374-00f8-48b6-9346-63796891fd53_1024x559.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Coverage is one of the most misunderstood metrics in software engineering.</p><p>AI-generated tests often maximize coverage numbers while minimizing actual verification.</p><p>Common patterns include:</p><ul><li><p>Assertions that only check for non-null values.</p></li><li><p>Tests that merely verify execution completed.</p></li><li><p>Excessive mocking.</p></li><li><p>Snapshot tests that preserve incorrect behavior.</p></li></ul><p>The result is a green pipeline that provides false confidence.</p><p>Effective tests validate business behavior, edge cases, and expected outcomes.</p><p>A useful technique is mutation testing:</p><p>Intentionally break the implementation.</p><p>If no test fails, the test suite is providing little protection.</p><div><hr></div><h2>4. Using AI Where Verification Is Expensive</h2><p>AI performs best when the generated output is easy to verify.</p><p>Problems emerge when teams apply it to areas where correctness is difficult to validate.</p><p>Examples include:</p><ul><li><p>Financial calculations</p></li><li><p>Concurrency systems</p></li><li><p>Security controls</p></li><li><p>Database optimization</p></li><li><p>Distributed infrastructure</p></li></ul><p>The issue isn&#8217;t model capability.</p><p>The issue is verification cost.</p><p>If validating correctness requires deep expertise, AI should be treated as a brainstorming tool rather than a source of truth.</p><div><hr></div><h2>5. Scope Creep and Interface Drift</h2><p>Most developers have experienced this.</p><p>A simple request becomes:</p><p>&#8220;While we&#8217;re here, let&#8217;s improve this.&#8221;</p><p>Then:</p><p>&#8220;Let&#8217;s refactor this section too.&#8221;</p><p>A small change gradually becomes a massive pull request spanning multiple modules.</p><p>AI assistants encourage this behavior because they naturally suggest additional improvements.</p><p>The result is larger diffs, reduced review quality, and increased risk.</p><p>The fix is disciplined scoping:</p><p>One problem.</p><p>One change.</p><p>One pull request.</p><div><hr></div><h2>6. Mock Data That Reaches Production</h2><p>Mock data is useful during development.</p><p>It becomes dangerous when it survives deployment.</p><p>AI-generated prototypes frequently contain placeholder values, fake responses, and temporary shortcuts.</p><p>Because everything appears to work locally, these artifacts are easy to overlook.</p><p>Teams should establish automated checks that detect temporary markers and prevent them from reaching production environments.</p><p>If a feature has only been validated against mocks, it has not truly been validated.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gsMS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gsMS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gsMS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gsMS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gsMS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gsMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183105,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/203211330?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gsMS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 424w, https://substackcdn.com/image/fetch/$s_!gsMS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 848w, https://substackcdn.com/image/fetch/$s_!gsMS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!gsMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6b0af9f-c2f4-416f-95bf-1fd2442facc8_1024x559.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>7. Context Rot</h2><p>AI assistants do not remember project rules the way humans do.</p><p>In long conversations, earlier constraints gradually lose influence.</p><p>Toward the end of a session, the model may begin suggesting:</p><ul><li><p>Deprecated APIs</p></li><li><p>Old architecture patterns</p></li><li><p>Previously rejected solutions</p></li></ul><p>The longer the interaction, the more likely this becomes.</p><p>Successful teams avoid relying on conversational memory.</p><p>Instead, they store critical rules in persistent project documentation such as:</p><ul><li><p>CLAUDE.md</p></li><li><p>AGENTS.md</p></li><li><p>Cursor rules</p></li><li><p>Architecture guides</p></li></ul><p>The source of truth should live outside the chat.</p><div><hr></div><h2>8. Architecture Built One Prompt at a Time</h2><p>Perhaps the most subtle AI anti-pattern is architectural degradation.</p><p>Every pull request looks reasonable.</p><p>Every function appears well written.</p><p>Yet over time the system becomes increasingly fragmented.</p><p>Why?</p><p>Because AI optimizes locally.</p><p>Architecture requires global thinking.</p><p>Without explicit boundaries, systems slowly drift toward:</p><ul><li><p>God services</p></li><li><p>Duplicate logic</p></li><li><p>Blurred module ownership</p></li><li><p>Increasing coupling</p></li></ul><p>This is why architectural decisions should be documented and reviewed independently of feature implementation.</p><p>AI can build inside boundaries.</p><p>Humans must define those boundaries.</p><div><hr></div><h1>Conclusion</h1><p>The biggest misconception about AI-generated code is that its primary risk is bad code.</p><p>In reality, its greatest danger is believable code.</p><p>Code that looks professional.</p><p>Code that feels finished.</p><p>Code that earns quick approval.</p><p>Modern engineering is no longer about generating software faster.</p><p>AI already does that.</p><p>The new challenge is determining which generated changes deserve trust.</p><p>The strongest teams are not the ones using the most AI.</p><p>They are the ones that have built the best systems for questioning it.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #39 — TypeScript, AI Tools & Open Source Releases]]></title><description><![CDATA[From TypeScript 7 and Node.js security updates to AI-powered tooling, new libraries, and open-source projects worth exploring.]]></description><link>https://jsdevspace.substack.com/p/friday-links-39-typescript-ai-tools</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-39-typescript-ai-tools</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 19 Jun 2026 06:56:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2MLO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2MLO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2MLO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 424w, https://substackcdn.com/image/fetch/$s_!2MLO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 848w, https://substackcdn.com/image/fetch/$s_!2MLO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 1272w, https://substackcdn.com/image/fetch/$s_!2MLO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2MLO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png" width="800" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:324971,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/202682279?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2MLO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 424w, https://substackcdn.com/image/fetch/$s_!2MLO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 848w, https://substackcdn.com/image/fetch/$s_!2MLO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 1272w, https://substackcdn.com/image/fetch/$s_!2MLO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89ac3199-8e9c-461b-b1c5-1c2b36437c51_800x533.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Another packed week across the JavaScript ecosystem.</p><p>TypeScript continues its transition toward a faster future, AI tooling shows up in more developer workflows, and open-source maintainers keep shipping new libraries, utilities, and experiments at an impressive pace.</p><p>This edition covers the most interesting releases, articles, tools, and discussions from the past week&#8212;from frontend development and backend runtimes to AI-assisted engineering and developer productivity.</p><p>Whether you&#8217;re building with React, Node.js, TypeScript, Astro, or the latest AI tools, there&#8217;s something here worth bookmarking.</p><h2>&#129504; Language &amp; Runtime Updates</h2><h3>TypeScript 7.0 Beta Continues To Generate Excitement</h3><p>The TypeScript team continues refining TypeScript 7.0 and its new Go-based compiler architecture. Early benchmarks and community testing suggest substantial performance improvements for large codebases, monorepos, and editor tooling. The transition marks one of the most significant architectural changes in TypeScript&#8217;s history.</p><h3>VoidZero Joins Cloudflare</h3><p>One of the biggest JavaScript ecosystem stories this week: the team behind Vite, Rolldown, Oxc, Vitest, and VoidZero is joining Cloudflare. The move could accelerate development across the next generation of JavaScript tooling and infrastructure.</p><p><a href="https://blog.cloudflare.com/voidzero-joins-cloudflare/">The Cloudflare Blog</a></p><h3>npm 12 Will Disable Install Scripts By Default</h3><p>npm is preparing a major security-focused change. Future versions will no longer execute <code>preinstall</code>, <code>install</code>, and <code>postinstall</code> scripts automatically by default. The goal is to reduce supply-chain attack risks and improve package installation security.</p><p>Node.js Security Releases Land Across Multiple Branches</p><p>Node.js shipped security updates for multiple active release lines, including fixes for high-severity vulnerabilities. Teams running production workloads should review the latest security advisories and update accordingly.</p><p><a href="https://github.com/npm/rfcs">rfcs</a></p><h3>Node.js 24 Continues To Improve Developer Experience</h3><p>Recent updates to Node.js 24 introduced support for UUID v7 generation, additional testing utilities, and improvements across the platform. The project continues pushing toward a more batteries-included developer experience.</p><h3>Node.js Security Releases Land Across Multiple Versions</h3><p>The Node.js team released security updates across several supported release lines, including Node.js 22, 24, and 26. The updates address multiple high-severity vulnerabilities affecting core dependencies and runtime components. Teams running production workloads should review the advisories and upgrade as soon as possible to ensure their applications remain protected.</p><p><a href="https://nodejs.org/en/blog/vulnerability/june-2026-security-releases">Node.js Security Releases</a></p><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://nextweekai.com/blog/build-chatgpt-from-scratch-guide/">How to Build ChatGPT From Scratch: Understanding LLMs Step by Step</a></p><p><a href="https://tanstack.com/blog/tanstack-table-v9-typescript-performance">TypeScript Performance in TanStack Table V9</a></p><p><a href="https://vercel.com/changelog/introducing-eve-an-open-source-agent-framework">Introducing eve, an open-source agent framework</a></p><p><a href="https://www.debugbear.com/blog/lazy-loading-performance">How to Use Lazy Loading Without Hurting Web Performance</a></p><p><a href="https://kittygiraudel.com/2026/04/09/an-interactive-cover-component/">An Interactive Cover Component</a></p><p><a href="https://olliewilliams.xyz/blog/streaming-html/">Streaming HTML</a></p><p><a href="https://roman.pt/posts/linkedin-backdoor/">A backdoor in a LinkedIn job offer</a></p><p><a href="https://www.react.doctor/blog/the-problem-with-useeffect">The problem with useEffect</a></p><p><a href="https://evilmartians.com/chronicles/ai-assisted-engineers-are-burning-out-is-this-fine">AI-assisted engineers are burning out, is this fine?</a></p><p><a href="https://www.smashingmagazine.com/2026/06/how-make-design-system-ai-ready/">How To Make Your Design System AI-Ready</a></p><p><a href="https://developer.mozilla.org/en-US/blog/introducing-mdn-mcp-server/">Introducing the MDN MCP server</a></p><p><a href="https://zed.dev/blog/introducing-deltadb">Software Is Made Between Commits</a></p><h2>&#9874;&#65039; Tools</h2><p><a href="https://nextweekai.com/">NextWeekAI</a> - Curated directory of cutting-edge AI tools.</p><p><a href="https://chrome.dev/view-transitions-toolkit/">View Transitions Toolkit</a></p><p>A collection of utility functions to more easily work with View Transitions.</p><p><a href="https://github.com/sindresorhus/eslint-plugin-unicorn">eslint-plugin-unicorn 67.0</a> - Adds Even More Ways to Improve Your Code</p><p>Nodemailer 9.0 Tightens Email Security in Node.js</p><p><a href="https://nodemailer.com/">Nodemailer 9.0</a> is out, bringing updates to one of the most widely used email libraries in the Node.js ecosystem. The package continues to support SMTP, Amazon SES, and Sendmail-based delivery, while version 9.0 adds a notable security improvement: TLS connections are now validated by default when fetching remote content. For projects that generate rich emails with external assets, this is a small but important hardening update.</p><p><a href="https://github.com/tabulator-tables/tabulator">Tabulator 6.5</a> - Easy to use, simple to code, fully featured, interactive JavaScript tables and data grids.</p><p><code>&lt;relative-time&gt;</code><a href="https://github.com/github/relative-time-element"> element</a> - Web component extensions to the standard <code>&lt;time&gt;</code> element.</p><p><a href="https://xem.github.io/miniPixelFont/js13k.html">MiniPixelFont generator</a></p><p><a href="https://react.foundation/">React Foundation Launches to Support the Future of React</a></p><p>The newly announced React Foundation aims to provide long-term sustainability for one of the world&#8217;s most widely used frontend ecosystems. The organization introduces a community-driven governance model focused on transparent decision-making, direct funding for maintainers, and financial support for critical open-source projects. By creating a dedicated foundation, the React community hopes to ensure the continued health, stability, and growth of the ecosystem for years to come.</p><p><a href="https://isitagentready.com/">Is Your Site Agent-Ready?</a> - A simple tool to check if your website is ready for AI agents.</p><p><a href="https://github.com/leonxlnx/taste-skill">Taste Skill</a> - Helps frontend projects escape the generic SaaS look</p><p><a href="https://github.com/kessler/gemma-gem">Gemma Gem</a> - Your personal AI assistant living right inside the browser. Gemma Gem runs Google&#8217;s Gemma 4 model entirely on-device via WebGPU &#8212; no API keys, no cloud, no data leaving your machine. It can read pages, click buttons, fill forms, run JavaScript, and answer questions about any site you visit.</p><p><a href="https://github.com/wonderwhy-er/DesktopCommanderMCP">Desktop Commander MCP</a> - This is MCP server for Claude that gives it terminal control, file system search and diff file editing capabilities</p><p><a href="https://depsguard.com/">DepsGuard</a> - Hardens Package Manager Configs Against Supply-Chain Attacks</p><h2>&#128218; Libs</h2><h3>zod-compiler Brings Zero-Overhead Validation to Zod</h3><p><a href="https://github.com/gajus/zod-compiler">zod-compiler</a> is a new build-time optimization tool that transforms existing Zod schemas into highly optimized validators during bundling. Designed to work with Vite, Webpack, and other modern build systems, it preserves the familiar Zod API while generating tree-shakeable validation code with virtually no runtime overhead. The project claims validation performance improvements ranging from 2&#215; to 75&#215; depending on schema complexity&#8212;all without requiring changes to application code. For teams heavily invested in Zod, this could be one of the most interesting performance-focused tooling releases of the year.</p><p><a href="https://polycss.com/">PolyCSS</a> - Render textured 3D meshes in the DOM with CSS. No WebGL or <code>&lt;canvas&gt;</code> needed: each polygon is a real DOM element.</p><p><a href="https://calendarjs.com/">CalendarJS</a></p><p><a href="https://github.com/Ataraxy-Labs/sem">sem</a> - Semantic version control =&gt; entity-level diffs, blame, and impact analysis on top of git. 28 languages via tree-sitter. Built for coding agents.</p><h2>&#8986; Releases</h2><p><a href="https://github.com/vitejs/vite/blob/v8.1.0-beta.0/packages/vite/CHANGELOG.md#810-beta0-2026-06-15">Vite 8.1 Released</a></p><p><a href="https://github.com/withastro/astro/releases/tag/astro@7.0.0-beta.4">Astro 7.0.0 Beta 4 Released</a></p><p><a href="https://github.com/vuejs/core/blob/minor/CHANGELOG.md#360-beta15-2026-06-11">Vue 3.6</a></p><p><a href="https://github.com/sveltejs/kit/releases/tag/%40sveltejs%2Fkit%403.0.0-next.4">SvelteKit 3.0 Released</a></p><p><a href="https://tanstack.com/blog/tanstack-ai-beta">TanStack AI Beta</a></p><p><a href="https://eslint.org/blog/2026/06/eslint-v10.5.0-released/">ESLint v10.5.0 released</a></p><p><a href="https://biomejs.dev/blog/biome-v2-5/">Biome v2.5</a> &#8212; 500 Lint Rules, Plugin Code Fix, and Cross-File Linting</p><p><a href="https://nubjs.com/blog/introducing-nub">Introducing Nub</a> - an all-in-one toolkit for Node.js</p><p><a href="https://playwright.dev/docs/release-notes#version-161">Playwright 1.61</a>, <a href="https://github.com/naver/billboard.js">billboard.js 4.0.1</a>, <a href="https://reactnative.dev/blog/2026/06/11/react-native-0.86">React Native 0.86</a>, <a href="https://github.com/fable-compiler/Fable/releases/tag/5.2.0">Fable 5.2</a>,</p><p><a href="https://github.com/axios/axios/releases/tag/v1.18.0">axios v1.18.0</a>, <a href="https://github.com/yagop/node-telegram-bot-api/releases">Node Telegram Bot API 1.0/1.1</a>, <a href="https://github.com/graphql/graphql-js">graphql-js 17.0</a>, <a href="https://github.com/nodejs/node-gyp">node-gyp v13.0.0</a></p><p><a href="https://devblogs.microsoft.com/react-native/%F0%9F%9A%80react-native-windows-v0-83-is-here/">React Native Windows v0.83 is here!!</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=nl6zw_L1j_U">Copying other website&#8217;s Design.MD File. Is it stealing?</a></p><p><a href="https://www.youtube.com/watch?v=fLwP3tlDe2U">Signs you&#8217;re cracked at programming</a></p><p><a href="https://www.youtube.com/watch?v=DOFflggE_0Q">Distributed Transactions Explained: 2 Phase Commit vs Saga Pattern</a></p><p><a href="https://www.youtube.com/watch?v=kVL_7csy_ZM">The Rise of Generative UI for Developers (CopilotKit)</a></p><p><a href="https://www.youtube.com/watch?v=7-aY-tS2LhE">MERN Stack Project: Realtime Chat App Tutorial - React.js &amp; Socket.io 2026</a></p><p><a href="https://www.youtube.com/watch?v=-fW2KFS022I">Adapting to dynamic content using modern CSS</a></p><p><a href="https://www.youtube.com/watch?v=vuezTFo4kRE">99% of Developers Don&#8217;t Get WebSockets</a></p><p><a href="https://www.youtube.com/watch?v=JG7wBlY0VUg">Most Important Programming Languages In 2026</a></p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>Jeff Bezos Says AI Will Create a Labor Shortage &#8212; As Amazon Cuts 30,000 Jobs</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0yIt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0yIt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0yIt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0yIt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0yIt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0yIt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg" width="800" height="494" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:494,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/202682279?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0yIt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0yIt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0yIt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0yIt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05d55d45-5d78-41a7-a047-f872850ff79e_800x494.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Speaking at the <a href="https://thehill.com/policy/technology/5928754-jeff-bezos-ai-labor/">VivaTech conference in Paris</a>, Amazon founder Jeff Bezos pushed back against one of the most common fears surrounding artificial intelligence: mass unemployment. Instead, Bezos argued that AI will eventually create a shortage of workers rather than replace them.</p><p>The statement comes at an interesting moment. Amazon has eliminated roughly 30,000 corporate positions in recent years&#8212;about 10% of its white-collar workforce&#8212;with automation and AI-driven efficiency playing a role in those reductions.</p><p>According to Bezos, AI expands what people are capable of accomplishing rather than making them obsolete. Human ambition, he argues, is effectively unlimited. There will always be more products to build, services to improve, and problems to solve. The real constraint isn&#8217;t imagination&#8212;it&#8217;s execution. By increasing productivity, AI could allow smaller teams to tackle significantly larger projects, creating demand for entirely new categories of work.</p><p>Bezos also believes rising productivity could reshape participation in the labor market itself. If AI-driven gains substantially increase incomes, some households may no longer require two full-time earners to maintain the same standard of living. In that scenario, labor shortages would emerge not only because businesses need more workers, but also because fewer people choose to remain in the workforce.</p><p>Whether that prediction proves accurate remains an open question. For now, the debate continues as companies invest heavily in AI while simultaneously restructuring parts of their workforce. The long-term impact of AI on employment may depend less on how many jobs it eliminates and more on how quickly new opportunities emerge to replace them.</p><h3>Google Is Testing a New reCAPTCHA That Requires Hand Gestures</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uUTb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uUTb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uUTb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uUTb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uUTb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uUTb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg" width="800" height="570" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:570,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33700,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/202682279?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uUTb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uUTb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uUTb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uUTb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1651f8a6-5b26-4236-9418-6432254c45fb_800x570.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://docs.cloud.google.com/recaptcha/docs/hand-gesture-verification">Google has begun testing a more advanced version of reCAPTCHA</a> that verifies users through hand gestures performed in front of a device&#8217;s camera. Instead of selecting traffic lights, clicking bicycles, or solving image puzzles, users may be asked to perform a specific hand movement that the system can recognize and validate.</p><p>According to reports, the experimental system tracks 21 hand landmarks and analyzes whether the performed gesture matches the requested action. Google says the captured video is not linked to a user&#8217;s identity and is deleted immediately after verification. Alternative verification methods will remain available for users who cannot complete gesture-based challenges.</p><p>The idea has already sparked privacy concerns. Critics argue that any authentication system requiring camera access introduces additional privacy risks, regardless of how temporary or anonymous the collected data may be. Others question whether increasingly complex CAPTCHA systems are becoming more frustrating for humans than for the bots they&#8217;re designed to stop.</p><p>Google has not announced when&#8212;or if&#8212;the feature will be rolled out more broadly. For now, it remains an experimental test, and the company may still adjust or abandon the approach based on user feedback and real-world results.</p><div><hr></div><p>That&#8217;s all for Friday Links #39.</p><p>The pace of change across software development shows no signs of slowing down. Between evolving JavaScript tooling, new AI workflows, and a constant stream of open-source releases, there&#8217;s never been a better time to be building on the web.</p><p>Thanks for reading, and if you discover something interesting during the week, there&#8217;s a good chance it will appear in the next edition.</p><p>See you in Friday Links #40.</p>]]></content:encoded></item><item><title><![CDATA[Selection Sort Made Visual: Learn Sorting Without Abstract Theory]]></title><description><![CDATA[Forget dry textbook explanations. Learn selection sort through intuition, simple visuals, and JavaScript examples that actually make sense.]]></description><link>https://jsdevspace.substack.com/p/selection-sort-made-visual-learn</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/selection-sort-made-visual-learn</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Thu, 28 May 2026 04:35:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!oAuk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oAuk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oAuk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oAuk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oAuk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oAuk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oAuk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg" width="1024" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:117389,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/199418535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oAuk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oAuk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oAuk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oAuk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F698e4233-9bc8-4191-809c-a4d0671389ca_1024x572.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Algorithms often sound more intimidating than they really are.</p><p>Someone says <em>sorting algorithm</em> and many people immediately imagine:</p><ul><li><p>scary computer science lectures</p></li><li><p>mathematical notation</p></li><li><p>Big-O formulas everywhere</p></li><li><p>complicated whiteboard interviews</p></li></ul><p>But most beginner algorithms are surprisingly ordinary once you strip away the terminology.</p><p>Selection sort is a perfect example.</p><p>Its entire strategy can be explained using something you already do naturally in everyday life:</p><p><strong>find the best candidate, put it where it belongs, then repeat.</strong></p><p>That&#8217;s all.</p><p>No magic.</p><p>No hidden computer science ritual.</p><p>Let&#8217;s make it visual.</p><div><hr></div><h1>Imagine Cleaning a Messy Desk</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YmE9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YmE9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YmE9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YmE9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YmE9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YmE9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg" width="1024" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:160684,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/199418535?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YmE9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YmE9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YmE9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YmE9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F065d11f1-6511-4e65-a996-1b2c0a9a5497_1024x572.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Suppose your desk is covered with books.</p><p>Not organized.</p><p>Not stacked nicely.</p><p>Just chaos.</p><p>You want to arrange them from thinnest to thickest.</p><p>Your pile looks like this:</p><pre><code><code>[ thick ] [ medium ] [ tiny ] [ huge ] [ thin ]</code></code></pre><p>How would a human solve this?</p><p>Probably like this:</p><ol><li><p>Look through <strong>all books</strong>.</p></li><li><p>Find the thinnest one.</p></li><li><p>Put it in the first position.</p></li><li><p>Ignore it forever.</p></li><li><p>Repeat with the remaining books.</p></li></ol><p>That process is selection sort.</p><p>The algorithm&#8217;s name suddenly becomes very literal.</p><p>You&#8217;re simply <strong>selecting</strong> the best candidate during each round.</p><div><hr></div><h1>The Core Mental Model</h1><p>Selection sort quietly divides your array into two invisible regions.</p><p>Think of the data as having two zones:</p><pre><code><code>Sorted Part | Unsorted Part</code></code></pre><p>At the beginning:</p><pre><code><code>[] | [64, 25, 12, 22, 11]</code></code></pre><p>Nothing is sorted yet.</p><p>Everything belongs to the unsorted zone.</p><p>Each round follows the same pattern:</p><ul><li><p>search the unsorted section</p></li><li><p>find the smallest value</p></li><li><p>move it into position</p></li><li><p>expand the sorted section</p></li></ul><p>Simple.</p><p>Predictable.</p><p>Repeatable.</p><div><hr></div><h1>Walking Through a Real Example</h1><p>Let&#8217;s sort this array:</p><pre><code><code>const values = [64, 25, 12, 22, 11];</code></code></pre><div><hr></div><h2>Round 1</h2><p>Current state:</p><pre><code><code>[] | [64, 25, 12, 22, 11]</code></code></pre><p>Search for the smallest value.</p><p>Scan through everything:</p><pre><code><code>64 &#8594; 25 &#8594; 12 &#8594; 22 &#8594; 11</code></code></pre><p>Smallest value:</p><pre><code><code>11</code></code></pre><p>Move it to the front.</p><p>Result:</p><pre><code><code>[11] | [25, 12, 22, 64]</code></code></pre><p>The first slot is finished forever.</p><p>We never need to touch it again.</p><div><hr></div><h2>Round 2</h2><p>Ignore the sorted section.</p><p>Focus only on:</p><pre><code><code>[25, 12, 22, 64]</code></code></pre><p>Search again.</p><p>Smallest value:</p><pre><code><code>12</code></code></pre><p>Swap it into place.</p><p>Result:</p><pre><code><code>[11, 12] | [25, 22, 64]</code></code></pre><p>Two positions solved.</p><div><hr></div><h2>Round 3</h2><p>Remaining section:</p><pre><code><code>[25, 22, 64]</code></code></pre><p>Find the smallest:</p><pre><code><code>22</code></code></pre><p>Swap.</p><p>Now we have:</p><pre><code><code>[11, 12, 22] | [25, 64]</code></code></pre><div><hr></div><h2>Round 4</h2><p>Remaining numbers:</p><pre><code><code>[25, 64]</code></code></pre><p>Smallest value?</p><p>Already:</p><pre><code><code>25</code></code></pre><p>No swap required.</p><p>Final result:</p><pre><code><code>[11, 12, 22, 25, 64]</code></code></pre><p>Done.</p><p>No mystery.</p><p>Just repetition.</p><div><hr></div><h1>Writing Selection Sort in JavaScript</h1><p>Now that the behavior feels intuitive, the implementation becomes much easier to understand.</p><p>Here&#8217;s a clean version.</p><pre><code><code>function selectionSort(items) {
  const result = [...items];

  for (let boundary = 0; boundary &lt; result.length - 1; boundary++) {
    let smallestIndex = boundary;

    for (let cursor = boundary + 1; cursor &lt; result.length; cursor++) {
      if (result[cursor] &lt; result[smallestIndex]) {
        smallestIndex = cursor;
      }
    }

    if (smallestIndex !== boundary) {
      [result[boundary], result[smallestIndex]] = [
        result[smallestIndex],
        result[boundary],
      ];
    }
  }

  return result;
}

const numbers = [64, 25, 12, 22, 11];

console.log(selectionSort(numbers));</code></code></pre><p>Output:</p><pre><code><code>[11, 12, 22, 25, 64]</code></code></pre><div><hr></div><h1>Understanding the Algorithm Step by Step</h1><p>Let&#8217;s slow down and unpack what&#8217;s actually happening.</p><div><hr></div><h2>The Outer Loop</h2><p>The outer loop controls <strong>rounds</strong>.</p><p>Each round permanently solves exactly one position.</p><p>Think of it like this:</p><pre><code><code>Round 1 &#8594; fill slot 0
Round 2 &#8594; fill slot 1
Round 3 &#8594; fill slot 2</code></code></pre><p>Each iteration grows the sorted region.</p><div><hr></div><h2>The Inner Loop</h2><p>The inner loop performs the search.</p><p>Its only responsibility:</p><p><strong>find the smallest remaining value.</strong></p><p>It scans the unsorted section and continuously updates the current minimum.</p><p>Imagine somebody repeatedly saying:</p><blockquote><p>&#8220;This is the smallest thing I&#8217;ve seen so far.&#8221;</p></blockquote><p>Then:</p><blockquote><p>&#8220;Wait, this one is smaller.&#8221;</p></blockquote><p>Then:</p><blockquote><p>&#8220;Nope, this one wins.&#8221;</p></blockquote><p>By the end of the scan, you know exactly which element belongs next.</p><div><hr></div><h1>Making Selection Sort Visual in JavaScript</h1><p>Reading algorithms is useful.</p><p>Watching them evolve is even better.</p><p>Let&#8217;s log every round.</p><pre><code><code>function visualizeSelectionSort(values) {
  const array = [...values];

  for (let start = 0; start &lt; array.length - 1; start++) {
    let minIndex = start;

    for (let scan = start + 1; scan &lt; array.length; scan++) {
      if (array[scan] &lt; array[minIndex]) {
        minIndex = scan;
      }
    }

    if (minIndex !== start) {
      [array[start], array[minIndex]] = [
        array[minIndex],
        array[start],
      ];
    }

    console.log(`Round ${start + 1}:`, [...array]);
  }
}

visualizeSelectionSort([64, 25, 12, 22, 11]);</code></code></pre><p>Console output:</p><pre><code><code>Round 1: [11, 25, 12, 22, 64]
Round 2: [11, 12, 25, 22, 64]
Round 3: [11, 12, 22, 25, 64]
Round 4: [11, 12, 22, 25, 64]</code></code></pre><p>This is where algorithms often become satisfying.</p><p>You can literally watch order emerge.</p><div><hr></div><h1>Why Selection Sort Is Slow</h1><p>Selection sort is simple.</p><p>But simplicity has a cost.</p><p>Even if your array is already perfectly sorted:</p><pre><code><code>[1, 2, 3, 4, 5]</code></code></pre><p>The algorithm still performs almost the same amount of scanning.</p><p>It keeps searching.</p><p>It keeps comparing.</p><p>It does not become dramatically smarter.</p><p>Time complexity:</p><pre><code><code>Best case: O(n&#178;)
Average case: O(n&#178;)
Worst case: O(n&#178;)</code></code></pre><p>That consistency is selection sort&#8217;s biggest weakness.</p><p>Faster algorithms like quicksort or mergesort can outperform it dramatically on large datasets.</p><div><hr></div><h1>Where Selection Sort Still Makes Sense</h1><p>You probably won&#8217;t use selection sort for processing millions of records.</p><p>That&#8217;s okay.</p><p>Not every algorithm exists to dominate benchmarks.</p><p>Selection sort still shines in a few areas.</p><div><hr></div><h2>Learning Core Programming Ideas</h2><p>Selection sort teaches important programming concepts:</p><ul><li><p>nested loops</p></li><li><p>boundaries</p></li><li><p>searching</p></li><li><p>state reduction</p></li><li><p>incremental problem solving</p></li></ul><p>That&#8217;s incredibly valuable for beginners.</p><div><hr></div><h2>Small Data Sets</h2><p>Tiny arrays.</p><p>Lightweight utilities.</p><p>Simple scripts.</p><p>Sometimes readability matters more than raw performance.</p><div><hr></div><h2>Low-Memory Scenarios</h2><p>Selection sort uses:</p><pre><code><code>O(1)</code></code></pre><p>extra space.</p><p>It sorts <strong>in place</strong>.</p><p>No helper arrays required.</p><p>That property can still matter in certain environments.</p><div><hr></div><h1>Why Visual Learning Changes Everything</h1><p>Many algorithm tutorials start from code.</p><p>That&#8217;s often backwards.</p><p>Beginners end up memorizing syntax before understanding behavior.</p><p>A smoother learning path looks like this:</p><ol><li><p>Understand the movement.</p></li><li><p>Understand the strategy.</p></li><li><p>Understand the implementation.</p></li></ol><p>Selection sort becomes much less abstract once you visualize the process.</p><p>You&#8217;re not really sorting numbers.</p><p>You&#8217;re solving a shrinking problem.</p><p>Each round removes uncertainty.</p><p>Each round reduces chaos.</p><p>Each round makes the remaining task smaller.</p><p>That&#8217;s a powerful programming pattern you&#8217;ll encounter far beyond sorting algorithms.</p><div><hr></div><h1>Final Thoughts</h1><p>Selection sort will not power massive search engines.</p><p>It will not replace highly optimized production sorting algorithms.</p><p>But that was never its real purpose.</p><p>Selection sort teaches a much more important lesson:</p><p><strong>solve one small piece completely, then move forward.</strong></p><p>Find the smallest value.</p><p>Place it.</p><p>Shrink the problem.</p><p>Repeat.</p><p>Simple.</p><p>Visual.</p><p>Surprisingly elegant.</p><p>And an excellent way to start thinking like a programmer.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #38 — Modern JavaScript, AI Coding Tools & Web Releases]]></title><description><![CDATA[The latest JavaScript ecosystem updates, AI developer workflows, framework releases, tooling launches, and frontend engineering news worth your attention.]]></description><link>https://jsdevspace.substack.com/p/friday-links-38-modern-javascript</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-38-modern-javascript</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Thu, 21 May 2026 09:20:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!razQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!razQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!razQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 424w, https://substackcdn.com/image/fetch/$s_!razQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 848w, https://substackcdn.com/image/fetch/$s_!razQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 1272w, https://substackcdn.com/image/fetch/$s_!razQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!razQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png" width="800" height="449" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:449,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:127164,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/198675332?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!razQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 424w, https://substackcdn.com/image/fetch/$s_!razQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 848w, https://substackcdn.com/image/fetch/$s_!razQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 1272w, https://substackcdn.com/image/fetch/$s_!razQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4d516d-65a1-45fc-b8df-72a78e1c2e1f_800x449.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Welcome to <strong>Friday Links #38</strong> &#8212; your weekly roundup of JavaScript news, AI tooling, releases, and modern web development updates.</p><p>This week&#8217;s edition covers new framework releases, developer tools, AI coding workflows, frontend ecosystem updates, open-source launches, and practical engineering trends shaping the modern JavaScript landscape. Whether you&#8217;re building with React, TypeScript, Node.js, or experimenting with AI-powered development, there&#8217;s plenty to explore.</p><h2>&#128226; Special partner message</h2><h3>&#128467;&#65039; <a href="https://reactnorway.com/">React Norway</a> &#8212; Oslo, June 5 &#127475;&#127476;</h3><p>Join 350+ React and full-stack developers for a unique single-track conference with a strong &#8220;Rock &amp; React&#8221; vibe, great talks, community energy, and modern web engineering discussions.</p><h3>&#127903;&#65039; Use code <code>TWIR</code> for 10% off your ticket.</h3><h2>&#129504; Language &amp; Runtime Updates</h2><h3>TypeScript 6.0 Is Official &#8212; And It&#8217;s Preparing the Road to TypeScript 7</h3><p>One of the biggest ecosystem updates remains <a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-6-0.html">TypeScript 6.0</a>.</p><p>This release is not just another incremental version bump. It acts as a transition layer between the current JavaScript-based compiler and the upcoming native TypeScript 7 compiler. According to the TypeScript team, 6.0 is effectively the bridge release that prepares projects for the future architecture.</p><p>Some notable changes include:</p><ul><li><p>alignment with future TS 7 behavior</p></li><li><p>deprecations aimed at modern ESM workflows</p></li><li><p>simplified DOM library behavior</p></li><li><p>stricter compiler rules</p></li><li><p>migration tooling for upcoming changes</p></li></ul><p>The broader direction is clear: TypeScript is increasingly optimizing for modern evergreen runtimes, ESM tooling, and native performance improvements.</p><h3>Bun&#8217;s Rust Rewrite Has Been Merged</h3><p>The Bun story continues.</p><p>One of the more talked-about updates recently: <a href="https://github.com/oven-sh/bun/pull/30412">Bun&#8217;s experimental Rust rewrite effort has now been merged</a>, generating substantial discussion across developer communities. Questions quickly emerged around maintainability, AI-assisted code generation quality, and long-term runtime strategy.</p><p>At the same time, Bun keeps strengthening its position inside the TypeScript ecosystem.</p><p>Developers increasingly evaluate Bun not just as a runtime, but as a broader replacement for parts of the traditional Node toolchain:</p><ul><li><p>package manager</p></li><li><p>bundler</p></li><li><p>test runner</p></li><li><p>TypeScript execution environment</p></li><li><p>server runtime</p></li></ul><p>The &#8220;Should new TypeScript projects start with Bun?&#8221; conversation is becoming more common.</p><p><a href="https://bsky.app/profile/deno.land/post/3mm6clkq5uc22">Deno 2.8 ships this week</a> with a focus on improving the developer experience around TypeScript, ESM, and modern JavaScript features.</p><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://developer.chrome.com/blog/install-element-ot">Install web apps with the new HTML install element</a></p><p><a href="https://www.linkedin.com/pulse/prompts-advisory-structure-binding-daniel-meyer-cpxce/">Prompts are advisory. Structure is binding.</a></p><p><a href="https://jsdev.space/meet-fate-react-astro/">Building an Astro Blog While Exploring Fate</a></p><p><a href="https://grahamhelton.com/blog/ssh-cheatsheet">An Excruciatingly Detailed Guide To SSH</a></p><p><a href="https://typesetinthefuture.com/2016/02/18/futuristic/">How To Make Your Text Look Futuristic</a></p><p><a href="https://www.thenodebook.com/">MASTER THE NODE.JS INTERNALS</a></p><p><a href="https://css-tricks.com/using-nonexistent-nth-letter-selector-now/">Let&#8217;s Use the Nonexistent ::nth-letter Selector Now</a></p><p><a href="https://tanstack.com/blog/incident-followup">Hardening TanStack After the npm Compromise</a></p><p><a href="https://polypane.app/blog/using-safe-area-inset-to-build-mobile-safe-layouts/">Using safe-area-inset to build mobile-safe layouts</a></p><p><a href="https://nodejsdesignpatterns.com/blog/whats-new-in-nodejs-26/">What&#8217;s new in Node.js 26</a></p><p><a href="https://jsdev.space/react-stack-2026/">The Modern React Stack Explained for 2026</a></p><p><a href="https://blog.sentry.io/fixing-javascript-observability/">Fixing JavaScript observability, one library at a time</a></p><p><a href="https://blog.gaborkoos.com/posts/2026-05-09-Your-Recursion-Is-Lying-to-You/">Your Recursion Is Lying to You</a></p><p><a href="https://www.jasnell.me/posts/quic-part-4">HTTP/3 Over QUIC in Node.js</a></p><p><a href="https://www.rubrik.com/blog/architecture/26/2/async-react-building-non-blocking-uis-with-usetransition-and-useactionstate">Async React: Building Non-Blocking UIs with useTransition and useActionState</a></p><p><a href="https://ishadeed.com/article/css-round/">Better fluid sizing with round()</a></p><p><a href="https://jsdev.space/gpt-shortcuts-that-work/">The Truth About GPT Shortcuts and &#8220;Secret&#8221; AI Commands</a></p><p><a href="https://jvns.ca/blog/2026/05/15/moving-away-from-tailwind--and-learning-to-structure-my-css-/">Moving away from Tailwind, and learning to structure my CSS</a></p><p><a href="https://evilmartians.com/chronicles/600-million-people-write-right-to-left-2-fixes-your-app-needs">600+ million people write right-to-left: 2 fixes your app needs</a></p><p><a href="https://developer.chrome.com/blog/gap-decorations-stable?hl=en">Gap decorations: Now available in Chromium</a></p><p><a href="https://chrismorgan.info/css-themed-colours">A few ways of specifying per-theme colours in only CSS</a></p><p><a href="https://thoughtbot.com/blog/when-to-use-and-not-use-css-shorthand-properties">When to use (and not use) CSS shorthand properties</a></p><p><a href="https://jsdev.space/docker-compose-production-settings/">5 Docker Compose Settings Missing From Most Production Setups</a></p><p><a href="https://tympanus.net/codrops/2025/02/04/how-to-make-the-fluffiest-grass-with-three-js/">How to Make The Fluffiest Grass With Three.js</a></p><h2>&#9874;&#65039; Tools</h2><p>Open-source Discord alternative <a href="https://github.com/Milkshiift/GoofCord">GoofCord</a> has been released, promising a faster, cleaner, and far more customizable experience than the official client.</p><p>According to the project, GoofCord:</p><ul><li><p>runs noticeably faster than the standard Discord client, with fewer slowdowns and UI hiccups;</p></li><li><p>blocks built-in telemetry and user data collection;</p></li><li><p>supports password-encrypted conversations;</p></li><li><p>allows screen sharing at any resolution and frame rate;</p></li><li><p>lets users choose which application audio gets streamed;</p></li><li><p>automatically updates your status based on games, music, or videos;</p></li><li><p>supports Vencord, Equicord, and Shelter customization plugins out of the box;</p></li><li><p>includes global hotkeys that keep working even when the app is minimized;</p></li><li><p>supports audio streaming on Linux, while also running on Windows and macOS.</p></li></ul><p><a href="https://github.com/alternbits/awesome-cuda-books">Awesome CUDA Books</a> is a new curated list of resources for learning CUDA programming, covering everything from beginner-friendly introductions to advanced optimization techniques.</p><p>An open-source project called <a href="https://github.com/MikeVeerman/tokenspeed">tokenspeed</a> (including an <a href="https://mikeveerman.github.io/tokenspeed/?rate=30&amp;mode=code">online version</a>) has been released to make LLM token throughput easier to understand visually.</p><p>Most local LLM benchmarks report raw generation speed:</p><ul><li><p>47 tokens/sec on an M3</p></li><li><p>180 tokens/sec on an RTX 4090</p></li><li><p>500 tokens/sec on Groq</p></li></ul><p>But unless you&#8217;ve actually watched tokens stream at those speeds, those numbers can feel pretty abstract.</p><p>tokenspeed solves that problem.</p><p>It&#8217;s a terminal utility that simulates token streaming at any speed you choose, allowing you to see what different throughput numbers actually look like in practice.</p><p>Instead of reading benchmark figures in isolation, you can visually compare generation speeds and better understand the real-world difference between various hardware setups, runtimes, and inference environments.</p><p><a href="https://github.com/nodeca/pica">Pica 10.0 Brings Modern Browser Image Resizing to TypeScript and ESM</a></p><p><a href="https://github.com/counterfact/api-simulator">Counterfact</a> Turns OpenAPI Specs Into Live API Simulators</p><p>Introducing <a href="https://vercel.com/blog/introducing-deepsec-find-and-fix-vulnerabilities-in-your-code-base">deepsec</a>: The security harness for finding vulnerabilities in your codebase</p><p><a href="https://validator.w3.org/feed/">Feed validation service</a></p><p><a href="https://www.svgstudio.org/">SVG Studio</a> Brings Layer-Based SVG Animation to the Browser</p><p><a href="https://github.com/Aejkatappaja/phantom-ui">phantom-ui</a> Creates Structure-Aware Skeleton Loaders from the DOM</p><p><a href="https://cssdb.org/">cssdb</a> Tracks the Implementation Status of Modern CSS Features</p><p><a href="https://react.review/">React Review</a> Audits Pull Requests for React Anti-Patterns</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qq7P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qq7P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 424w, https://substackcdn.com/image/fetch/$s_!Qq7P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 848w, https://substackcdn.com/image/fetch/$s_!Qq7P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 1272w, https://substackcdn.com/image/fetch/$s_!Qq7P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qq7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png" width="800" height="405" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b8ee660b-2791-49f6-8107-74508817ac10_800x405.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:405,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18266,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/198675332?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Qq7P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 424w, https://substackcdn.com/image/fetch/$s_!Qq7P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 848w, https://substackcdn.com/image/fetch/$s_!Qq7P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 1272w, https://substackcdn.com/image/fetch/$s_!Qq7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb8ee660b-2791-49f6-8107-74508817ac10_800x405.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://designsurface.dev/cascade">Cascade</a> - An Icon Set Built Around CSS Concepts</p><p><a href="https://flexboxle.com/">flexboxle</a> Turns CSS Flexbox Practice Into a Daily Puzzle</p><p><a href="https://typescale.ai/">Typescale AI</a> Helps Generate Typography Systems and Design Tokens</p><p><a href="https://files.littlebird.com.au/ascii-sketch.html">ASCII Sketch</a> Brings Diagram Drawing to the World of ASCII Art</p><p><a href="https://github.com/rohitg00/agentmemory">agentmemory</a> is a persistent memory layer designed for AI coding agents, helping them retain context across sessions instead of starting from scratch every time.</p><p><a href="https://github.com/deepfence/SecretScanner">SecretScanner</a> is an open-source tool for discovering passwords, API keys, tokens, and other sensitive data hidden inside applications.</p><p>It scans Docker images and file systems to uncover secrets that may be buried in configs, binaries, or application files.</p><p><a href="https://whatmodelscanirun.com/">What Models</a>? is an open-source online tool that helps you find local AI models that can realistically run on your hardware without exhausting system resources.</p><p>Enter your PC specs &#8212; GPU, VRAM, and RAM &#8212; and the service generates a compatibility list showing suitable models, including the AI project name, quantization format, inference speed, and context window.</p><h2>&#128218; Libs</h2><p><a href="https://github.com/cporter202/API-mega-list">A repository featuring 10,000+ ready-to-use APIs</a> has been released, covering everything from automation and web scraping to AI integrations and market intelligence.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZIyL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZIyL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 424w, https://substackcdn.com/image/fetch/$s_!ZIyL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 848w, https://substackcdn.com/image/fetch/$s_!ZIyL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 1272w, https://substackcdn.com/image/fetch/$s_!ZIyL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZIyL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png" width="719" height="444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:444,&quot;width&quot;:719,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79700,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/198675332?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZIyL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 424w, https://substackcdn.com/image/fetch/$s_!ZIyL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 848w, https://substackcdn.com/image/fetch/$s_!ZIyL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 1272w, https://substackcdn.com/image/fetch/$s_!ZIyL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b399e7b-009a-4a8e-bf85-0160025474c9_719x444.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The collection includes APIs for:</p><ul><li><p><strong>automation</strong> &#8212; handling repetitive workflows, recurring tasks, and everyday operational processes;</p></li><li><p><strong>data extraction</strong> &#8212; scraping websites, parsing pages, and pulling structured information from across the web;</p></li><li><p><strong>analytics</strong> &#8212; gathering market, competitor, and business intelligence data;</p></li><li><p><strong>e-commerce</strong> &#8212; tracking products, monitoring prices, and analyzing market trends;</p></li><li><p><strong>social media</strong> &#8212; collecting posts, measuring audience engagement, and identifying emerging trends;</p></li><li><p><strong>AI integrations</strong> &#8212; connecting to language models, processing content, and generating structured outputs;</p></li><li><p><strong>job market analysis</strong> &#8212; tracking vacancies, salary trends, and new career opportunities;</p></li><li><p><strong>real estate</strong> &#8212; searching, monitoring, and analyzing property listings for personal use or investment research.</p></li></ul><p><a href="https://github.com/datawhalechina/easy-vibe">easy-vibe</a>, an open educational project for learning vibe coding, has been released.</p><ul><li><p>The course includes four levels, from beginner basics to building AI product prototypes, deployment, databases, and cross-platform development.</p></li><li><p>It covers nine domains and 80+ interactive topics with animations and visuals, ranging from computer fundamentals to advanced AI workflows.</p></li><li><p>The knowledge base evolves continuously alongside new AI models, prompting techniques, and development practices.</p></li></ul><p><a href="https://github.com/stackblitz/alien-signals">Alien Signals</a> describes itself as &#8220;the lightest signal library&#8221;, combining ideas from Vue, Preact, and Svelte into an extremely small reactive system.</p><p><a href="https://mdxeditor.dev/">MDXEditor 4.0</a> - A Rich Markdown Editor Component</p><p><a href="https://github.com/anthropics/claude-cookbooks">Claude Cookbooks</a> is a collection of notebooks and recipe-style examples demonstrating useful, creative, and sometimes unexpected ways to work with Claude.</p><p><a href="https://github.com/openclaw/clawsweeper">GitClassic</a> Offers a Lightweight Alternative to Browsing GitHub</p><h2>&#8986; Releases</h2><p><a href="https://nodejs.org/en/blog/release/v22.22.3">Node.js 22.22.3 (LTS)</a></p><p><a href="https://github.com/jestjs/jest/releases/tag/v30.4.0">Jest 30.4.0 Improves ESM, Temporal, and React 19 Support</a></p><p><a href="https://bun.com/blog/bun-v1.3.14">Bun 1.3.14 Expands Image APIs, HTTP Support, and Node Compatibility</a></p><p><a href="https://github.com/JamieMason/syncpack">Syncpack 15.0</a> has been released, bringing new features to the dependency management tool widely used in large JavaScript monorepos, including projects at Electron, Cloudflare, and Vercel.</p><p><a href="https://pnpm.io/blog/releases/11.1">pnpm 11.1</a> Introduces New Commands for Debugging, Security, and GitHub Packages</p><p><a href="https://www.thunderbird.net/en-US/thunderbird/151.0/releasenotes/">Mozilla Thunderbird 151.0 Released</a></p><p><a href="https://github.com/angular/angular/releases/tag/v22.0.0-rc.0">Angular 22 Release Candidate Lands Ahead of June Launch</a></p><p><a href="https://github.com/eslint/config-inspector">ESLint Config Inspector 3.0</a></p><p><a href="https://typeorm.io/docs/releases/1.0/release-notes/">TypeORM 1.0 Released</a></p><p><a href="https://eslint.org/blog/2026/05/eslint-v10.4.0-released/">ESLint v10.4.0 released</a></p><p><a href="https://github.com/facebook/relay/releases/tag/v21.0.0">Relay 21.0</a>, <a href="https://github.com/rolldown/rolldown/releases/tag/v1.0.1">Rolldown 1.0.1</a>, <a href="https://github.com/addyosmani/critical">Critical 8.0</a>, <a href="https://github.com/sql-formatter-org/sql-formatter">SQL Formatter 15.8</a>,<br><a href="https://github.com/shikijs/shiki">Shiki 4.1</a>, <a href="https://github.com/reduxjs/redux-toolkit/releases/tag/v2.12.0">Redux Toolkit 2.12.0</a>, <a href="https://github.com/reduxjs/react-redux/releases/tag/v9.3.0">React Redux 9.3</a>, <a href="https://x.com/nextjs/status/2052489312944759202">Next.js 16.2.6 &amp; 15.5.18 Security Releases</a>,<br><a href="https://pixijs.com/blog/8.17.0">PixiJS 8.17</a>, <a href="https://github.com/ant-design/ant-design/releases/tag/6.4.0">Ant Design 6.4.0</a>, <a href="https://github.com/yudielcurbelo/react-qr-scanner">react-qr-scanner 2.6</a>, <a href="https://styled-components.com/docs/v7">styled-components v7</a>, <a href="https://storybook.js.org/blog/storybook-10-4/">Storybook 10.4</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=6moPS3AAbe4">Why React Developers Are Leaving Next.js for TanStack</a></p><p><a href="https://www.youtube.com/watch?v=jcBzuuZvLCE">Learn Tanstack Start in 30 Minutes</a></p><p><a href="https://www.youtube.com/watch?v=VWlEt4WKpYI">Why React Native is Still King in 2026</a></p><p><a href="https://www.youtube.com/watch?v=SaHHgzoXceU">It was more fun before AI</a></p><p><a href="https://www.youtube.com/watch?v=5ziHGrlbdOA">The Most Popular Claude Code Skills (And What They&#8217;re Missing)</a></p><p><a href="https://www.youtube.com/watch?v=NzpcuP2RAdQ">Is Software Engineering Dead?</a></p><p><a href="https://www.youtube.com/watch?v=uJEEGBDJjQo">The Future of SEO: Building AI-Ready Sites with Astro &amp; AEO</a></p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>The End of an Era: Iconic Ask.com Domain Hits the Auction Block</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HPY_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HPY_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 424w, https://substackcdn.com/image/fetch/$s_!HPY_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 848w, https://substackcdn.com/image/fetch/$s_!HPY_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 1272w, https://substackcdn.com/image/fetch/$s_!HPY_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HPY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png" width="720" height="404" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:404,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54659,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/198675332?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HPY_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 424w, https://substackcdn.com/image/fetch/$s_!HPY_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 848w, https://substackcdn.com/image/fetch/$s_!HPY_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 1272w, https://substackcdn.com/image/fetch/$s_!HPY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F041ed522-8d84-425b-9469-1835eb9c89eb_720x404.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The digital landscape is losing another piece of its foundation. Ask.com, one of the web&#8217;s original search heavyweights, has officially put its domain name up for sale.</p><p>According to reports from <a href="https://domainincite.com/31709-ask-com-hits-the-market-as-jeeves-breathes-his-last">Domain Incite</a>, the high-stakes sale is being spearheaded by domain brokers Andrew Miller (ATM Holdings) and Larry Fisher (LPL Financial). Miller didn&#8217;t mince words about the magnitude of the listing, calling it &#8220;one of the most valuable domain assets to ever hit the market.&#8221;</p><h3>Creator of C++ Criticizes Vibe Coding</h3><div id="youtube2-WQABdV2p2fA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;WQABdV2p2fA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/WQABdV2p2fA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Bjarne Stroustrup, the creator of C++, delivered a sharp critique of vibe coding in a recent interview. His argument: AI-generated code may look convincing in demos, but in real systems it often creates bugs, bloated codebases, security issues, and maintenance problems. The burden usually lands on senior engineers, who end up reviewing, debugging, and rewriting prompt-generated code instead of moving faster.</p><h3>Large GitHub Security Incident: Malicious VS Code Extension Linked to 3,800 Repository Breach</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pn8m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pn8m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 424w, https://substackcdn.com/image/fetch/$s_!Pn8m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 848w, https://substackcdn.com/image/fetch/$s_!Pn8m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 1272w, https://substackcdn.com/image/fetch/$s_!Pn8m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pn8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png" width="767" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae43facd-d1bb-4053-9995-cdd141f62324_767x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:767,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65169,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/198675332?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pn8m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 424w, https://substackcdn.com/image/fetch/$s_!Pn8m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 848w, https://substackcdn.com/image/fetch/$s_!Pn8m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 1272w, https://substackcdn.com/image/fetch/$s_!Pn8m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae43facd-d1bb-4053-9995-cdd141f62324_767x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A major security incident has hit GitHub, and the company has <a href="https://x.com/github/status/2056949168208552080?s=46">already confirmed that</a> an unauthorized compromise took place.</p><p>According to preliminary findings, attackers gained access to at least 3,800 repositories. GitHub is still investigating the full scope of the breach and determining what systems, credentials, or internal data may have been affected.</p><p>The incident reportedly originated from a compromised VS Code extension. The malicious extension infected a GitHub employee&#8217;s machine, giving attackers a foothold that eventually led to access inside GitHub&#8217;s internal environment.</p><p>The investigation is ongoing, and the company continues to assess the scale of the impact. The case is another reminder that development tooling and third-party extensions can become critical attack vectors, especially inside large engineering organizations.</p><p><a href="https://openai.com/index/model-disproves-discrete-geometry-conjecture/">An OpenAI model has disproved a central conjecture in discrete geometry</a></p><div><hr></div><p>That wraps up <strong>Friday Links #38</strong>.</p><p>The JavaScript ecosystem continues to move fast &#8212; new runtimes, framework releases, AI developer tooling, and experiments seem to arrive every week. We filter the noise and surface the updates, launches, and discussions that matter most to modern web developers.</p><p>If you discovered something useful, consider sharing this edition with your team, friends, or fellow developers. See you in the next roundup.</p>]]></content:encoded></item><item><title><![CDATA[Building a Fully Local AI Workspace Inside VS Code]]></title><description><![CDATA[A practical guide to running local AI models inside VS Code using LM Studio, Cline, and offline coding workflows]]></description><link>https://jsdevspace.substack.com/p/building-a-fully-local-ai-workspace</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/building-a-fully-local-ai-workspace</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Tue, 12 May 2026 18:41:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yIyK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yIyK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yIyK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yIyK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yIyK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yIyK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yIyK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1562614,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/197382504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yIyK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!yIyK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!yIyK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!yIyK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F066ac251-7b27-45b9-b09a-d43099da0e9a_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>AI-assisted development is rapidly shifting from cloud-only workflows to local-first environments.</p><p>Instead of relying entirely on external services, developers can now run powerful language models directly on their own machines and integrate them into their editor, terminal, and everyday workflow.</p><p>This approach offers several advantages:</p><ul><li><p>private local inference</p></li><li><p>offline development</p></li><li><p>zero API costs</p></li><li><p>customizable tooling</p></li><li><p>faster experimentation</p></li><li><p>complete environment control</p></li></ul><p>In this guide, we will build a fully local AI development setup using:</p><ul><li><p><a href="https://code.visualstudio.com/">Visual Studio Code</a></p></li><li><p><a href="https://lmstudio.ai/">LM Studio</a></p></li><li><p><a href="https://nodejs.org/en">Node.js</a></p></li><li><p><a href="https://cline.bot/">Cline</a></p></li></ul><div><hr></div><h1>Why Developers Are Moving Toward Local AI</h1><p>Cloud-based coding assistants are convenient, but they also introduce limitations that become more noticeable over time.</p><p>Common problems include:</p><ul><li><p>subscription pricing</p></li><li><p>privacy concerns</p></li><li><p>internet dependency</p></li><li><p>API rate limits</p></li><li><p>slow responses during peak usage</p></li><li><p>lack of control over models and infrastructure</p></li></ul><p>Local AI environments solve many of these issues.</p><p>Instead of sending requests to external servers, everything runs directly on the developer&#8217;s machine. That means projects remain private, inference works offline, and the environment becomes fully customizable.</p><p>Of course, there is a tradeoff.</p><p>Local language models require significantly more hardware resources than traditional developer tools.</p><div><hr></div><h1>Hardware Requirements Matter More Than Most People Expect</h1><p>Running local models is heavily dependent on system performance.</p><p>A weak machine may technically load a model, but the actual experience can become frustrating very quickly. Response generation slows down, inference becomes inconsistent, and larger projects become difficult to work with.</p><p>Mid-range systems usually provide a much more comfortable experience, especially for small and medium-sized projects.</p><p>The most important hardware components are:</p><ul><li><p>GPU memory</p></li><li><p>RAM</p></li><li><p>SSD speed</p></li><li><p>CPU performance</p></li></ul><p>Operating system optimization also plays a surprisingly large role. Different Windows builds can noticeably affect model performance and inference speed.</p><div><hr></div><h1>Skipping the Obvious Setup</h1><p>Most JavaScript developers already have:</p><ul><li><p>Visual Studio Code</p></li><li><p>Node.js</p></li><li><p>npm</p></li><li><p>terminal tooling</p></li></ul><p>installed and configured.</p><p>Because of that, there is no reason to spend half the article installing VS Code and Node.js from scratch.</p><p>Instead, it makes more sense to jump directly into the interesting part: building a fully local AI workflow with LM Studio.</p><div><hr></div><h1>Installing LM Studio</h1><p>The next step is installing LM Studio.</p><p>Download:</p><p><a href="https://lmstudio.ai">LM Studio</a></p><p>LM Studio acts as the foundation of the entire local AI workflow.</p><p>It provides:</p><ul><li><p>local model downloads</p></li><li><p>GPU acceleration</p></li><li><p>model management</p></li><li><p>chat interfaces</p></li><li><p>OpenAI-compatible APIs</p></li><li><p>inference servers</p></li></ul><p>During installation, it is usually better to:</p><ul><li><p>skip automatic model downloads</p></li><li><p>disable auto-start services</p></li><li><p>configure a custom models directory</p></li></ul><p>Large models can consume hundreds of gigabytes over time, so storing them on a secondary drive is often the better option.</p><p>Example:</p><pre><code><code>D:\models</code> </code></pre><div><hr></div><h1>Choosing a Local Model</h1><p>After installing LM Studio, the next step is downloading a model.</p><p>At the moment, LM Studio itself recommends the:</p><pre><code><code>google/gemma-4-e4b</code></code></pre><p>model by default. </p><p>And honestly, for most developers, this is currently a pretty solid starting point.</p><p>Gemma 4 E4B is part of Google DeepMind&#8217;s newer Gemma 4 family and is designed specifically for efficient local inference on consumer hardware. The model supports:</p><ul><li><p>reasoning</p></li><li><p>coding tasks</p></li><li><p>tool calling</p></li><li><p>multimodal workflows</p></li><li><p>long context windows</p></li></ul><p>while remaining relatively lightweight compared to larger models. </p><p>This is exactly why LM Studio currently pushes it as the default recommendation.</p><p>For laptops and mid-range desktop machines, E4B is usually much easier to run than massive 26B or 31B models while still delivering surprisingly good coding performance. </p><p>That said, the local AI ecosystem changes ridiculously fast.</p><p>A model that is considered &#8220;the best default&#8221; today may be outdated in a few months. New open-source models appear constantly, and performance improvements happen almost weekly.</p><p>Because of that, developers should absolutely spend time researching newer models later instead of treating the default LM Studio recommendation as permanent.</p><p>Right now, though, Gemma 4 E4B is a very reasonable place to start.</p><div><hr></div><h1>Configuring Virtual Memory</h1><p>Systems with limited RAM may run into memory allocation issues when loading larger models.</p><p>Windows virtual memory can help stabilize the environment.</p><p>Open:</p><pre><code><code>System Properties &#8594; Performance &#8594; Advanced</code></code></pre><p>Then configure virtual memory as:</p><pre><code><code>System managed size</code></code></pre><p>for all drives.</p><p>After applying the changes, Windows will usually require a restart.</p><p>This simple adjustment can significantly improve stability on weaker systems.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OJ-b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OJ-b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 424w, https://substackcdn.com/image/fetch/$s_!OJ-b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 848w, https://substackcdn.com/image/fetch/$s_!OJ-b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 1272w, https://substackcdn.com/image/fetch/$s_!OJ-b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OJ-b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png" width="1538" height="937" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:937,&quot;width&quot;:1538,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:222923,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/197382504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f8a7cf8-ef20-4680-a96f-af53e103039e_1538x937.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OJ-b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 424w, https://substackcdn.com/image/fetch/$s_!OJ-b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 848w, https://substackcdn.com/image/fetch/$s_!OJ-b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 1272w, https://substackcdn.com/image/fetch/$s_!OJ-b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfa368e3-42ee-4c47-bf2e-5cd9109b5709_1538x937.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h1>Understanding Context Length</h1><p>One setting that many developers overlook is context length.</p><p>Modern coding workflows benefit heavily from large context windows because AI models need to understand multiple files simultaneously.</p><p>A common configuration is:</p><pre><code><code>32768</code></code></pre><p>tokens.</p><p>Larger context windows help models:</p><ul><li><p>preserve conversation history</p></li><li><p>analyze larger codebases</p></li><li><p>understand project structure</p></li><li><p>generate more coherent edits</p></li></ul><p>For AI-assisted development, context size often matters just as much as model size. </p><div><hr></div><h1>Testing the Model Before Integration</h1><p>Before connecting the model to external tools, it is a good idea to verify that everything works correctly inside LM Studio itself.</p><p>A simple prompt is enough:</p><pre><code><code>What are tokens in language models?</code></code></pre><p>If the model responds normally, the inference pipeline is working correctly.</p><p>At this stage, developers can also estimate generation speed and determine whether the hardware configuration feels comfortable enough for daily work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BZz5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BZz5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 424w, https://substackcdn.com/image/fetch/$s_!BZz5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 848w, https://substackcdn.com/image/fetch/$s_!BZz5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 1272w, https://substackcdn.com/image/fetch/$s_!BZz5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BZz5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png" width="1456" height="916" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:916,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:136568,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/197382504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BZz5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 424w, https://substackcdn.com/image/fetch/$s_!BZz5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 848w, https://substackcdn.com/image/fetch/$s_!BZz5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 1272w, https://substackcdn.com/image/fetch/$s_!BZz5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fe0cb91-80ed-44b4-8c94-72b5e5639719_1481x932.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h1>Turning LM Studio into a Local API Server</h1><p>One of LM Studio&#8217;s most useful features is its OpenAI-compatible API server.</p><p>Inside the Developer section:</p><ol><li><p>Load the model</p></li><li><p>Verify context settings</p></li><li><p>Enable CORS</p></li><li><p>Start the local server</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1KF2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1KF2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 424w, https://substackcdn.com/image/fetch/$s_!1KF2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 848w, https://substackcdn.com/image/fetch/$s_!1KF2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 1272w, https://substackcdn.com/image/fetch/$s_!1KF2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1KF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:200253,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/197382504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1KF2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 424w, https://substackcdn.com/image/fetch/$s_!1KF2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 848w, https://substackcdn.com/image/fetch/$s_!1KF2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 1272w, https://substackcdn.com/image/fetch/$s_!1KF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdab66093-6cb2-4f72-9469-451efa5d9255_1492x932.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once enabled, external applications can communicate with the local model exactly like they would with a cloud AI provider.</p><p>This transforms the machine into a fully local AI backend. </p><div><hr></div><h1>Installing the Cline Extension</h1><p>Now it is time to integrate AI directly into the editor.</p><p>Inside VS Code Extensions, search for:</p><pre><code><code>Cline</code></code></pre><p>Install the extension and grant workspace trust permissions.</p><p>Unlike traditional autocomplete plugins, Cline behaves more like an autonomous development agent.</p><p>It can:</p><ul><li><p>execute terminal commands</p></li><li><p>create files</p></li><li><p>refactor projects</p></li><li><p>install dependencies</p></li><li><p>update configuration files</p></li><li><p>explain errors</p></li></ul><p>This makes the workflow feel very different from traditional autocomplete systems.</p><div><hr></div><h1>Connecting Cline to LM Studio</h1><p>Inside Cline settings:</p><p>Choose:</p><pre><code><code>OpenAI Compatible</code></code></pre><p>Then configure the local endpoint:</p><pre><code><code>http://127.0.0.1:1234/v1</code></code></pre><p>The <code>/v1</code> suffix is important because LM Studio exposes an OpenAI-style REST API.</p><p>The API key field can contain any placeholder value since everything runs locally.</p><p>Finally, copy the model identifier directly from LM Studio and paste it into the model configuration field. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hlHC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hlHC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 424w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 848w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 1272w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hlHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png" width="1456" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:164558,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/197382504?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hlHC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 424w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 848w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 1272w, https://substackcdn.com/image/fetch/$s_!hlHC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F558484e9-fcb3-47b7-81cf-e4ecd4b6a45a_1806x895.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once connected, VS Code gains direct access to locally running AI models.</p><div><hr></div><h1>Working with AI Coding Agents</h1><p>AI coding agents work differently from traditional assistants.</p><p>Instead of only suggesting snippets, they can actively interact with the project itself.</p><p>For example, an agent can:</p><ul><li><p>initialize projects</p></li><li><p>install dependencies</p></li><li><p>generate files</p></li><li><p>modify configuration</p></li><li><p>launch development servers</p></li><li><p>refactor existing code</p></li></ul><p>The most interesting part is transparency.</p><p>Every command, file change, and generated edit remains visible to the developer.</p><p>This makes it much easier to supervise the workflow and intervene when necessary.</p><div><hr></div><h1>AI Agents Still Require Supervision</h1><p>Even powerful models make mistakes.</p><p>Incorrect assumptions, outdated configurations, and broken project structures still happen regularly.</p><p>Sometimes the AI fixes its own mistakes automatically. Other times, manual intervention becomes necessary.</p><p>This is why modern AI workflows work best when developers treat the model as a collaborator rather than a replacement.</p><p>The quality of results depends heavily on:</p><ul><li><p>prompt quality</p></li><li><p>project constraints</p></li><li><p>developer supervision</p></li><li><p>iterative refinement</p></li></ul><p>Developers who expect perfect output from a single prompt usually end up disappointed.</p><div><hr></div><h1>Better Prompts Produce Better Results</h1><p>One of the biggest differences between mediocre AI workflows and excellent ones is instruction quality.</p><p>Specific prompts dramatically improve reliability.</p><p>For example, instead of writing:</p><pre><code><code>Migrate styles to Tailwind</code></code></pre><p>it is much better to write:</p><pre><code><code>Migrate all styles to Tailwind CSS v4
and remove old CSS files.</code></code></pre><p>Version numbers matter.</p><p>Explicit constraints matter.</p><p>Clear expectations matter.</p><p>The more structured the prompt becomes, the more predictable the output becomes.</p><div><hr></div><h1>Local AI Works Best for Repetitive Development Tasks</h1><p>AI coding tools are especially effective for:</p><ul><li><p>scaffolding</p></li><li><p>repetitive refactoring</p></li><li><p>style migrations</p></li><li><p>configuration generation</p></li><li><p>boilerplate creation</p></li><li><p>documentation</p></li><li><p>debugging assistance</p></li></ul><p>These systems are not replacing software engineers.</p><p>They are reducing friction.</p><p>For solo developers and small teams, this can dramatically accelerate everyday development work.</p><div><hr></div><h1>Final Thoughts</h1><p>Local AI development has evolved from an experimental niche into a genuinely practical workflow.</p><p>With tools like:</p><ul><li><p>LM Studio</p></li><li><p>Cline</p></li><li><p>Visual Studio Code</p></li></ul><p>developers can build fully private AI-powered workspaces directly on their own machines.</p><p>The ecosystem is still evolving rapidly, and local models still lag behind the most advanced cloud systems in some areas. But the gap is shrinking much faster than many people expected.</p><p>For developers willing to experiment, local AI already offers a surprisingly capable and highly flexible development experience.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #37 — Dev Tools, AI & JS Updates]]></title><description><![CDATA[Key releases, performance wins, and tooling shaping modern JavaScript.]]></description><link>https://jsdevspace.substack.com/p/friday-links-37-dev-tools-ai-and</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-37-dev-tools-ai-and</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 01 May 2026 14:44:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fkWI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fkWI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fkWI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 424w, https://substackcdn.com/image/fetch/$s_!fkWI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 848w, https://substackcdn.com/image/fetch/$s_!fkWI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 1272w, https://substackcdn.com/image/fetch/$s_!fkWI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fkWI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png" width="800" height="446" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:446,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:176243,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/196120009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fkWI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 424w, https://substackcdn.com/image/fetch/$s_!fkWI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 848w, https://substackcdn.com/image/fetch/$s_!fkWI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 1272w, https://substackcdn.com/image/fetch/$s_!fkWI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e90a122-a639-4e20-a7eb-695c11865f73_800x446.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>JavaScript keeps moving fast, but not all updates are worth your time. Friday Links #37 focuses on the releases, tools, and ideas that actually matter&#8212;from performance improvements in runtimes and libraries to new developer workflows powered by AI. This issue highlights what&#8217;s changing across the ecosystem and why it matters for real-world projects.</p><div><hr></div><h2>&#129504; Language &amp; Runtime Updates</h2><p><strong>Node.js 26 (Current) &#8212; almost here</strong> The upcoming release of Node.js 26 is expected to ship with V8 14.6 and enable the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal">Temporal API</a> by default&#8212;a major step toward handling dates natively without relying on third-party libraries.</p><p><strong>JavaScript (ES2025 &#8594; ES2026)</strong> The language continues evolving toward ES2026, with ongoing improvements to the standard library and deeper integration with AI-driven tooling and workflows.</p><p><a href="https://deno.com/blog/fresh-2.3">&#127819; Fresh 2.3</a> &#8212; the Deno-native full-stack framework &#8212; introduces first-class WebSocket support, eliminates unnecessary JavaScript for pages that don&#8217;t need it, and makes the View Transitions API effortless with a single attribute in your views.</p><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://piccalil.li/blog/the-end-of-responsive-images/">The end of responsive images</a></p><p><code>&lt;dialog&gt;</code><a href="https://web.dev/articles/baseline-in-action-dialog-popover"> and popover: Baseline layered UI patterns</a></p><p><a href="https://www.joshwcomeau.com/animation/scroll-driven-animations/">Scroll-Driven Animations</a></p><p><a href="https://www.debugbear.com/blog/lazy-loading-performance">How to Use Lazy Loading Without Hurting Web Performance</a></p><p><a href="https://nik.digital/posts/compositing-blending">Compositing &amp; Blending</a></p><p><a href="https://css-tricks.com/css-multi-column-layout-wrapping-features/">Looking at New CSS Multi-Column Layout Wrapping Features</a></p><p><a href="https://css-tricks.com/recreating-apples-vision-pro-animation-in-css/">Recreating Apple&#8217;s Vision Pro Animation in CSS</a></p><p><a href="https://frontendmasters.com/blog/constructable-stylesheets-and-adoptedstylesheets-one-parse-every-shadow-root/">Constructable Stylesheets and adoptedStyleSheets: One Parse, Every Shadow Root</a></p><p><a href="https://nerdy.dev/CSS-recently-in-all-browsers">CSS Recently In All Browsers</a></p><p><a href="https://www.smashingmagazine.com/2026/04/session-timeouts-accessibility-barrier-authentication-design/">Session Timeouts: The Overlooked Accessibility Barrier In Authentication Design</a></p><p><a href="https://saschb2b.com/blog/react-compiler-year-in-review">The React Compiler at Eighteen Months: The Arc, the Debates, and What&#8217;s Next</a></p><p><a href="https://shadcnstudio.com/blog/migrate-from-radix-ui-to-base-ui">Migrating from Radix UI to Base UI: Step-by-Step Guide</a></p><p><a href="https://csswizardry.com/2026/04/font-family-doesnt-fall-back-the-way-you-think/">font-family Doesn&#8217;t Fall Back the Way You Think</a></p><p><a href="https://blog.isquaredsoftware.com/presentations/2026-04-react-compiler-rendering/">A Guide to React Compiler Rendering</a></p><h2>&#9874;&#65039; Tools</h2><p><strong>TypeScript 7.0 Beta &#8212; gaining traction</strong></p><p><a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/">TypeScript 7</a> is generating significant discussion. It introduces a native compiler written in Go, promising substantial performance gains and a redesigned architecture for large-scale projects.</p><p>TypeScript 6 &#8212; a transitional release TypeScript 6.0 acts as a bridge toward TS 7, bringing:</p><p>Deprecation of legacy APIs Updated DOM typings Adoption of modern <code>import attributes</code> (<code>with</code>)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dba1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dba1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 424w, https://substackcdn.com/image/fetch/$s_!Dba1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 848w, https://substackcdn.com/image/fetch/$s_!Dba1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 1272w, https://substackcdn.com/image/fetch/$s_!Dba1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dba1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png" width="800" height="444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:444,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44016,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/196120009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dba1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 424w, https://substackcdn.com/image/fetch/$s_!Dba1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 848w, https://substackcdn.com/image/fetch/$s_!Dba1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 1272w, https://substackcdn.com/image/fetch/$s_!Dba1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F162b80a1-867b-4f1e-abb9-7b784f32a674_800x444.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://www.perryts.com/">Perry</a> is a cross-platform TypeScript compiler that compiles code directly into native executables, offering an alternative to traditional JavaScript runtimes.</p><p><a href="https://openwarp.zerx.dev/en/">OpenWarp</a> - Bring any AI model into your terminal</p><p><a href="https://github.com/GoogleChromeLabs/view-transitions-mock">View Transitions Mock</a> &#8212; a non-visual polyfill for the View Transitions API &#8212; provides a JavaScript implementation of same-document transitions without the visual layer. You can write a single code path for all browsers: supported ones render transitions, while others fall back to a DOM swap, with the same promises and API behavior.</p><p><a href="https://github.com/google-labs-code/design.md">DESIGN.md</a> is a proposed format for describing a product&#8217;s visual identity&#8212;colors, typography, spacing, and UI rules&#8212;in a structured, machine-readable way. It&#8217;s designed for AI agents and tooling, enabling them to generate consistent interfaces, designs, or code based on a single source of truth.</p><p><a href="https://github.com/open-circle/formisch">Formisch</a> &#8212; a schema-based, headless form library for JavaScript frameworks that handles form state and validation. It&#8217;s type-safe, fast by default, and keeps bundle size small thanks to its modular design.</p><p><a href="https://franktisellano.github.io/datatype/">Datatype</a> is a variable font that turns text into charts, providing a unique way to visualize data.</p><p><a href="https://github.com/0xGF/boneyard">Boneyard</a> &#8212; generates pixel-perfect skeleton loading screens directly from your real UI, with no manual measurements or placeholder tuning.</p><p>Works across frameworks including React, Preact, Vue, Svelte 5, Angular, and React Native.</p><p><a href="https://github.com/isaac-mason/crashcat">crashcat</a> &#8212; a JavaScript physics engine built for games, simulations, and creative web projects. It includes rigid body simulation, support for multiple shape types, continuous collision detection, and more for building dynamic, interactive experiences.</p><p><a href="https://github.com/harshankur/officeParser">officeParser</a> &#8212; a robust, strictly typed library for Node.js and the browser that parses office documents into a clean, hierarchical AST. It preserves rich metadata, text formatting, and supports embedded attachments.</p><p><a href="https://github.com/maximhq/bifrost">Bifrost</a> &#8212; a high-performance AI gateway that unifies access to 15+ providers (including OpenAI, Anthropic, Amazon Web Services, and Google) through a single OpenAI-compatible API.</p><h2>&#128218; Libs</h2><p><a href="https://github.com/vercel-labs/portless">Portless</a> lets you replace port-based URLs with clean, stable local domains&#8212;so instead of <code>http://localhost:3000</code>, you can use something like <code>https://myapp.localhost</code>. It&#8217;s built on Node.js and now adds new features for Tailscale users.</p><p><a href="https://github.com/russellromney/honker">Honker</a> brings PostgreSQL-style NOTIFY/LISTEN semantics to SQLite&#8212;no daemon required. The honker-node package adds support for Node.js, making it easy to integrate event-driven messaging into your apps.</p><p><a href="https://github.com/Secreto31126/whatsapp-api-js">whatsapp-api-js</a> &#8212; a lightweight, dependency-free library for interacting with the WhatsApp Cloud API, built for efficiency and full TypeScript support.</p><h2>&#8986; Releases</h2><p><a href="https://pnpm.io/blog/releases/11.0">pnpm 11.0 Released</a></p><p><a href="https://github.com/avajs/ava/releases/tag/v8.0.0">AVA 8.0</a> &#8212; the popular Node.js test runner is now fully ESM and introduces two new test modifiers: <code>test.skipIf()</code> and <code>test.runIf()</code>.</p><p><a href="https://github.com/metafloor/bwip-js">BWIP-JS 4.10</a> &#8212; a pure JavaScript port of the original Barcode Writer in Pure PostScript, designed to run in any modern browser or JavaScript-based server environment.</p><p>It supports 100+ barcode formats, including both linear and 2D standards. Barcodes can be generated as PNG images (Node.js, React Native), rendered to a canvas (browser), or exported as SVG across all platforms.</p><p><a href="https://github.com/honojs/node-server/releases/tag/v2.0.0">Hono Node.js Adapter 2.0</a> &#8212; the latest version delivers up to 2.3&#215; higher throughput compared to v1, based on body-parsing benchmarks from bun-http-framework-benchmark. Other scenarios like Ping and Query also see smaller, but noticeable, performance gains.</p><p><a href="https://github.com/patrickjuchli/basic-ftp">basic-ftp 6.0</a> &#8212; a modern FTP client for Node.js with support for FTPS over TLS, passive mode over IPv6, async/await APIs, and built-in TypeScript types.</p><p><a href="https://github.com/Automattic/mongoose/releases/tag/9.6.0">Mongoose 9.6</a> &#8212; the popular object data modeling (ODM) library for MongoDB, widely used with Node.js to structure and manage application data.</p><p><a href="https://github.com/vinejs/vine">Vine 4.4</a> &#8212; a fast form data validation library for Node.js, designed for performance and clean schema-based validation.</p><p><a href="https://github.com/react-hook-form/react-hook-form/releases/tag/v7.74.0">React Hook Form 7.74</a> &#8212; introduces setValues, a new API for updating multiple form fields at once, making bulk state updates simpler and more efficient.</p><p><a href="https://github.com/ReactTooltip/react-tooltip/releases/tag/v6.0.0">React Tooltip 6.0</a> &#8212; adds portalRoot and autoClose props, introduces support for React 19, and removes the legacy HTML string API.</p><p><a href="https://github.com/shadcn-ui/ui/releases/tag/shadcn%404.5.0">shadcn CLI 4.5</a> &#8212; introduces a new <code>--pointer</code> flag that re-enables <code>cursor: pointer</code> on buttons.</p><p><a href="https://github.com/chakra-ui/chakra-ui/releases/tag/%40chakra-ui%2Freact%403.35.0">Chakra UI 3.35</a> &#8212; a multi-package release covering React, charts, CLI, panda-presets, and codemods. It introduces a new Splitter component, adds support for React 19, and includes new CLI commands for generating docs and props.</p><p><a href="https://github.com/TanStack/query/releases/tag/release-2026-04-23-1319">TanStack Query 5.100</a> &#8212; adds a new <code>retryOnMount</code> callback for finer control over retries, along with internal cleanup of Svelte test infrastructure.</p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=JHkarhWMTII">Why Rust is Replacing JavaScript for Full Stack Web Apps in 2026</a></p><p><a href="https://www.youtube.com/watch?v=pekbl3Yz02g">GitHub is facing HUGE problems!</a></p><p><a href="https://www.youtube.com/watch?v=d53Zk28esmU">GitHub is having some major issues right now&#8230;</a></p><p><a href="https://www.youtube.com/watch?v=XLtuSy1opW4">This Coding Tool Kills AI Code Slop</a></p><p><a href="https://www.youtube.com/watch?v=TKal4pZHr0U">End of Vibe Coding? Github Copilot Changes</a></p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>C:/Deb &#8212; A Linux-Based OS with a Windows-Like Environment</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bakK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bakK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 424w, https://substackcdn.com/image/fetch/$s_!bakK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 848w, https://substackcdn.com/image/fetch/$s_!bakK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 1272w, https://substackcdn.com/image/fetch/$s_!bakK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bakK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png" width="799" height="530" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:530,&quot;width&quot;:799,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37053,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/196120009?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bakK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 424w, https://substackcdn.com/image/fetch/$s_!bakK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 848w, https://substackcdn.com/image/fetch/$s_!bakK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 1272w, https://substackcdn.com/image/fetch/$s_!bakK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe84376eb-f241-4cc7-b0c6-e6ed56a86a73_799x530.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A new project called <a href="https://github.com/cusdeb-com/os">C:/Deb</a> introduces a working prototype of a Win32/Linux system built on Debian 13. It delivers a Windows-like experience using Wine and components from ReactOS, running on the Linux kernel, with a UI styled after Windows 95/98.</p><p><a href="https://github.com/cusdeb-com/os/releases/tag/main-197d599">Test images</a> are available for QEMU and VirtualBox, along with build scripts. The project follows earlier experiments like Loss32, while ongoing ReactOS progress has improved compatibility with legacy Windows drivers (Intel, NVIDIA, AMD).</p><div><hr></div><p>That&#8217;s it for this week&#8217;s roundup. Try a few of these tools, keep an eye on the trends, and don&#8217;t just read&#8212;experiment. The JavaScript ecosystem rewards builders who stay curious and adapt quickly. More updates, releases, and insights are coming next week.</p>]]></content:encoded></item><item><title><![CDATA[Blob Objects in JavaScript: A Practical Guide to Files, Previews, Downloads, and Memory]]></title><description><![CDATA[A deep, real-world walkthrough of Blob APIs for frontend developers who need to handle files efficiently without destroying performance.]]></description><link>https://jsdevspace.substack.com/p/blob-objects-in-javascript-a-practical</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/blob-objects-in-javascript-a-practical</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 20 Mar 2026 13:50:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!f6ON!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f6ON!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f6ON!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 424w, https://substackcdn.com/image/fetch/$s_!f6ON!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 848w, https://substackcdn.com/image/fetch/$s_!f6ON!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 1272w, https://substackcdn.com/image/fetch/$s_!f6ON!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f6ON!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png" width="1151" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1151,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1250522,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/191582872?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f6ON!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 424w, https://substackcdn.com/image/fetch/$s_!f6ON!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 848w, https://substackcdn.com/image/fetch/$s_!f6ON!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 1272w, https://substackcdn.com/image/fetch/$s_!f6ON!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4d51cc2-8f73-4569-8156-90bb768b2fc0_1151x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Frontend developers spend a lot of time thinking about UI, state, routing, and performance. But there is one area that quietly causes a surprising number of real-world problems: <strong>file handling</strong>.</p><p>It usually starts innocently.</p><p>You add image uploads. Then someone wants drag-and-drop PDF previews. Then product asks for CSV export. Then users upload 200MB videos from low-end mobile devices. Suddenly the browser starts freezing, memory climbs, tabs crash, and your &#8220;simple file feature&#8221; becomes one of the most fragile parts of the application.</p><p>This is exactly where <strong>Blob objects</strong> become useful.</p><p>Blob is one of those browser APIs that many developers have seen, but not everyone has really learned to use properly. It often appears in quick snippets for downloads or image previews, but its actual role in file-heavy applications is much bigger. Blob sits at the center of modern client-side file workflows: generating files, slicing large files, converting formats, previewing content, and controlling memory more carefully than naive string-based approaches.</p><p>In this article, we&#8217;ll take a practical approach to Blob objects. No abstract theory for the sake of theory. Just real use cases, better patterns, and production-friendly code.</p><p>We&#8217;ll cover:</p><ul><li><p>what Blob actually is</p></li><li><p>why it&#8217;s better than huge strings or data URLs in many cases</p></li><li><p>how to generate files efficiently</p></li><li><p>how to split large files into chunks</p></li><li><p>how to build image compression pipelines</p></li><li><p>how to preview files in the browser</p></li><li><p>how to export data safely</p></li><li><p>how to avoid memory leaks caused by object URLs</p></li></ul><p>If you work on dashboards, admin panels, editors, media tools, or upload-heavy products, this API deserves a place in your toolkit.</p><div><hr></div><h2>What a Blob Actually Is</h2><p>A Blob is short for <strong>Binary Large Object</strong>. In browser terms, it represents raw immutable data that can be treated like a file, even if it didn&#8217;t come from the filesystem.</p><p>That last part matters.</p><p>A Blob can come from:</p><ul><li><p>plain text</p></li><li><p>JSON</p></li><li><p>canvas output</p></li><li><p>image transformations</p></li><li><p>sliced file chunks</p></li><li><p>fetched binary content</p></li><li><p>generated CSV or HTML</p></li></ul><p>You can think of a Blob as a browser-friendly wrapper around file-like data. It lets you package content with a MIME type and pass it into APIs that expect binary or file-based input.</p><p>Here&#8217;s a very simple example:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;dc8baecc-21db-4e04-8ff0-45e0ac866d74&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const reportPayload = new Blob(
  [&#8217;Hello from a generated file&#8217;],
  { type: &#8216;text/plain&#8217; }
)</code></pre></div><p>That Blob can now be:</p><ul><li><p>downloaded</p></li><li><p>previewed</p></li><li><p>uploaded</p></li><li><p>passed into <code>URL.createObjectURL</code></p></li><li><p>wrapped in a <code>File</code></p></li><li><p>read as text, bytes, or streams in modern APIs</p></li></ul><p>This is much more efficient and flexible than stuffing everything into long strings and hoping the browser handles it well.</p><h2>Why Developers Run Into Trouble Without Blob</h2><p>A common beginner approach to file generation looks like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;b2304d1f-d2d2-4b04-87ad-76f66446396b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const hugeText = &#8216;row,data\\n&#8217;.repeat(200000)
const downloadHref = &#8216;data:text/plain;charset=utf-8,&#8217; + encodeURIComponent(hugeText)</code></pre></div><p>This works for small examples. It becomes painful for larger payloads.</p><p>Why?</p><p>Because:</p><ul><li><p>the string itself already consumes memory</p></li><li><p><code>encodeURIComponent</code> creates more work and more memory pressure</p></li><li><p>the resulting URL can become extremely large</p></li><li><p>browsers may struggle or fail with very long data URLs</p></li></ul><p>Blob is usually the cleaner and safer choice.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;c0b262da-d643-4246-bc2d-30e6856d8b6d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const hugeText = &#8216;row,data\\n&#8217;.repeat(200000)

const exportBlob = new Blob([hugeText], {
  type: &#8216;text/plain;charset=utf-8&#8217;
})</code></pre></div><p>Now you have a file-like object without forcing the browser to build a massive inline data URL.</p><p>That difference becomes more important as payload size grows.</p><div><hr></div><h2>1. Creating Blob Objects the Right Way</h2><p>The Blob constructor accepts an array of parts. Those parts can be strings, typed arrays, ArrayBuffers, or other Blob instances.</p><p>That means you can assemble files incrementally and explicitly.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;3e4bbcec-c58f-40ea-886a-94e8ce9ae80e&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">function makeJsonBlob(payload) {
  const serialized = JSON.stringify(payload, null, 2)

  return new Blob([serialized], {
    type: &#8216;application/json&#8217;
  })
}

function makeHtmlBlob(markup) {
  return new Blob([markup], {
    type: &#8216;text/html;charset=utf-8&#8217;
  })
}

function makeTextBlob(lines) {
  return new Blob([lines.join(&#8217;\\n&#8217;)], {
    type: &#8216;text/plain;charset=utf-8&#8217;
  })
}</code></pre></div><p>This is already a step up from ad hoc string handling because you&#8217;re making the file type explicit.</p><p>For example:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;c3db1ae5-8d85-4618-8755-bf377f78d5d5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const profileBlob = makeJsonBlob({
  id: 42,
  username: &#8216;anton&#8217;,
  plan: &#8216;pro&#8217;
})</code></pre></div><p>A few practical tips here:</p><p>First, always set the MIME type when you know it. It improves interoperability with previews, downloads, and downstream consumers.</p><p>Second, think of Blob creation as a boundary. Once you create the Blob, treat it as a file artifact, not just &#8220;some random string.&#8221;</p><p>Third, don&#8217;t confuse Blob with File. <code>File</code> extends Blob and adds metadata like file name and last modified timestamp. If you need filename semantics, wrap the Blob:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;a562980e-2883-4a46-8423-eaae59d420ed&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const notesBlob = makeTextBlob([&#8217;First line&#8217;, &#8216;Second line&#8217;])

const notesFile = new File([notesBlob], &#8216;notes.txt&#8217;, {
  type: &#8216;text/plain&#8217;
})</code></pre></div><div><hr></div><h2></h2><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://jsdevspace.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://jsdevspace.substack.com/subscribe?"><span>Subscribe now</span></a></p><h2>2. Splitting Large Files Instead of Reading Everything at Once</h2><p>One of the easiest ways to crash a browser tab is to read a large file all at once and then process it in memory.</p><p>This is especially risky for:</p><ul><li><p>CSV imports</p></li><li><p>big JSON files</p></li><li><p>video uploads</p></li><li><p>logs</p></li><li><p>archives</p></li></ul><p>A safer pattern is to use <code>slice()</code> and process the file in chunks.</p><pre><code>async function readChunkAsText(blobPart) {
  return await blobPart.text()
}

async function scanFileByChunks(sourceFile, options = {}) {
  const partSize = options.partSize ?? 1024 * 1024
  const onProgress = options.onProgress ?? (() =&gt; {})

  const partCount = Math.ceil(sourceFile.size / partSize)
  const summary = []

  for (let partIndex = 0; partIndex &lt; partCount; partIndex++) {
    const offsetStart = partIndex * partSize
    const offsetEnd = Math.min(offsetStart + partSize, sourceFile.size)

    const filePart = sourceFile.slice(offsetStart, offsetEnd)
    const textPreview = await readChunkAsText(filePart)

    summary.push({
      partIndex,
      bytes: filePart.size,
      preview: textPreview.slice(0, 80)
    })

    onProgress({
      done: partIndex + 1,
      total: partCount,
      percent: Math.round(((partIndex + 1) / partCount) * 100)
    })
  }

  return summary
}</code></pre><p>This approach gives you several benefits.</p><p>You avoid loading the entire file at once. You can show progress. You can retry failed chunks individually. And you can build resumable upload pipelines much more easily.</p><p>Here&#8217;s a cleaner upload-oriented version:</p><pre><code>class ResumableUploader {
  constructor(fileHandle, config) {
    this.fileHandle = fileHandle
    this.endpoint = config.endpoint
    this.segmentSize = config.segmentSize ?? 2 * 1024 * 1024
    this.onUpdate = config.onUpdate ?? (() =&gt; {})
  }

  async start() {
    const totalSegments = Math.ceil(this.fileHandle.size / this.segmentSize)
    const transferId = crypto.randomUUID()

    for (let segmentNumber = 0; segmentNumber &lt; totalSegments; segmentNumber++) {
      const byteStart = segmentNumber * this.segmentSize
      const byteEnd = Math.min(byteStart + this.segmentSize, this.fileHandle.size)

      const segmentBlob = this.fileHandle.slice(byteStart, byteEnd)

      await this.sendSegment({
        segmentBlob,
        segmentNumber,
        transferId
      })

      this.onUpdate({
        uploadedSegments: segmentNumber + 1,
        totalSegments,
        percent: Math.round(((segmentNumber + 1) / totalSegments) * 100)
      })
    }

    return this.finishUpload(transferId, totalSegments)
  }

  async sendSegment({ segmentBlob, segmentNumber, transferId }) {
    const payload = new FormData()
    payload.append(&#8217;segment&#8217;, segmentBlob)
    payload.append(&#8217;segmentNumber&#8217;, String(segmentNumber))
    payload.append(&#8217;transferId&#8217;, transferId)

    const response = await fetch(this.endpoint, {
      method: &#8216;POST&#8217;,
      body: payload
    })

    if (!response.ok) {
      throw new Error(`Failed to upload segment ${segmentNumber}`)
    }

    return response.json()
  }

  async finishUpload(transferId, totalSegments) {
    const response = await fetch(&#8217;/api/uploads/complete&#8217;, {
      method: &#8216;POST&#8217;,
      headers: { &#8216;Content-Type&#8217;: &#8216;application/json&#8217; },
      body: JSON.stringify({
        transferId,
        totalSegments
      })
    })

    if (!response.ok) {
      throw new Error(&#8217;Failed to finalize upload&#8217;)
    }

    return response.json()
  }
}</code></pre><p>This is the kind of pattern that scales much better than &#8220;read the whole thing and hope.&#8221;</p><div><hr></div><h2>3. Using Blob for Image Compression and Format Conversion</h2><p>Client-side image processing is one of the most practical Blob use cases.</p><p>Uploading the original photo straight from a phone is often wasteful. It might be 5MB, 8MB, or even larger. In many products, that&#8217;s unnecessary. A resized image with reasonable compression can look almost identical while being dramatically smaller.</p><p>The browser already gives us the tools: <code>Image</code>, <code>canvas</code>, and <code>canvas.toBlob()</code>.</p><pre><code>async function compressPhoto(sourceFile, settings = {}) {
  const maxWidth = settings.maxWidth ?? 1600
  const maxHeight = settings.maxHeight ?? 1600
  const quality = settings.quality ?? 0.82
  const outputType = settings.outputType ?? &#8216;image/jpeg&#8217;

  const sourceUrl = URL.createObjectURL(sourceFile)

  try {
    const bitmap = await loadImage(sourceUrl)
    const { width, height } = fitIntoBounds(
      bitmap.width,
      bitmap.height,
      maxWidth,
      maxHeight
    )

    const canvas = document.createElement(&#8217;canvas&#8217;)
    canvas.width = width
    canvas.height = height

    const context = canvas.getContext(&#8217;2d&#8217;)
    context.drawImage(bitmap, 0, 0, width, height)

    const compressedBlob = await canvasToBlob(canvas, outputType, quality)

    return {
      blob: compressedBlob,
      width,
      height,
      beforeBytes: sourceFile.size,
      afterBytes: compressedBlob.size
    }
  } finally {
    URL.revokeObjectURL(sourceUrl)
  }
}

function loadImage(src) {
  return new Promise((resolve, reject) =&gt; {
    const image = new Image()
    image.onload = () =&gt; resolve(image)
    image.onerror = reject
    image.src = src
  })
}

function canvasToBlob(canvas, mimeType, quality) {
  return new Promise((resolve, reject) =&gt; {
    canvas.toBlob((blob) =&gt; {
      if (!blob) {
        reject(new Error(&#8217;Canvas export returned null&#8217;))
        return
      }

      resolve(blob)
    }, mimeType, quality)
  })
}

function fitIntoBounds(originalWidth, originalHeight, maxWidth, maxHeight) {
  let nextWidth = originalWidth
  let nextHeight = originalHeight

  if (nextWidth &gt; maxWidth) {
    nextHeight = (nextHeight * maxWidth) / nextWidth
    nextWidth = maxWidth
  }

  if (nextHeight &gt; maxHeight) {
    nextWidth = (nextWidth * maxHeight) / nextHeight
    nextHeight = maxHeight
  }

  return {
    width: Math.round(nextWidth),
    height: Math.round(nextHeight)
  }
}</code></pre><p>This is more than a demo. It&#8217;s the foundation of avatar uploaders, CMS media tools, admin dashboards, and image-heavy forms.</p><p>You can build on it like this:</p><pre><code>async function prepareAvatarUpload(rawImageFile) {
  if (!rawImageFile.type.startsWith(&#8217;image/&#8217;)) {
    throw new Error(&#8217;Only image files are allowed&#8217;)
  }

  const result = await compressPhoto(rawImageFile, {
    maxWidth: 400,
    maxHeight: 400,
    quality: 0.9,
    outputType: &#8216;image/jpeg&#8217;
  })

  const previewLink = URL.createObjectURL(result.blob)

  return {
    fileBlob: result.blob,
    previewLink,
    savedPercent: Math.round(
      (1 - result.afterBytes / result.beforeBytes) * 100
    )
  }
}</code></pre><p>This creates a compressed Blob for upload and a preview URL for the UI.</p><p>That&#8217;s exactly the kind of workflow Blob is meant for.</p><div><hr></div><h2>4. Building a File Preview System That Doesn&#8217;t Turn Into a Mess</h2><p>File preview features often start small and then grow into unmaintainable code. One function handles images, another handles text, another handles PDFs, another handles videos, and eventually every new type becomes its own special case.</p><p>A better approach is to centralize the logic.</p><pre><code>class PreviewHub {
  constructor(rootElement) {
    this.rootElement = rootElement
    this.activeObjectUrl = null
  }

  async show(fileEntry) {
    this.reset()

    const majorType = this.detectCategory(fileEntry)

    if (majorType === &#8216;image&#8217;) {
      return this.renderImage(fileEntry)
    }

    if (majorType === &#8216;text&#8217;) {
      return this.renderText(fileEntry)
    }

    if (majorType === &#8216;video&#8217;) {
      return this.renderVideo(fileEntry)
    }

    if (majorType === &#8216;audio&#8217;) {
      return this.renderAudio(fileEntry)
    }

    return this.renderFallback(fileEntry)
  }

  detectCategory(fileEntry) {
    const mime = (fileEntry.type || &#8216;&#8217;).toLowerCase()

    if (mime.startsWith(&#8217;image/&#8217;)) return &#8216;image&#8217;
    if (mime.startsWith(&#8217;text/&#8217;) || mime === &#8216;application/json&#8217;) return &#8216;text&#8217;
    if (mime.startsWith(&#8217;video/&#8217;)) return &#8216;video&#8217;
    if (mime.startsWith(&#8217;audio/&#8217;)) return &#8216;audio&#8217;

    return &#8216;unknown&#8217;
  }

  renderImage(fileEntry) {
    const imageNode = document.createElement(&#8217;img&#8217;)
    imageNode.style.maxWidth = &#8216;100%&#8217;
    imageNode.style.maxHeight = &#8216;480px&#8217;
    imageNode.style.objectFit = &#8216;contain&#8217;

    const objectUrl = URL.createObjectURL(fileEntry)
    this.activeObjectUrl = objectUrl
    imageNode.src = objectUrl

    this.rootElement.append(imageNode)
  }

  async renderText(fileEntry) {
    const rawText = await fileEntry.text()
    const previewText = rawText.length &gt; 12000
      ? rawText.slice(0, 12000) + &#8216;\\n\\n...truncated for preview&#8217;
      : rawText

    const codeBlock = document.createElement(&#8217;pre&#8217;)
    codeBlock.textContent = previewText
    codeBlock.style.whiteSpace = &#8216;pre-wrap&#8217;
    codeBlock.style.overflow = &#8216;auto&#8217;
    codeBlock.style.maxHeight = &#8216;420px&#8217;

    this.rootElement.append(codeBlock)
  }

  renderVideo(fileEntry) {
    const videoNode = document.createElement(&#8217;video&#8217;)
    videoNode.controls = true
    videoNode.style.maxWidth = &#8216;100%&#8217;

    const objectUrl = URL.createObjectURL(fileEntry)
    this.activeObjectUrl = objectUrl
    videoNode.src = objectUrl

    this.rootElement.append(videoNode)
  }

  renderAudio(fileEntry) {
    const audioNode = document.createElement(&#8217;audio&#8217;)
    audioNode.controls = true
    audioNode.style.width = &#8216;100%&#8217;

    const objectUrl = URL.createObjectURL(fileEntry)
    this.activeObjectUrl = objectUrl
    audioNode.src = objectUrl

    this.rootElement.append(audioNode)
  }

  renderFallback(fileEntry) {
    const message = document.createElement(&#8217;div&#8217;)
    message.textContent = `Preview is not available for ${fileEntry.name || &#8216;this file&#8217;}`
    this.rootElement.append(message)
  }

  reset() {
    this.rootElement.innerHTML = &#8216;&#8217;

    if (this.activeObjectUrl) {
      URL.revokeObjectURL(this.activeObjectUrl)
      this.activeObjectUrl = null
    }
  }
}</code></pre><p>This gives you one interface for many file types and keeps the preview lifecycle under control.</p><p>The important detail here is not just rendering. It&#8217;s cleanup. Preview systems that use object URLs without revoking them can leak memory over time, especially in file managers and media-heavy dashboards.</p><div><hr></div><h2>5. Generating Downloads Without Data URL Headaches</h2><p>Export features are everywhere:</p><ul><li><p>CSV exports</p></li><li><p>config downloads</p></li><li><p>JSON backups</p></li><li><p>generated reports</p></li><li><p>text logs</p></li><li><p>HTML snapshots</p></li></ul><p>Blob is one of the safest ways to build these features.</p><pre><code>function triggerBlobDownload(fileBlob, fileName) {
  const tempUrl = URL.createObjectURL(fileBlob)
  const anchor = document.createElement(&#8217;a&#8217;)

  anchor.href = tempUrl
  anchor.download = fileName
  anchor.style.display = &#8216;none&#8217;

  document.body.append(anchor)
  anchor.click()
  anchor.remove()

  setTimeout(() =&gt; {
    URL.revokeObjectURL(tempUrl)
  }, 1000)
}</code></pre><p>Now wrap that in useful helpers:</p><pre><code>function exportAsJson(payload, fileName = &#8216;export.json&#8217;) {
  const fileBlob = new Blob(
    [JSON.stringify(payload, null, 2)],
    { type: &#8216;application/json;charset=utf-8&#8217; }
  )

  triggerBlobDownload(fileBlob, fileName)
}

function exportAsText(content, fileName = &#8216;notes.txt&#8217;) {
  const fileBlob = new Blob(
    [content],
    { type: &#8216;text/plain;charset=utf-8&#8217; }
  )

  triggerBlobDownload(fileBlob, fileName)
}

function exportAsCsv(rows, fileName = &#8216;table.csv&#8217;) {
  if (!rows.length) {
    throw new Error(&#8217;Cannot export an empty dataset&#8217;)
  }

  const headers = Object.keys(rows[0])
  const csvLines = [headers.join(&#8217;,&#8217;)]

  for (const row of rows) {
    const values = headers.map((key) =&gt; {
      const value = String(row[key] ?? &#8216;&#8217;)
      const escaped = value.replaceAll(&#8217;&#8221;&#8217;, &#8216;&#8221;&#8220;&#8217;)
      return `&#8221;${escaped}&#8221;`
    })

    csvLines.push(values.join(&#8217;,&#8217;))
  }

  const csvBlob = new Blob(
    [&#8217;\\uFEFF&#8217; + csvLines.join(&#8217;\\n&#8217;)],
    { type: &#8216;text/csv;charset=utf-8&#8217; }
  )

  triggerBlobDownload(csvBlob, fileName)
}</code></pre><p>This approach is simple, predictable, and much more scalable than embedding giant payloads into data URLs.</p><div><hr></div><h2>6. The Part Everyone Forgets: Memory Management</h2><p>Blob itself is usually not the problem.</p><p>The real trouble often starts with <strong>object URLs</strong> created through <code>URL.createObjectURL(blob)</code>.</p><p>These URLs are incredibly useful. They let you point <code>img</code>, <code>video</code>, <code>audio</code>, or download links to Blob-backed content. But they also need cleanup.</p><p>If you keep creating object URLs and never revoke them, memory usage can slowly grow.</p><p>A safer pattern is to track them intentionally.</p><pre><code>class ObjectUrlRegistry {
  constructor() {
    this.liveUrls = new Set()
  }

  allocate(blobValue) {
    const objectUrl = URL.createObjectURL(blobValue)
    this.liveUrls.add(objectUrl)
    return objectUrl
  }

  release(objectUrl) {
    if (!this.liveUrls.has(objectUrl)) return

    URL.revokeObjectURL(objectUrl)
    this.liveUrls.delete(objectUrl)
  }

  releaseAll() {
    for (const objectUrl of this.liveUrls) {
      URL.revokeObjectURL(objectUrl)
    }

    this.liveUrls.clear()
  }
}</code></pre><p>And then use it in components or modules:</p><pre><code>const urlRegistry = new ObjectUrlRegistry()

function mountPreview(imageBlob, mountPoint) {
  const objectUrl = urlRegistry.allocate(imageBlob)

  const imageNode = document.createElement(&#8217;img&#8217;)
  imageNode.src = objectUrl
  imageNode.style.maxWidth = &#8216;100%&#8217;

  mountPoint.innerHTML = &#8216;&#8217;
  mountPoint.append(imageNode)

  return () =&gt; {
    urlRegistry.release(objectUrl)
    mountPoint.innerHTML = &#8216;&#8217;
  }
}</code></pre><p>This becomes especially useful in:</p><ul><li><p>image editors</p></li><li><p>file galleries</p></li><li><p>drag-and-drop uploaders</p></li><li><p>long-lived admin apps</p></li><li><p>preview modals that open and close many times</p></li></ul><p>If you&#8217;ve ever had a file-heavy SPA get progressively slower during a session, forgotten object URLs may be one of the causes.</p><div><hr></div><h2>Practical Rules I&#8217;d Actually Follow in Production</h2><p>After working with Blob-based flows, a few rules stand out.</p><p>Use Blob when you are generating or transforming file-like data. It gives you cleaner boundaries and better interoperability.</p><p>Prefer object URLs over giant data URLs for previews and downloads, but always clean them up.</p><p>Chunk large files instead of processing them in one shot. A slightly more complex implementation is worth the stability.</p><p>Compress images before upload when your product doesn&#8217;t require the original full-resolution asset.</p><p>Use Blob-backed exports for CSV, JSON, and text generation. It scales better and is easier to maintain.</p><p>Keep file preview logic centralized. Scattered preview code becomes technical debt very quickly.</p><p>And most importantly: think about file features as performance features. A bad upload or preview experience is not just a technical issue. Users feel it immediately.</p><div><hr></div><h2>Final Thoughts</h2><p>Blob objects are one of those browser APIs that quietly power a huge amount of modern frontend functionality.</p><p>They help bridge the gap between raw in-memory data and file-oriented browser workflows. They make previews easier. Downloads cleaner. Upload pipelines safer. Image processing more practical. Large-file handling more realistic.</p><p>But the real value isn&#8217;t just knowing the API exists.</p><p>The real value is knowing when to use it instead of naive strings, oversized data URLs, or &#8220;just read the whole thing into memory&#8221; patterns.</p><p>That&#8217;s where Blob stops being a trivia item and starts becoming an architectural tool.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #36: JavaScript, AI Tools, and Ecosystem Updates]]></title><description><![CDATA[A curated roundup of the most important developments in the JavaScript ecosystem this week, including new framework releases, tooling improvements, security discoveries, and AI-powered developer tools]]></description><link>https://jsdevspace.substack.com/p/friday-links-36-javascript-ai-tools</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-36-javascript-ai-tools</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 13 Mar 2026 11:33:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JfML!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JfML!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JfML!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JfML!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JfML!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JfML!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JfML!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2188347,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/190825288?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JfML!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JfML!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JfML!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JfML!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F396c4c58-c25d-43e2-ab05-1e3e8d883fcb_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The JavaScript ecosystem continues to evolve at an extraordinary pace. Every week brings new frameworks, faster build tools, smarter AI assistants, and surprising discoveries in existing projects.</p><p>This week&#8217;s selection includes a particularly interesting mix of updates. Researchers uncovered several previously unknown vulnerabilities in Firefox using AI-assisted analysis. The Solid team released the first beta of Solid 2.0 with a redesigned asynchronous rendering model. Meanwhile, benchmarking data for modern JavaScript minifiers highlights how tools like SWC, Oxc, and Minify are pushing the limits of build performance.</p><h2>&#129504; Ecosystem Highlights</h2><h3>TypeScript 6 Prepares the Path to TS7</h3><p>The TypeScript team <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-rc/">released</a> an early preview of <strong>TypeScript 6</strong>.</p><p>This release is mainly about <strong>internal changes preparing for the future Go-based compiler planned for TypeScript 7</strong>.</p><p>Key goals:</p><ul><li><p>faster compilation</p></li><li><p>reduced memory usage</p></li><li><p>better incremental builds</p></li><li><p>improved large project performance</p></li></ul><p>Large monorepos could see <strong>dramatic speed improvements</strong> once the Go compiler lands.</p><h3>Deno 2.7 Improves Node Compatibility</h3><p>The latest <strong><a href="https://deno.com/blog/v2.7">Deno runtime release</a></strong> continues improving Node compatibility.</p><p>Highlights:</p><ul><li><p>improved npm integration</p></li><li><p>Node API compatibility</p></li><li><p>Temporal API stabilization</p></li></ul><p>Example:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;108a9bb8-d327-4840-9f9b-288723f91b26&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const now = Temporal.Now.instant()
console.log(now.toString())</code></pre></div><div><hr></div><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://github.blog/ai-and-ml/generative-ai/under-the-hood-security-architecture-of-github-agentic-workflows/">Under the hood: Security architecture of GitHub Agentic Workflows</a></p><p><a href="https://hackernoon.com/beating-javascript-performance-limits-with-rust-and-n-api-building-a-faster-image-diff-tool">Beating JavaScript Performance Limits With Rust and N-API: Building a Faster Image Diff Tool</a></p><p><a href="https://jsdev.space/valibot-vs-zod/">Valibot vs Zod: A Lightweight Validation Alternative</a></p><p><a href="https://css-tricks.com/the-different-ways-to-select-html-in-css/">The Different Ways to Select </a><code>&lt;html&gt;</code><a href="https://css-tricks.com/the-different-ways-to-select-html-in-css/"> in CSS</a></p><p><a href="https://frontendmasters.com/blog/the-big-gotcha-of-anchor-positioning/">The Big Gotcha of Anchor Positioning</a></p><p><a href="https://jsdev.space/safe-json-parse-javascript/">Why Blindly Using JSON.parse() Can Be Dangerous</a></p><p><a href="https://neciudan.dev/cline-ci-got-compromised-here-is-how">How to steal npm publish tokens by opening GitHub issues</a></p><p><a href="https://cardog.app/blog/vin-decoder-javascript">How to Decode a VIN in JavaScript</a></p><p><a href="https://blog.scottlogic.com/2026/03/09/noJS-3-flappy-bird.html">Making a Flappy Bird clone using pure HTML and CSS, no JavaScript</a></p><p><a href="https://www.ishchhabra.com/writing/pnpm-monorepo">How to build a pnpm monorepo, the right way</a></p><p><a href="https://www.mux.com/blog/react-is-changing-the-game-for-streaming-apps-with-the-activity-component">React is changing the game for streaming apps with the Activity component</a></p><p><a href="https://patrickbrosset.com/articles/2026-03-09-using-css-animations-as-state-machines-to-remember-focus-and-hover-states-with-css-only/">Using CSS animations as state machines to remember focus and hover states with CSS only</a></p><p><a href="https://blog.frankmtaylor.com/2026/03/05/you-dont-know-html-tables/">You Don&#8217;t Know HTML Tables</a></p><p><a href="https://reactdevelopment.substack.com/p/5-react-hooks-techniques-to-improve">5 React Hooks Techniques to Improve Component Performance</a></p><p><a href="https://jsdev.space/tailwind-v4-vs-mui-antd-styled-components/">Tailwind CSS v4 vs MUI, Ant Design &amp; Styled Components</a></p><p><a href="https://jsdev.space/howto/lru-cache-javascript/">Designing an Efficient LRU Cache Step by Step</a></p><p><a href="https://jsdev.space/howto/deploy-openclaw-second-brain/">Howto Deploy OpenClaw and Build Your Personal AI Second Brain</a></p><h2>&#9874;&#65039; Tools</h2><h3>Repomix &#8212; Turn Any Repo Into a Single AI-Readable File</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XuvP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XuvP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 424w, https://substackcdn.com/image/fetch/$s_!XuvP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 848w, https://substackcdn.com/image/fetch/$s_!XuvP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 1272w, https://substackcdn.com/image/fetch/$s_!XuvP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XuvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png" width="600" height="292" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:292,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16960,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/190825288?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XuvP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 424w, https://substackcdn.com/image/fetch/$s_!XuvP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 848w, https://substackcdn.com/image/fetch/$s_!XuvP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 1272w, https://substackcdn.com/image/fetch/$s_!XuvP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24f39fb4-746c-4d87-9cb4-1344a41691ea_600x292.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://github.com/yamadashy/repomix">Repomix</a> packs an entire repository into a single AI-friendly document.</p><p><a href="https://github.com/tb5z035i/cursor-tg">Cursor Cloud Telegram Connector</a></p><p><a href="https://npmx.dev/">npmx</a> is an experimental tool designed to improve npm package exploration.</p><p><a href="https://litepacks.github.io/welyjs/">Wely</a> &#8212; Lightweight Web Component Framework</p><p><a href="https://github.com/vadimdemedes/ink">Ink</a> allows developers to build CLI tools using React components.</p><p><a href="https://sojinantony01.github.io/react-cron-generator/">Cron Expression Generator</a></p><h2>&#128218; Libs</h2><p><a href="https://github.com/vercel/nft">Node File Trace</a> - determines exactly which files a Node application needs to run.</p><p><a href="https://github.com/privatenumber/minification-benchmarks">JavaScript Minification Benchmarks</a>: SWC Still Leads</p><p><a href="https://rv-grid.com/">RevoGrid</a> - High-Performance Data Grid Component</p><p><a href="https://github.com/cosmiciron/vmprint">VMPrint</a> - A pure-JS, tiny typesetting engine with bit-perfect PDF output on everything&#8212;from Cloudflare Workers to the browser.</p><p><a href="https://github.com/quantizor/markdown-to-jsx">markdown-to-jsx</a> - A very fast and versatile markdown toolchain. Output to AST, React, React Native, SolidJS, Vue, HTML, and more!</p><p><a href="https://github.com/sindresorhus/clipboardy">clipboardy</a> - Access the system clipboard (copy/paste)</p><h2>&#8986; Releases</h2><p><a href="https://github.com/solidjs/solid/releases/tag/v2.0.0-beta.0">Solid v2.0.0 Beta: The </a><code>&lt;Suspense&gt;</code><a href="https://github.com/solidjs/solid/releases/tag/v2.0.0-beta.0"> Era Comes to an End</a></p><p>After a long experimental phase, Solid 2.0 has released its first beta, introducing native asynchronous reactivity as a core feature of the framework.</p><p>In this new model, reactive computations can directly return Promises or async iterables, and Solid&#8217;s reactive graph will automatically suspend and resume around those async operations. This removes much of the complexity developers previously had to manage when dealing with asynchronous state.</p><p>One notable change is that <code>&lt;Suspense&gt;</code> has been retired. For initial renders, it is now replaced by a simpler component called <code>&lt;Loading&gt;</code>.</p><p><a href="https://astro.build/blog/astro-6/">Astro 6 is here!</a></p><p><a href="https://nodejs.org/en/blog/release/v25.8.0">Node.js 25.8.0 (Current)</a></p><p><a href="https://eslint.org/blog/2026/03/eslint-v10.0.3-released/">ESLint v10.0.3 released</a></p><p><a href="https://blog.emberjs.com/ember-released-6-11/">Ember 6.11 Released</a></p><p><a href="https://ionic.io/blog/announcing-ionic-framework-8-8">Ionic Framework 8.8</a></p><p><a href="https://github.com/facebook/react-native/releases/tag/v0.85.0-rc.0">React Native 0.85 RC.0</a>, <a href="https://github.com/pnpm/pnpm/releases/tag/v10.32.0">pnpm 10.32</a>, <a href="https://github.com/jestjs/jest/releases/tag/v30.3.0">Jest 30.3</a>, <a href="https://github.com/recharts/recharts/releases/tag/v3.8.0">Recharts 3.8</a>, <a href="https://github.com/openplayerjs/openplayerjs/releases/tag/v3.0.2">OpenPlayer.js 3.0.2</a>, <a href="https://github.com/prisma/prisma/releases/tag/7.5.0">Prisma 7.5</a>, <a href="https://github.com/sqliteai/sqlite-js">SQLite JS 1.3</a>, <a href="https://github.com/staylor/react-helmet-async/pull/260">React Helmet Async 3.0</a>, <a href="https://github.com/preactjs/preact/releases/tag/10.29.0">Preact 10.29.0</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=IBTx5aGj-6U">Build Your Own Video Sharing App &#8211; Loom Clone with Next.js and Mux JavaScript Tutorial</a></p><p><a href="https://www.youtube.com/watch?v=_TRV6fPUMJw">You Can Just Ship Agents: Architecting for the Agentic Era | Dom Sipowicz, Vercel</a></p><p><a href="https://www.youtube.com/watch?v=wvt5JNUXXLM">The Future of TypeScript</a></p><p><a href="https://www.youtube.com/watch?v=IBTx5aGj-6U">Build Your Own Video Sharing App &#8211; Loom Clone with Next.js and Mux JavaScript Tutorial</a></p><p><a href="https://www.youtube.com/watch?v=abbeIUOCzmw">Cloudflare just slop forked Next.js&#8230;</a></p><p><a href="https://www.youtube.com/watch?v=Xn-gtHDsaPY">7 new open source AI tools you need right now&#8230;</a></p><p><a href="https://www.youtube.com/watch?v=S26VdcWQzRQ">NEW Tanstack Hotkeys Library is Amazing</a></p><h2>&#127908; Talks &amp; Podcasts</h2><p><a href="https://www.youtube.com/watch?v=S_wCMc_iNk4">Why are we building CodePen v2? &#8212; CodePen Radio 419</a></p><p><a href="https://www.youtube.com/watch?v=M5IkdUunf8g">Stop putting secrets in .env</a></p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>The web industry is gradually shortening the maximum lifespan of TLS certificates.</h3><p>Starting March 15, 2026, the limit will drop from 398 days to 200 days. The timeline continues with further reductions: 100 days in 2027, and by 2029 the maximum validity period will shrink to just 47 days.</p><p>Because of these changes, <a href="https://www.heroku.com/blog/preparing-for-shorter-ssl-tls-certificate-lifetimes/">Heroku recommends enabling automatic certificate renewal</a> to avoid unexpected expirations and potential service disruptions.</p><p><a href="https://www.11ty.dev/blog/build-awesome/">Eleventy is now Build Awesome</a></p><h2>&#128272; Security</h2><h3>Supply-Chain Attacks Target Developers</h3><p>Researchers recently discovered malicious GitHub repositories disguised as job assignments.</p><p>When opened in VS Code they may execute scripts automatically.</p><p>Developers should always review:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;8f372eb0-e5cf-4c60-be25-b92a24aa0377&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">.vscode/tasks.json
.vscode/settings.json
package.json</code></pre></div><p>&#128279; <a href="https://thehackernews.com/2026/02/fake-nextjs-repos-target-developers.html">thehackernews</a></p><h3>vm2 Sandbox Escape Vulnerability</h3><p>A critical vulnerability was discovered in vm2, a sandbox library used for executing untrusted JavaScript.</p><p>This vulnerability allows escaping the sandbox and executing arbitrary code.</p><p>&#128279; <a href="https://github.com/patriksimek/vm2">github.com/patriksimek/vm2</a></p><h3>Researchers at Brave discovered that web agents often leak user information &#8212; even when explicitly instructed not to.</h3><p>In a <a href="https://brave.com/blog/agentic-oversharing/">study involving 1,080 runs</a> on Amazon and eBay, agents powered by GPT-4o, O3, and O4-mini repeatedly exposed data to third-party services that had nothing to do with the task they were performing.</p><p>Examples included:</p><ul><li><p>inserting conversation history into search fields</p></li><li><p>revealing personal details through interaction patterns</p></li><li><p>unintentionally sending contextual data to external services</p></li></ul><p>The findings highlight a growing concern: AI web agents may unintentionally expose sensitive user information through their behavior, even when privacy safeguards are in place.</p><p>The <strong>Anthropic team</strong> recently analyzed the Firefox codebase using Claude and uncovered <a href="https://blog.mozilla.org/en/firefox/hardening-firefox-anthropic-red-team/">14 critical vulnerabilities</a> that had gone unnoticed for years.</p><p>In total, the investigation led to the discovery of 22 security issues, all of which were assigned CVE identifiers and addressed in Firefox 148.</p><p>Some of these vulnerabilities had reportedly been present in the codebase for over a decade, highlighting how AI-assisted analysis can help uncover deeply hidden security flaws in large, mature software projects.</p><p><a href="https://trigger.dev/blog/shai-hulud-postmortem">How we got hit by Shai-Hulud: A complete post-mortem</a></p><p>That concludes this week&#8217;s collection of JavaScript and developer ecosystem highlights.</p><p>If you enjoy staying informed about the latest tools, frameworks, and performance innovations, keep an eye on these weekly roundups. The ecosystem changes quickly, and small improvements in tooling often translate into major productivity gains for developers.</p><p>If you discovered an interesting library, tool, or article this week, feel free to share it. The JavaScript community thrives on curiosity, experimentation, and knowledge sharing.</p><p>See you next Friday.</p>]]></content:encoded></item><item><title><![CDATA[Stop Fighting the TypeScript Compiler and Start Writing Safer Code]]></title><description><![CDATA[How unknown, satisfies, custom type guards, and template literal types can dramatically improve the safety of your code.]]></description><link>https://jsdevspace.substack.com/p/stop-fighting-the-typescript-compiler</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/stop-fighting-the-typescript-compiler</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 06 Mar 2026 00:00:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uS7r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uS7r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uS7r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 424w, https://substackcdn.com/image/fetch/$s_!uS7r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 848w, https://substackcdn.com/image/fetch/$s_!uS7r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 1272w, https://substackcdn.com/image/fetch/$s_!uS7r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uS7r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png" width="1408" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:615448,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/190054524?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uS7r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 424w, https://substackcdn.com/image/fetch/$s_!uS7r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 848w, https://substackcdn.com/image/fetch/$s_!uS7r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 1272w, https://substackcdn.com/image/fetch/$s_!uS7r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F805abe3f-a0dd-4cd2-adb8-c4872b7f151a_1408x588.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>TypeScript&#8217;s type system is incredibly powerful. In theory, it can catch a huge number of bugs before your code ever runs.</p><p>In practice, though, many developers barely use a fraction of what it offers.</p><p>Be honest &#8212; most of us have written <code>any</code> at least once just to silence the compiler and get the project to build.</p><p>The problem is that shortcuts like this tend to come back later as runtime crashes.</p><p>In this article, we&#8217;ll walk through several practical TypeScript techniques that help you write <strong>cleaner, safer, and more predictable code</strong>, while letting the type system catch bugs before they reach production.</p><div><hr></div><h1>First Rule: Forget About <code>any</code></h1><p>When you assign the <code>any</code> type to a variable, you&#8217;re essentially telling the compiler:</p><blockquote><p>&#8220;Stop checking this. I&#8217;ll handle it myself.&#8221;</p></blockquote><p>At that moment, you&#8217;ve basically turned off TypeScript.</p><p>Even worse, <code>any</code> tends to spread through a codebase. If a function returns <code>any</code>, every variable that receives that value becomes untyped as well.</p><p>Instead, use <code>unknown</code>.</p><p>It behaves like a safer version of <code>any</code>. You can store anything in an <code>unknown</code> variable, but TypeScript won&#8217;t let you access properties or call methods until you explicitly check the value.</p><p>Example:</p><pre><code>// Dangerous: the compiler allows everything
const rawData: any = JSON.parse(userInput);
rawData.toLowerCase(); // crashes if rawData is a number</code></pre><p>A safer version:</p><pre><code>const safeData: unknown = JSON.parse(userInput);

// safeData.toLowerCase(); &#10060; Compile error

if (typeof safeData === &#8220;string&#8221;) {
  console.log(safeData.toLowerCase());
}</code></pre><p>The <code>unknown</code> type works especially well for:</p><ul><li><p>API responses</p></li><li><p>user input</p></li><li><p>error objects in <code>catch</code> blocks</p></li></ul><p>These are situations where you can never be completely sure about the data shape.</p><div><hr></div><h1>Use <code>satisfies</code> Instead of <code>as</code></h1><p>The <code>as</code> keyword is a <strong>type assertion</strong>. It forces TypeScript to trust you.</p><p>Sometimes that&#8217;s necessary &#8212; but it can also hide real errors.</p><p>TypeScript 4.9 introduced a better tool: <code>satisfies</code>.</p><p>Instead of blindly accepting your assertion, it checks whether the object actually matches the expected type.</p><p>Example:</p><pre><code>type Status = &#8220;draft&#8221; | &#8220;published&#8221; | &#8220;archived&#8221;;

type Article = {
  title: string;
  status: Status;
  tags: string[];
};</code></pre><p>Using <code>as</code>:</p><pre><code>const badArticle = {
  title: &#8220;TS Tips&#8221;,
  status: &#8220;published&#8221;
} as Article;</code></pre><p>This compiles even though the <code>tags</code> field is missing.</p><p>Now compare it with <code>satisfies</code>:</p><pre><code>const safeArticle = {
  title: &#8220;TS Tips&#8221;,
  status: &#8220;published&#8221;
} satisfies Article;</code></pre><p>TypeScript immediately reports the problem.</p><p>This already makes <code>satisfies</code> safer than <code>as</code>, but there&#8217;s another advantage.</p><div><hr></div><h1><code>satisfies</code> Keeps Precise Types</h1><p>When you type an object normally, TypeScript often <strong>widens literal values</strong>.</p><p>Example:</p><pre><code>const articleA: Article = {
  title: &#8220;TS&#8221;,
  status: &#8220;published&#8221;
};</code></pre><p>The <code>status</code> field now has type:</p><pre><code>&#8216;draft&#8217; | &#8216;published&#8217; | &#8216;archived&#8217;</code></pre><p>TypeScript forgets that the actual value is <code>"published"</code>.</p><p>But with <code>satisfies</code>, the literal value is preserved.</p><pre><code>const articleB = {
  title: &#8220;TS&#8221;,
  status: &#8220;published&#8221;
} satisfies Article;</code></pre><p>Now the type of <code>articleB.status</code> is exactly <code>"published"</code>.</p><p>Why does this matter?</p><p>Because TypeScript can now detect impossible conditions.</p><pre><code>if (articleB.status === &#8220;draft&#8221;) {
  // TypeScript warns: this condition will never be true
}</code></pre><p>You get stricter validation and better autocomplete at the same time.</p><div><hr></div><h1>Write Your Own Type Guards</h1><p>Simple checks like <code>typeof</code> or <code>instanceof</code> are often not enough.</p><p>When working with complex objects, TypeScript allows you to define <strong>custom type guards</strong>.</p><p>These are functions that tell the compiler what type a value has when the function returns <code>true</code>.</p><p>Example:</p><pre><code>interface PaymentSuccess {
  status: &#8220;success&#8221;;
  transactionId: string;
}

interface PaymentFailed {
  status: &#8220;error&#8221;;
  errorMessage: string;
}

type PaymentResult = PaymentSuccess | PaymentFailed;</code></pre><p>Now we define a custom type guard:</p><pre><code>function isSuccess(result: PaymentResult): result is PaymentSuccess {
  return result.status === &#8220;success&#8221;;
}</code></pre><p>And use it like this:</p><pre><code>function handlePayment(result: PaymentResult) {
  if (isSuccess(result)) {
    console.log(`Success! ID: ${result.transactionId}`);
  } else {
    console.error(`Error: ${result.errorMessage}`);
  }
}</code></pre><p>TypeScript automatically narrows the type inside each branch.</p><p>Type guards are especially powerful with array methods:</p><pre><code>const successfulPayments = results.filter(isSuccess);</code></pre><p>The resulting array automatically becomes:</p><pre><code>PaymentSuccess[]</code></pre><div><hr></div><h1>Avoid Enums in Favor of Union Types</h1><p>Developers coming from languages like Java or C# often reach for <code>enum</code>.</p><p>But TypeScript enums have a hidden downside.</p><p>Most TypeScript types disappear during compilation. The compiler strips them away and outputs clean JavaScript.</p><p>Enums are different &#8212; they become actual runtime code.</p><p>Example:</p><pre><code>enum Role {
  Admin,
  Editor
}</code></pre><p>This compiles into something like:</p><pre><code>var Role;
(function (Role) {
  Role[Role[&#8221;Admin&#8221;] = 0] = &#8220;Admin&#8221;;
  Role[Role[&#8221;Editor&#8221;] = 1] = &#8220;Editor&#8221;;
})(Role || (Role = {}));</code></pre><p>This adds unnecessary code to your bundle.</p><p>There&#8217;s another historical issue: numeric enums allowed assigning arbitrary numbers.</p><p>A simpler alternative is <strong>string unions</strong>.</p><pre><code>type UserRole = &#8220;admin&#8221; | &#8220;editor&#8221; | &#8220;viewer&#8221;;

function setRole(role: UserRole) {}

setRole(&#8221;admin&#8221;); // OK
// setRole(&#8221;owner&#8221;); // Error</code></pre><p>You get:</p><ul><li><p>autocomplete</p></li><li><p>compile-time validation</p></li><li><p>zero runtime cost</p></li></ul><div><hr></div><h1>What If You Need to Iterate Over Roles?</h1><p>Union types cannot be iterated directly.</p><p>The solution is to create a constant object and freeze it with <code>as const</code>.</p><pre><code>const ROLES = {
  Admin: &#8220;admin&#8221;,
  Editor: &#8220;editor&#8221;,
  Viewer: &#8220;viewer&#8221;
} as const;</code></pre><p>Then extract the union from the object:</p><pre><code>type AppRole = typeof ROLES[keyof typeof ROLES];</code></pre><p>Now you get both:</p><ul><li><p>a runtime object for loops</p></li><li><p>a strictly typed union for TypeScript</p></li></ul><div><hr></div><h1>Use <code>Record</code> for Dictionaries</h1><p>Sometimes developers type objects as <code>Object</code> or <code>{}</code>.</p><p>Both are problematic.</p><ul><li><p><code>Object</code> allows almost anything, including primitives.</p></li><li><p><code>{}</code> means &#8220;any value except null and undefined&#8221;.</p></li></ul><p>When describing key-value structures, use <code>Record</code>.</p><p>Example:</p><pre><code>type Config = Record&lt;string, unknown&gt;;

const config: Config = {
  url: &#8220;localhost&#8221;,
  port: 8080
};</code></pre><p><code>Record</code> becomes even more useful when keys are limited.</p><pre><code>type Role = &#8220;admin&#8221; | &#8220;user&#8221; | &#8220;guest&#8221;;

const permissions: Record&lt;Role, string[]&gt; = {
  admin: [&#8221;read&#8221;, &#8220;write&#8221;, &#8220;delete&#8221;],
  user: [&#8221;read&#8221;, &#8220;write&#8221;],
  guest: [&#8221;read&#8221;]
};</code></pre><p>If you forget a role or add an extra key, TypeScript will immediately complain.</p><div><hr></div><h1>Generate Types with Template Literal Types</h1><p>TypeScript also supports <strong>template literal types</strong>, which allow you to build types dynamically from strings.</p><p>Example:</p><pre><code>type ButtonSize = &#8220;small&#8221; | &#8220;medium&#8221; | &#8220;large&#8221;;
type ButtonTheme = &#8220;primary&#8221; | &#8220;secondary&#8221;;

type ButtonClass = `btn-${ButtonSize}-${ButtonTheme}`;</code></pre><p>TypeScript generates all possible combinations:</p><pre><code>btn-small-primary
btn-small-secondary
btn-medium-primary
...</code></pre><p>Usage:</p><pre><code>const myClass: ButtonClass = &#8220;btn-medium-primary&#8221;;</code></pre><p>Incorrect values will immediately produce errors.</p><div><hr></div><h1>Transform Strings at the Type Level</h1><p>TypeScript also provides built-in utilities for string manipulation:</p><ul><li><p><code>Capitalize</code></p></li><li><p><code>Lowercase</code></p></li><li><p><code>Uppercase</code></p></li></ul><p>Example:</p><pre><code>type EventType = &#8220;click&#8221; | &#8220;hover&#8221; | &#8220;scroll&#8221;;
type EventHandler = `on${Capitalize&lt;EventType&gt;}`;</code></pre><p>This automatically generates:</p><pre><code>onClick | onHover | onScroll</code></pre><div><hr></div><h1>Final Thoughts</h1><p>Writing good TypeScript code isn&#8217;t about covering every line with types just for the sake of it.</p><p>It&#8217;s about <strong>using the right tools where they actually help</strong>.</p><p>Avoid shortcuts like <code>any</code>. Let the compiler guide you instead of fighting it.</p><p>When used properly, TypeScript becomes less of an obstacle and more of a powerful safety net that catches bugs long before they reach production.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #35: Dev Tools, AI & JS Ecosystem Updates]]></title><description><![CDATA[A weekly curated selection of developer tools, AI breakthroughs, framework updates, and notable releases shaping the modern JavaScript ecosystem.]]></description><link>https://jsdevspace.substack.com/p/friday-links-35-dev-tools-ai-and</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-35-dev-tools-ai-and</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 27 Feb 2026 13:16:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!slbq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!slbq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!slbq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 424w, https://substackcdn.com/image/fetch/$s_!slbq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 848w, https://substackcdn.com/image/fetch/$s_!slbq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 1272w, https://substackcdn.com/image/fetch/$s_!slbq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!slbq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png" width="800" height="471" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:471,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124814,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/189357942?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!slbq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 424w, https://substackcdn.com/image/fetch/$s_!slbq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 848w, https://substackcdn.com/image/fetch/$s_!slbq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 1272w, https://substackcdn.com/image/fetch/$s_!slbq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F891166a6-a7b9-4064-9b14-29c76479b02e_800x471.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The JavaScript ecosystem never really slows down &#8212; it just shifts direction. This week brings a mix of AI-powered developer tooling, performance-focused libraries, experimental frameworks, and practical utilities aimed at improving everyday workflows.</p><p>In <strong>Friday Links #35</strong>, we highlight projects that help developers build faster, ship safer, and explore new possibilities across frontend, backend, and edge environments. From emerging open-source tools to ecosystem upgrades worth tracking, these are the updates that stood out this week.</p><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://nextjs.org/blog/agentic-future">Building Next.js for an agentic future</a></p><p><a href="https://adventures.nodeland.dev/archive/yes-learning-to-code-is-still-valuable">Yes, Learning to Code Is Still Valuable</a></p><p><a href="https://css-tricks.com/potentially-coming-to-a-browser-near-you/">Potentially Coming to a Browser :near() You</a></p><p><a href="https://frontendmasters.com/blog/death-to-scroll-fade/">Death to Scroll Fade!</a></p><p><a href="https://blog.logrocket.com/react-server-components-performance-mistakes/">6 React Server Component performance pitfalls in Next.js</a></p><p><a href="https://blog.hyperparam.app/hightable-scrolling-billions-of-rows/">Virtual Scrolling for Billions of Rows &#8212; Techniques from HighTable</a></p><p><a href="https://thecodebarbarian.com/getting-started-with-the-vercel-ai-sdk-in-nodejs.html">Getting Started with the Vercel AI SDK in Node.js</a></p><p><a href="https://stackinsight.dev/blog/loop-performance-empirical-study">Loop Performance Anti-Patterns: A 40-Repository Scan and Six-Module Benchmark Study</a></p><p><a href="https://aarontgrogg.github.io/NoLoJS/">Reduce the JS Workload with no- or lo-JS options</a></p><p><a href="https://stephaniewalter.design/blog/tips-on-how-to-pick-the-right-icons-for-your-website-with-icons8/">Tips on How to Pick the Right Icons for Your Website</a></p><p><a href="https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals">AGENTS.md outperforms skills in our agent evals</a></p><p><a href="https://una.im/border-shape">border-shape: the future of the non-rectangular web</a></p><p><a href="https://piccalil.li/blog/an-in-depth-guide-to-customising-lists-with-css/">An in-depth guide to customising lists with CSS</a></p><p><a href="https://css-tricks.com/loading-smarter-svg-vs-raster-loaders-in-modern-web-design/">Loading Smarter: SVG vs. Raster Loaders in Modern Web Design</a></p><h2>&#9874;&#65039; Tools</h2><p><a href="https://www.react.doctor/">React Doctor</a> - is an open-source CLI tool created by the Million.js (millionco) team that scans React codebases and automatically detects common issues: anti-patterns, performance bottlenecks, accessibility gaps, architectural flaws, and even critical security vulnerabilities that can quietly slip into production.</p><p><a href="https://svar.dev/react/gantt/">SVAR React Gantt</a> - is a modern, high-performance Gantt chart component designed specifically for React applications.</p><p><a href="https://llm-timeline.com/">LLM Timeline</a></p><p><a href="https://oxc.rs/">The JavaScript Oxidation Compiler</a></p><p><a href="https://batiste.github.io/blop/example/">Blop</a> - A typed language for the web that compiles to Virtual DOM. Blop uses real control flow statements &#8212; for loops, if/else &#8212; directly in templates, without JSX constraints.</p><p><a href="https://sciter.com/">Sciter</a> &#8211; Embeddable HTML/CSS/JavaScript Engine for modern UI development</p><p><a href="https://github.com/taskforcesh/bullmq">BullMQ</a> - Message Queue and Batch processing for NodeJS, Python, Elixir and PHP based on Redis</p><p><a href="https://github.com/tanstack/hotkeys">TanStack Hotkeys</a> - Type-Safe keyboard shortcuts library with awesome devtools</p><p><a href="https://github.com/Mina-Massoud/Mina-Rich-Editor">Mina Rich Editor</a> - A powerful, elegant rich text editor built with Shadcn UI. Experience unparalleled customization, beautiful design, and seamless integration. Built with React, TypeScript, and meticulous attention to detail.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AU1w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AU1w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 424w, https://substackcdn.com/image/fetch/$s_!AU1w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 848w, https://substackcdn.com/image/fetch/$s_!AU1w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 1272w, https://substackcdn.com/image/fetch/$s_!AU1w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AU1w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png" width="800" height="358" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:358,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26199,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/189357942?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AU1w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 424w, https://substackcdn.com/image/fetch/$s_!AU1w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 848w, https://substackcdn.com/image/fetch/$s_!AU1w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 1272w, https://substackcdn.com/image/fetch/$s_!AU1w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc37dd7d-7abd-4b55-a3c2-6a69bb41f9e4_800x358.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://temporal-playground.vercel.app/">Temporal Playground</a> &#8212; an interactive online environment for experimenting with the JavaScript Temporal API, allowing developers to run real code and explore modern date and time handling directly in the browser.</p><p><a href="https://github.com/nicotsx/zerobyte">Zerobyte</a> - Powerful backup automation for your remote storage</p><h2>&#128218; Libs</h2><p><a href="https://github.com/LayoutitStudio/voxcss">voxcss</a> - A CSS voxel engine. A 3D grid for the DOM. Renders HTML cuboids by stacking grid layers and applying transforms.</p><p><a href="https://github.com/vercel-labs/portless">portless</a> - Replace port numbers with stable, named .localhost URLs. For humans and agents.</p><p><a href="https://github.com/tomkp/react-split-pane">react-split-pane</a> - React split-pane component</p><p><a href="https://github.com/patrickjuchli/basic-ftp">Basic FTP</a> - FTP client for Node.js, supports FTPS over TLS, passive mode over IPv6, async/await, and Typescript.</p><p><a href="https://github.com/sathvikc/lume-js">Lume.js</a> - Minimal reactive state management using only standard JavaScript and HTML. No custom syntax, no build step required, no framework lock-in.</p><p><a href="https://github.com/superlucky84/fp-pack">fp-pack</a> - A functional toolkit focused on type-safe pipelines, not FP dogma, for JavaScript and TypeScript.</p><p><a href="https://github.com/tambo-ai/tambo">tambo</a> - Generative UI SDK for React</p><h2>&#8986; Releases</h2><p><a href="https://biomejs.dev/blog/biome-v2-4/">Biome v2.4&#8212;Embedded Snippets, HTML Accessibility, and Better Framework Support</a></p><p><a href="https://github.com/prisma/prisma/releases/tag/7.4.0">Prsma 7.4.0 Released</a></p><p><a href="https://phaser.io/news/2026/02/phaser-editor-v5-beta">Phaser Editor v5 Beta now available</a></p><p><a href="https://github.com/emscripten-core/emscripten/blob/main/ChangeLog.md#502---022526">Emscripten 5.0.2</a> &#8212; the well-established LLVM-to-WebAssembly compiler that enables running native low-level code in Node.js without native bindings &#8212; receives internal cleanups, removing legacy Node-specific workarounds that are no longer required.</p><p><a href="https://github.com/honojs/hono/releases/tag/v4.12.0">Hono 4.12</a> &#8212; a lightweight, multi-runtime web framework built around Web Standards, designed to run seamlessly across Node.js, Bun, Deno, Cloudflare Workers, and other edge environments.</p><p><a href="https://github.com/alfateam/orange-orm/releases/tag/v5.2.0">Orange ORM 5.2</a> &#8212; a powerful and modern ORM designed for efficient database interaction, offering type-safe queries, clean abstractions, and strong performance across modern JavaScript runtimes.</p><p><a href="https://eslint.org/blog/2026/02/eslint-v10.0.2-released/">ESLint 10.0.2 Released</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=Ab01W6h4Giw">TanStack Router - How to Become a Routing God in React</a></p><p><a href="https://www.youtube.com/watch?v=0G_HKDrYpYc">Build Your Own Claude Code with Mastra Workspaces</a></p><p><a href="https://www.youtube.com/watch?v=uGsauG7Btlg">Build &amp; Deploy AI Agent Workflow Builder using NextJs, Mongodb, React, Prisma, Upstash</a></p><p><a href="https://www.youtube.com/watch?v=O7DTIHISrJw">How One Engineer and AI Crashed IBM&#8217;s Stock Price</a></p><p><a href="https://www.youtube.com/watch?v=ssYt09bCgUY">The wild rise of OpenClaw&#8230;</a></p><p><a href="https://www.youtube.com/watch?v=bzWI3Dil9Ig">My Multi-Agent Team with OpenClaw</a></p><p><a href="https://www.youtube.com/watch?v=n1sfrc-RjyM">OpenClaw Full Tutorial for Beginners &#8211; How to Set Up and Use OpenClaw (ClawdBot / MoltBot)</a></p><h2>&#127908; Talks &amp; Podcasts</h2><p>No content this week &#128546;</p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>An AI agent running on a $5 microcontroller &#8212; powered by just 35 KB of code.</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yb97!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yb97!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 424w, https://substackcdn.com/image/fetch/$s_!yb97!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 848w, https://substackcdn.com/image/fetch/$s_!yb97!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 1272w, https://substackcdn.com/image/fetch/$s_!yb97!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yb97!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png" width="800" height="606" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/454a576f-e856-4656-8519-454d4a69b516_800x606.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:606,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91387,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/189357942?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yb97!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 424w, https://substackcdn.com/image/fetch/$s_!yb97!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 848w, https://substackcdn.com/image/fetch/$s_!yb97!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 1272w, https://substackcdn.com/image/fetch/$s_!yb97!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a576f-e856-4656-8519-454d4a69b516_800x606.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Developer tnm has released an open-source AI agent called <a href="https://github.com/tnm/zclaw">zclaw</a>, designed to run on ESP32 microcontrollers with a total firmware size under 888 KB. The agent itself occupies only about 35 KB, while the remaining space is used by the Wi-Fi stack (~388 KB), TLS encryption (~110 KB), and certificates.</p><p>The project is written in C using ESP-IDF and FreeRTOS, and can run on affordable hardware like the Seeed XIAO ESP32-C3 board, which costs around $5. At publication time, the repository had already gained 750+ stars on GitHub and is available under the MIT license.</p><div><hr></div><p>That wraps up this week&#8217;s roundup.</p><p>As AI tooling matures and JavaScript continues expanding beyond the browser into servers, edge runtimes, and embedded devices, the developer landscape keeps evolving in exciting ways. Try something new, explore the tools that caught your eye, and stay curious.</p><p>See you next week with another collection of tools, ideas, and ecosystem highlights in <strong>Friday Links #36</strong>.</p>]]></content:encoded></item><item><title><![CDATA[20 Design Reference Platforms Beyond Dribbble]]></title><description><![CDATA[A curated list of tools that go deeper than static shots &#8212; featuring real user flows, motion recordings, Figma files, component code, and design evolution.]]></description><link>https://jsdevspace.substack.com/p/20-design-reference-platforms-beyond</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/20-design-reference-platforms-beyond</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Thu, 19 Feb 2026 06:10:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!N7bF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N7bF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N7bF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 424w, https://substackcdn.com/image/fetch/$s_!N7bF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 848w, https://substackcdn.com/image/fetch/$s_!N7bF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!N7bF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N7bF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:189806,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/188461310?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N7bF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 424w, https://substackcdn.com/image/fetch/$s_!N7bF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 848w, https://substackcdn.com/image/fetch/$s_!N7bF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!N7bF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd809f6-2610-4d83-a05b-d26bbd628a99_1024x559.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Most designers rely on the same 2&#8211;3 sources for inspiration: <strong>Dribbble, Behance, Pinterest</strong>. That works &#8212; but only up to a point.</p><p>Static images don&#8217;t show motion.<br>You can&#8217;t inspect real product structure.<br>You don&#8217;t see how interfaces evolve over time.<br>You rarely understand what actually works in production.</p><p>So I decided to go deep. I reviewed <strong>every major design reference platform I could find</strong> &#8212; not just the popular ones &#8212; and analyzed how they actually help in real-world work.</p><p>The conclusion?<br>Dribbble and Behance are just the surface. There&#8217;s a much bigger ecosystem underneath.</p><p>Below are <strong>20 platforms</strong> that give you something more: real user flows, video recordings, Figma files, component code, version history, or actionable best practices.</p><div><hr></div><h2>Why deep visual literacy matters</h2><p>When you&#8217;ve seen <strong>hundreds of onboarding flows</strong>, you stop guessing.<br>When you&#8217;ve studied <strong>dozens of pricing pages</strong>, you recognize patterns instantly.</p><p>The issue with mainstream inspiration sources:</p><ul><li><p><strong><a href="https://dribbble.com/">Dribbble</a></strong><a href="https://dribbble.com/"> </a>&#8594; lots of beautiful concepts, not always realistic.</p></li><li><p><strong><a href="https://www.pinterest.com/">Pinterest</a></strong> &#8594; random visuals without context.</p></li><li><p><strong><a href="https://www.behance.net/">Behance</a></strong> &#8594; polished case studies, rarely iterative thinking.</p></li></ul><p>The platforms below offer something different:</p><ul><li><p>Video instead of static images</p></li><li><p>Figma files instead of flattened screenshots</p></li><li><p>Design evolution instead of one final version</p></li><li><p>Code references instead of just visuals</p></li><li><p>Best-practice explanations instead of pure galleries</p></li></ul><div><hr></div><h1>The Platforms</h1><div><hr></div><h2>1. Mobbin &#8212; Real User Flows in Motion</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6hah!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6hah!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 424w, https://substackcdn.com/image/fetch/$s_!6hah!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 848w, https://substackcdn.com/image/fetch/$s_!6hah!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 1272w, https://substackcdn.com/image/fetch/$s_!6hah!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6hah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png" width="1345" height="833" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:833,&quot;width&quot;:1345,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86424,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/188461310?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6hah!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 424w, https://substackcdn.com/image/fetch/$s_!6hah!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 848w, https://substackcdn.com/image/fetch/$s_!6hah!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 1272w, https://substackcdn.com/image/fetch/$s_!6hah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafb4f3b3-329f-4d07-addc-d0e20f4946c5_1345x833.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Best for:</strong> Mobile UX patterns</p><p>Mobbin&#8217;s strength is flow visibility. You don&#8217;t just see screens &#8212; you see transitions, states, animations, and interaction timing.</p><p>It&#8217;s heavily categorized (onboarding, payments, recovery flows, forms, etc.), so pattern research is fast and structured.</p><p><strong>Cons:</strong> Focused mostly on mobile. Paid subscription.<br><strong>Price:</strong> $12/month<br><strong>Link:</strong> <a href="https://mobbin.com">https://mobbin.com</a></p><div><hr></div><h2>2. SaaSFrame &#8212; Beyond Landing Pages</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iGLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iGLm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 424w, https://substackcdn.com/image/fetch/$s_!iGLm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 848w, https://substackcdn.com/image/fetch/$s_!iGLm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 1272w, https://substackcdn.com/image/fetch/$s_!iGLm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iGLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png" width="1456" height="657" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:657,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:174659,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/188461310?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iGLm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 424w, https://substackcdn.com/image/fetch/$s_!iGLm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 848w, https://substackcdn.com/image/fetch/$s_!iGLm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 1272w, https://substackcdn.com/image/fetch/$s_!iGLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe8b057d7-3d50-4818-a60b-9b6e2dd4efae_1847x833.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Best for:</strong> SaaS journeys (emails + product UI)</p><p>Most galleries show landing pages. SaaSFrame goes deeper: onboarding emails, product dashboards, internal UI patterns, and complete SaaS journeys.</p><p>Some pages include downloadable Figma files, which is rare.</p><p><strong>Cons:</strong> No motion recordings.<br><strong>Price:</strong> $14/month<br><strong>Link:</strong> <a href="https://saasframe.io">https://saasframe.io</a></p><div><hr></div><h2>3. Muzli &#8212; Inspiration in Your New Tab</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fGx4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fGx4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 424w, https://substackcdn.com/image/fetch/$s_!fGx4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 848w, https://substackcdn.com/image/fetch/$s_!fGx4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 1272w, https://substackcdn.com/image/fetch/$s_!fGx4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fGx4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png" width="1456" height="651" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:651,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:539247,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/188461310?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fGx4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 424w, https://substackcdn.com/image/fetch/$s_!fGx4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 848w, https://substackcdn.com/image/fetch/$s_!fGx4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 1272w, https://substackcdn.com/image/fetch/$s_!fGx4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4d33a0-c2b4-4079-850a-178f16ad6ae8_1896x848.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Best for:</strong> Passive visual intake</p><p>A Chrome extension that replaces your new tab with curated design content. Inspiration becomes ambient rather than intentional.</p><p><strong>Cons:</strong> Can distract.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://muz.li">https://muz.li</a></p><div><hr></div><h2>4. Awwwards &#8212; High-End Web Inspiration</h2><p><strong>Best for:</strong> Award-level web experiences</p><p>Curated, jury-reviewed websites. Good for studying premium brand execution and creative direction.</p><p><strong>Cons:</strong> Heavy agency aesthetic. Less practical for SaaS/B2B.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://www.awwwards.com">https://www.awwwards.com</a></p><div><hr></div><h2>5. Refero &#8212; Large-Scale UI Library</h2><p><strong>Best for:</strong> Web + iOS interface patterns</p><p>A large screenshot database covering dashboards, onboarding flows, marketing, and more. Offers a lifetime option.</p><p><strong>Cons:</strong> Limited motion content.<br><strong>Price:</strong> &#8364;14/month or lifetime option<br><strong>Link:</strong> <a href="https://refero.design">https://refero.design</a></p><div><hr></div><h2>6. Component Gallery &#8212; Design Systems with Code</h2><p><strong>Best for:</strong> System-level thinking</p><p>Instead of screenshots, you get real component implementations across multiple frameworks. Great for engineers and system designers.</p><p><strong>Cons:</strong> Less visually curated.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://component.gallery">https://component.gallery</a></p><div><hr></div><h2>7. Land-Book &#8212; Design Evolution Tracking</h2><p><strong>Best for:</strong> Studying interface change over time</p><p>See how websites transform across iterations. Useful for understanding messaging shifts and structural changes.</p><p><strong>Cons:</strong> Full history often behind PRO plan.<br><strong>Price:</strong> Free + PRO<br><strong>Link:</strong> <a href="https://land-book.com">https://land-book.com</a></p><div><hr></div><h2>8. Landing Love &#8212; Full Page Video Recordings</h2><p><strong>Best for:</strong> Motion-heavy landing pages</p><p>Captures complete landing page scroll recordings. Helps analyze animation timing and interaction choreography.</p><p><strong>Cons:</strong> Focused only on landings.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://landing.love">https://landing.love</a></p><div><hr></div><h2>9. Page Flows &#8212; End-to-End Product Journeys</h2><p><strong>Best for:</strong> Checkout, onboarding, upgrade flows</p><p>Structured around full user journeys rather than isolated screens. Excellent for SaaS and product research.</p><p><strong>Cons:</strong> Subscription required for most content.<br><strong>Price:</strong> ~$13/month<br><strong>Link:</strong> <a href="https://pageflows.com">https://pageflows.com</a></p><div><hr></div><h2>10. CSS Design Awards &#8212; Jury-Based Recognition</h2><p><strong>Best for:</strong> Award-winning web work</p><p>Another curated award ecosystem with professional review.</p><p><strong>Cons:</strong> Smaller reach than Awwwards.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://cssdesignawards.com">https://cssdesignawards.com</a></p><div><hr></div><h2>11. Really Good Emails &#8212; Email UX Reference</h2><p><strong>Best for:</strong> Email structure &amp; lifecycle design</p><p>Focused specifically on email UX patterns. Useful for SaaS and product marketing.</p><p><strong>Cons:</strong> No performance metrics.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://reallygoodemails.com">https://reallygoodemails.com</a></p><div><hr></div><h2>12. LandingFolio &#8212; Color-Based Search</h2><p><strong>Best for:</strong> Brand-aligned visual exploration</p><p>Lets you filter landing pages by color palette. Helpful when working with strict brand systems.</p><p><strong>Cons:</strong> Smaller dataset.<br><strong>Price:</strong> Subscription<br><strong>Link:</strong> <a href="https://landingfolio.com">https://landingfolio.com</a></p><div><hr></div><h2>13. Landing Gallery &#8212; Builder-Specific Examples</h2><p><strong>Best for:</strong> Webflow / no-code references</p><p>Filter by builder platform to ensure feasibility without custom code.</p><p><strong>Cons:</strong> Quality varies.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://landing.gallery">https://landing.gallery</a></p><div><hr></div><h2>14. SaaSPages &#8212; Best Practices Explained</h2><p><strong>Best for:</strong> Learning why sections convert</p><p>Explains common patterns for pricing, hero sections, CTAs. More educational than gallery-based.</p><p><strong>Cons:</strong> Advice can be basic.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://saaspages.xyz">https://saaspages.xyz</a></p><div><hr></div><h2>15. One Page Love &#8212; One-Page Focus</h2><p><strong>Best for:</strong> Startup landing formats</p><p>Human-curated one-page site collection with interviews and tutorials.</p><p><strong>Cons:</strong> Narrow specialization.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://onepagelove.com">https://onepagelove.com</a></p><div><hr></div><h2>16. Scrnshts &#8212; App Store Visual Strategy</h2><p><strong>Best for:</strong> iOS marketing screenshots</p><p>Focused on App Store presentation design.</p><p><strong>Cons:</strong> iOS-only.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://scrnshts.club">https://scrnshts.club</a></p><div><hr></div><h2>17. Collect UI &#8212; Component Exploration</h2><p><strong>Best for:</strong> Quick UI pattern scanning</p><p>Browse sign-ups, pricing tables, 404 screens, etc.</p><p><strong>Cons:</strong> Many conceptual pieces.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://collectui.com">https://collectui.com</a></p><div><hr></div><h2>18. Godly &#8212; Modern Web Aesthetics</h2><p><strong>Best for:</strong> Trend discovery</p><p>Highly curated contemporary web designs.</p><p><strong>Cons:</strong> Sometimes prioritizes visuals over usability.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://godly.website">https://godly.website</a></p><div><hr></div><h2>19. Httpster &#8212; Experimental Web</h2><p><strong>Best for:</strong> Non-traditional design inspiration</p><p>Useful when you need something unconventional.</p><p><strong>Cons:</strong> Rarely practical for mainstream products.<br><strong>Price:</strong> Free<br><strong>Link:</strong> <a href="https://httpster.net">https://httpster.net</a></p><div><hr></div><h2>20. Behance &#8212; Deep Case Studies</h2><p><strong>Best for:</strong> Portfolio storytelling</p><p>Great for showing full project narratives and hiring visibility.</p><p><strong>Cons:</strong> Usually shows final states, not iterations.<br><strong>Price:</strong> Free + PRO<br><strong>Link:</strong> <a href="https://behance.net">https://behance.net</a></p><div><hr></div><h1>How to Use This Without Overwhelm</h1><p>You don&#8217;t need all 20 daily.</p><p><strong>Daily:</strong></p><ul><li><p>Muzli (passive intake)</p></li></ul><p><strong>Weekly:</strong></p><ul><li><p>Awwwards</p></li><li><p>Godly</p></li></ul><p><strong>Before starting a project:</strong></p><ul><li><p>Mobbin / SaaSFrame / Refero</p></li><li><p>Component Gallery</p></li><li><p>Page Flows</p></li></ul><p><strong>Occasionally:</strong></p><ul><li><p>Land-Book</p></li><li><p>Httpster</p></li></ul><div><hr></div><h2>Final Thought</h2><p>Each tool gives you a different lens: motion, systems, marketing, experimentation, evolution.</p><p>Visual literacy isn&#8217;t built in a weekend. It&#8217;s built through consistent exposure and structured comparison.</p><p>After a few months of this approach, you&#8217;ll stop reinventing common patterns.<br>You&#8217;ll recognize solutions instantly. And most importantly &#8212; you&#8217;ll be able to explain your design decisions with confidence.</p><p>If you use something not listed here, share it. The ecosystem is bigger than any single list.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://jsdevspace.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://jsdevspace.substack.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Friday Links #34: Fresh JavaScript Tools & Releases]]></title><description><![CDATA[A weekly roundup of modern JS libraries, frameworks, and dev discoveries]]></description><link>https://jsdevspace.substack.com/p/friday-links-34-fresh-javascript</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-34-fresh-javascript</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 13 Feb 2026 12:49:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rVf6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rVf6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rVf6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!rVf6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!rVf6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!rVf6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rVf6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png" width="1024" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d1df670-e295-4712-9e56-682250f3c815_1024x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1098843,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/187851992?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rVf6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 424w, https://substackcdn.com/image/fetch/$s_!rVf6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 848w, https://substackcdn.com/image/fetch/$s_!rVf6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 1272w, https://substackcdn.com/image/fetch/$s_!rVf6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1df670-e295-4712-9e56-682250f3c815_1024x559.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Friday Links #34 brings another curated batch of JavaScript tools, releases, and resources worth your attention. This week&#8217;s selection highlights practical libraries, experimental projects, and notable ecosystem updates that can influence real-world workflows. If you like staying current without the noise, this digest delivers the signal.</p><h2>Pinterest processes more searches than ChatGPT</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ojsk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ojsk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 424w, https://substackcdn.com/image/fetch/$s_!Ojsk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 848w, https://substackcdn.com/image/fetch/$s_!Ojsk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 1272w, https://substackcdn.com/image/fetch/$s_!Ojsk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ojsk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png" width="800" height="533" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99313fe9-322e-4d2b-bf63-720897773f98_800x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:533,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53549,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/187851992?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ojsk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 424w, https://substackcdn.com/image/fetch/$s_!Ojsk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 848w, https://substackcdn.com/image/fetch/$s_!Ojsk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 1272w, https://substackcdn.com/image/fetch/$s_!Ojsk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99313fe9-322e-4d2b-bf63-720897773f98_800x533.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>According to Pinterest CEO Bill Ready, who made the comparison while discussing the company&#8217;s latest quarterly results. He positioned Pinterest as a major standalone search and discovery entry point, especially for commercial intent.</p><p>According to third-party estimates, ChatGPT handles around 75B searches per month, while Pinterest sees roughly 80B, generating about 1.7B monthly clicks. Ready noted that more than half of Pinterest searches are commercial in nature, versus roughly 2% for ChatGPT (by his estimate).</p><p>The quarter itself came in slightly below expectations: &#8212; revenue: $1.32B vs $1.33B expected &#8212; EPS: $0.67 vs $0.69 expected &#8212; Q1 2026 outlook: $951&#8211;971M vs $980M expected</p><p>Pinterest attributed the softness to reduced advertiser budgets (especially in Europe) and new tariffs affecting home and furniture categories. Despite this, user growth beat forecasts, reaching 619M monthly active users (+12% YoY). Shares dropped about 20% in after-hours trading.</p><p>The company says it&#8217;s doubling down on visual search, recommendations, personalization, and tighter e-commerce integrations (including Amazon partnerships) to capture buying intent earlier in the discovery journey.</p><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-deep-think/">Gemini 3 Deep Think: Advancing science, research and engineering</a></p><p><a href="https://forwardemail.net/en/blog/docs/email-protocols-rfc-compliance-imap-smtp-pop3-comparison">Email RFC Protocol Support - Complete Standards &amp; Specifications Guide</a></p><p><a href="https://blog.logrocket.com/css-in-2026">CSS in 2026: The new features reshaping frontend development</a></p><p><a href="https://emanueleferonato.com/2026/01/28/greedy-rectangle-merging-turning-binary-grids-into-simple-geometry-javascript-example/">Greedy Rectangle Merging: Turning Binary Grids into Simple Geometry &#8211; JavaScript example</a></p><p><a href="https://fadamakis.com/you-probably-dont-need-usecallback-here-7e22d54fe7c0">You probably don&#8217;t need </a><code>useCallback</code><a href="https://fadamakis.com/you-probably-dont-need-usecallback-here-7e22d54fe7c0"> here</a></p><p><a href="https://github.com/vercel-labs/agent-browser">agent-browser</a> - Browser automation CLI for AI agents</p><p><a href="https://github.com/puffinsoft/syntux">syntux</a> - Generative UIs for the web.</p><p><a href="https://dev.to/playfulprogramming/javascript-frameworks-heading-into-2026-2hel">JavaScript Frameworks - Heading into 2026</a></p><p><a href="https://frontendmasters.com/blog/the-browser-hates-surprises/">The Browser Hates Surprises</a></p><p><a href="https://www.matuzo.at/blog/2026/text-scaling-meta-tag">A new meta tag for respecting text scaling on mobile</a></p><p><a href="https://www.phpied.com/measuring-svg-rendering-time/">Measuring SVG rendering time</a></p><p><a href="https://www.sanity.io/blog/the-logo-soup-problem">The logo soup problem (and how to solve it)</a></p><p><a href="https://www.developerway.com/posts/debugging-with-ai">Debugging with AI: Can It Replace an Experienced Developer?</a></p><h2>&#9874;&#65039; Tools</h2><p><a href="https://npmx.dev/">npmx</a> &#8212; A Faster, More Informative npm Registry Browser &#8212; A new high-performance interface for exploring packages from the official npm registry. Search is quick and accurate, and package pages (for example, axios) surface richer metadata and insights at a glance. It&#8217;s not meant to replace the official registry, but it makes the default npmjs.com browsing experience feel dated. The built-in package comparison feature is especially useful.</p><p><a href="https://rari.build/">Rari</a> &#8211; Rust-powered React framework</p><p><a href="https://github.com/macaly/almostnode">almostnode</a> &#8212; Run a Node.js Environment in the Browser &#8212; An experimental project that brings a Node.js (v20) runtime directly into the browser, including basic npm package support. It&#8217;s still early and not production-ready, but the concept is intriguing and the live demo on the homepage shows promising potential.</p><p><a href="https://github.com/affaan-m/everything-claude-code">Everything Claude Code</a> - The complete collection of Claude Code configs from an Anthropic hackathon winner.</p><p><a href="https://github.com/karam-ajaj/atlas">Atlas - Network Infrastructure Visualizer</a> - Open-source tool for network discovery, visualization, and monitoring. Built with Go, FastAPI, and React, supports Docker host scanning.</p><p><a href="https://github.com/jeffijoe/awilix">Awilix</a> - Extremely powerful Inversion of Control (IoC) container for Node.JS</p><p><a href="https://github.com/moscajs/aedes">Aedes</a> - Barebone MQTT broker that can run on any stream server, the node way</p><p><a href="https://github.com/antfu/broz">broz</a> - A simple, frameless browser for screenshots</p><p><a href="https://github.com/shaka-project/shaka-player">Shaka Player</a> - JavaScript player library / DASH &amp; HLS client / MSE-EME player</p><p><a href="https://www.svg.studio/">SVG Studio</a> &#8212; A Browser-Based SVG Editing Tool</p><p><a href="https://baseline-status-for-video.css-weekly.com/">Baseline Status for Video</a> - An Easy Way to Show Baseline Support in Videos. A small, practical utility for quickly displaying Baseline support status in video content. It helps creators visually communicate browser feature support and compatibility without building custom overlays or graphics.</p><p><a href="https://www.promptefy.online/">Promptefy</a> - Prompt-Driven Video Generator with Gemini</p><h2>&#128218; Libs</h2><p><a href="https://github.com/ShaneIsrael/fireshare">Fireshare</a> - Self host your media and share with unique links</p><p><a href="https://github.com/fleetbase/fleetbase">Fleetbase</a> - Modular logistics and supply chain operating system (LSOS)</p><p><a href="https://github.com/adesignl/Peek">Peek</a> - Light Weight &#8220;Headroom Style&#8221; scroll intent library that hides the site header on scroll down and shows on scroll up</p><p><a href="https://openai.github.io/chatkit-js/">ChatKit</a> &#8212; A Framework for Building AI Chat Experiences &#8212; A developer framework for adding polished, AI-powered chat interfaces to applications with minimal setup. It provides ready-made building blocks for conversational features and orchestration, helping teams ship advanced chat functionality quickly without rebuilding common patterns from scratch.</p><p><a href="https://github.com/image-js/image-js">image-js</a> - Image processing and manipulation in JavaScript</p><h2>&#8986; Releases</h2><p><a href="https://devblogs.microsoft.com/typescript/announcing-typescript-6-0-beta/">TypeScript 6.0</a> has entered beta. This release isn&#8217;t about flashy new features &#8212; it focuses on simplifying and cleaning up <code>tsconfig</code> settings. Think of it as a transitional version designed to smooth the path toward the future Go-based &#8220;native&#8221; TypeScript 7 compiler.</p><ul><li><p><strong>Improved type inference for functions without </strong><code>this</code>: TypeScript now treats functions that don&#8217;t actually use <code>this</code> as less context-sensitive, improving inference in more cases.</p></li><li><p><strong>Support for subpath imports starting with </strong><code>#/</code>: You can now use imports like <code>import x from "#/module"</code> in supported environments, simplifying internal package aliasing.</p></li><li><p><strong>New </strong><code>--stableTypeOrdering</code><strong> flag</strong>: A flag to make type ordering deterministic and closer to TypeScript 7&#8217;s behavior, reducing differences between runs.</p></li><li><p><strong>ES2025 support for </strong><code>target</code><strong> and </strong><code>lib</code>: The new <code>es2025</code> target and lib options include newer built-in API types (e.g., <code>RegExp.escape</code>).</p></li><li><p><strong>Temporal API types included</strong>: Built-in type definitions for the ECMAScript <code>Temporal</code> API are now available.</p></li><li><p><strong>New types for Map upsert methods</strong>: <code>Types</code> for <code>getOrInsert</code> and <code>getOrInsertComputed</code> methods on <code>Map/WeakMap</code> have been added.</p></li><li><p><strong>Simplified DOM lib</strong>: <code>dom.iterable</code> and <code>dom.asynciterable</code> are now fully included in <code>lib.dom</code>, so you can drop extra entries in <code>"lib"</code>.</p></li><li><p><strong>Updated default compiler options</strong>: Defaults such as <code>"strict": true</code>, <code>module: "esnext"</code>, and <code>target: es2025</code> reflect modern JS practices.</p></li><li><p><strong>Changed default </strong><code>rootDir</code>: Now defaults to the directory containing <code>tsconfig.json</code>, simplifying output layout.</p></li><li><p><strong>types defaults to </strong><code>[]</code>: The default global types list in <code>tsconfig.json</code> is now empty by default.</p></li></ul><p><a href="https://nodejs.org/en/blog/release/v25.6.1">Node.js 25.6.1 (Current)</a></p><p><a href="https://eslint.org/blog/2026/02/eslint-v10.0.0-released/">ESLint v10.0.0 released</a></p><p><a href="https://bun.sh/blog/bun-v1.3.9">Bun v1.3.9 Released</a></p><p><a href="https://huggingface.co/blog/transformersjs-v4">Transformers.js v4</a> Preview: Now Available on NPM!</p><p><a href="https://github.com/prisma/prisma/releases/tag/7.4.0">Prisma 7.4.0 Released</a></p><p><a href="https://github.com/dolanmiu/docx/releases/tag/9.5.2">docx 9.5.2 released</a>,</p><p><a href="https://github.com/pnpm/pnpm/releases/tag/v10.29.3">pnpm 10.29.3</a>, <a href="https://github.com/alfateam/orange-orm/releases/tag/v5.0.0">Orange ORM v5.0.0</a></p><p><a href="https://tamagui.dev/blog/version-two">Tamagui 2 Released</a></p><p><a href="https://www.gatsbyjs.com/docs/reference/release-notes/v5.16/">Gatsby v5.16</a> Adds React 19 Support &#8212; The latest Gatsby release (v5.16) introduces official support for React 19, bringing compatibility with the newest React features and runtime behavior.</p><p><a href="https://babeljs.io/blog/2026/01/31/7.29.0">Babel 7.29.0 Released</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=Lim_T_BJ8-s">Designing a Database Like a Senior Engineer (ERD &amp; PRD)</a></p><p><a href="https://www.youtube.com/watch?v=TInTm-M5yBs">Improving Performance using React Server Components!</a></p><p><a href="https://www.youtube.com/watch?v=_RQAMXlWSd0">RSC vs SSR Performance: Why LCP Optimization Fails Without Streaming and Suspense</a></p><p><a href="https://www.youtube.com/watch?v=87Y0sK-krfM">Windows Users Are Switching and Linux Is Where They&#8217;re Going</a></p><p><a href="https://www.youtube.com/watch?v=AOq9P_H-aaU">WHO SURVIVES AI? Junior vs Senior</a></p><p><a href="https://www.youtube.com/watch?v=ttLIQPQmLKc">&#128274; Master Role-Based Authorization in NestJS (Full Guide)</a></p><h2>&#127908; Talks &amp; Podcasts</h2><p>No content this week &#128546;</p><h2>&#128478;&#65039; News &amp; Updates</h2><p><a href="https://openai.com/index/introducing-gpt-5-3-codex-spark/">Introducing GPT&#8209;5.3&#8209;Codex&#8209;Spark</a></p><p><a href="https://webkit.org/blog/17808/interop-2025-review/">A Quick Guide to WCAG 3.0</a> &#8212; An overview of WCAG 3.0, the next generation of the W3C&#8217;s web accessibility guidelines. The standard is still in active development, with many details evolving, and a draft candidate recommendation is not expected until around 2027. It&#8217;s a helpful early look at where accessibility requirements are heading next.</p><p><a href="https://abilitynet.org.uk/resources/digital-accessibility/what-expect-wcag-30-web-content-accessibility-guidelines">WCAG 3.0 overview and update 2026</a></p><p><a href="https://www.anthropic.com/news/anthropic-raises-30-billion-series-g-funding-380-billion-post-money-valuation">Anthropic raises $30 billion in Series G funding at $380 billion post-money valuation</a></p><div><hr></div><p>That wraps up this week&#8217;s picks. Try a few tools, explore the releases, and save what fits your stack. More JavaScript finds and ecosystem highlights are coming in the next edition.</p>]]></content:encoded></item><item><title><![CDATA[9 Useful Chrome DevTools Features You Might Be Missing]]></title><description><![CDATA[A practical overview of lesser-known DevTools tricks that improve debugging, accessibility, and performance workflows.]]></description><link>https://jsdevspace.substack.com/p/9-useful-chrome-devtools-features</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/9-useful-chrome-devtools-features</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Wed, 14 Jan 2026 19:09:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!inJx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Developers use Chrome DevTools almost every day, but the toolset is so extensive that many features remain unnoticed. In this short overview, we&#8217;ll explore several DevTools capabilities that are genuinely useful in real-world work and often overlooked.</p><p>Maybe you already use some of them daily &#8212; or maybe these are exactly the features that will fill long-standing gaps in your debugging workflow.</p><p>Let&#8217;s get started.</p><div><hr></div><h2>Understanding Accessibility with DevTools</h2><p>Large companies often have dedicated accessibility teams, but smaller teams or solo developers still want to deliver accessible products. Chrome DevTools provides helpful tools for that.</p><h3>1 Simulating Vision Deficiencies</h3><p>DevTools can simulate visual impairments to show how users with different vision conditions see your UI:</p><p>Path: <code>DevTools &#8594; Rendering &#8594; Emulate vision deficiencies</code></p><p>Available simulations include:</p><ul><li><p>Blurred Vision</p></li><li><p>Reduced Contrast Sensitivity</p></li><li><p>Protanopia (no red)</p></li><li><p>Deuteranopia (no green)</p></li><li><p>Tritanopia (no blue)</p></li><li><p>Achromatopsia (no color)</p></li></ul><p>This is extremely helpful for testing visual UX beyond contrast ratios.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!inJx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!inJx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 424w, https://substackcdn.com/image/fetch/$s_!inJx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 848w, https://substackcdn.com/image/fetch/$s_!inJx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 1272w, https://substackcdn.com/image/fetch/$s_!inJx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!inJx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png" width="1456" height="648" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:648,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:141425,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!inJx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 424w, https://substackcdn.com/image/fetch/$s_!inJx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 848w, https://substackcdn.com/image/fetch/$s_!inJx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 1272w, https://substackcdn.com/image/fetch/$s_!inJx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb8a5eca-0fcb-40e4-9551-eceb588803d3_1922x855.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you don&#8217;t see the <em>Emulate vision deficiencies</em> option, open the <strong>Command Menu</strong> with <strong>Ctrl+Shift+P</strong>, type <strong>&#8220;Rendering&#8221;</strong>, select <strong>&#8220;Show Rendering&#8221;</strong>, and the panel will appear at the bottom of DevTools.</p><h3>2 Accessibility in Inspect Element</h3><p>Open DevTools, pick an element, and look beyond layout metrics like margin, width, or font-style. Chrome DevTools also exposes useful accessibility&#8209;related information.</p><h4><strong>Contrast: text contrast ratio</strong></h4><p>One of the most common accessibility issues on the web is insufficient text contrast. Chrome no longer shows contrast in the Accessibility panel &#8212; instead, you&#8217;ll find it inside the <strong>color picker</strong>:</p><p><code>Styles &#8594; color &#8594; click the color square &#8594; Contrast ratio</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ANAj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ANAj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 424w, https://substackcdn.com/image/fetch/$s_!ANAj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 848w, https://substackcdn.com/image/fetch/$s_!ANAj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 1272w, https://substackcdn.com/image/fetch/$s_!ANAj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ANAj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png" width="1456" height="654" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:654,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:251425,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ANAj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 424w, https://substackcdn.com/image/fetch/$s_!ANAj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 848w, https://substackcdn.com/image/fetch/$s_!ANAj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 1272w, https://substackcdn.com/image/fetch/$s_!ANAj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47b38ae1-30a8-4b41-8741-442ff1d72526_1877x843.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Google provides guidance on how to detect and fix contrast problems, along with recommended minimum values: <strong>3.0</strong> (minimum) and <strong>4.5</strong> (recommended).</p><p>DevTools can also display contrast using the newer <strong>APCA</strong> algorithm. To enable it:</p><p><code>Settings &#8594; Experiments &#8594; Enable new Advanced Perceptual Contrast Algorithm (APCA)</code></p><p>These built&#8209;in tools make it easier to validate essential accessibility properties without relying on external tooling.</p><h3>3 Accessibility Tree</h3><p>On the right panel, there is an <strong>Accessibility</strong> tab. Selecting an element in the DOM shows:</p><ul><li><p>how it appears in the <strong>accessibility tree</strong>, and</p></li><li><p>which semantic attributes are relevant (<code>aria-*</code>, roles, content).</p></li></ul><p>DevTools also offers a <strong>full accessibility tree</strong>, showing how a screen reader perceives the page. This makes it dramatically easier to audit semantic correctness.</p><p>To enable it:</p><ol><li><p>Enable <strong>Accessibility Tree</strong></p></li><li><p>Reload DevTools</p></li><li><p>Click the accessibility icon</p></li></ol><p>You will see only semantically relevant nodes, not every DOM element.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UvVQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UvVQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 424w, https://substackcdn.com/image/fetch/$s_!UvVQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 848w, https://substackcdn.com/image/fetch/$s_!UvVQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 1272w, https://substackcdn.com/image/fetch/$s_!UvVQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UvVQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png" width="1456" height="550" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:550,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:226410,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UvVQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 424w, https://substackcdn.com/image/fetch/$s_!UvVQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 848w, https://substackcdn.com/image/fetch/$s_!UvVQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 1272w, https://substackcdn.com/image/fetch/$s_!UvVQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4b96f5a-050a-409a-9c7b-18db5018eeca_1875x708.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>4 Code Coverage for JS + CSS</h3><p>Coverage shows which parts of your JS and CSS are actually used.</p><p>Open via:</p><p><code>DevTools &#8594; Cmd/Ctrl + Shift + P &#8594; &#8220;Show Coverage&#8221; &#8594; Record</code></p><p>You will see:</p><ul><li><p><strong>Unused Bytes</strong></p></li><li><p><strong>File URL</strong></p></li><li><p><strong>Type (JS/CSS)</strong></p></li></ul><p>Inside a file, unused code is highlighted in red, used in green. This helps when:</p><ul><li><p>optimizing bundle size</p></li><li><p>removing legacy code</p></li><li><p>evaluating library usage</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ry9v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ry9v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 424w, https://substackcdn.com/image/fetch/$s_!ry9v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 848w, https://substackcdn.com/image/fetch/$s_!ry9v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 1272w, https://substackcdn.com/image/fetch/$s_!ry9v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ry9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png" width="1456" height="674" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:232594,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ry9v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 424w, https://substackcdn.com/image/fetch/$s_!ry9v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 848w, https://substackcdn.com/image/fetch/$s_!ry9v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 1272w, https://substackcdn.com/image/fetch/$s_!ry9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5647c3ed-4244-4c96-89e6-e69e32e2fb28_1993x923.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>5 Lighthouse Accessibility Audit</h3><p>Lighthouse can run an automated accessibility audit:</p><ol><li><p>Open <strong>Lighthouse</strong></p></li><li><p>Pick <strong>Mode</strong> and <strong>Device</strong></p></li><li><p>Select only <strong>Accessibility</strong></p></li><li><p>Click <strong>Analyze page load</strong></p></li></ol><p>You will receive:</p><ul><li><p>an accessibility score (0&#8211;100)</p></li><li><p>actionable recommendations</p></li></ul><p>Note: Lighthouse does not guarantee full accessibility compliance &#8212; it checks only measurable criteria. Manual testing is still required.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gDy0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gDy0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 424w, https://substackcdn.com/image/fetch/$s_!gDy0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 848w, https://substackcdn.com/image/fetch/$s_!gDy0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 1272w, https://substackcdn.com/image/fetch/$s_!gDy0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gDy0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png" width="1456" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91949,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gDy0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 424w, https://substackcdn.com/image/fetch/$s_!gDy0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 848w, https://substackcdn.com/image/fetch/$s_!gDy0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 1272w, https://substackcdn.com/image/fetch/$s_!gDy0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F125f1fb1-f7d4-4a15-a1ed-005ee5e3add3_1881x723.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>6 CSS Overview</h3><p>CSS Overview provides a global snapshot of CSS usage:</p><p>It reports:</p><ul><li><p>all colors used in text, backgrounds, borders</p></li><li><p>contrast issues</p></li><li><p>font sizes &amp; line-heights</p></li><li><p>media queries</p></li></ul><p>Open via:</p><p><code>Cmd/Ctrl + Shift + P &#8594; &#8220;Capture Overview&#8221; &#8594; Record</code></p><p>Very useful for cleanup and design audits.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ebjg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ebjg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 424w, https://substackcdn.com/image/fetch/$s_!ebjg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 848w, https://substackcdn.com/image/fetch/$s_!ebjg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 1272w, https://substackcdn.com/image/fetch/$s_!ebjg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ebjg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png" width="1456" height="439" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:439,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69404,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ebjg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 424w, https://substackcdn.com/image/fetch/$s_!ebjg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 848w, https://substackcdn.com/image/fetch/$s_!ebjg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 1272w, https://substackcdn.com/image/fetch/$s_!ebjg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8716895-101e-4b6a-ba6a-f6e51f0b49c6_1912x576.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Console Tricks</h2><p>The Console is packed with hidden gems. Here are three highly practical ones.</p><h3>7 Edit the Whole Page Live</h3><p>Entering:</p><pre><code><code>document.designMode = "on"</code></code></pre><p>makes all elements editable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IOne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IOne!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 424w, https://substackcdn.com/image/fetch/$s_!IOne!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 848w, https://substackcdn.com/image/fetch/$s_!IOne!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 1272w, https://substackcdn.com/image/fetch/$s_!IOne!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IOne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png" width="1456" height="381" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:381,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70869,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IOne!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 424w, https://substackcdn.com/image/fetch/$s_!IOne!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 848w, https://substackcdn.com/image/fetch/$s_!IOne!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 1272w, https://substackcdn.com/image/fetch/$s_!IOne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb2b2d78-5447-438a-a1da-9952b960435a_1913x500.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Use cases:</p><ul><li><p>designers can modify text live</p></li><li><p>copywriters can adjust content without touching code</p></li><li><p>marketing teams can mock ad banners or hero sections</p></li></ul><p>Surprisingly useful.</p><h3>8 Quick Access to Inspected Elements</h3><p>DevTools keeps a history of inspected elements:</p><ul><li><p><code>$0</code> &#8212; most recently selected</p></li><li><p><code>$1</code> &#8212; previous</p></li><li><p><code>$2</code>, <code>$3</code>, <code>$4</code> &#8212; earlier selections</p></li></ul><p>Example:</p><pre><code><code>$0.style.background = "purple"</code></code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c-UA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c-UA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 424w, https://substackcdn.com/image/fetch/$s_!c-UA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 848w, https://substackcdn.com/image/fetch/$s_!c-UA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 1272w, https://substackcdn.com/image/fetch/$s_!c-UA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c-UA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png" width="1456" height="568" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:568,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:178989,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c-UA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 424w, https://substackcdn.com/image/fetch/$s_!c-UA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 848w, https://substackcdn.com/image/fetch/$s_!c-UA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 1272w, https://substackcdn.com/image/fetch/$s_!c-UA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43af2b1d-a9ac-4fb5-92f3-bd232bbece0a_1938x756.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Great for quick tests instead of manual <code>querySelector</code>.</p><h3>9 Live Expressions</h3><p>Click the <strong>eye icon</strong> in the Console to create a Live Expression &#8212; a JS expression that evaluates every 250 ms.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9eM9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9eM9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 424w, https://substackcdn.com/image/fetch/$s_!9eM9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 848w, https://substackcdn.com/image/fetch/$s_!9eM9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 1272w, https://substackcdn.com/image/fetch/$s_!9eM9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9eM9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png" width="772" height="133" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:133,&quot;width&quot;:772,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15562,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184574495?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9eM9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 424w, https://substackcdn.com/image/fetch/$s_!9eM9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 848w, https://substackcdn.com/image/fetch/$s_!9eM9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 1272w, https://substackcdn.com/image/fetch/$s_!9eM9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e597a26-016a-4eb6-9b0a-6f901abadb08_772x133.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Useful for watching:</p><ul><li><p>variable changes</p></li><li><p>DOM state</p></li><li><p>timers</p></li><li><p>scroll positions</p></li><li><p>FPS metrics</p></li></ul><h2>Final Thoughts</h2><p>Chrome DevTools contains far more capabilities than most developers regularly touch. This article showcased a handful of rarely discussed but extremely useful features.</p><p>If you want to go deeper, the <a href="https://developer.chrome.com/docs/devtools">official DevTools documentation</a> is the best place to start.</p><p>Good luck and happy debugging.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #33 — Fresh JavaScript Tools & Trends]]></title><description><![CDATA[A curated weekly digest of new libraries, releases, and ecosystem shifts shaping the modern JavaScript landscape.]]></description><link>https://jsdevspace.substack.com/p/friday-links-33-fresh-javascript</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-33-fresh-javascript</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 09 Jan 2026 12:29:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gRLT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The JavaScript ecosystem evolves quickly &#8212; new tools land, frameworks ship updates, and experiments turn into production-ready solutions overnight. <strong>Friday Links</strong> is your weekly shortcut through that noise: a focused snapshot of what&#8217;s worth paying attention to right now, without endless scrolling through timelines and repos.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gRLT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gRLT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 424w, https://substackcdn.com/image/fetch/$s_!gRLT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 848w, https://substackcdn.com/image/fetch/$s_!gRLT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 1272w, https://substackcdn.com/image/fetch/$s_!gRLT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gRLT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png" width="800" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:390,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:151119,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184015157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gRLT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 424w, https://substackcdn.com/image/fetch/$s_!gRLT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 848w, https://substackcdn.com/image/fetch/$s_!gRLT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 1272w, https://substackcdn.com/image/fetch/$s_!gRLT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac5234ba-9fbf-4501-9944-fa93cc9f6925_800x390.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Welcome to issue <strong>#33</strong>, covering the latest releases, interesting utilities, and trends in the JS world.</p><h2>OpenAI Launches ChatGPT Health</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UfGn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UfGn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 424w, https://substackcdn.com/image/fetch/$s_!UfGn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 848w, https://substackcdn.com/image/fetch/$s_!UfGn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 1272w, https://substackcdn.com/image/fetch/$s_!UfGn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UfGn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png" width="800" height="450" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88037,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184015157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UfGn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 424w, https://substackcdn.com/image/fetch/$s_!UfGn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 848w, https://substackcdn.com/image/fetch/$s_!UfGn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 1272w, https://substackcdn.com/image/fetch/$s_!UfGn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d72013f-cd85-4dd6-9d3b-cd1b7e4a8d23_800x450.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>OpenAI has introduced ChatGPT Health, a dedicated section inside ChatGPT focused entirely on personal health. It&#8217;s more than a themed chat &#8212; users can discuss symptoms, interpret lab results, track metrics over time, and get clear explanations of medical terms.</p><p>A key feature is integration with health and fitness services. Users can connect Apple Health, MyFitnessPal, and similar apps so the AI can analyze sleep, activity, nutrition, and wellness trends. In the U.S., it can also sync with electronic health records for reviewing test results and medical history.</p><p>Privacy is a major emphasis: ChatGPT Health uses separate infrastructure with layered encryption, and its data is not used to train base models or mixed with regular chats by default.</p><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://courses.csail.mit.edu/6.042/spring18/mcs.pdf">Mathematics for Computer Science</a></p><p><a href="https://webkit.org/blog/17660/introducing-css-grid-lanes/">Introducing CSS Grid Lanes</a></p><p><a href="https://www.htmhell.dev/adventcalendar/2025/27/">Replacing JS with just HTML</a></p><p><a href="https://blog.logrocket.com/react2shell-exploit/">React2Shell exploit: What happened and lessons learned</a></p><p><a href="https://devblogs.microsoft.com/devops/github-copilot-for-azure-boards/">Azure Boards integration with GitHub Copilot</a></p><p><a href="https://www.stefanjudis.com/today-i-learned/load-env-files-in-node-js-scripts/">Automatically load .env files in Node.js scripts</a></p><p><a href="https://krasimirtsonev.com/blog/article/streaming-json-in-just-200-lines-of-javascript">Streaming JSON in just 200 lines of JavaScript</a></p><p><a href="https://openwebf.com/en/blog/announcing-webf">Introducing WebF Beta: Bring JavaScript and the Web dev to Flutter</a></p><p><a href="https://github.com/vadimdemedes/ink">Ink 6.6</a> &#8212; a library for building CLI apps with React, used by Claude Code, Gemini CLI, and others.</p><p><a href="https://www.digitalocean.com/community/tutorials/olmo-3-allen-ai-open-source-llm">Olmo 3: Fully Open-Source LLM from AI2 (Models, Data, &amp; Code)</a></p><p><a href="https://railsdesigner.com/dialog-turboframe/">Use native dialog with Turbo (and no extra JavaScript)</a></p><p><a href="https://www.datadoghq.com/blog/datadog-database-research/">How microservice architectures have shaped the usage of database technologies</a></p><p><a href="https://marmelab.com/blog/2025/12/04/typescript-type-as-a-programming-language.html">TypeScript Types as a Programming Language</a></p><h2>&#9874;&#65039; Tools</h2><p>A new free open-source service called <a href="https://github.com/stamparm/maltrail">Maltrail</a> has been released for analyzing inbound and outbound network traffic and detecting malware. The project can:</p><ul><li><p>detect malicious domains, URLs, and IP addresses</p></li><li><p>identify harmful HTTP User-Agent strings</p></li><li><p>spot modern attack tools on workstations</p></li><li><p>provide strong network security without complex setup &#8212; installable in one click</p></li><li><p>help reveal viruses, miners, and other unwanted network-active software</p></li></ul><p><a href="https://npmgraph.js.org/">npmgraph</a> is a web-based tool that visualizes npm package dependencies. You can enter one or more package names (or upload a <code>package.json</code>) to see how their dependency graphs intersect. It also supports coloring packages by different metrics (like number of maintainers) and exporting the result as an SVG.</p><p><a href="https://www.usebruno.com/">Bruno</a> - Bruno is a fully local and Git-native solution to accelerate and secure API work and collaboration</p><p><a href="https://github.com/cloudcommunity/Free-Certifications">Free Certifications</a> - A curated list of free courses with certifications.</p><p><a href="https://github.com/max-sixty/worktrunk">worktrunk</a> - A CLI tool to manage multiple worktrees in Git repositories.</p><p><a href="https://github.com/gibbok/typescript-book">The Concise TypeScript Book</a> - A concise and practical guide to TypeScript, covering essential concepts and features.</p><p><a href="https://github.com/VibiumDev/vibium">Vibium</a> - Browser automation for AI agents and humans.</p><h2>&#128218; Libs</h2><p><a href="https://github.com/C4illin/ConvertX">ConvertX</a> - Self-hosted online file converter. Supports 1000+ formats.</p><p><a href="https://fabricjs.com/">Fabric.js 7</a> - is a JavaScript library for working with the HTML5 canvas. It runs in both browsers and Node (via node-canvas) and provides an object model for canvas elements along with SVG-to-canvas and canvas-to-SVG conversion. The project also offers many demos with full source code.</p><p><a href="https://github.com/parallax/jsPDF">jsPDF</a> - Client-side JavaScript PDF generation for everyone.</p><p><a href="https://github.com/jrouwe/JoltPhysics.js">JoltPhysics.js</a> - A JavaScript/WebAssembly port of the Jolt Physics engine for real-time physics simulation in web applications.</p><p><a href="https://github.com/martijnversluis/ChordSheetJS">ChordSheetJS</a> - A JavaScript library for parsing and formatting chords and chord sheets</p><p><a href="https://github.com/playcanvas/model-viewer">PlayCanvas Model Viewer</a> - A JavaScript library for displaying 3D models in the browser using WebGL and WebXR.</p><p><a href="https://github.com/recharts/recharts">recharts</a> - A composable charting library built on React components and D3.js.</p><p><a href="https://github.com/nats-io/nats.js">nats.js</a> - JavaScript client for Node.js, Bun, Deno and browser for NATS, the cloud native messaging system</p><p><a href="https://github.com/LironEr/bundlemon">bundlemon</a> - A tool to monitor and enforce bundle size budgets for JavaScript projects.</p><p><a href="https://github.com/Lulzx/tinypdf">tinypdf</a> - A lightweight PDF manipulation library for Node.js and the browser.</p><p><a href="https://github.com/BlueprintLabIO/markdown-ui">Markdown UI</a> - An open standard for rendering interactive widgets in plain Markdown.</p><h2>&#8986; Releases</h2><p><a href="https://pnpm.io/blog/releases/10.27">pnpm 10.27 Released</a></p><p><a href="https://github.com/prisma/prisma/releases/tag/7.2.0">Prisma 7.2</a></p><p><a href="https://github.com/denoland/deno/releases/tag/v2.6.4">Deno 2.6.4</a></p><p><a href="https://github.com/sindresorhus/file-type">file-type 21.2</a> - Detect the file type of a file, stream, or data</p><p><a href="https://github.com/taoqf/node-html-parser">Fast HTML Parser 7.0.2 Released</a></p><p><a href="https://middy.js.org/docs/upgrade/6-7/">Middy 7.0</a> brings middleware to AWS Lambda for Node.js, now with Durable Functions support.</p><p><a href="https://github.com/vercel/nft">Node File Trace 1.2</a> - determines the minimal set of files required for an app to execute.</p><p><a href="https://orange-orm.io/">Orange ORM 4.8</a> &#8212; an Object-Relational Mapper for Node, Bun, and Deno.</p><p><a href="https://github.com/yamadashy/repomix/releases/tag/v1.11.0">Repomix 1.11</a> &#8212; package an entire repository into a single, LLM-friendly file.</p><p><a href="https://github.com/bdeitte/hot-shots">hot-shots 12.0 / 12.1</a> &#8212; a Node.js client for statsd, DogStatsD, and Telegraf.</p><p><a href="https://github.com/color-js/color.js/releases/tag/v0.6.0">Color.js v0.6</a> &#8212; a standards-compliant color conversion and manipulation library &#8212; moves closer to its 1.0 release.</p><p><a href="https://nxos.org/changelog/release-announcement-nitrux-5-1-0/">Nitrux 5.1.0 Released</a> &#8212; a Linux distribution based on Debian, featuring the KDE Plasma desktop environment.</p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=CtHFlq6WXzg">I Reviewed 3 REAL React Native Apps (Here&#8217;s what I thought)</a></p><p><a href="https://www.youtube.com/watch?v=SmhLuxlUIkc">2026 UI/UX Design Trends - 2 of the Biggest Trends</a></p><p><a href="https://www.youtube.com/watch?v=chH2tlh_Vvk">An Open-Source Alternative to ElevenLabs</a></p><p><a href="https://www.youtube.com/watch?v=y7kvxIQQxtQ">PERN Stack Course: Build a Full Stack Product Store with React and Postgres</a></p><p><a href="https://www.youtube.com/watch?v=-vsh_GxC-vg">Build and Deploy a Real Time Crypto Screener &amp; Dashboard App | WebSocket API with Next.js</a></p><p><a href="https://www.youtube.com/watch?v=5KkaaYl5rwA">3 React Experts vs 1 React Interview Challenge | Kent C. Dodds, Jack Herrington &amp; Roadside Coder</a></p><p><a href="https://www.youtube.com/watch?v=uGp5kTPWaqY">Figma MCP vs Claude: UI Building Battle!</a></p><p><a href="https://www.youtube.com/watch?v=LZFEr9QDIVg">The Best React Native Tech Stack for 2026</a></p><p><a href="https://www.youtube.com/watch?v=Oh96LTqhWqg">How To Become Elite at Programming</a></p><p><a href="https://www.youtube.com/watch?v=UQ-nXHwdSFU">99% of Developers Don&#8217;t Get gRPC</a></p><h2>&#127908; Talks &amp; Podcasts</h2><p>No content this week &#128546;</p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>Google AI and Vercel Sponsor Tailwind After 80% Revenue Drop Caused by AI</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DW0e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DW0e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DW0e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DW0e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DW0e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DW0e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg" width="800" height="414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:414,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11342,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/184015157?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DW0e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 424w, https://substackcdn.com/image/fetch/$s_!DW0e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 848w, https://substackcdn.com/image/fetch/$s_!DW0e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!DW0e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F778b2c1f-a15a-48ba-9660-68f05c49975e_800x414.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Logan Kilpatrick</strong>, Head of Product at <strong>Google AI Studio</strong>, posted on <a href="https://x.com/OfficialLoganK/status/2009339263251566902">X</a> that the Google AI team is now a Tailwind sponsor and added:</p><blockquote><p><em>&#8220;I&#8217;d love to discuss how we can do more together.&#8221;</em></p></blockquote><p><strong>Guillermo Rauch</strong>, CEO of <strong>Vercel</strong>, also <a href="https://x.com/rauchg/status/2009336725043335338">confirmed</a> sponsorship.</p><h4>Why It Happened</h4><p>According to Wathan, the crisis was caused by a broken sales funnel. Previously:</p><ul><li><p>developers googled CSS questions,</p></li><li><p>landed on Tailwind&#8217;s documentation,</p></li><li><p>discovered paid products like component kits and templates.</p></li></ul><p>With modern LLMs such as <strong>Claude, ChatGPT, and Cursor</strong>, developers now generate code directly. Since LLMs were trained on Tailwind documentation, they produce accurate solutions <strong>without the developer visiting the site</strong>.</p><p>The result:</p><ul><li><p>documentation traffic dropped <strong>40% since early 2023</strong></p></li><li><p>Tailwind reached <strong>75 million downloads/month</strong>, making it more popular than ever</p></li><li><p>revenue collapsed despite adoption increasing</p></li></ul><h4>How Much Sponsorship Was Provided?</h4><p>Google and Vercel did not disclose amounts. Tailwind&#8217;s public sponsorship tiers start at:</p><ul><li><p><strong>$6,000/year</strong> (base tier)</p></li><li><p><strong>$60,000/year</strong> (top partner tier)</p></li></ul><p>Before today, Tailwind already received <strong>&#8776;$1.1M/year</strong> from <strong>29 corporate sponsors</strong>, including <strong>Cursor</strong>. Despite that, layoffs were unavoidable &#8212; only <strong>one engineer</strong> remains from the original four.</p><p>For now, three engineers have already lost their jobs, new sponsorship sums remain undisclosed, and only time will tell whether this was a one-time PR move or the start of <strong>systemic open-source funding from AI companies</strong>.</p><h3>OpenAI, Anthropic, and Google Share the Top Spot in Intelligence Index 4.0</h3><p>The platform <a href="https://artificialanalysis.ai/">Artificial Analysis</a> has published the fourth edition of its Intelligence Index, one of the strictest rankings of modern AI models. In this update, the report recorded an effective three-way tie between the largest players. Formally, GPT-5.2 (X-High) takes first place, but Claude Opus 4.5 from Anthropic and Gemini 3 Pro from Google trail by only a statistically insignificant margin.</p><p>The key change in version 4.0 is methodology. The authors deliberately toughened evaluation criteria and abandoned the familiar benchmarks that models have become highly optimized for in recent years. As a result, absolute scores dropped: where leaders previously scored above 70, the new ceiling is closer to 50. This isn&#8217;t model degradation &#8212; it&#8217;s an attempt to restore genuine difficulty to the measurements.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://t.co/HuUZ0XoFlO&#8221;>pic.twitter.com/HuUZ0XoFlO</a></p>&amp;mdash; Artificial Analysis (@ArtificialAnlys) <a href=&#8221;https://twitter.com/ArtificialAnlys/status/2008570646897573931?ref_src=twsrc%5Etfw&#8221;>January&quot;,&quot;full_text&quot;:&quot;New year, new Artificial Analysis Intelligence Index! Announcing Intelligence Index v4.0: incorporating 3 new evaluations, further aligning to real-word use and reducing saturation\n\nThe Artificial Analysis Intelligence Index is our synthesis metric for assessing generalist model &quot;,&quot;username&quot;:&quot;ArtificialAnlys&quot;,&quot;name&quot;:&quot;Artificial Analysis&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1810946341511766016/3mg9KIaQ_normal.jpg&quot;,&quot;date&quot;:&quot;2026-01-06T16:05:34.000Z&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/G9_eEAmagAEaqmb.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/HuUZ0XoFlO&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:45,&quot;retweet_count&quot;:90,&quot;like_count&quot;:845,&quot;impression_count&quot;:177853,&quot;expanded_url&quot;:null,&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><h3>Micro QuickJS: a JavaScript Engine for Embedded Devices Using Only 10 KB of RAM</h3><p><a href="https://bellard.org/">Fabrice Bellard</a> &#8212; creator of <strong>QEMU</strong>, <strong>FFmpeg</strong>, <strong>QuickJS</strong>, <strong>TinyGL</strong>, and <strong>TinyCC</strong> &#8212; has introduced <strong><a href="https://github.com/bellard/mquickjs">Micro QuickJS</a></strong>, an open-source JavaScript engine designed for embedded systems. It can <strong>compile and execute JavaScript programs with as little as 10 KB of RAM</strong>. The codebase is written in <strong>C</strong> and published on GitHub under the <strong>MIT license</strong>.</p><p><a href="https://2025.stateofhtml.com/en-US/">The results of the State of HTML 2025 survey are now available.</a></p><p>That&#8217;s a wrap for this week&#8217;s edition. If you discovered something useful, share it with teammates or send in a link you think deserves a spotlight next time. The JS ecosystem thrives through learning, remixing, and curiosity &#8212; see you next Friday for more tools, updates, and ideas.</p>]]></content:encoded></item><item><title><![CDATA[Git 3.0 Finally Retires Master: What Developers Need to Know]]></title><description><![CDATA[Git 3.0 Kills &#8220;Master&#8221;: A New Era for Default Branches]]></description><link>https://jsdevspace.substack.com/p/git-30-finally-retires-master-what</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/git-30-finally-retires-master-what</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Tue, 25 Nov 2025 09:33:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!41E_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!41E_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!41E_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 424w, https://substackcdn.com/image/fetch/$s_!41E_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 848w, https://substackcdn.com/image/fetch/$s_!41E_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 1272w, https://substackcdn.com/image/fetch/$s_!41E_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!41E_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png" width="1024" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:965318,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/179903463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!41E_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 424w, https://substackcdn.com/image/fetch/$s_!41E_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 848w, https://substackcdn.com/image/fetch/$s_!41E_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 1272w, https://substackcdn.com/image/fetch/$s_!41E_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd0d862c6-dbfa-450f-b869-9d759976d607_1024x798.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For more than a decade, every <code>git init</code> quietly created a <code>master</code> branch. Even after GitHub, GitLab, and nearly every major platform migrated to <code>main</code>, the Git CLI itself remained frozen in the past. But that era is finally ending.</p><p>Starting with <strong>Git 3.0</strong>, the default branch for new repositories will no longer be <strong>master</strong>, but <strong>main</strong> &#8212; aligning Git with the modern tooling ecosystem and long-standing community requests.</p><p>This isn&#8217;t just a symbolic rename. Git 3.0 arrives with several deep technical changes that will reshape workflows, security, and long-term compatibility across the entire developer ecosystem.</p><p>Welcome to the post-master world.</p><div><hr></div><h2><strong>Why Git Is Finally Switching to &#8220;main&#8221;</strong></h2><p>The request isn&#8217;t new.</p><p>Back in 2020, the Software Freedom Conservancy <a href="https://sfconservancy.org/news/2020/jun/23/gitbranchname/">asked</a> major projects to replace the term <em>master</em> with something neutral and inclusive. Within months:</p><ul><li><p>GitHub <a href="https://github.com/github/renaming">switched</a> its default branch to <strong>main</strong></p></li><li><p>GitLab offered automatic migration</p></li><li><p>CI systems, CD pipelines, and dev tooling followed suit</p></li></ul><p>And yet&#8230; Git itself didn&#8217;t change.</p><p>Users had to manually configure:</p><pre><code><code>git config --global init.defaultBranch main</code></code></pre><p>Git maintained the status quo to avoid breaking scripts, tutorials, legacy pipelines, and enterprise workflows that assumed <code>master</code>.</p><p>But as of <strong>Git 2.52</strong>, the team <a href="https://lore.kernel.org/lkml/xmqqh5usmvsd.fsf@gitster.g/">officially confirmed</a> the upcoming switch. Git 3.0 completes that shift &#8212; finally aligning the CLI with modern platforms.</p><p>For most developers, nothing will change. For companies with giant monorepos, old CI systems, and dusty Bash scripts still referencing <code>master</code>&#8230; this may introduce breaking surprises.</p><div><hr></div><h2><strong>What Else Is Coming in Git 3.0</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lAtD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lAtD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 424w, https://substackcdn.com/image/fetch/$s_!lAtD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 848w, https://substackcdn.com/image/fetch/$s_!lAtD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 1272w, https://substackcdn.com/image/fetch/$s_!lAtD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lAtD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png" width="400" height="167" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:167,&quot;width&quot;:400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50608,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/179903463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lAtD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 424w, https://substackcdn.com/image/fetch/$s_!lAtD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 848w, https://substackcdn.com/image/fetch/$s_!lAtD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 1272w, https://substackcdn.com/image/fetch/$s_!lAtD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e8a853b-18e1-4358-af0f-7c52d6a6c633_400x167.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p></p><p>Yes &#8212; the <code>main</code> migration is the headline. But the real story?<br>Git 3.0 contains several <strong>major under-the-hood upgrades</strong> developers should prepare for.</p><p>Let&#8217;s break them down.</p><div><hr></div><h2><strong>1. SHA-256 Becomes Git&#8217;s Default Hash</strong></h2><p>For 19 years, Git has relied on <strong>SHA-1</strong>, a hash once considered secure &#8212; until attacks proved otherwise.</p><p>Git already introduced optional SHA-256 support in past releases, but Git 3.0 makes it <strong>the default</strong>.</p><h3>Why This Matters</h3><ul><li><p><strong>Stronger cryptographic guarantees</strong></p></li><li><p><strong>Modern security standards</strong></p></li><li><p><strong>Future-proofing against collisions</strong></p></li></ul><h3>Example: Checking hash algorithm</h3><pre><code><code>git hash-object --hash=sha256 README.md</code></code></pre><p>Older SHA-1 hashes still work. Git includes a compatibility layer for mixed repos, but long-term:</p><p><strong>New repos = SHA-256</strong><br><strong>Old repos = supported but encouraged to migrate</strong></p><p>Expect enterprise-level migration tools to appear closer to Git 3.0&#8217;s release window.</p><div><hr></div><h2><strong>2. A New Object Storage Format</strong></h2><p>Git&#8217;s traditional <code>.git/objects</code> structure predates Docker, SSDs, and even modern Linux kernels.<br>Git 3.0 introduces a <strong>faster, optimized storage backend</strong> designed to reduce overhead, especially on Windows and macOS where Git filesystem I/O is notoriously slow.</p><h3>Potential Improvements</h3><ul><li><p>Faster cloning</p></li><li><p>Faster <code>git checkout</code></p></li><li><p>Reduced disk usage</p></li><li><p>Better performance for huge monorepos</p></li></ul><p>Example of inspecting storage backend:</p><pre><code><code>git count-objects -vH</code></code></pre><p>If you&#8217;ve ever worked in a repo with 5+ GB of history, this is <em>very</em> good news.</p><div><hr></div><h2><strong>3. Rust Is Becoming Part of Git&#8217;s Core</strong></h2><p>Rust in Git? Yes. And not just experiments.</p><p>Git has been incrementally rewriting performance-critical components in <strong>Rust</strong>, similar to how Linux kernel and Python ecosystems are slowly adopting it.</p><p>Git 3.0 is the first release where Rust integration becomes:</p><ul><li><p><strong>formal</strong></p></li><li><p><strong>officially supported</strong></p></li><li><p><strong>part of the build system</strong></p></li></ul><h3>Why Rust?</h3><ul><li><p>memory-safe</p></li><li><p>fast</p></li><li><p>perfect for complex low-level tooling</p></li><li><p>easier contribution path for modern developers</p></li></ul><p>Expect future Git releases to include more Rust rewrites, reducing segmentation faults, memory errors, and undefined behavior that C-based Git sometimes suffers from.</p><div><hr></div><h2><strong>What Developers Should Do Before Git 3.0 Lands</strong></h2><p>Git 3.0 isn&#8217;t here yet (expected around late 2026), but you <em>should</em> prepare your workflow.</p><div><hr></div><h3><strong>1. Check scripts that reference &#8220;master&#8221;</strong></h3><p>Look for anything like:</p><pre><code><code>git checkout master
git push origin master
git merge master</code></code></pre><p>Legacy CI/CD pipelines may break.</p><p>Rewrite them now:</p><pre><code><code>git checkout main
git push origin main
git merge main</code></code></pre><div><hr></div><h3><strong>2. Update deployment pipelines</strong></h3><p>Examples of pipelines that may break:</p><ul><li><p>GitHub Actions</p></li><li><p>GitLab CI</p></li><li><p>Jenkins</p></li><li><p>Bitbucket Pipelines</p></li><li><p>Bash deploy scripts</p></li></ul><p>Example for GitHub Actions:</p><pre><code><code>on:
  push:
    branches:
      - main</code></code></pre><p>If your workflows still use master, migrate ASAP.</p><div><hr></div><h3><strong>3. Audit internal repositories</strong></h3><p>Teams often have:</p><ul><li><p>onboarding docs</p></li><li><p>templates</p></li><li><p>boilerplates</p></li><li><p>shared Bash scripts</p></li><li><p>automation tools</p></li></ul><p>All of them should be updated to the new default branch terminology.</p><div><hr></div><h2><strong>Examples for Updating Existing Repos</strong></h2><h3>Rename master &#8594; main</h3><pre><code><code>git branch -m master main
git push -u origin main
git push origin --delete master</code></code></pre><p>Or on GitHub:</p><pre><code><code>gh repo edit --default-branch main</code></code></pre><div><hr></div><h2><strong>Will Existing Repositories Break?</strong></h2><p>No &#8212; Git is extremely conservative.</p><ul><li><p>Repos with <code>master</code> will continue to work.</p></li><li><p>Branch names will not be auto-migrated.</p></li><li><p>Git 3.0 only changes the <em>default branch name for new repos</em>.</p></li></ul><p>Still, older systems expecting <code>master</code> may require manual fixes.</p><div><hr></div><h2><strong>Why This Change Matters (Even If You Already Use main)</strong></h2><p>Git&#8217;s default branch name is referenced literally everywhere:</p><ul><li><p>programming tutorials</p></li><li><p>textbooks</p></li><li><p>CI examples</p></li><li><p>open-source templates</p></li><li><p>blog posts</p></li><li><p>YouTube tutorials</p></li><li><p>onboarding guides</p></li></ul><p>Git 3.0&#8217;s switch makes the ecosystem <strong>consistent</strong> for the first time since 2020.</p><p>It&#8217;s less about politics and more about reducing confusion for new developers.</p><div><hr></div><h2><strong>Git 3.0: A Symbolic Change With Real Technical Upgrades</strong></h2><p>To summarize:</p><h4>&#10004; Git 3.0 default branch = <strong>main</strong></h4><h4>&#10004; SHA-256 = default hash</h4><h4>&#10004; New optimized object storage</h4><h4>&#10004; Rust integration goes official</h4><h4>&#10004; Ecosystem modernized for future decades</h4><p>It&#8217;s the biggest Git update since 2.0 in 2014 &#8212; not because of the branch rename, but because Git is evolving into a faster, safer, more modern tool.</p><p>By the time Git 3.0 drops, most developers won&#8217;t notice the transition.</p><p>But the few who do &#8212; especially those running large enterprise systems &#8212; should start preparing now.</p>]]></content:encoded></item><item><title><![CDATA[How to Configure SEO in Next.js 16 (the Right Way)]]></title><description><![CDATA[A Complete Guide to Metadata, Sitemaps, Robots, Structured Data & Social Sharing in the App Router]]></description><link>https://jsdevspace.substack.com/p/how-to-configure-seo-in-nextjs-16</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/how-to-configure-seo-in-nextjs-16</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 21 Nov 2025 07:55:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8m2y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8m2y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8m2y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 424w, https://substackcdn.com/image/fetch/$s_!8m2y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 848w, https://substackcdn.com/image/fetch/$s_!8m2y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 1272w, https://substackcdn.com/image/fetch/$s_!8m2y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8m2y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png" width="1456" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:64082,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/179534878?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8m2y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 424w, https://substackcdn.com/image/fetch/$s_!8m2y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 848w, https://substackcdn.com/image/fetch/$s_!8m2y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 1272w, https://substackcdn.com/image/fetch/$s_!8m2y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd05aed-44cd-4e14-9867-5679b27061fd_1536x721.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1><strong>Introduction</strong></h1><p>Most Next.js projects never reach their full SEO potential. Common issues include:</p><ul><li><p>Pages are only partially indexed</p></li><li><p>Missing structured data</p></li><li><p>Incorrect Open Graph previews</p></li><li><p>Wrong canonical URLs</p></li><li><p>Broken sitemap configuration</p></li><li><p>Duplicate metadata</p></li></ul><p>Next.js 16 solves the majority of these problems &#8212; <em>if you configure it correctly</em>.<br>The App Router makes SEO predictable, typed, and deeply integrated into the framework.</p><p>In this guide, we cover everything you need to make your Next.js 16 project:</p><ul><li><p>fully indexable</p></li><li><p>fast for Core Web Vitals</p></li><li><p>optimized for Google Search &amp; AI Overviews</p></li><li><p>ready for rich snippets (FAQ, Article, Breadcrumbs, etc.)</p></li><li><p>shareable in social networks</p></li><li><p>correctly structured for sitemaps and robots.txt</p></li></ul><p>This is <strong>the modern SEO stack for Next.js 16</strong>.</p><div><hr></div><h1><strong>Rendering Strategies &amp; SEO in Next.js 16</strong></h1><p>Next.js 16 supports three primary rendering strategies:</p><h2><strong>1. SSG &#8212; Static Site Generation</strong></h2><p>Best for:</p><ul><li><p>marketing pages</p></li><li><p>blogs</p></li><li><p>product listings</p></li><li><p>documentation</p></li></ul><p>SEO impact:</p><ul><li><p><strong>Excellent</strong></p></li><li><p>Pre-rendered HTML</p></li><li><p>Fastest load time</p></li><li><p>Best choice for most public content</p></li></ul><p>In the App Router, SSG happens automatically when no dynamic data is used.</p><h2><strong>2. SSR &#8212; Server-Side Rendering</strong></h2><p>Best for:</p><ul><li><p>user dashboards</p></li><li><p>dynamic feeds</p></li><li><p>constantly updated content</p></li></ul><p>SEO impact:</p><ul><li><p><strong>Great</strong></p></li><li><p>HTML is fresh on every request</p></li><li><p>Slower than SSG but still SEO-friendly</p></li></ul><p>In App Router, you enable SSR by calling dynamic data inside server components or route handlers.</p><h2><strong>3. CSR &#8212; Client-Side Rendering</strong></h2><p>Best for:</p><ul><li><p>admin panels</p></li><li><p>private tools</p></li><li><p>dashboards</p></li></ul><p>SEO impact:</p><ul><li><p><strong>Poor</strong></p></li><li><p>Content appears only after hydration</p></li><li><p>Google <em>might</em> index it, but slowly and inconsistently</p></li></ul><p>Avoid CSR for public pages.</p><h2><strong>4. ISR &#8212; Incremental Static Regeneration</strong></h2><p>Best hybrid strategy.<br>You statically pre-render pages but allow them to revalidate in the background.</p><pre><code><code>export const revalidate = 60; // seconds
</code></code></pre><p>SEO impact:</p><ul><li><p><strong>Fantastic</strong> &#8212; combines SSG speed with SSR freshness</p></li><li><p>Ideal for blogs, product pages, news portals</p></li></ul><div><hr></div><h1><strong>Metadata API in Next.js 16</strong></h1><p>Next.js 16 uses a fully typed <code>Metadata</code> system that replaces:</p><p>&#10060; <code>&lt;Head&gt;</code> tags<br>&#10060; next-seo<br>&#10060; manually writing <code>&lt;meta&gt;</code> tags</p><h3><strong>Metadata configuration example: </strong><code>app/layout.tsx</code></h3><pre><code><code>import type { Metadata } from &#8220;next&#8221;;

export const metadata: Metadata = {
  metadataBase: new URL(&#8221;https://my-app.com&#8221;),
  title: {
    default: &#8220;My Awesome Site&#8221;,
    template: &#8220;%s | My Awesome Site&#8221;,
  },
  description: &#8220;Modern web platform built with Next.js 16.&#8221;,
  openGraph: {
    title: &#8220;My Awesome Site&#8221;,
    description: &#8220;Explore modern features and lightning-fast performance.&#8221;,
    url: &#8220;/&#8221;,
    siteName: &#8220;My Awesome Site&#8221;,
    images: [&#8221;/og-default.jpg&#8221;],
    locale: &#8220;en_US&#8221;,
    type: &#8220;website&#8221;,
  },
  twitter: {
    card: &#8220;summary_large_image&#8221;,
    title: &#8220;My Awesome Site&#8221;,
    description: &#8220;Next.js 16 powered web experience.&#8221;,
    images: [&#8221;/twitter-default.jpg&#8221;],
  },
  alternates: {
    canonical: &#8220;/&#8221;,
  },
};
</code></code></pre><div><hr></div><h1><strong>Dynamic Metadata Example</strong></h1><p>For blog posts or products:</p><pre><code><code>import type { Metadata } from &#8220;next&#8221;;
import { fetchArticle } from &#8220;@/lib/content-api&#8221;;

export async function generateMetadata(
  { params }: { params: { slug: string } }
): Promise&lt;Metadata&gt; {
  const article = await fetchArticle(params.slug);

  return {
    title: article.title,
    description: article.excerpt,
    alternates: {
      canonical: `/blog/${params.slug}`,
    },
    openGraph: {
      title: article.title,
      description: article.excerpt,
      url: `/blog/${params.slug}`,
      images: [article.coverImage],
      type: &#8220;article&#8221;,
    },
  };
}
</code></code></pre><div><hr></div><h1><strong>Robots.txt in Next.js 16</strong></h1><p>Next.js 16 generates robots.txt through <code>app/robots.ts</code>.</p><pre><code><code>import type { MetadataRoute } from &#8220;next&#8221;;

export default function robots(): MetadataRoute.Robots {
  return {
    rules: [
      {
        userAgent: &#8220;*&#8221;,
        allow: &#8220;/&#8221;,
        disallow: [&#8221;/admin/&#8221;, &#8220;/api/private/&#8221;],
      }
    ],
    sitemap: &#8220;https://my-app.com/sitemap.xml&#8221;,
  };
}
</code></code></pre><p>No physical file required.</p><div><hr></div><h1><strong>Sitemap Generation in Next.js 16</strong></h1><p>Native support via <code>app/sitemap.ts</code>:</p><pre><code><code>import type { MetadataRoute } from &#8220;next&#8221;;

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: &#8220;https://my-app.com&#8221;,
      lastModified: new Date(),
      changeFrequency: &#8220;monthly&#8221;,
      priority: 1.0,
    },
    {
      url: &#8220;https://my-app.com/blog&#8221;,
      lastModified: new Date(),
      changeFrequency: &#8220;weekly&#8221;,
      priority: 0.8,
    },
  ];
}
</code></code></pre><p>Add dynamic URLs by fetching from your DB:</p><pre><code><code>const posts = await getAllPosts();
return posts.map((post) =&gt; ({
  url: `https://my-app.com/blog/${post.slug}`,
  lastModified: post.updatedAt,
  changeFrequency: &#8220;weekly&#8221;,
  priority: 0.7,
}));
</code></code></pre><div><hr></div><h1><strong>Structured Data / JSON-LD in Next.js 16</strong></h1><p>Next.js 16 supports JSON-LD natively.</p><p>Example for an article page:</p><pre><code><code>export default function ArticlePage({ article }) {
  const articleJsonLd = {
    &#8220;@context&#8221;: &#8220;https://schema.org&#8221;,
    &#8220;@type&#8221;: &#8220;Article&#8221;,
    headline: article.title,
    description: article.excerpt,
    datePublished: article.publishedAt,
    author: {
      &#8220;@type&#8221;: &#8220;Person&#8221;,
      name: article.author,
    },
    image: article.coverImage,
  };

  return (
    &lt;&gt;
      &lt;script
        type=&#8221;application/ld+json&#8221;
        dangerouslySetInnerHTML={{
          __html: JSON.stringify(articleJsonLd)
        }}
      /&gt;
      {/* Content */}
    &lt;/&gt;
  );
}
</code></code></pre><p>Works for:</p><p>&#10004; FAQ<br>&#10004; Breadcrumbs<br>&#10004; Product<br>&#10004; Sitelinks SearchBox<br>&#10004; Organization<br>&#10004; Events</p><div><hr></div><h1><strong>Social SEO: Open Graph + Twitter Cards</strong></h1><p>Handled via Metadata API:</p><h3>Example for <code>page.tsx</code>:</h3><pre><code><code>export const metadata = {
  openGraph: {
    title: &#8220;Discover New Features&#8221;,
    description: &#8220;Next.js 16 powerful tools for SEO and performance.&#8221;,
    images: [&#8221;/blog/og-preview.jpg&#8221;],
    type: &#8220;article&#8221;,
  },
  twitter: {
    card: &#8220;summary_large_image&#8221;,
    title: &#8220;Discover New Features&#8221;,
    description: &#8220;Learn about Next.js 16&#8217;s SEO capabilities.&#8221;,
    images: [&#8221;/blog/og-preview.jpg&#8221;],
  },
};
</code></code></pre><div><hr></div><h1><strong>Canonical URLs &amp; Multilingual SEO</strong></h1><pre><code><code>export const metadata = {
  metadataBase: new URL(&#8221;https://my-app.com&#8221;),
  alternates: {
    canonical: &#8220;/blog/my-post&#8221;,
    languages: {
      &#8220;en-US&#8221;: &#8220;/en/blog/my-post&#8221;,
      &#8220;de-DE&#8221;: &#8220;/de/blog/my-post&#8221;,
    },
  },
};
</code></code></pre><div><hr></div><h1><strong>Best Practices for SEO in Next.js 16 (2025 Edition)</strong></h1><h3>&#10004; Always use Metadata API (never <code>&lt;Head&gt;</code>)</h3><h3>&#10004; Always set <code>metadataBase</code></h3><h3>&#10004; Avoid CSR for public pages</h3><h3>&#10004; Use ISR (<code>export const revalidate = &#8230;</code>)</h3><h3>&#10004; Add structured data for Articles, Products, FAQs</h3><h3>&#10004; Provide canonical links</h3><h3>&#10004; Optimize Core Web Vitals</h3><h3>&#10004; Ensure OG + Twitter images are <strong>1200x630</strong></h3><h3>&#10004; Add <code>sitemap</code> and <code>robots</code></h3><h3>&#10004; Validate everything in Google Search Console</h3><h3>&#10004; Use &#8220;AI-friendly&#8221; structured data for AEO (Answer Engine Optimization)</h3><p>FAQ + JSON-LD dramatically increases chances of being featured by Gemini, ChatGPT Search, Perplexity, DuckDuckGo AI.</p><div><hr></div><h1><strong>Common SEO Mistakes in Next.js</strong></h1><p>&#10060; Mixing <code>next-seo</code> with Metadata API<br>&#10060; Missing canonical links<br>&#10060; Using CSR for SEO pages<br>&#10060; Incorrect <code>robots.txt</code> blocking assets<br>&#10060; Forgetting Open Graph preview images<br>&#10060; Duplicate title/description tags<br>&#10060; Sitemap missing or wrong domain</p><div><hr></div><h1><strong>Conclusion</strong></h1><p>Next.js 16 provides one of the most complete SEO toolsets available in any modern framework:</p><ul><li><p>Typed Metadata API</p></li><li><p>Native structured data support</p></li><li><p>Native sitemap + robots</p></li><li><p>Advanced rendering strategies (SSG/SSR/ISR)</p></li><li><p>Automatic image optimization</p></li><li><p>Predictable URL routing</p></li><li><p>Fast server components</p></li></ul><p>When combined with modern SEO practices, correct metadata, structured data, and fast performance, your Next.js site becomes:</p><ul><li><p>easier to index</p></li><li><p>AI-overview ready</p></li><li><p>social-share optimized</p></li><li><p>faster for users</p></li><li><p>compliant with modern ranking signals (CWV, INP, AEO)</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Friday Links #32: Fresh JavaScript Trends & Tools]]></title><description><![CDATA[This Week&#8217;s Highlights in the JavaScript Ecosystem]]></description><link>https://jsdevspace.substack.com/p/friday-links-32-fresh-javascript</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-32-fresh-javascript</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 14 Nov 2025 06:50:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aLdu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The JavaScript ecosystem moves fast, and keeping track of the most meaningful updates can feel like a full-time job. This week&#8217;s collection brings together the tools, releases, and breakthroughs that stand out &#8212; the ones already shaping developer workflows, performance practices, and emerging patterns across the frontend and backend. Each link is selected to give readers practical insight into where the language and its tooling are heading right now.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aLdu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aLdu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 424w, https://substackcdn.com/image/fetch/$s_!aLdu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 848w, https://substackcdn.com/image/fetch/$s_!aLdu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 1272w, https://substackcdn.com/image/fetch/$s_!aLdu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aLdu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png" width="800" height="579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:579,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159097,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/178864160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aLdu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 424w, https://substackcdn.com/image/fetch/$s_!aLdu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 848w, https://substackcdn.com/image/fetch/$s_!aLdu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 1272w, https://substackcdn.com/image/fetch/$s_!aLdu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0fbb597-bcfb-4826-874e-41dcd849ca7c_800x579.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>GPT-5.1 Emerges as a Top Performer in Coding Benchmarks</h2><p>GPT-5.1 arrived in the API just a day after its ChatGPT release and is now integrated into the Codex coding agent along with new development tools. Built on the GPT-5 architecture, it inherits strong long-context reasoning, enabling deep repository analysis and high-quality patch generation.</p><p>On benchmarks, GPT-5.1 shows consistent gains over GPT-5. In SWE-bench Verified&#8212;where models fix real bugs&#8212;it achieved 76.3%, up from 72.8%, placing it among the best coding models available. Other tests (MMMU, GPQA, Tau&#178;-bench) also show targeted improvements, putting GPT-5.1 alongside the latest Claude Sonnet and Doubao-Seed-Code models.</p><p>OpenAI also upgraded Codex with gpt-5.1-codex and gpt-5.1-codex-mini, tuned for long code analysis and agent workflows. Two major tools were added to the API:</p><ul><li><p><code>apply_patch</code> for clean diff-based patch generation</p></li><li><p><code>shell</code> for safe, sandboxed command-line access</p></li></ul><p>These updates are already being integrated into IDEs and agent systems that rely on multi-step edits and test-driven feedback loops.</p><p>API pricing for GPT-5.1 Thinking remains the same as GPT-5:</p><ul><li><p>$1.25 per 1M input tokens</p></li><li><p>$10 per 1M output tokens</p></li><li><p>$0.125 per 1M cached tokens</p></li></ul><p>Prompt caching now lasts 24 hours, reducing costs for long sessions and large-project coding workflows.</p><h2>&#128220; Articles &amp; Tutorials</h2><p>Google researchers released a 50-page guide on building practical, useful AI agents. It covers agent architecture, how an LLM operates inside an agent, tool integration and configuration, multi-agent coordination, and methods for evaluating performance. Original guide is available <a href="https://www.kaggle.com/whitepaper-introduction-to-agents">here</a>.</p><p><a href="https://nilostolte.github.io/tech/articles/ZigCool.html">Why is Zig so Cool?</a></p><p><a href="https://medium.com/@sohail_saifi/should-you-stop-using-prisma-421aba045846">Should You Stop Using Prisma? Why Database ORMs Might Be the Worst Thing That Happened to Backend Development</a></p><p><a href="https://github.blog/developer-skills/programming-languages-and-frameworks/typescripts-rise-in-the-ai-era-insights-from-lead-architect-anders-hejlsberg/">TypeScript&#8217;s rise in the AI era: Insights from Lead Architect, Anders Hejlsberg</a></p><p><a href="https://piccalil.li/blog/programming-principles-for-self-taught-front-end-developers/">Programming principles for self taught front-end developers</a></p><p><a href="https://frontendmasters.com/blog/perfectly-pointed-tooltips-to-the-corners/">Perfectly Pointed Tooltips: To The Corners</a></p><p><a href="https://ergaster.org/posts/2025/10/29-vscode-to-helix/">From VS Code to Helix</a></p><p><a href="https://spin.atomicobject.com/animations-threejs-gsap/">Create Sick Web Animations in Three.js with GSAP</a></p><p><a href="https://github.com/anthropics/claude-cookbooks/blob/293cde3d3fe1e29ce90b535ccfd311c289302d0c/coding/prompting_for_frontend_aesthetics.ipynb">Frontend Aesthetics: A Prompting Guide</a></p><p><a href="https://engineering.fb.com/2025/11/11/web/stylex-a-styling-library-for-css-at-scale/">StyleX: A Styling Library for CSS at Scale</a></p><p><a href="https://marmelab.com/blog/2025/10/29/from-graphql-to-zod.html">From GraphQL to Zod: Simplifying Arte&#8217;s API Architecture</a></p><p><a href="https://developers.redhat.com/articles/2025/11/04/3-mcp-servers-you-should-be-using">3 MCP servers you should be using (safely)</a></p><p><a href="https://blog.yakkomajuri.com/blog/python-to-node">Why we migrated from Python to Node.js</a></p><p><a href="https://physical-ai.ghost.io/a-one-file-pwa-to-tell-you-when-time-is-lying/">A One File PWA to Tell You When Time Is Lying</a></p><p><a href="https://minimaxir.com/2025/11/nano-banana-prompts/">Nano Banana can be prompt engineered for extremely nuanced AI image generation</a></p><p><a href="https://blog.tensorflow.org/2020/05/pose-animator-open-source-tool-to-bring-svg-characters-to-life.html">Pose Animator - An open source tool to bring SVG characters to life in the browser via motion capture</a></p><h2>&#9874;&#65039; Tools</h2><p><a href="https://filemock.com/">FileMock: A Free Tool for Generating Test Files in Any Format</a></p><p><a href="https://github.com/cloudflare/vibesdk">vibesdk</a> - An open-source vibe coding platform that helps you build your own vibe-coding platform, built entirely on Cloudflare stack</p><p><a href="https://github.com/Vanilagy/mediabunny">Mediabunny</a>: Read and Convert Media Files Directly in the Browser</p><p><a href="https://github.com/attogram/bash-screensavers">bash-screensavers</a> &#8211; Turn your idle shell into a visual playground.</p><p><a href="https://github.com/google/osv-scanner">Google osv-scanner</a></p><p><a href="https://placeholderimage.io/">Placeholder Image Generator</a></p><h3>Tiny Docker Healthcheck Tools That Cut Image Size by Megabytes</h3><p>A developer released <a href="https://github.com/tarampampam/microcheck">microcheck</a>, a set of ultra-small, statically compiled utilities designed specifically for Docker healthchecks. Instead of installing curl or wget&#8212;adding 10MB or more to an image&#8212;you can drop in a single 70&#8211;500 KB binary that works even in scratch and distroless environments.</p><p>The toolkit includes:</p><ul><li><p><code>httpcheck</code> &#8212; HTTP endpoint checks (~75 KB)</p></li><li><p><code>httpscheck</code> &#8212; same, with TLS and protocol autodetection (~500 KB)</p></li><li><p><code>portcheck</code> &#8212; TCP/UDP port checks (~70 KB)</p></li></ul><p>Each tool returns standard Docker exit codes (0 = healthy, 1 = unhealthy), making them ideal for bare Docker setups or runtimes without built-in healthchecks.</p><p>Example:</p><pre><code><code># Before (+10MB)
RUN apt update &amp;&amp; apt install -y curl
HEALTHCHECK CMD curl -f http://localhost:8080/ || exit 1

# After (+75KB)
COPY --from=ghcr.io/tarampampam/microcheck /bin/httpcheck /bin/httpcheck
HEALTHCHECK CMD [&#8221;httpcheck&#8221;, &#8220;http://localhost:8080/&#8221;]</code></code></pre><p>They support major architectures (x86_64, ARM, ppc64le, s390x) and provide ready-to-use images.</p><p>Source code, examples, and binaries: <a href="https://jsdev.space/friday/friday-32/microcheck">https://github.com/tarampampam/microcheck</a></p><p><a href="https://github.com/raghavyuva/nixopus">Nixopus</a> - Open Source alternative to vercel, heroku, netlify with Terminal integration, and Self Hosting capabilities.</p><p><a href="https://github.com/podman-desktop/podman-desktop">podman-desktop</a> - Podman Desktop is the best free and open source tool to work with Containers and Kubernetes for developers. Get an intuitive and user-friendly interface to effortlessly build, manage, and deploy containers and Kubernetes &#8212; all from your desktop.</p><p><a href="https://react-syntax-highlighter.github.io/react-syntax-highlighter/demo/">React Syntax Highlighter Demo</a></p><p><a href="https://github.com/lone-cloud/gerbil">Gerbil</a> - A desktop app to easily run Large Language Models locally.</p><p><a href="https://github.com/OneUptime/oneuptime">OneUptime</a>: The Complete Open-Source Observability Platform</p><h2>&#128218; Libs</h2><p><a href="https://github.com/wavetermdev/waveterm">waveterm</a> - An open-source, cross-platform terminal for seamless workflows</p><p><a href="https://github.com/sindresorhus/image-dimensions">image-dimensions</a> - Get the dimensions of an image</p><p><a href="https://github.com/WeiboAI/VibeThinker">VibeThinker</a> - Tiny Model, Big Logic: Diversity-Driven Optimization Elicits Large-Model Reasoning Ability in VibeThinker-1.5B</p><h2>&#8986; Releases</h2><p><a href="https://nodejs.org/en/blog/release/v25.2.0">Node.js v25.2.0 (Current)</a></p><p><a href="https://github.com/ekalinin/sitemap.js/releases/tag/9.0.0">Sitemap.js 9.0</a>: A Faster Way to Generate XML Sitemaps</p><p><a href="https://github.com/sindresorhus/debounce">Debounce 3.0</a>: A Modern ESM Utility for Delaying Function Calls</p><p><a href="https://github.com/dcodeIO/bcrypt.js">bcrypt.js 3.0.3</a>: Faster Pure-JS Password Hashing</p><p><a href="https://github.com/ruilisi/fortune-sheet">Fortune Sheet 1.0.4</a> &#8211; Google Sheets/Excel-style spreadsheet control.</p><p><a href="https://github.com/mongodb/node-mongodb-native/releases/tag/v7.0.0">MongoDB Node.js Driver 7.0 Released</a></p><p><a href="https://github.com/prabhuignoto/react-chrono">react-chrono 3.2.1</a> - Modern Timeline Component for React</p><p><a href="https://github.com/vitaly-t/pg-promise">pg-promise v12.3</a>: A More Powerful Postgres Client for Node.js</p><p><a href="https://github.com/markedjs/marked">Marked 17.0</a> &#8211; Markdown parser and compiler.</p><p><a href="https://github.com/fastify/fastify/releases/tag/v5.6.2">Fastify 5.6.2 released</a></p><p><a href="https://resend.com/blog/react-email-5">React Email 5.0 Released</a></p><p><a href="https://github.com/prisma/prisma/releases/tag/6.19.0">Prisma 6.19</a>, <a href="https://storybook.js.org/blog/storybook-10/">Storybook 10</a>, <a href="https://htmx.org/essays/the-fetchening/">htmx 4.0 Alpha 1</a>,</p><p><a href="https://github.com/Hacker0x01/react-datepicker">React Date Picker 8.9</a>, <a href="https://github.com/rjsf-team/react-jsonschema-form">react-jsonschema-form 6.1</a>, <a href="https://github.com/invertase/react-native-apple-authentication">React Native Apple Authentication 2.5</a>,</p><p><a href="https://bun.com/blog/bun-v1.3.2">Bun v1.3.2</a>, <a href="https://github.com/helm/helm/releases/tag/v4.0.0">Helm v4.0.0</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=AnkhdbrrTlo">Why Ripple.js Is The Most Interesting Framework of 2025</a></p><p><a href="https://www.youtube.com/watch?v=PJ0ARnSKfgw">MERN Stack Project: Video Calling Interview Platform with React &amp; Node.js</a></p><p><a href="https://www.youtube.com/watch?v=LsQpSGQ-sq4">This React Document Editor (DOCX) Is All Your App Needs</a></p><p><a href="https://www.youtube.com/watch?v=5cAjuIxIvHg">Extremely Underrated Programming Skills</a></p><p><a href="https://www.youtube.com/watch?v=OZ6qKoq7RJU">The magic of auto-fit and auto-fill (and the difference between them)</a></p><p><a href="https://www.youtube.com/watch?v=7gCCXCSs734">account suspended from github</a></p><p><a href="https://www.youtube.com/watch?v=OGYEXGy8ca4">AWS Explained: The Most Important AWS Services To Know</a></p><p><a href="https://www.youtube.com/watch?v=6ctoS84iFCw">$100 to train an LLM</a></p><p><a href="https://www.youtube.com/watch?v=2TryYQIuUqI">AI Fatigue is real</a></p><p><a href="https://www.youtube.com/watch?v=4J53WvB1-4E">From QA to DevOps - How I Learned DevOps to future-proof my career</a></p><h2>&#127908; Talks &amp; Podcasts</h2><p>No content this week &#128546;</p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>OpenAI May Spend Over $5B a Year Running Sora, Analysts Say</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gmP8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gmP8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 424w, https://substackcdn.com/image/fetch/$s_!gmP8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 848w, https://substackcdn.com/image/fetch/$s_!gmP8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 1272w, https://substackcdn.com/image/fetch/$s_!gmP8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gmP8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png" width="800" height="450" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:228196,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/178864160?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gmP8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 424w, https://substackcdn.com/image/fetch/$s_!gmP8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 848w, https://substackcdn.com/image/fetch/$s_!gmP8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 1272w, https://substackcdn.com/image/fetch/$s_!gmP8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faae39023-8d50-4cd8-9b40-ff71d4270377_800x450.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Analysts estimate that OpenAI spends around $15 million per day to operate its video generator Sora&#8212;over $5 billion annually. The calculation is based on an estimated $1.3 cost per 10-second clip and a daily volume of roughly 11 million videos.</p><p>Despite these huge expenses, OpenAI is prioritizing market dominance: grow the user base now, collect training data, and monetize later. Free access to Sora helps expand adoption while generating massive datasets to improve model quality.</p><p>Sam Altman has already confirmed that free video generation will be reduced over time. According to him, no ad model can cover the current cost of producing short videos, so scaling and training remain the priority over immediate profit.</p><p>The towering costs highlight how resource-intensive large-scale AI video generation is&#8212;and reinforce OpenAI&#8217;s strategy to lead the generative video market.</p><p>Anthropic <a href="https://www.anthropic.com/news/anthropic-invests-50-billion-in-american-ai-infrastructure">announced</a> a major $50B investment program to expand AI infrastructure in the US. The company plans to build its own data centers in partnership with Fluidstack, a UK provider of GPU cloud services and custom AI-optimized clusters. According to Anthropic, the initiative is essential to meet rising demand for Claude models and to secure the compute needed for advancing frontier AI research.</p><h3>Cloudflare Adds Python Support to Workflows for AI and Data Pipelines</h3><p>Cloudflare <a href="https://blog.cloudflare.com/python-workflows/">has expanded</a> its Workflows service by adding full Python support, previously limited to TypeScript. Workflows is used to orchestrate multi-step processes on the Workers platform, making it useful for automation, data processing, and AI agent pipelines.</p><p>Python support opens the door for developers working in AI/ML and large-scale data workflows. Use cases include data pipeline orchestration, ML model training, and complex agent systems&#8212;benefiting from built-in error handling and state persistence.</p><p>The feature is powered by Pyodide, a WebAssembly port of CPython, allowing Python code to run directly in the browser or on Cloudflare&#8217;s servers without installing a local interpreter. This makes Workflows a more flexible and accessible tool for enterprise and research applications.</p><p>Python integration also simplifies bringing existing Python libraries into Workflows, accelerating development and deployment of cloud-based solutions.</p><h3>Report: 65% of Top AI Companies Leaked Secrets on GitHub</h3><p>A new report from cloud security firm <a href="https://www.wiz.io/">Wiz</a> found that 65% of companies listed in the Forbes AI 50 leaked API keys, tokens, or other credentials on GitHub. Experts warn that such leaks could expose private models, training data, or internal infrastructure, creating serious security risks.</p><p>Most exposed secrets were found in Jupyter Notebooks and Python scripts, including tokens for Hugging Face, Azure, and W&amp;B. In one case, a compromised Hugging Face token could have granted access to roughly a thousand private models, highlighting the severity of the issue.</p><p>Wiz publicly named only two companies&#8212;ElevenLabs and LangChain&#8212;that responded quickly and addressed their leaks. Nearly half of the other organizations did not reply to disclosure notifications, leaving their data and models potentially vulnerable.</p><p>Researchers emphasize that GitHub leaks remain one of the most common security failures in the AI ecosystem. They recommend strict secret-management practices, encryption, and automated pre-commit checks to prevent accidental exposure of sensitive credentials.</p><p><a href="https://www.anthropic.com/news/disrupting-AI-espionage%5D">Disrupting the first reported AI-orchestrated cyber espionage campaign</a></p><p><a href="https://x.com/omar_quraishi/status/1988518627859951986">Pakistani newspaper mistakenly prints AI prompt with the article</a></p><div><hr></div><p>That wraps up this week&#8217;s highlights. The JavaScript world continues evolving through a mix of new frameworks, refined utilities, and ambitious platform updates &#8212; and following these shifts helps developers stay sharp and build better software. Check back next Friday for another curated roundup of tools and trends worth your attention.</p>]]></content:encoded></item><item><title><![CDATA[JavaScript Just Leveled Up: ES2025 - You’ll Fall in Love With]]></title><description><![CDATA[JavaScript Just Got Beautiful &#8212; The New ES2025 Syntax Revolution]]></description><link>https://jsdevspace.substack.com/p/javascript-just-leveled-up-es2025</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/javascript-just-leveled-up-es2025</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 07 Nov 2025 06:47:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!clmP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!clmP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!clmP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 424w, https://substackcdn.com/image/fetch/$s_!clmP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 848w, https://substackcdn.com/image/fetch/$s_!clmP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 1272w, https://substackcdn.com/image/fetch/$s_!clmP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!clmP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png" width="789" height="389" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:389,&quot;width&quot;:789,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:60046,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/178244833?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!clmP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 424w, https://substackcdn.com/image/fetch/$s_!clmP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 848w, https://substackcdn.com/image/fetch/$s_!clmP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 1272w, https://substackcdn.com/image/fetch/$s_!clmP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa6e2b21-20ec-4a45-bd5a-036923f09ddb_789x389.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As front-end developers, staying ahead of JavaScript&#8217;s evolution isn&#8217;t optional &#8212; it&#8217;s survival.<br>When the ES2025 proposals dropped, many developers (myself included) were <em>shocked</em>. JavaScript could finally be written like poetry &#8212; expressive, readable, and ridiculously elegant.</p><p>Let&#8217;s explore some of these groundbreaking new features that are shaping the next generation of JS.</p><div><hr></div><h2>&#127919; Pattern Matching &#8212; Goodbye <code>if</code>/<code>else</code> Hell</h2><p>Tired of endless conditionals?<br>Pattern matching transforms branching logic into declarative expressions.</p><p><strong>Old approach:</strong></p><pre><code><code>function handleResponse(response) {
  if (response.status === 200 &amp;&amp; response.data) {
    return response.data;
  } else if (response.status === 401) {
    throw new Error(&#8217;Unauthorized&#8217;);
  } else if (response.status === 404) {
    throw new Error(&#8217;Not Found&#8217;);
  } else if (response.status &gt;= 500) {
    throw new Error(&#8217;Server Error&#8217;);
  } else {
    throw new Error(&#8217;Unknown Error&#8217;);
  }
}</code></code></pre><p><strong>New ES2025 magic:</strong></p><pre><code><code>function handleResponse(response) {
  return match (response) {
    when ({ status: 200, data }) -&gt; data
    when ({ status: 401 }) -&gt; throw new Error(&#8217;Unauthorized&#8217;)
    when ({ status: 404 }) -&gt; throw new Error(&#8217;Not Found&#8217;)
    when ({ status: s if s &gt;= 500 }) -&gt; throw new Error(&#8217;Server Error&#8217;)
    default -&gt; throw new Error(&#8217;Unknown Error&#8217;)
  };
}</code></code></pre><p>It&#8217;s concise, readable, and surprisingly powerful &#8212; like switch statements on steroids.</p><p><strong>Array pattern matching:</strong></p><pre><code><code>const analyzeArray = (arr) =&gt; match (arr) {
  when ([]) -&gt; &#8220;Empty array&#8221;
  when ([x]) -&gt; `Single element: ${x}`
  when ([x, y]) -&gt; `Two elements: ${x}, ${y}`
  when ([first, ...rest]) -&gt; `First: ${first}, Remaining: ${rest.length}`
};</code></code></pre><div><hr></div><h2>&#128640; Pipeline Operators &#8212; Fluent, Elegant Data Flow</h2><p>The pipeline operator <code>|&gt;</code> lets you chain operations without deep nesting.</p><p><strong>Old way (callback spaghetti):</strong></p><pre><code><code>const result = encodeURIComponent(
  JSON.stringify(
    Object.values(
      Object.fromEntries(
        Object.entries(data).filter(([k, v]) =&gt; v != null)
      )
    )
  )
);</code></code></pre><p><strong>ES2025 way:</strong></p><pre><code><code>const result = data
  |&gt; Object.entries(%)
  |&gt; (%.filter(([k, v]) =&gt; v != null))
  |&gt; Object.fromEntries(%)
  |&gt; Object.values(%)
  |&gt; JSON.stringify(%)
  |&gt; encodeURIComponent(%);</code></code></pre><p>Readable. Linear. Beautiful.<br>And yes &#8212; it supports <strong>async pipelines</strong> too!</p><div><hr></div><h2>&#128274; Record &amp; Tuple &#8212; True Immutable Data Structures</h2><p>Finally, native immutability without libraries like Immutable.js.</p><pre><code><code>// Record &#8212; immutable object
const user = #{
  id: 1,
  name: &#8220;Alice&#8221;,
  profile: #{
    age: 25,
    email: &#8220;alice@example.com&#8221;
  }
};

// Tuple &#8212; immutable array
const settings = #[&#8221;dark&#8221;, &#8220;en-US&#8221;, true];</code></code></pre><p>Records and Tuples compare by <strong>value</strong>, not by reference:</p><pre><code><code>#{ x: 1, y: 2 } === #{ x: 1, y: 2 } // true!</code></code></pre><p><strong>In React:</strong></p><pre><code><code>const UserCard = React.memo(({ user }) =&gt; {
  const processed = #{
    ...user,
    displayName: `${user.firstName} ${user.lastName}`
  };
  return &lt;div&gt;{processed.displayName}&lt;/div&gt;;
});</code></code></pre><p>No <code>useMemo</code>, no shallow comparison headaches.</p><div><hr></div><h2>&#128176; Decimal Type &#8212; Precision You Can Bank On</h2><p>No more <code>0.1 + 0.2 !== 0.3</code> memes.</p><pre><code><code>const total = 0.1m + 0.2m; // 0.3m
const tax = 19.99m * 0.08m; // 1.5992m

function calculateOrder(price, qty, taxRate) {
  const subtotal = price * qty;
  const tax = subtotal * taxRate;
  return (subtotal + tax).round(2);
}</code></code></pre><p>The new <code>Decimal</code> type (<code>m</code> suffix) gives <strong>exact arithmetic</strong> &#8212; crucial for finance, billing, and scientific calculations.</p><div><hr></div><h2>&#128260; Iterator Helpers &#8212; Superpowers for Generators</h2><pre><code><code>function* fibonacci() {
  let [a, b] = [0, 1];
  while (true) { yield a; [a, b] = [b, a + b]; }
}

const evenSquares = fibonacci()
  .take(20)
  .filter(n =&gt; n % 2 === 0)
  .map(n =&gt; n ** 2)
  .toArray();</code></code></pre><p>Readable streaming, chainable processing, and lazy evaluation &#8212; <em>finally built-in</em>.</p><div><hr></div><h2>&#128230; Secure Module Imports &#8212; Explicit and Type-Safe</h2><pre><code><code>import config from &#8216;./config.json&#8217; with { type: &#8216;json&#8217; };
import styles from &#8216;./styles.css&#8217; with { type: &#8216;css&#8217; };
import wasmModule from &#8216;./algo.wasm&#8217; with { type: &#8216;wasm&#8217; };</code></code></pre><p>Supports conditional and environment-based imports:</p><pre><code><code>const config = await import(
  `./config-${process.env.NODE_ENV}.json`,
  { with: { type: &#8216;json&#8217; } }
);</code></code></pre><div><hr></div><h2>&#128737;&#65039; Try Expressions &#8212; Elegant Error Handling</h2><pre><code><code>const data = try fetchUserData(userId) catch (err) {
  console.warn(&#8217;Failed to fetch user:&#8217;, err);
  return getDefaultUser();
};</code></code></pre><p>Functional, concise, and expressive &#8212; no need for nested <code>try/catch</code>.</p><div><hr></div><h2>&#9200; Temporal API &#8212; The End of Date() Confusion</h2><p>Finally, JavaScript dates that make sense.</p><pre><code><code>const now = Temporal.Now.instant();
const birthday = Temporal.PlainDate.from(&#8217;2024-01-15&#8217;);
const meeting = Temporal.ZonedDateTime.from(&#8217;2024-12-25T10:30:00[Asia/Shanghai]&#8217;);
const nextWeek = now.add({ days: 7 });</code></code></pre><p>It&#8217;s like Luxon and Day.js, but <strong>native</strong>.</p><div><hr></div><h2>&#127912; Smarter Template Strings &#8212; Write HTML, SQL, and Styles Safely</h2><pre><code><code>const renderHTML = (title, content) =&gt; html`
  &lt;div class=&#8221;container&#8221;&gt;
    &lt;h1&gt;${title}&lt;/h1&gt;
    &lt;div&gt;${content}&lt;/div&gt;
  &lt;/div&gt;
`.dedent();</code></code></pre><p>They now support <strong>auto indentation removal</strong>, <strong>safe variable insertion</strong>, and <strong>context-specific escaping</strong> for HTML, SQL, and CSS templates.</p><div><hr></div><h2>&#128161; Practical Tips for Adopting ES2025</h2><ul><li><p><strong>Start small:</strong> Try pipeline operators and pattern matching first.</p></li><li><p><strong>Use Babel plugins:</strong> Many features can be used today via transformations.</p></li><li><p><strong>Train your team:</strong> Modern syntax means modern mental models.</p></li><li><p><strong>Use TypeScript:</strong> Combine these features with static typing for the ultimate developer experience.</p></li></ul><div><hr></div><h2>&#129517; The Future Is Already Here</h2><p>ES2025 is more than a syntax upgrade &#8212; it&#8217;s a mindset shift.<br>Cleaner, safer, and more expressive code will change how we reason about logic and structure.</p><p>JavaScript just became <em>beautifully powerful</em>.<br>Now it&#8217;s your turn to write it that way.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #31 — New JavaScript Tools and October Highlights]]></title><description><![CDATA[Fresh JavaScript Tools and Updates This Week]]></description><link>https://jsdevspace.substack.com/p/friday-links-31-new-javascript-tools</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-31-new-javascript-tools</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 31 Oct 2025 13:48:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JVkH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome to <strong>Friday Links #31</strong>, where we round up the most interesting news, tools, and experiments in the JavaScript ecosystem. This week&#8217;s edition features new framework releases, UI updates, testing improvements, and performance-focused utilities &#8212; all designed to make your workflow faster and smarter.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JVkH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JVkH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 424w, https://substackcdn.com/image/fetch/$s_!JVkH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 848w, https://substackcdn.com/image/fetch/$s_!JVkH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 1272w, https://substackcdn.com/image/fetch/$s_!JVkH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JVkH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png" width="800" height="625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:625,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:679964,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/177654608?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JVkH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 424w, https://substackcdn.com/image/fetch/$s_!JVkH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 848w, https://substackcdn.com/image/fetch/$s_!JVkH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 1272w, https://substackcdn.com/image/fetch/$s_!JVkH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d29f1eb-5729-42b8-8ae4-3f28df3e1e63_800x625.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>DeepSeek V3.1 Tops AI Stock Trading Challenge &#8212; With Some Fine Print</h2><p>A new open benchmark called <strong>AI-Trader</strong> is testing how well AI models can handle real-world stock trading. Each model starts with <strong>$10,000</strong> and trades Nasdaq-100 stocks using real-time prices and financial news.</p><p>After the first month, <strong>DeepSeek v3.1</strong> leads with a <strong>+16.46%</strong> return, followed by <strong>MiniMax-M2 (+12.03%)</strong>, <strong>GPT-5 (+9.98%)</strong>, and <strong>Claude 3.7 Sonnet (+9.8%)</strong>.<br>Meanwhile, <strong>Qwen3-max</strong> earned <strong>+7.96%</strong>, and <strong>Gemini-2.5-Flash</strong> barely moved the needle at <strong>+0.48%</strong> despite the most trades.<br>For comparison, a passive <strong>QQQ ETF</strong> tracker gained <strong>+5.39%</strong>, proving DeepSeek&#8217;s picks weren&#8217;t just lucky &#8212; they were smart.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uNn-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uNn-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 424w, https://substackcdn.com/image/fetch/$s_!uNn-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 848w, https://substackcdn.com/image/fetch/$s_!uNn-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 1272w, https://substackcdn.com/image/fetch/$s_!uNn-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uNn-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png" width="800" height="421" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:421,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55815,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/177654608?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uNn-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 424w, https://substackcdn.com/image/fetch/$s_!uNn-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 848w, https://substackcdn.com/image/fetch/$s_!uNn-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 1272w, https://substackcdn.com/image/fetch/$s_!uNn-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9eba8c53-0091-41cd-b5ad-c4d120c7e145_800x421.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h3>Important Context</h3><p>Still, the experiment comes with caveats:</p><ul><li><p><strong>Simulated setup</strong> &#8211; models trade at the <strong>day&#8217;s opening price</strong>, not in real markets.</p></li><li><p><strong>Possible data leaks</strong> &#8211; some news lacked timestamps, letting models see &#8220;future&#8221; info.</p></li><li><p><strong>Short, bullish window</strong> &#8211; tech stocks like Nvidia and Microsoft dominated, inflating returns.</p></li></ul><p>DeepSeek shows it can <strong>spot patterns and take confident bets</strong>, but calling it the best AI trader yet would be premature.</p><p>If the AI-Trader team adds <strong>hour-level trading</strong> and fixes data issues, it could become a reliable benchmark for evaluating how AIs handle <strong>risk</strong>, <strong>discipline</strong>, and <strong>adaptability</strong> in real financial markets.</p><div><hr></div><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://www.databricks.com/blog/build-high-quality-domain-specific-agents-95-lower-cost">Build High-Quality, Domain-Specific Agents at 95% Lower Cost</a></p><p><a href="https://jsdev.space/zip-bombs/">Zip-bombs vs Aggressive AI Crawlers: Defensive Tactics for Sites</a></p><p><a href="https://jovidecroock.com/blog/state-vs-signals/">State-based vs Signal-based rendering</a></p><p><a href="https://www.nan.fyi/database">Build Your Own Database</a></p><p><a href="https://tkdodo.eu/blog/context-inheritance-in-tan-stack-router">Context Inheritance in TanStack Router</a></p><p><a href="https://blog.curbanii.net/practical-caching-recipes-for-next-js-app-router/">Practical Caching Recipes for Next.js (App Router)</a></p><p><a href="https://css-tip.com/conditional-border-radius/">Conditional Border Radius with Modern CSS</a></p><p><a href="https://jsdev.space/howto/react-performance-optimization-trio/">React Performance Optimization Trio Explained</a></p><p><a href="https://jsdev.space/howto/web-workers-performance-optimization/">Master Web Workers for Faster Front-End Apps</a></p><p><a href="https://news.opensuse.org/2025/10/08/gsoc-semantic-video-search/">GSoC 2025, Building a Semantic Search Engine for Any Video</a></p><p><a href="https://jsdev.space/urlpattern-router-node24/">Mastering URLPattern for Cross-Platform Routing</a></p><p><a href="https://tanstack.com/blog/directives-and-the-platform-boundary">Tanstack Directives and the Platform Boundary</a></p><p><a href="https://appwrite.io/blog/post/why-developers-leaving-nextjs-tanstack-start">Why developers are leaving Next.js for TanStack Start, and loving it</a></p><p><a href="https://www.howtogeek.com/i-run-a-full-linux-desktop-in-docker-just-because-i-can/">I Run a Full Linux Desktop in Docker Just Because I Can</a></p><p><a href="https://jsdev.space/howto/bun-install-vs-bun-add/">Bun Install vs Bun Add: Choosing the Right Command</a></p><p><a href="https://jsdev.space/bun-workflows/">Mastering Bun for Maximum Developer Productivity</a></p><h2>&#9874;&#65039; Tools</h2><p><a href="https://vscode-extension.vercel.app/">VSCode Vercel Extention</a></p><p><a href="https://jj-vcs.github.io/jj/latest/">Jujutsu</a> &#8212; a version control system</p><p><a href="https://github.com/vercel/workflow">Workflow DevKit</a> - A toolkit for building Vercel Workflow integrations</p><p><a href="https://github.com/jasonjmcghee/WebMCP">WebMCP</a> - WebMCP allows a website to be an MCP server. No sharing API Keys. Use any model you want.</p><p><a href="https://www.delopsu.com/draw">ASCII Drawing Board</a></p><p><a href="https://github.com/honojs/cli">Hono CLI</a> - Command Line Interface for Hono framework</p><p><a href="https://typingsvg.vercel.app/">Typing SVG Generator</a></p><p><a href="https://oklch.fyi/">Explore color as we see it</a> - A tool to visualize colors in the Oklch color space</p><p><a href="https://github.com/imputnet/helium">Helium</a> - Private, fast, and honest web browser</p><p><a href="https://handy.computer/">Handy</a> - the free and open source app for speech to text</p><h2>&#128218; Libs</h2><p><a href="https://github.com/mountain-loop/yaak">Yaak</a> - The most intuitive desktop API client. Organize and execute REST, GraphQL, WebSockets, Server Sent Events, and gRPC &#129452;</p><p><a href="https://github.com/sindresorhus/ky">Ky</a> - &#127795; Tiny &amp; elegant JavaScript HTTP client based on the Fetch API</p><p><a href="https://github.com/qgis/QGIS">QGIS</a> - QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS)</p><p><a href="https://github.com/character-ai/Ovi">Ovi</a> - Twin Backbone Cross-Modal Fusion for Audio-Video Generation</p><h2>&#8986; Releases</h2><p><a href="https://vitest.dev/blog/vitest-4">Vitest 4.0 is out!</a></p><p><a href="https://nextjs.org/blog/next-16">Next.js 16 Released</a></p><p><a href="https://biomejs.dev/blog/biome-v2-3/">Biome v2.3 Released</a></p><p><a href="https://bun.com/blog/bun-v1.3.1">Bun v1.3.1 Released</a></p><p><a href="https://boajs.dev/blog/2025/10/22/boa-release-21">Boa release v0.21</a></p><p><a href="https://eslint.org/blog/2025/10/eslint-v9.38.0-released/">ESLint v9.38.0 released</a></p><p><a href="https://github.com/web-infra-dev/rspack/releases/tag/v1.6.0-beta.1">Rspack 1.6.0 Beta 1</a></p><p><a href="https://github.com/storybookjs/storybook/releases/tag/v10.0.0">Storybook 10.0 Released</a> &#8212; Major Update Adds Module Automocking, Next.js 16, Vitest 4, and Async Svelte Component Support</p><p><a href="https://github.com/shadcn-ui/ui/releases/tag/shadcn%403.5.0">shadcn/ui 3.5 Released</a> &#8212; Now Fully Compatible with Next.js 16</p><p><a href="https://pnpm.io/blog/releases/10.20">pnpm 10.20</a>, <a href="https://astro.build/blog/astro-5150/">Astro 5.15</a>, <a href="https://github.com/ali-master/uuidv47/releases/tag/1.2.0">uuidv47 v1.2.0</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=NPMi-3uf_ig">Is this the end for Adobe?</a></p><p><a href="https://www.youtube.com/watch?v=R4oYppOBKwo">The coolest feature of Hono</a></p><p><a href="https://www.youtube.com/watch?v=I1V9YWqRIeI">Next.js 16 Full Course | Build and Deploy a Production-Ready Full Stack App</a></p><p><a href="https://www.youtube.com/watch?v=gjrXeqgxbas">I Will Never Use Shadcn Form Components Again</a></p><p><a href="https://www.youtube.com/watch?v=HIp8sFB2GGw">Cursor 2.0 is here&#8230; 5 things you didn&#8217;t know it can do</a></p><p><a href="https://www.youtube.com/watch?v=yl0YWA2K2B0">React wants to win you back&#8230;</a></p><p><a href="https://www.youtube.com/watch?v=KI4gjUrOfOs">Master React 19.2 Async Everywhere &#8212; Boost Performance</a></p><p><a href="https://www.youtube.com/watch?v=O8uazkirvVo">WebAssembly might actually save web dev&#8230;</a></p><p><a href="https://www.youtube.com/watch?v=G1XiiXTQHSE">React Native Tutorial for Absolute Beginners - Build a Mobile App in 2 Hours</a></p><p><a href="https://www.youtube.com/watch?v=P8rrhZTPEAQ">99% of Developers Don&#8217;t Get PostgreSQL</a></p><p><a href="https://www.youtube.com/watch?v=8U2FNq2-IiE">Build Docker Images in a Git Repo but Only Committed Changes</a></p><p><a href="https://www.youtube.com/watch?v=v9gsMFozXK0">The Standup - Jira Bought 2 Browsers???</a></p><h2>&#127908; Talks &amp; Podcasts</h2><p>No content this week &#128546;</p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>OpenAI Reportedly Preparing for a $1 Trillion IPO</h3><p>According to <a href="https://www.reuters.com/business/openai-lays-groundwork-juggernaut-ipo-up-1-trillion-valuation-2025-10-29/">Reuters</a>, OpenAI is preparing for an IPO following its recent restructuring into a public benefit corporation &#8212; a move that clears the path for going public. Sources say the company aims to file with the U.S. SEC in the second half of 2026, with a potential listing in early 2027.</p><p>The valuation under discussion is reportedly up to $1 trillion, which would make it one of the most significant IPOs in tech history. OpenAI expects to reach around $20 billion in annual revenue by the end of 2025, showcasing steady demand for its AI services.</p><p>The company is also in talks to raise over $60 billion in private funding before the IPO to expand its data centers, acquire chips, and strengthen partnerships like its collaboration with Microsoft.</p><p>While OpenAI told Reuters that &#8220;IPO is not a focus,&#8221; its restructuring and growing investor interest signal that a public listing in 2026&#8211;2027 is becoming increasingly likely.</p><p><a href="https://vercel.com/changelog/new-domains-registrar-api-for-domain-search-pricing-purchase-and-management">New Domains Registrar API for domain search, pricing, purchase, and management (Vercel)</a></p><p><a href="https://spectrum.ieee.org/wi-fi-signal-heartbeat-detection">How Wi-Fi Signals Can Be Used to Detect Your Heartbeat The advance opens up new contactless heart-monitoring possibilities</a></p><p>That&#8217;s it for this week&#8217;s roundup of <strong>JavaScript Trends and Tools</strong>. If you found something worth trying, share it with your team or community. See you next Friday for another collection of tools and stories shaping the JavaScript landscape.</p>]]></content:encoded></item><item><title><![CDATA[How JavaScript Became the Beating Heart of Web3]]></title><description><![CDATA[JavaScript on the Blockchain: From Browser Scripts to Web3&#8217;s Core]]></description><link>https://jsdevspace.substack.com/p/how-javascript-became-the-beating</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/how-javascript-became-the-beating</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 24 Oct 2025 08:35:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3SQ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3SQ0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3SQ0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 424w, https://substackcdn.com/image/fetch/$s_!3SQ0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 848w, https://substackcdn.com/image/fetch/$s_!3SQ0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 1272w, https://substackcdn.com/image/fetch/$s_!3SQ0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3SQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png" width="1200" height="675" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:675,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:188370,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://jsdevspace.substack.com/i/176993881?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3SQ0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 424w, https://substackcdn.com/image/fetch/$s_!3SQ0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 848w, https://substackcdn.com/image/fetch/$s_!3SQ0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 1272w, https://substackcdn.com/image/fetch/$s_!3SQ0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3599cd1-b0eb-4305-a1ad-ecb9c0822f3f_1200x675.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At first glance, JavaScript and blockchain seem worlds apart &#8212; one was designed to make buttons interactive, the other to power distributed, cryptographically secure systems.<br>And yet, JavaScript turned out to be the key that unlocked <strong>Web3</strong> for millions of developers.</p><p>This article explores how the world&#8217;s most ubiquitous front-end language became the backbone of decentralized apps &#8212; from wallets and RPC nodes to smart contract tooling.</p><p>&#128073; For a deeper dive into Web3 development with JavaScript and related tools, check out <a href="https://jsdev.space/web3/">Web3 on jsdev.space &#8594;</a></p><div><hr></div><h2>From UI Scripting to Blockchain Integration</h2><p>Once upon a time, JavaScript was used to make buttons glow on a web page. Then it handled 3D graphics in browsers. Now, it&#8217;s used to move assets worth millions across the blockchain.</p><p>Even though many developers still joke that &#8220;you can&#8217;t trust JS with real logic,&#8221; Web3 engineers rely on it as their universal toolkit &#8212; it runs everywhere: inside wallets, browser extensions, backend services, and blockchain SDKs.</p><p>It&#8217;s almost ironic: in a world obsessed with cryptographic immutability, <strong>the most dynamic language ever invented</strong> became the bridge between humans and the blockchain.</p><div><hr></div><h2>How JavaScript Became the Language of Web3</h2><p>It all started with <strong><a href="https://docs.ethers.org/v5/">ethers.js</a></strong> and <strong><a href="https://web3js.readthedocs.io/en/v1.10.0/">web3.js</a></strong> &#8212; libraries that let browsers talk directly to the Ethereum blockchain.</p><p>Previously, you had to run a node, write code in Go or Python, and manually send JSON-RPC requests. Now, just a few lines of JS can do all that:</p><pre><code>const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
const contract = new ethers.Contract(address, abi, signer);

await contract.transfer(recipient, amount);</code></pre><p>Five lines &#8212; and your browser becomes a <strong>decentralized gateway</strong>.</p><div><hr></div><h2>The Frontend Is the New Wallet</h2><p>What used to be a simple interface is now responsible for <strong>security and cryptographic signing</strong>.</p><p>In Web3, the phrase <em>&#8220;frontend is the new backend&#8221;</em> isn&#8217;t a joke &#8212; it&#8217;s a fact.</p><p>Functions like:</p><pre><code>window.ethereum.request({ method: &#8216;eth_sendTransaction&#8217;, params: [...] });</code></pre><p>turn a regular website into a <strong>financial application</strong>. </p><p>It&#8217;s powerful &#8212; and a bit terrifying.</p><div><hr></div><h2>Node.js: The Bridge Between Smart Contracts and DevOps</h2><p>Node.js plays a central role in blockchain development.<br>Every deployment script, test suite, and migration tool runs on Node.</p><p>JavaScript drives:</p><ul><li><p>Contract deployment and verification</p></li><li><p>Gas estimation and signature management</p></li><li><p>Integration with RPC nodes and CI/CD pipelines</p></li></ul><p>Even major infrastructure platforms &#8212; <strong>The Graph</strong>, <strong>Alchemy</strong>, <strong>Infura</strong> &#8212; provide official <strong>JavaScript SDKs</strong>.</p><p>JS isn&#8217;t just convenient anymore &#8212; it&#8217;s become the <em>standard language</em> of the Web3 stack.</p><div><hr></div><h2>WebAssembly, Rust, and the Future of JS on Blockchain</h2><p>Some argue that JavaScript is being replaced by Rust or Solidity.<br>In reality, they complement each other.</p><ul><li><p><strong>Rust</strong> compiles into <strong>WebAssembly (Wasm)</strong></p></li><li><p><strong>Wasm</strong> runs inside environments orchestrated by <strong>JavaScript</strong></p></li></ul><p>Frameworks like <strong>NEAR</strong>, <strong>Solana</strong>, and <strong>ICP</strong> even allow developers to write smart contracts in <strong>TypeScript</strong>, compiling them into safe, low-level bytecode.</p><p>In other words, JavaScript is evolving into the <strong>glue</strong> that binds together contracts, APIs, and user interfaces.</p><div><hr></div><h2>Mistakes, Pain, and Progress</h2><p>Let&#8217;s be honest &#8212; JavaScript wasn&#8217;t designed for financial logic.<br>Miss a single character in <code>BigNumber</code>, forget an <code>await</code>, and your transaction is gone.</p><p>These issues led to classic Web3 errors:</p><ul><li><p>Lost signatures</p></li><li><p>Incorrect nonces</p></li><li><p>Duplicate transactions</p></li></ul><p>But this chaos also fueled innovation &#8212; better SDKs, stricter type systems, and safer wrappers.<br>Tools like <strong>TypeScript</strong> and modern EVM libraries now enforce type safety and input validation by default.</p><div><hr></div><h2>How JS Developers Changed the Blockchain Industry</h2><p>Blockchain used to be the realm of cryptographers and C++ engineers.<br>Now, <strong>frontend developers</strong> have joined the game &#8212; and they&#8217;re reshaping it.</p><p>They bring UX, color, animations, and design systems into dApps.<br>They create buttons like <em>Connect Wallet</em> or <em>Mint NFT</em> that hide immense complexity behind a friendly UI.</p><p>Without JavaScript, Web3 would still look like a command-line interface for the elite.<br>Now, anyone with React and ethers.js can build a dApp that feels like a modern web app &#8212; but runs entirely on decentralized networks.</p><div><hr></div><h2>What Comes Next</h2><p>Web3 is becoming <strong>modular</strong>.</p><p>Libraries like <strong><a href="https://viem.sh/">viem</a></strong>, <strong><a href="https://wagmi.sh/">wagmi</a></strong>, and <strong><a href="https://rainbowkit.com/">rainbowkit</a></strong> are turning dApp development into a plug-and-play experience.</p><p>In a few years, developers might stop importing <code>web3.js</code> directly &#8212; but underneath, it will still be <strong>JavaScript</strong> running the show.<br>The same language that once handled a form&#8217;s &#8220;Submit&#8221; button now powers decentralized finance.</p><div><hr></div><h2>Conclusion</h2><p>JavaScript has proven to be the <strong>most resilient programming language of our time</strong>.<br>It survived browser wars, the callback hell of jQuery, and the rise of frameworks &#8212; and now, it stands at the center of Web3.</p><p>Not because it&#8217;s perfect &#8212; but because it&#8217;s <strong>everywhere</strong>.</p><p>Where there&#8217;s an interface, there will eventually be JavaScript &#8212; even if that interface manages wallets, crypto assets, and millions in digital value.</p>]]></content:encoded></item></channel></rss>