<?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>Thu, 23 Jul 2026 23:27:22 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[10 Modern JavaScript Tricks That Instantly Cut Boilerplate Code]]></title><description><![CDATA[Write less, avoid common pitfalls, and make everyday JavaScript cleaner.]]></description><link>https://jsdevspace.substack.com/p/10-modern-javascript-tricks-that</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/10-modern-javascript-tricks-that</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Thu, 23 Jul 2026 09:00:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tXwv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tXwv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tXwv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 424w, https://substackcdn.com/image/fetch/$s_!tXwv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 848w, https://substackcdn.com/image/fetch/$s_!tXwv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!tXwv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tXwv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:365391,&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/207851360?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.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_!tXwv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 424w, https://substackcdn.com/image/fetch/$s_!tXwv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 848w, https://substackcdn.com/image/fetch/$s_!tXwv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!tXwv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2e3f30e-e5cb-41d9-9e8e-c8a149dcd288_1749x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Modern JavaScript keeps getting smaller.</p><p>Features that once required helper functions, verbose conditionals, or entire utility libraries are now built directly into the language. Yet many developers continue writing code the same way they did years ago.</p><p>The result is unnecessary boilerplate, harder-to-read logic, and bugs that modern syntax was designed to prevent.</p><p>This article covers ten JavaScript techniques that can dramatically reduce repetitive code while making applications easier to maintain. Each example includes practical advice and the most common mistakes developers still make.</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><h2>1. Optional Chaining Eliminates Nested Property Checks</h2><p>Checking whether every nested property exists used to produce long, repetitive conditions.</p><p><strong>Before</strong></p><pre><code><code>if (
  user &amp;&amp;
  user.profile &amp;&amp;
  user.profile.address &amp;&amp;
  user.profile.address.city
) {
  console.log(user.profile.address.city);
}</code></code></pre><p><strong>Modern JavaScript</strong></p><pre><code><code>console.log(user?.profile?.address?.city);</code></code></pre><p>Optional chaining immediately returns <code>undefined</code> whenever one part of the chain is <code>null</code> or <code>undefined</code>.</p><p>The code becomes shorter and far easier to read.</p><h3>Common mistake</h3><p>Optional chaining only checks for <code>null</code> and <code>undefined</code>.</p><p>Values such as <code>0</code>, <code>false</code>, and an empty string are perfectly valid and will continue through the chain.</p><div><hr></div><h2>2. Prefer <code>??</code> Instead of <code>||</code> for Default Values</h2><p>One of the most common JavaScript bugs comes from using logical OR to provide defaults.</p><pre><code><code>function setVolume(volume) {
  return volume || 50;
}

setVolume(0); // 50 &#10060;</code></code></pre><p>Passing <code>0</code> should not reset the value.</p><p>Instead, use the nullish coalescing operator.</p><pre><code><code>function setVolume(volume) {
  return volume ?? 50;
}

setVolume(0); // 0 &#9989;
setVolume(null); // 50
setVolume(undefined); // 50</code></code></pre><h3>Common mistake</h3><p><code>??</code> cannot be mixed directly with <code>||</code> or <code>&amp;&amp;</code>.</p><p>This causes a syntax error:</p><pre><code><code>// &#10060;
value || other ?? fallback;</code></code></pre><p>Instead, group expressions explicitly.</p><pre><code><code>(value || other) ?? fallback;</code></code></pre><div><hr></div><h2>3. Learn the Logical Assignment Operators</h2><p>Modern JavaScript combines assignment and conditional logic into a single operator.</p><pre><code><code>settings.theme ??= "dark";
cache.enabled ||= true;
user.name &amp;&amp;= user.name.trim();</code></code></pre><p>Each operator behaves differently.</p><pre><code><code>let count = 0;

count ||= 10;
console.log(count); // 10

count = 0;

count ??= 10;
console.log(count); // 0</code></code></pre><h3>Quick reference</h3><ul><li><p><code>||=</code> replaces falsy values.</p></li><li><p><code>??=</code> replaces only <code>null</code> or <code>undefined</code>.</p></li><li><p><code>&amp;&amp;=</code> updates only truthy values.</p></li></ul><p>Choosing the wrong operator often introduces subtle bugs around <code>0</code>, <code>false</code>, and empty strings.</p><div><hr></div><h2>4. Use <code>Object.prototype.toString.call()</code> for Reliable Type Detection</h2><p><code>typeof</code> works well for primitives but quickly falls apart with complex objects.</p><pre><code><code>typeof [];
// "object"

typeof null;
// "object"</code></code></pre><p>A more reliable solution is:</p><pre><code><code>function getType(value) {
  return Object.prototype.toString.call(value).slice(8, -1);
}

getType([]);
// "Array"

getType(new Map());
// "Map"

getType(new Date());
// "Date"

getType(/js/);
// "RegExp"</code></code></pre><p>This approach correctly distinguishes nearly every built-in JavaScript object.</p><h3>When to use <code>typeof</code></h3><p>Use <code>typeof</code> for:</p><ul><li><p>string</p></li><li><p>number</p></li><li><p>bigint</p></li><li><p>boolean</p></li><li><p>symbol</p></li><li><p>undefined</p></li><li><p>function</p></li></ul><p>Use <code>Object.prototype.toString.call()</code> when you need precise object types.</p><div><hr></div><h2>5. Always Use <code>Array.isArray()</code></h2><p>Checking arrays with <code>instanceof</code> can fail across browser windows or iframes.</p><pre><code><code>value instanceof Array;</code></code></pre><p>The safer solution is built into JavaScript.</p><pre><code><code>Array.isArray(value);</code></code></pre><p>It also avoids confusing array-like objects.</p><pre><code><code>Array.isArray([]);
// true

Array.isArray({ length: 2 });
// false</code></code></pre><p>Whenever you need to detect arrays, this should be your default choice.</p><div><hr></div><h2>6. ES Modules Already Implement the Singleton Pattern</h2><p>Many projects still include unnecessary singleton classes.</p><pre><code><code>class Config {
  static instance;

  static getInstance() {
    if (!this.instance) {
      this.instance = new Config();
    }

    return this.instance;
  }
}</code></code></pre><p>In modern JavaScript, a module is loaded only once.</p><pre><code><code>// config.js

export const config = {
  apiUrl: "/api",
  timeout: 5000,
};</code></code></pre><pre><code><code>import { config } from "./config.js";</code></code></pre><p>Every import receives the same object.</p><p>No singleton boilerplate required.</p><h3>Watch out</h3><p>Exported objects remain mutable.</p><p>If multiple modules modify shared state, unexpected side effects can appear.</p><div><hr></div><h2>7. Replace Large <code>if</code> Statements with a Strategy Object</h2><p>Long chains of conditions become difficult to maintain.</p><pre><code><code>function calculate(type, a, b) {
  if (type === "add") return a + b;
  if (type === "subtract") return a - b;
  if (type === "multiply") return a * b;
  if (type === "divide") return a / b;

  throw new Error("Unknown operation");
}</code></code></pre><p>A lookup table is cleaner.</p><pre><code><code>const operations = {
  add: (a, b) =&gt; a + b,
  subtract: (a, b) =&gt; a - b,
  multiply: (a, b) =&gt; a * b,
  divide: (a, b) =&gt; a / b,
};

function calculate(type, a, b) {
  const operation = operations[type];

  if (!operation) {
    throw new Error(`Unknown operation: ${type}`);
  }

  return operation(a, b);
}</code></code></pre><p>Adding new functionality now means adding one new property instead of editing existing logic.</p><h3>TypeScript tip</h3><pre><code><code>type Operation = keyof typeof operations;

function calculate(type: Operation, a: number, b: number) {
  return operations[type](a, b);
}</code></code></pre><p>This catches invalid operation names before runtime.</p><div><hr></div><h2>8. Build a Tiny Event Emitter</h2><p>The Observer pattern powers everything from UI events to state management.</p><p>A minimal implementation is surprisingly small.</p><pre><code><code>class EventEmitter {
  #listeners = new Map();

  on(event, listener) {
    const list = this.#listeners.get(event) ?? [];

    list.push(listener);
    this.#listeners.set(event, list);
  }

  off(event, listener) {
    const list = this.#listeners.get(event);

    if (!list) return;

    this.#listeners.set(
      event,
      list.filter(fn =&gt; fn !== listener)
    );
  }

  emit(event, ...args) {
    for (const listener of this.#listeners.get(event) ?? []) {
      listener(...args);
    }
  }
}</code></code></pre><p>Usage is simple.</p><pre><code><code>const events = new EventEmitter();

events.on("login", user =&gt; {
  console.log(`${user.name} signed in`);
});

events.emit("login", {
  name: "Alex",
});</code></code></pre><h3>Common mistake</h3><p>Always remove listeners when components are destroyed.</p><p>Forgotten subscriptions remain one of the most common causes of memory leaks.</p><div><hr></div><h2>9. <code>Proxy</code> Can Create Smarter Read-Only Objects</h2><p><code>Object.freeze()</code> freezes everything.</p><p><code>Proxy</code> lets you intercept only the operations you care about.</p><pre><code><code>function readonly(object) {
  return new Proxy(object, {
    set(_, property) {
      throw new Error(`${String(property)} is read-only`);
    },

    deleteProperty(_, property) {
      throw new Error(`${String(property)} cannot be deleted`);
    },
  });
}

const config = readonly({
  api: "/v1",
});

config.api = "/v2";
// Error</code></code></pre><h3>Common mistake</h3><p>The original object is still mutable.</p><pre><code><code>const original = {
  api: "/v1",
};

const safe = readonly(original);

original.api = "/v2";
// succeeds</code></code></pre><p>Deep read-only protection requires recursively wrapping nested objects.</p><div><hr></div><h2>10. Decorate Functions Instead of Editing Them</h2><p>Adding logging, timing, retries, or authorization directly into business logic quickly creates messy functions.</p><p>A higher-order function keeps concerns separate.</p><pre><code><code>function withLogging(fn) {
  return (...args) =&gt; {
    console.time(fn.name);

    const result = fn(...args);

    console.timeEnd(fn.name);

    return result;
  };
}

const sum = withLogging((a, b) =&gt; a + b);

sum(10, 20);</code></code></pre><p>The original function stays clean while additional behavior can be reused everywhere.</p><p>This technique is one of the foundations behind middleware, React higher-order components, and many modern frameworks.</p><h3>Common mistake</h3><p>Wrapping anonymous functions makes debugging harder because stack traces become less descriptive.</p><p>Whenever possible, decorate named functions instead.</p><pre><code><code>function calculateTotal(price, tax) {
  return price + tax;
}

const loggedCalculateTotal = withLogging(calculateTotal);</code></code></pre><h2>Final Thoughts</h2><p>Most JavaScript developers don&#8217;t need more libraries.</p><p>They need to make better use of the language they already have.</p><p>Optional chaining, nullish coalescing, logical assignment, lookup tables, modules, proxies, and decorators remove hundreds of lines of repetitive code across a typical project.</p><p>The biggest productivity improvement rarely comes from writing clever code.</p><p>It comes from letting modern JavaScript solve problems that developers used to solve manually.</p>]]></content:encoded></item><item><title><![CDATA[The Quiet Tax of Not Knowing Your AI Limits]]></title><description><![CDATA[Six tools, six hidden meters, and one small extension that puts them on a single screen]]></description><link>https://jsdevspace.substack.com/p/the-quiet-tax-of-not-knowing-your</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/the-quiet-tax-of-not-knowing-your</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Sun, 19 Jul 2026 13:15:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wK7D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.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_!wK7D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wK7D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png 424w, https://substackcdn.com/image/fetch/$s_!wK7D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png 848w, https://substackcdn.com/image/fetch/$s_!wK7D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png 1272w, https://substackcdn.com/image/fetch/$s_!wK7D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wK7D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png" width="1330" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e94dae01-0823-44aa-8262-19c6553d0340_1330x870.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1330,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122736,&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/207656324?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.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_!wK7D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png 424w, https://substackcdn.com/image/fetch/$s_!wK7D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png 848w, https://substackcdn.com/image/fetch/$s_!wK7D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.png 1272w, https://substackcdn.com/image/fetch/$s_!wK7D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe94dae01-0823-44aa-8262-19c6553d0340_1330x870.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>There is a particular kind of modern frustration that did not exist five years ago. A person is in the middle of good work, the model is cooperating, ideas are landing, and then a message appears: limit reached, try again later. The work does not pause. It stops.</p><p>What makes it sting is not the limit itself. It is the ambush.</p><p>Nobody warned them. There was no meter creeping toward empty, no yellow light, no sense that the edge was close. Everything worked, and then it did not. For people who now run their days through AI tools, this has quietly become a recurring tax. Small each time, but paid over and over.</p><h2>The meters exist. They are just scattered</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-yGk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-yGk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!-yGk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!-yGk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!-yGk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-yGk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png" width="1280" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24572,&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/207656324?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.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_!-yGk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png 424w, https://substackcdn.com/image/fetch/$s_!-yGk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png 848w, https://substackcdn.com/image/fetch/$s_!-yGk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.png 1272w, https://substackcdn.com/image/fetch/$s_!-yGk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51b6606a-3b66-4ab6-863f-bdb33eeecec6_1280x800.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>Modern AI tools are not stingy. They are opaque.</p><p>Every provider tracks usage. Claude counts against five hour and weekly windows. Codex has its own rhythm. Cursor measures fast requests by the month. ChatGPT keeps separate ceilings for research, for images, for uploads. Perplexity limits Pro searches. Grok works in windows of its own.</p><p>The information is all there. It is simply spread across six dashboards, in six formats, speaking six dialects of the same idea. To hold a clear picture of where they stand, a person has to open every tab and assemble the answer by hand. Most people never do. They just work until something breaks, then react.</p><p>That is the gap. Not missing data, but missing a place to see it together.</p><h2>A tool built out of one bad Friday</h2><p><a href="https://ai-karma-tracker.github.io/">AI Karma Tracker</a> started as one developer&#8217;s answer to that exact problem. It is a Chrome extension with a narrow job. It reads the real usage limits across the tools someone already uses, and it shows them in one place.</p><p>The numbers are live. Not decorative percentages, but the actual balance remaining and the time until it resets, read straight from sessions the person is already signed into. When a ceiling gets close, the extension says so in advance, which is the whole point. A warning an hour early turns a wall into a scheduling decision.</p><p>It also remembers. Small charts per provider mean that after a week, patterns emerge. The heavy days, the quiet ones, the hours when shared capacity tightens and limits burn faster than usual. Work starts getting planned around reality instead of colliding with it.</p><p>And it stays in its lane. The extension runs locally, in the browser. It does not ship usage data to a server, does not touch passwords or cookies or the contents of conversations. The design that makes it work, reading from sessions where the person is already logged in, is the same design that keeps their data on their own machine.</p><h2>Who should ignore this</h2><p>Plenty of people. Anyone who opens an AI tool a couple of times a week does not have this problem and does not need a fix for it.</p><p>The tool is for the other group. The ones who live inside these products. Whose code, writing, research, and images all pass through daily sessions. The ones who have felt that specific jolt of a limit landing at the worst possible moment, and who would happily trade a couple of dollars a month to never be surprised by it again.</p><p>There is a free tier for trying the idea on one tool, with no card and no signup. The paid tiers open up the full stack, the history, and alerts in Telegram, and they cancel anytime.</p><h2>Where to find it</h2><p>AI Karma Tracker is on the<a href="https://chromewebstore.google.com/detail/ai-karma-tracker/gkhiemjkhadobiiggbbkjkglgjgogjoa"> Chrome Web Store Plugins</a>.</p><p>More about the <a href="https://ai-karma-tracker.github.io">project lives here</a>.</p><p>The pitch is smaller than most software pitches, and that is on purpose. It does not promise to change how anyone works. It just removes one recurring, avoidable surprise, and hands back the quiet confidence of knowing, at a glance, exactly how much runway is left.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #41: TypeScript 7, Bun, AI Agents and More]]></title><description><![CDATA[This week's roundup covers the launch of TypeScript 7, the latest Node.js and Bun releases, new developer tools, AI coding breakthroughs, open source projects, and the web development stories worth yo]]></description><link>https://jsdevspace.substack.com/p/friday-links-41-typescript-7-bun</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-41-typescript-7-bun</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 17 Jul 2026 13:24:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CCMV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.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_!CCMV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CCMV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png 424w, https://substackcdn.com/image/fetch/$s_!CCMV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png 848w, https://substackcdn.com/image/fetch/$s_!CCMV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png 1272w, https://substackcdn.com/image/fetch/$s_!CCMV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CCMV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png" width="800" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0122e74d-8b86-4a55-868d-8249d7720222_800x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121769,&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/207426199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.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_!CCMV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png 424w, https://substackcdn.com/image/fetch/$s_!CCMV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png 848w, https://substackcdn.com/image/fetch/$s_!CCMV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.png 1272w, https://substackcdn.com/image/fetch/$s_!CCMV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0122e74d-8b86-4a55-868d-8249d7720222_800x500.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 aria-hidden="true" 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><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 week, another wave of releases across the JavaScript ecosystem.</p><h2><strong>&#129504; Language &amp; Runtime Updates</strong></h2><h3><strong>TypeScript 7.0</strong></h3><p>The biggest release of the week is finally here. <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/">TypeScript 7</a> has officially landed, introducing the long-awaited Go-based compiler that&#8217;s designed to dramatically reduce compilation times, especially for large codebases.</p><p>It&#8217;s still early days, though. Much of the ecosystem continues to target TypeScript 6 while tooling authors update plugins, language servers, and build integrations. If you&#8217;re planning to upgrade, it&#8217;s worth checking compatibility with your existing toolchain first.</p><h3><strong>npm 12</strong></h3><p><a href="https://github.blog/changelog/2026-07-08-npm-install-time-security-and-gat-bypass2fa-deprecation/">npm has reached</a> another major milestone with the release of version 12.</p><p>The new version includes CLI improvements, dependency management updates, performance refinements, and plenty of internal cleanup. While there aren&#8217;t many headline-grabbing features, it&#8217;s an important release that lays the groundwork for future improvements across the Node.js ecosystem.</p><h3><strong>Bun 1.3.14</strong></h3><p>Bun continues its rapid release cadence. Version 1.3.14 focuses primarily on bug fixes, compatibility improvements, and runtime performance.</p><p><a href="https://bun.com/blog/bun-in-rust">The Bun team also published</a> one of the most interesting engineering stories of the year: a detailed write-up explaining how the runtime is being rewritten from Zig to Rust using dozens of parallel Claude Code sessions. The Rust implementation will become the foundation of Bun 1.4.</p><h3><strong>Node.js 26.5.0</strong></h3><p><a href="https://nodejs.org/en/blog/release/v26.5.0">Node.js 26</a> continues to evolve with another feature-packed release. Version 26.5 adds support for importing text files using ESM import attributes, making it easier to work with non-JavaScript assets without custom loaders.</p><p>The release also introduces <code>blob.textStream()</code> along with several smaller improvements across the runtime, performance, and platform APIs.</p><h2><strong>&#128220; Articles &amp; Tutorials</strong></h2><p><a href="https://developers.googleblog.com/litertjs-googles-high-performance-web-ai-inference/">LiteRT.js, Google&#8217;s high performance Web AI Inference</a></p><p><a href="https://github.blog/security/6-security-settings-every-github-maintainer-should-enable-this-week/">6 security settings every GitHub maintainer should enable this week</a></p><p><a href="https://www.jstools.space/blog/read-large-json-files/">How to Read Large JSON Files Without Losing Your Mind</a></p><p><a href="https://page-transitions-with-webgpu-vanilla-js.crnacura.workers.dev/">Building Persistent Page Transitions with WebGPU and Vanilla JavaScript</a></p><p><a href="https://morello.dev/blog/solidjs-2-react-developers-first-look">SolidJS 2.0: A React Developer&#8217;s First Look at Signals and Async</a></p><p><a href="https://olliewilliams.xyz/blog/no-build/">Do we still need build tools?</a></p><p><a href="https://blog.logrocket.com/css-staggered-animations/">How to create awesome staggered animations in CSS</a>, <a href="https://github.com/color-js/color.js/releases/tag/v0.7.0">Color.js v0.7.0</a></p><p><a href="https://www.jstools.space/blog/password-hashing-argon2/">Password Hashing Done Right: Argon2, bcrypt, Salt and Pepper</a></p><p><a href="https://nextjs.org/blog/next-security-release-program">Next.js Security Release and Our Next Patch Release</a></p><p><a href="https://jsdev.space/javascript-string-algorithms/">Mastering JavaScript String Algorithms</a></p><p><a href="https://jsdev.space/observer-vs-publish-subscribe-pattern/">Observer vs Publish-Subscribe: What&#8217;s the Difference?</a></p><p><a href="https://jsdev.space/docker-swarm-explained/">Master Docker Swarm with Real Production Examples</a></p><p><a href="https://www.jstools.space/blog/url-design-routing-query-parameters-fragments/">How to Design URLs: Routing, Query Parameters, and Fragments</a></p><h2><strong>&#9874;&#65039; Tools</strong></h2><p><a href="https://www.jstools.space/html-formatter/">HTML Formatter Online</a> - A simple online tool for formatting and beautifying HTML code. It supports various formatting options, including indentation styles, line breaks, and attribute sorting, making it easy to clean up messy HTML code.</p><p><a href="https://doc.babylonjs.com/lite/">Babylon Lite</a>: A Fresh Take on Babylon.js &#8212; What if the Babylon.js team could rebuild their 3D engine from scratch today? That&#8217;s exactly the idea behind Babylon Lite. Designed exclusively for WebGPU, the new engine is significantly smaller and faster than the original, thanks to a cleaner architecture and the removal of years of legacy compatibility. The trade-off is that some features haven&#8217;t made the jump yet, but Babylon Lite offers a glimpse of what the next generation of web-based 3D engines could look like.</p><p><a href="https://hyperblam.how/">HYPERBLAM</a> lets you make music with HTML</p><p><a href="https://github.com/mozilla/web-ext/releases/tag/10.5.0">web-ext 10.5</a> - A command line tool to help build, run, and test web extensions</p><p><a href="https://wordpalette.github.io/">WordPalette</a> &#8211; Generate a brand palette and visual identity from a word or image</p><p><a href="https://blur-unblur.github.io/">Blur and Unblur Faces</a> &#8211; A simple web tool that uses AI to blur or unblur faces in images. It can be useful for privacy protection, content moderation, or creative effects.</p><p><a href="https://github.com/sindresorhus/eslint-node-test">eslint-node-test</a> &#8212; An ESLint plugin that catches common mistakes and enforces best practices when writing tests with Node.js&#8217;s built-in <code>node:test</code> runner.</p><p><a href="https://nubjs.com/">Nub</a> &#8212; A TypeScript-first toolchain that runs TypeScript files, package.json scripts, and local CLIs using your existing Node.js installation, with no custom runtime or vendor lock-in.</p><p><a href="https://depsguard.com/">DepsGuard</a> &#8212; A native cross-platform security tool that scans and hardens npm, pnpm, Yarn, Bun, uv, pip, and Poetry configurations to reduce supply chain risks with a single command and zero dependencies.</p><h2><strong>&#128218; Libs</strong></h2><p><a href="https://rombo.co/tailwind/">tailwindcss-motion</a> - A new animation library for Tailwind CSS that adds more than 20 ready-to-use animations with a simple drop-in setup. Every effect can be previewed, tweaked, and customized directly in the browser, and the project even includes a visual animation builder for creating your own motion presets without writing complex CSS.</p><p><a href="https://flueframework.com/">Flue</a> - The Open Agent Framework. Build durable AI agents and workflows with Flue&#8217;s programmable TypeScript harness. Write once, deploy anywhere, use any LLM.</p><p><a href="https://crustjs.com/">CrustJS</a> &#8212; A lightweight, dependency-free CLI framework built specifically for Bun and written with a TypeScript-first approach. It features a fluent builder API, composable modules, and a modern developer experience, making it easy to build fast, maintainable command-line applications without pulling in a large dependency tree.</p><p><a href="https://geajs.com/">Gea</a> &#8212; A compiler-first UI framework that shifts most of the work to build time instead of runtime. Rather than relying on a virtual DOM, hooks, or signals, Gea analyzes ordinary classes and functions during compilation and generates highly targeted DOM updates. The result is a lightweight runtime with minimal overhead while letting developers write familiar JavaScript and TypeScript code.</p><p><a href="https://vercel.com/eve">eve</a> &#8212; A framework for building AI agents with a Next.js-like developer experience, combining Markdown-based instructions, TypeScript tools, and durable execution by default.</p><p><a href="https://litepacks.github.io/welyjs/">Wely</a> &#8212; A lightweight Web Components framework with a single <code>defineComponent()</code> API, offering a simple, framework-agnostic way to build reusable UI components.</p><p><a href="https://svar.dev/react/gantt/">SVAR React Gantt</a> &#8212; A modern React Gantt chart component for building everything from simple project timelines to complex enterprise scheduling applications.</p><p><a href="https://github.com/oracle/graal">GraalVM</a> - compiles applications into native executables that start instantly, scale fast, and use fewer compute resources &#128640;</p><h2><strong>&#8986; Releases</strong></h2><p><a href="https://storybook.js.org/releases/10.5">Storybook 10.5</a> focuses on polishing the developer experience. The release includes performance optimizations, workflow improvements, and a number of fixes that make component development faster and more reliable.</p><p><a href="https://devtools.vite.dev/">Vite DevTools 0.4</a> - The official Vite DevTools continue to mature. Version 0.4 delivers a smoother debugging experience, additional inspector capabilities, and numerous quality-of-life improvements for Vite developers.</p><p>The project is quickly becoming one of the most useful additions to the Vite ecosystem.</p><p><a href="https://eslint.org/blog/2026/07/eslint-v10.7.0-released/">ESLint v10.7.0 released</a></p><p><a href="https://github.com/sindresorhus/np/releases/tag/v12.0.0">np 12.0</a> - A better <code>npm publish</code></p><p><a href="https://github.com/krisk/Fuse/releases/tag/v7.5.0">Fuse.js 7.5</a>, <a href="https://github.com/ai/nanoid/releases/tag/6.0.0">Nano ID 6.0</a>, <a href="https://github.com/kartikk221/hyper-express/releases/tag/7.0.0">HyperExpress 7.0</a>, <a href="https://github.com/helmetjs/helmet">Helmet 8.3</a>, <a href="https://github.com/auth0/node-auth0/releases/tag/v6.0.0">node-auth0 6.0</a>, <a href="https://github.com/remix-run/react-router/releases/tag/react-router%408.2.0">React Router 8.2</a>, <a href="https://github.com/resend/react-email/releases/tag/react-email%406.7.0">React Email 6.7</a></p><p><a href="https://jwt-handbook.notion.site/39032ba6820480a4b06ff502248da228?v=39032ba6820480bab5fe000ce7b2681d">JWT Handbook</a> &#8211; A Complete Knowledge Base for Developers and LLMs</p><h2><strong>&#128250; Videos</strong></h2><p><a href="https://www.youtube.com/watch?v=AiZsEIhIves">I finally used GSAP&#8230; and I get the hype now</a></p><p><a href="https://www.youtube.com/watch?v=BJvQdS0m-Kw">The Outbox Pattern Explained (Complete Guide)</a></p><p><a href="https://www.youtube.com/watch?v=6By2hDgSh98">What we can learn from the Bun Rust rewrite</a></p><p><a href="https://www.youtube.com/watch?v=dKbV8MEzVPA">DuckDB is becoming unstoppable&#8230;</a></p><p><a href="https://www.youtube.com/watch?v=vVL6NFzr0Rg">Every Data Structure Simply Explained in 25 Minutes</a></p><p><a href="https://www.youtube.com/watch?v=S7_SOmxO5DA">Redis will finally make sense after this video</a></p><p><a href="https://www.youtube.com/watch?v=k1TrnzZaygo">HTMX vs React: The honest verdict (with receipts)!</a></p><p><a href="https://www.youtube.com/watch?v=WvfacC0FtbE">This Rust Rewrite Passes 100% of PostgreSQL&#8217;s Tests (pgrust)</a></p><p><a href="https://www.youtube.com/watch?v=C2GpeepcmYs">Claude Code Crash Course For Developers</a></p><h2><strong>&#128478;&#65039; News &amp; Updates</strong></h2><h3><strong>Claude Code Now Uses AI Agent Teams for Code Reviews</strong></h3><p>Anthropic <a href="https://x.com/claudedevs/status/2077840057130692886">has redesigned</a> Code Review in Claude Code, replacing a single reasoning-heavy review with a multi-agent pipeline that scales from quick local checks to distributed cloud analysis.</p><p>Instead of simply increasing how long the model &#8220;thinks,&#8221; Claude Code now offers five review levels: <strong>Low</strong>, <strong>Medium</strong>, <strong>High</strong>, <strong>X-high</strong>, and <strong>Ultra</strong>. Developers can choose a mode manually (for example, <code>/code-review high</code>) or let Claude select the most appropriate level automatically.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ydb4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ydb4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png 424w, https://substackcdn.com/image/fetch/$s_!ydb4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png 848w, https://substackcdn.com/image/fetch/$s_!ydb4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png 1272w, https://substackcdn.com/image/fetch/$s_!ydb4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ydb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png" width="800" height="510" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/afe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:510,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37457,&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/207426199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.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_!ydb4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png 424w, https://substackcdn.com/image/fetch/$s_!ydb4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png 848w, https://substackcdn.com/image/fetch/$s_!ydb4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.png 1272w, https://substackcdn.com/image/fetch/$s_!ydb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fafe5d43e-5e6d-4cba-b6d7-57a7770320f4_800x510.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 aria-hidden="true" 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><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>Low</strong> performs a fast pass over the modified files. <strong>Medium</strong> expands the review to the entire project, searches the repository for related code, and verifies potential issues before reporting them.</p><p>The biggest architectural change starts with <strong>High</strong>. Rather than relying on a single model session, Claude delegates bug discovery and validation to multiple independent AI agents, each working with a fresh context. This helps reduce anchoring bias, where a model is more likely to defend code it recently generated itself.</p><p><strong>X-high</strong> goes a step further by analyzing how a change could affect the rest of the codebase instead of focusing only on the current diff.</p><p>The new <strong>Ultra</strong> mode runs in a cloud sandbox. Claude Code clones the repository or GitHub pull request, launches a team of specialized AI reviewers, and independently reproduces every reported issue before including it in the final report.</p><p>Ultra is currently available as a Research Preview. Pro and Max subscribers receive three free reviews, after which each run typically costs <strong>$5&#8211;20</strong>, depending on the size of the changes.</p><p>According to Anthropic&#8217;s internal benchmarks, review quality improves steadily as the analysis becomes more sophisticated. Using Claude Opus 4.8, the system detected roughly <strong>17%</strong> of labeled bugs in <strong>Low</strong> mode, <strong>22%</strong> in <strong>Medium</strong>, <strong>24%</strong> in <strong>High</strong>, and <strong>25%</strong> in <strong>X-high</strong>. Anthropic also reports that a competing system achieved between <strong>8% and 12%</strong> on the same benchmark.</p><p>The company says Ultra Review is already being used internally to review every pull request before changes are merged.</p><p>Rather than relying solely on larger language models, Anthropic is betting on agent-based software engineering, where multiple specialized AI reviewers collaborate to analyze, validate, and verify code before it reaches production. This approach could become the next major step in AI-assisted development.</p><div><hr></div><p>That&#8217;s a wrap for <strong>Friday Links #41</strong>.</p><p>The JavaScript ecosystem continues to move at an incredible pace. New runtimes are getting faster, AI coding workflows are becoming more sophisticated, and the tooling around TypeScript and modern web development keeps improving almost every week.</p><p>We&#8217;ll be back next Friday with another curated collection of the most interesting releases, libraries, engineering articles, and AI tools. Until then, happy coding, and don&#8217;t forget to star the projects you find useful.</p>]]></content:encoded></item><item><title><![CDATA[Bun.WebView Makes Browser Automation Ridiculously Simple]]></title><description><![CDATA[Forget heavyweight browser automation stacks. With Bun 1.3.12, taking screenshots, scraping pages, and interacting with websites can be as simple as a few lines of TypeScript.]]></description><link>https://jsdevspace.substack.com/p/bunwebview-makes-browser-automation</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/bunwebview-makes-browser-automation</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Wed, 08 Jul 2026 10:30:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!O81X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_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_!O81X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O81X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!O81X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!O81X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!O81X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O81X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_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;:1023626,&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/206025004?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_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_!O81X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!O81X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!O81X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!O81X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac77dbc1-8c5b-4f56-bb33-48c5972cc8c7_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>For years, browser automation has usually meant reaching for <strong>Puppeteer</strong> or <strong>Playwright</strong>. They&#8217;re incredibly powerful, but they also come with a price: large Chromium downloads, extra dependencies, platform-specific setup, and a lot of boilerplate before you can accomplish something simple.</p><p>With <strong><a href="https://bun.com/">Bun</a></strong>, there&#8217;s now another option.</p><p><strong>Bun.WebView</strong> is an experimental API built directly into Bun that provides a lightweight way to automate browsers, capture screenshots, execute JavaScript, and simulate real user interactions&#8212;all without installing another npm package.</p><h2>Taking a Screenshot in Three Lines</h2><p>Getting a screenshot of a webpage really is this simple:</p><pre><code><code>await using view = new Bun.WebView();

await view.navigate("https://example.com");

await Bun.write(
  "page.png",
  await view.screenshot(),
);</code></code></pre><p>Run it:</p><pre><code><code>bun run demo.ts</code></code></pre><p>That&#8217;s it.</p><p>No Puppeteer installation.</p><p>No Chromium download.</p><p>No browser launch configuration.</p><div><hr></div><h2>Why Bun.WebView Exists</h2><p>Many developers only need to:</p><ul><li><p>capture screenshots</p></li><li><p>scrape page content</p></li><li><p>test UI interactions</p></li><li><p>automate repetitive browser tasks<br></p></li></ul><p>Yet a typical Puppeteer setup often involves:</p><ul><li><p>installing another package</p></li><li><p>downloading hundreds of megabytes of Chromium</p></li><li><p>dealing with missing Linux dependencies</p></li><li><p>waiting for browsers to launch</p></li></ul><p>Bun.WebView aims to remove that friction.</p><p>Because it&#8217;s built directly into Bun, there&#8217;s nothing extra to install.</p><div><hr></div><h2>Platform Support</h2><p>Bun uses native browser engines whenever possible.</p><h3>macOS</h3><p>Uses the system <strong>WKWebView</strong>.</p><p>No configuration required.</p><h3>Windows &amp; Linux</h3><p>Bun automatically searches for installed versions of:</p><ul><li><p>Chrome</p></li><li><p>Chromium</p></li><li><p>Microsoft Edge</p></li></ul><p>In most cases it simply works.</p><div><hr></div><h2>Install Bun</h2><p>You&#8217;ll need <strong>Bun 1.3.12</strong> or newer.</p><pre><code><code>curl -fsSL https://bun.sh/install | bash

bun --version</code></code></pre><p>Then simply execute your script:</p><pre><code><code>bun run demo.ts</code></code></pre><div><hr></div><h1>Running JavaScript Inside the Page</h1><p>You can evaluate JavaScript directly in the loaded document.</p><pre><code><code>const view = new Bun.WebView();

await view.navigate("https://example.com");

const title = await view.evaluate(
  "document.title",
);

console.log(title);</code></code></pre><p><code>evaluate()</code> automatically:</p><ul><li><p>executes JavaScript</p></li><li><p>waits for Promises</p></li><li><p>serializes the returned value</p></li></ul><p>Fetching API data becomes trivial:</p><pre><code><code>const posts = await view.evaluate(`
  fetch("/api/posts")
    .then(res =&gt; res.json())
`);</code></code></pre><p>No manual serialization is required.</p><div><hr></div><h2>Simulating Real User Actions</h2><p>Bun.WebView generates <strong>native browser input events</strong>.</p><p>Clicking an element:</p><pre><code><code>await view.click("input[name='search']");</code></code></pre><p>Typing text:</p><pre><code><code>await view.type("Bun WebView");</code></code></pre><p>Pressing keyboard shortcuts:</p><pre><code><code>await view.press("Enter");</code></code></pre><p>Unlike directly changing <code>input.value</code>, these generate actual keyboard events.</p><p>That means frameworks like:</p><ul><li><p>React</p></li><li><p>Vue</p></li><li><p>Svelte</p></li></ul><p>receive normal user input events exactly as if someone were typing.</p><div><hr></div><h2>Advanced Click Options</h2><p>Double-click while holding Shift:</p><pre><code><code>await view.click("a.article", {
  button: "left",
  count: 2,
  modifiers: ["Shift"],
  timeout: 5000,
});</code></code></pre><p>Bun automatically waits until the element:</p><ul><li><p>exists</p></li><li><p>is visible</p></li><li><p>is stable</p></li><li><p>isn&#8217;t covered by another element</p></li></ul><p>before clicking.</p><div><hr></div><h2>Scrolling and Window Resizing</h2><p>Scrolling the page:</p><pre><code><code>await view.scroll(0, 600);</code></code></pre><p>Changing browser dimensions:</p><pre><code><code>await view.resize(1920, 1080);</code></code></pre><p>Useful when testing responsive layouts or generating screenshots at multiple resolutions.</p><div><hr></div><h2>Capturing Screenshots</h2><h3>Entire Page</h3><pre><code><code>await Bun.write(
  "full.png",
  await view.screenshot({
    format: "png",
    fullPage: true,
  }),
);</code></code></pre><div><hr></div><h3>Specific Elements</h3><p>Capture only one component:</p><pre><code><code>const hero = await view.screenshot({
  selector: "header.hero",
  format: "jpeg",
  quality: 85,
});

await Bun.write("hero.jpg", hero);</code></code></pre><p>Supported formats include:</p><ul><li><p>PNG</p></li><li><p>JPEG</p></li><li><p>WebP</p></li></ul><p>WebP files are typically much smaller than equivalent PNG images while maintaining excellent quality.</p><div><hr></div><h2>Choosing a Browser Manually</h2><p>If automatic browser detection doesn&#8217;t find Chrome, specify it yourself.</p><pre><code><code>const view = new Bun.WebView({
  backend: {
    type: "chrome",
    path: "/usr/bin/google-chrome",
  },
});</code></code></pre><div><hr></div><h2>Reusing an Existing Chrome Instance</h2><p>If you&#8217;re already debugging Chrome:</p><pre><code><code>chrome --remote-debugging-port=9222</code></code></pre><p>Connect directly:</p><pre><code><code>const view = new Bun.WebView({
  backend: {
    type: "chrome",
    url: "ws://127.0.0.1:9222/devtools/browser/xxx",
  },
});</code></code></pre><p>Keeping Chrome running between executions can significantly reduce startup time during development.</p><div><hr></div><h2>Scraping Multiple Pages</h2><p>Here&#8217;s a simple crawler that collects page titles.</p><pre><code><code>const urls = [
  "https://bun.sh/blog",
  "https://bun.sh/docs",
  "https://bun.sh/docs/cli/run",
];

await using view = new Bun.WebView();

for (const url of urls) {
  await view.navigate(url);

  const title = await view.evaluate(`
    document.querySelector("h1")?.textContent
      || document.title
  `);

  console.log(`${url} &#8594; ${title}`);
}</code></code></pre><p>Multiple <code>WebView</code> instances share the same browser subprocess, making them much lighter than launching separate browser instances.</p><div><hr></div><h1>Persisting Login Sessions</h1><p>Need cookies to survive between runs?</p><p>Simply specify a data directory.</p><pre><code><code>const view = new Bun.WebView({
  dataStore: {
    directory: "./browser-profile",
  },
});</code></code></pre><p>Bun automatically preserves:</p><ul><li><p>cookies</p></li><li><p>localStorage</p></li><li><p>browser storage</p></li></ul><p>Log in once, and future runs reuse the same session.</p><div><hr></div><h2>Capturing Browser Console Output</h2><p>Debugging frontend code becomes much easier.</p><pre><code><code>const view = new Bun.WebView({
  console(type, ...args) {
    console.log(`[${type}]`, ...args);
  },
});</code></code></pre><p>This captures:</p><ul><li><p><code>console.log</code></p></li><li><p><code>console.warn</code></p></li><li><p><code>console.error</code></p></li></ul><p>directly from the webpage.</p><div><hr></div><h2>Using Chrome DevTools Protocol</h2><p>Need lower-level browser control?</p><p>Bun exposes the Chrome DevTools Protocol (CDP).</p><p>Execute a command:</p><pre><code><code>const metrics = await view.cdp(
  "Page.getLayoutMetrics",
);

console.log(metrics);</code></code></pre><p>Subscribe to browser events:</p><pre><code><code>const unsubscribe = view.cdpSubscribe(
  "Network.requestWillBeSent",
  ({ request }) =&gt; {
    console.log(request.url);
  },
);

await view.navigate("https://example.com");

unsubscribe();</code></code></pre><p>With CDP you can build advanced tooling for:</p><ul><li><p>network inspection</p></li><li><p>performance profiling</p></li><li><p>cookie management</p></li><li><p>browser instrumentation</p></li><li><p>request monitoring</p></li></ul><div><hr></div><h2>Things to Keep in Mind</h2><p>Bun.WebView is currently <strong>experimental</strong>, so expect the API to evolve as Bun continues development.</p><p>Before using it:</p><ul><li><p>install <strong>Bun 1.3.12 or newer</strong></p></li><li><p>ensure Chrome (or Chromium/Edge) is installed on Linux</p></li><li><p>remember that macOS uses the built-in WebKit engine automatically</p></li></ul><p>One more important detail: browser sessions create temporary directories. If you don&#8217;t dispose of a <code>WebView</code>, those temporary files can accumulate over time.</p><p>Using:</p><pre><code><code>await using view = new Bun.WebView();</code></code></pre><p>ensures the browser is cleaned up automatically when execution finishes.</p><div><hr></div><h2>Final Thoughts</h2><p>Bun.WebView isn&#8217;t trying to replace mature automation frameworks like Puppeteer or Playwright for complex end-to-end testing. Instead, it targets a different sweet spot: everyday browser automation with almost no setup.</p><p>For quick scripts, screenshots, scraping, or lightweight UI automation, the developer experience is refreshingly simple. If you&#8217;re already using Bun, you can start experimenting immediately&#8212;no extra packages, no massive browser downloads, and only a handful of lines to get real work done.</p><p>While the API is still experimental, it&#8217;s an exciting glimpse at how browser automation could become a first-class feature of modern JavaScript runtimes.</p>]]></content:encoded></item><item><title><![CDATA[Friday Links #40 — JavaScript News, New Libraries & AI Tools]]></title><description><![CDATA[From new open-source releases and developer tooling to AI breakthroughs and engineering insights, here's everything that caught our attention over the past two weeks.]]></description><link>https://jsdevspace.substack.com/p/friday-links-40-javascript-news-new</link><guid isPermaLink="false">https://jsdevspace.substack.com/p/friday-links-40-javascript-news-new</guid><dc:creator><![CDATA[JavaScript Development Space]]></dc:creator><pubDate>Fri, 03 Jul 2026 08:52:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-Uy2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.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_!-Uy2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-Uy2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png 424w, https://substackcdn.com/image/fetch/$s_!-Uy2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png 848w, https://substackcdn.com/image/fetch/$s_!-Uy2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png 1272w, https://substackcdn.com/image/fetch/$s_!-Uy2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-Uy2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png" width="800" height="505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:505,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:581518,&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/204803876?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.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_!-Uy2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png 424w, https://substackcdn.com/image/fetch/$s_!-Uy2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png 848w, https://substackcdn.com/image/fetch/$s_!-Uy2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.png 1272w, https://substackcdn.com/image/fetch/$s_!-Uy2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b5908dc-aba4-4657-9bba-fab075b04a56_800x505.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 #40</strong>.</p><p>The JavaScript ecosystem continues to move at an incredible pace, with new libraries, framework updates, open-source releases, and AI-powered developer tools appearing almost every day. Keeping up with everything can be challenging, so we&#8217;ve gathered the most interesting announcements, projects, articles, and resources from the past two weeks into one place.</p><p>Whether you&#8217;re looking for something new to use in production, an open-source project to explore, or simply a few good engineering reads for the weekend, there&#8217;s plenty to discover in this edition.</p><h2>&#128220; Articles &amp; Tutorials</h2><p><a href="https://www.xda-developers.com/a-former-microsoft-engineer-has-rebuilt-notepad-and-its-25kb-in-size-and-has-zero-ai-bloat/">A former Microsoft engineer has rebuilt Notepad, and it&#8217;s 2.5KB in size and has zero AI bloat</a></p><p><a href="https://jakearchibald.com/2026/goldilocks-select-height/">The Goldilocks customizable select height</a></p><p><a href="https://neciudan.dev/hydration-and-rendering-strategies">Different hydration and rendering strategies</a></p><p><a href="https://developer.chrome.com/blog/usermedia-html-element">Introducing the </a><code>&lt;usermedia&gt;</code><a href="https://developer.chrome.com/blog/usermedia-html-element"> HTML element</a></p><p><a href="https://css-tricks.com/css-states-and-javascript-events/">The Shifting Line Between CSS States and JavaScript Events</a></p><p><a href="https://polypane.app/blog/experimenting-with-random-in-css/">Experimenting with random() in CSS</a></p><p><a href="https://cassidoo.co/post/radial-mask-text-css/">An animated radial gradient mask over text in CSS</a></p><p><a href="https://microlink.io/blog/webgl-without-a-gpu">WebGL without a GPU</a></p><p><a href="https://quirksmode.org/quirksblog/2026/0527-gridalgo.html">Grid algorithm adventures</a></p><p><a href="https://github.blog/changelog/2026-06-25-actions-steps-can-now-be-run-in-parallel/">Actions steps can now be run in parallel</a></p><p><a href="https://developers.googleblog.com/build-agentic-full-stack-apps-with-genkit/">Announcing Genkit Agents: A full-stack foundation for conversational AI</a></p><p><a href="https://code.visualstudio.com/blogs/2026/06/26/iterating-faster-with-ts-7">VSCode - Iterating faster with TypeScript 7</a></p><p><a href="https://www.jstools.space/blog/read-large-json-files/">How to Read Large JSON Files Without Losing Your Mind</a></p><h2>&#9874;&#65039; Tools</h2><p><a href="http://localhost:4322/json-formatter/">JSON Formatter</a> - A simple and fast JSON formatter and validator for developers. It can format, validate, and beautify JSON data in a user-friendly interface.</p><p><a href="https://jstools-space.gitbook.io/json-handbook">JSON Handbook</a></p><p><a href="https://github.com/raiyanyahya/recall">Recall</a> - fully-local project memory for Claude Code</p><p><a href="https://github.com/stablyai/orca">Orca</a> - is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop and mobile.</p><p><a href="https://infographic.antv.vision/">Infographic</a> - An Infographic Generation and Rendering Framework, bring words to life with AI!</p><p><a href="https://github.com/breschio/drawbridge">Drawbridge</a> - Design editor for Claude Code and Cursor. &#8220;Figma Comments&#8221; for the browser, are sent directly to Claude Code and Cursor as prompts.</p><p><a href="https://github.com/jarrodwatts/claude-hud">Claude HUD</a> - A Claude Code plugin that shows what&#8217;s happening &#8212; context usage, active tools, running agents, and todo progress. Always visible below your input.</p><p><a href="https://github.com/EpicGames/lore">Lore</a> - Lore is a next-generation, open source version control system</p><h2>&#128218; Libs</h2><p><a href="https://github.com/daloyjs/daloy">DaloyJS</a> - The secure TypeScript API framework that runs anywhere</p><p><a href="https://github.com/pdfme/pdfme">pdfme</a> - Open-source PDF generation library built with TypeScript and React. Features a WYSIWYG template designer, PDF viewer, and powerful generation capabilities.</p><p><a href="https://github.com/ddoemonn/hiraki">hiraki</a> - A zero-dependency React drawer component. All 4 directions, velocity-aware gestures, snap points, 6 variants, and a pure CSS animation system without Radix, Framer Motion, or any external runtime dependencies.</p><p><a href="https://github.com/thoughtfulllc/gridland">Gridland</a> - Terminal apps that run anywhere - even the browser!</p><p><a href="https://github.com/rari-build/rari">rari</a> - High-performance React Server Components framework powered by a Rust runtime, delivering 18.1x faster response times (0.12ms vs 2.17ms) and 67.4x higher throughput (97,826 vs 1,452 req/sec) than Next.js with zero-config setup.</p><p><a href="https://github.com/marcoaapfortes/Mantic.sh">Mantic.sh</a> - A structural code search engine for Al agents.</p><p><a href="https://github.com/zhw2590582/ArtPlayer">ArtPlayer</a> - ArtPlayer.js is a modern and full featured HTML5 video player</p><p><code>&lt;qr-code&gt;</code> - Web Component for generating QR Codes</p><p><a href="https://github.com/jsdom/whatwg-url">whatwg-url</a> - An implementation of the WHATWG URL Standard in JavaScript</p><h2>&#8986; Releases</h2><p><a href="https://astro.build/blog/astro-7/">Astro 7.0 Released</a></p><p>Astro 7 is the biggest release since Astro 5, with a strong focus on build performance and AI-powered workflows. The framework now ships with Vite 8, a brand-new Rust-based .astro compiler, Rust-powered Markdown/MDX processing, queued rendering, and stable route caching. The Astro team reports 15&#8211;61% faster builds, with some large documentation sites building more than twice as fast. Astro 7 also introduces Advanced Routing, astro dev &#8212;background for AI coding agents, and structured JSON logging.</p><p><a href="https://blog.angular.dev/announcing-angular-v22-c52bb83a4664">Announcing Angular v22</a></p><p><a href="https://devblogs.microsoft.com/commandline/intelligent-terminal-0-1-1-is-here-bash-support-new-slash-commands-and-customization/">Intelligent Terminal 0.1.1 is here: bash support, new slash commands, and more customization</a></p><p><a href="https://vite.dev/blog/announcing-vite8-1">Vite 8.1 is out!</a></p><p><a href="https://nodejs.org/en/blog/release/v26.4.0">Node.js 26.4.0 (Current)</a></p><p><a href="https://rspack.rs/blog/announcing-2-1">Announcing Rspack 2.1</a></p><p><a href="https://github.com/react-hook-form/react-hook-form/releases/tag/v7.80.0">React Hook Form v7.80</a>, <a href="https://reactnative.dev/blog/2026/06/11/react-native-0.86">React Native v0.86</a>, <a href="https://motion.dev/docs/arc">Motion v12.40</a>, <a href="https://www.electronjs.org/blog/electron-43-0">Electron 43</a>, <a href="https://nextjs.org/blog/next-16-3-instant-navigations">Next.js 16.3: Instant Navigations</a>, <a href="https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v810">React-Router 8.1</a></p><p><a href="https://rspack.rs/blog/announcing-2-1">Announcing Rspack 2.1</a>, <a href="https://github.com/47ng/nuqs/releases/tag/v2.9.0">nuqs 2.9</a>, <a href="https://github.com/redwoodjs/sdk/releases/tag/v1.5.0">RedwoodSDK 1.5</a>, <a href="https://prettier.io/blog/2026/06/27/3.9.0">Prettier 3.9</a>, <a href="https://deno.com/blog/v2.9#deno-desktop">Deno 2.9</a>, <a href="https://webpack.js.org/blog/2026-06-25-webpack-5-108/">Webpack 5.108</a>, <a href="https://eslint.org/blog/2026/06/eslint-v10.6.0-released/">ESLint v10.6.0 released</a></p><p><a href="https://github.blog/open-source/git/highlights-from-git-2-55/">Highlights from Git 2.55</a></p><h2>&#128250; Videos</h2><p><a href="https://www.youtube.com/watch?v=Q6NpiIp-6WM">NestJS Full Course for Beginners in 2026 | Build a Production-Ready API</a></p><p><a href="https://www.youtube.com/watch?v=8FSLsVAJj2w">Modern UI Patterns - Una Kravets - CSS Day 2026</a></p><p><a href="https://www.youtube.com/watch?v=dJ_MeKWdeVQ">Postgres Replicas Explained</a></p><p><a href="https://www.youtube.com/watch?v=3NSSGt9bZag">Linus Torvalds: AI Can&#8217;t Think Like a Programmer</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=zPqcS5AvQvQ">Local AI Coding is Finally Good Enough</a></p><p><a href="https://www.youtube.com/watch?v=X4iAQkjtx5k">The Real Reason Discord Left Cassandra</a></p><p><a href="https://www.youtube.com/watch?v=Sntj4HmuykI">The most trusted code on Earth is being rewritten in Rust</a></p><p><a href="https://www.youtube.com/watch?v=a2i9h2ip-nY">Midjourney has a new side quest&#8230; death</a></p><p><a href="https://www.youtube.com/watch?v=grPtnrOTP_4">Software Architecture&#8217;s Biggest Enemy (Not What You Think)</a></p><p><a href="https://www.youtube.com/watch?v=mABpAI-pCw0">Command Line Basics for Beginners - Full Course</a></p><h2>&#128478;&#65039; News &amp; Updates</h2><h3>California Just Plugged Its Government Into Claude</h3><p>On June 29, 2026, <a href="https://www.gov.ca.gov/2026/06/29/governor-newsom-announces-a-first-of-its-kind-partnership-providing-anthropic-tools-to-state-agencies-and-improving-services-for-californians/">Governor Gavin Newsom&#8217;s office announced</a> that California is making Anthropic&#8217;s Claude available across state government.</p><p>Every state agency can now access Claude through a shared government IT portal at a 50% discount. The same deal extends to cities and counties, with Anthropic also providing staff training and workflow support.</p><p>The state says this is its first AI productivity tool available to all agencies. The DMV is already using Claude to reduce customer service wait times, while health and human services teams are testing it in Medicaid-related workflows.</p><p>Newsom framed the move carefully: AI should not replace government workers, but help them work faster.</p><p>The interesting part is not just the discount. It is the strategy.</p><p>California is doing what many organizations should probably do: choose one model, put it behind a single access point, train people properly, and define a clear rule for how it should be used. That is much better than letting every department experiment with random tools in isolation.</p><p>But there is a tradeoff.</p><p>Once workflows, documents, support systems, and internal habits are built around one model, switching becomes harder. The vendor is no longer just a tool provider. It becomes part of the operating system.</p><p>That does not mean California made a bad move. A 50% statewide deal plus training is valuable. But every good enterprise AI deal also creates dependency.</p><p>The real lesson is simple: standardize the model, but own the system around it.</p><p>Your prompts, processes, escalation rules, knowledge base, audits, and workflow design should belong to you. The model underneath may change, get more expensive, become outdated, or be replaced by something better.</p><p>Claude may be the engine today. Tomorrow it could be another model.</p><p>The organizations that win will not be the ones that merely &#8220;use AI.&#8221; They will be the ones that build an operational layer strong enough to survive the model changing underneath it.</p><div><hr></div><p>That wraps up <strong>Friday Links #40</strong>.</p><p>As always, if you discover a project you like, consider starring it on GitHub, supporting the maintainers, or sharing it with your team. Open source grows because developers contribute, provide feedback, and spread the word.</p><p>Thanks for reading, have a great weekend, and we&#8217;ll be back soon with another collection of the best JavaScript news, libraries, tools, and AI developments in <strong>Friday Links #41</strong>.</p>]]></content:encoded></item><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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 aria-hidden="true" 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><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;video_preview_media_key&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></channel></rss>