<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Electron Blog</title>
        <link>https://electronjs.org/blog</link>
        <description>Electron Blog</description>
        <lastBuildDate>Fri, 22 Nov 2024 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[December Quiet Month (Dec'24)]]></title>
            <link>https://electronjs.org/blog/dec-quiet-period-24</link>
            <guid>https://electronjs.org/blog/dec-quiet-period-24</guid>
            <pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[The Electron project will pause for the month of December 2024, then return to full speed in January 2025.]]></description>
            <content:encoded><![CDATA[<p>The Electron project will pause for the month of December 2024, then return to full speed in January 2025.</p>
<iframe src="https://giphy.com/embed/3otPoSDQczp1s9kVAQ" width="480" height="259" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe>
<p><a href="https://giphy.com/gifs/filmeditor-disney-pixar-3otPoSDQczp1s9kVAQ">via GIPHY</a></p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-will-be-the-same-in-december">What will be the same in December<a href="https://electronjs.org/blog/dec-quiet-period-24#what-will-be-the-same-in-december" class="hash-link" aria-label="Direct link to What will be the same in December" title="Direct link to What will be the same in December">​</a></h2>
<ol>
<li>Zero-day and other major security-related releases will be published as necessary. Security
incidents should be reported via <a href="https://github.com/electron/electron/tree/main/SECURITY.md" target="_blank" rel="noopener noreferrer">SECURITY.md</a>.</li>
<li><a href="https://github.com/electron/electron/blob/main/CODE_OF_CONDUCT.md" target="_blank" rel="noopener noreferrer">Code of Conduct</a> reports
and moderation will continue.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-will-be-different-in-december">What will be different in December<a href="https://electronjs.org/blog/dec-quiet-period-24#what-will-be-different-in-december" class="hash-link" aria-label="Direct link to What will be different in December" title="Direct link to What will be different in December">​</a></h2>
<ol>
<li>2024's last stable branch releases for the year, which include Electron 31, 32, and 33, will occur the week of December 1st. There will be no additional planned releases in December.</li>
<li>No Nightly and Alpha releases for the last two weeks of December.</li>
<li>With few exceptions, no pull request reviews or merges.</li>
<li>No issue tracker updates on any repositories.</li>
<li>No Discord debugging help from maintainers.</li>
<li>No social media content updates.</li>
</ol>
<p>See you all in 2025!</p>]]></content:encoded>
            <category>Project News</category>
        </item>
        <item>
            <title><![CDATA[Migrating from BrowserView to WebContentsView]]></title>
            <link>https://electronjs.org/blog/migrate-to-webcontentsview</link>
            <guid>https://electronjs.org/blog/migrate-to-webcontentsview</guid>
            <pubDate>Mon, 11 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[BrowserView has been deprecated since Electron 30 and is replaced by WebContentView. Thankfully, migrating is fairly painless.]]></description>
            <content:encoded><![CDATA[<p><code>BrowserView</code> has been deprecated since <a href="http://www.electronjs.org/blog/electron-30-0" target="_blank" rel="noopener noreferrer">Electron 30</a> and is replaced by <code>WebContentView</code>. Thankfully, migrating is fairly painless.</p>
<hr>
<p>Electron is moving from <a href="https://www.electronjs.org/docs/latest/api/browser-view" target="_blank" rel="noopener noreferrer"><code>BrowserView</code></a> to <a href="https://www.electronjs.org/docs/latest/api/web-contents-view" target="_blank" rel="noopener noreferrer"><code>WebContentsView</code></a> to align with Chromium’s UI framework, the <a href="https://www.chromium.org/chromium-os/developer-library/guides/views/intro/" target="_blank" rel="noopener noreferrer">Views API</a>. <code>WebContentsView</code> offers a reusable view directly tied to Chromium’s rendering pipeline, simplifying future upgrades and opening up the possibility for developers to integrate non-web UI elements to their Electron apps. By adopting <code>WebContentsView</code>, applications are not only prepared for upcoming updates but also benefit from reduced code complexity and fewer potential bugs in the long run.</p>
<p>Developers familiar with BrowserWindows and BrowserViews should note that <code>BrowserWindow</code> and <code>WebContentsView</code> are subclasses inheriting from the <a href="https://www.electronjs.org/docs/latest/api/base-window" target="_blank" rel="noopener noreferrer"><code>BaseWindow</code></a> and <a href="https://www.electronjs.org/docs/latest/api/view" target="_blank" rel="noopener noreferrer"><code>View</code></a> base classes, respectively. To fully understand the available instance variables and methods, be sure to consult the documentation for these base classes.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="migration-steps">Migration steps<a href="https://electronjs.org/blog/migrate-to-webcontentsview#migration-steps" class="hash-link" aria-label="Direct link to Migration steps" title="Direct link to Migration steps">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-upgrade-electron-to-3000-or-higher">1. Upgrade Electron to 30.0.0 or higher<a href="https://electronjs.org/blog/migrate-to-webcontentsview#1-upgrade-electron-to-3000-or-higher" class="hash-link" aria-label="Direct link to 1. Upgrade Electron to 30.0.0 or higher" title="Direct link to 1. Upgrade Electron to 30.0.0 or higher">​</a></h3>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Electron releases may contain breaking changes that affect your application. It’s a good idea to test and land the Electron upgrade on your app <em>first</em> before proceeding with the rest of this migration. A list of breaking changes for each Electron major version can be found <a href="https://www.electronjs.org/docs/latest/breaking-changes" target="_blank" rel="noopener noreferrer">here</a> as well as in the release notes for each major version on the Electron Blog.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-familiarize-yourself-with-where-your-application-uses-browserviews">2. Familiarize yourself with where your application uses BrowserViews<a href="https://electronjs.org/blog/migrate-to-webcontentsview#2-familiarize-yourself-with-where-your-application-uses-browserviews" class="hash-link" aria-label="Direct link to 2. Familiarize yourself with where your application uses BrowserViews" title="Direct link to 2. Familiarize yourself with where your application uses BrowserViews">​</a></h3>
<p>One way to do this is to search your codebase for <code>new BrowserView(</code>. This should give you a sense for how your application is using BrowserViews and how many call sites need to be migrated.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>For the most part, each instance where your app instantiates new BrowserViews can be migrated in isolation from the others.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-migrate-each-usage-of-browserview">3. Migrate each usage of <code>BrowserView</code><a href="https://electronjs.org/blog/migrate-to-webcontentsview#3-migrate-each-usage-of-browserview" class="hash-link" aria-label="Direct link to 3-migrate-each-usage-of-browserview" title="Direct link to 3-migrate-each-usage-of-browserview">​</a></h3>
<ol>
<li>
<p>Migrate the instantiation. This should be fairly straightforward because <a href="https://www.electronjs.org/docs/latest/api/web-contents-view#new-webcontentsviewoptions" target="_blank" rel="noopener noreferrer">WebContentsView</a> and <a href="https://www.electronjs.org/docs/latest/api/browser-view#new-browserviewoptions-experimental-deprecated" target="_blank" rel="noopener noreferrer">BrowserView’s</a> constructors have essentially the same shape. Both accept <a href="https://www.electronjs.org/docs/latest/api/structures/web-preferences" target="_blank" rel="noopener noreferrer">WebPreferences</a>&nbsp;via the <code>webPreferences</code> param.</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49"> this.tabBar = new BrowserView({</span><br></span><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa"> this.tabBar = new WebContentsView({</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>By default, <code>WebContentsView</code> instantiates with a white background, while <code>BrowserView</code> instantiates with a transparent background.
To get a transparent background in <code>WebContentsView</code>, set its background color to an RGBA hex value with an alpha (opaqueness) channel set to <code>00</code>:</p><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa"> this.webContentsView.setBackgroundColor("#00000000");</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div>
</li>
<li>
<p>Migrate where the <code>BrowserView</code> gets added to its parent window.</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49"> this.browserWindow.addBrowserView(this.tabBar)</span><br></span><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa"> this.browserWindow.contentView.addChildView(this.tabBar);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>Migrate <code>BrowserView</code> instance method calls on the parent window.</p>
<table><thead><tr><th>Old Method</th><th>New Method</th><th>Notes</th></tr></thead><tbody><tr><td><code>win.setBrowserView</code></td><td><code>win.contentView.removeChildView</code> + <code>win.contentView.addChildView</code></td><td></td></tr><tr><td><code>win.getBrowserView</code></td><td><code>win.contentView.children</code></td><td></td></tr><tr><td><code>win.removeBrowserView</code></td><td><code>win.contentView.removeChildView</code></td><td></td></tr><tr><td><code>win.setTopBrowserView</code></td><td><code>win.contentView.addChildView</code></td><td>Calling <code>addChildView</code> on an existing view reorders it to the top.</td></tr><tr><td><code>win.getBrowserViews</code></td><td><code>win.contentView.children</code></td><td></td></tr></tbody></table>
</li>
<li>
<p>Migrate the <code>setAutoResize</code> instance method to a resize listener.</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49"> this.browserView.setAutoResize({</span><br></span><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49">   vertical: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token deleted-sign deleted prefix deleted" style="color:#d73a49">-</span><span class="token deleted-sign deleted line" style="color:#d73a49"> })</span><br></span><span class="token-line" style="color:#393A34"><span class="token deleted-sign deleted line" style="color:#d73a49"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa"> this.browserWindow.on('resize', () =&gt; {</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   if (!this.browserWindow || !this.webContentsView) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">     return;</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   }</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   const bounds = this.browserWindow.getBounds();</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">   this.webContentsView.setBounds({</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">     x: 0,</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">     y: 0,</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">     width: bounds.width,</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">     height: bounds.height,</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">    });</span><br></span><span class="token-line" style="color:#393A34"><span class="token inserted-sign inserted line" style="color:#36acaa"></span><span class="token inserted-sign inserted prefix inserted" style="color:#36acaa">+</span><span class="token inserted-sign inserted line" style="color:#36acaa">  });</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>All existing usage of <code>browserView.webContents</code> and instance methods <code>browserView.setBounds</code>, <code>browserView.getBounds</code> , and <code>browserView.setBackgroundColor</code> do not need to be migrated and should work with a <code>WebContentsView</code> instance out of the box!</p></div></div>
</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-test-and-commit-your-changes">4. Test and commit your changes<a href="https://electronjs.org/blog/migrate-to-webcontentsview#4-test-and-commit-your-changes" class="hash-link" aria-label="Direct link to 4. Test and commit your changes" title="Direct link to 4. Test and commit your changes">​</a></h3>
<p>Running into issues? Check the <a href="https://github.com/electron/electron/labels/component%2FWebContentsView" target="_blank" rel="noopener noreferrer">WebContentsView</a> tag on Electron's issue tracker to see if the issue you're encountering has been reported. If you don't see your issue there, feel free to add a new bug report. Including testcase gists will help us better triage your issue!</p>
<p>Congrats, you’ve migrated onto WebContentsViews! 🎉</p>]]></content:encoded>
            <category>Community</category>
        </item>
        <item>
            <title><![CDATA[Electron 33.0.0]]></title>
            <link>https://electronjs.org/blog/electron-33-0</link>
            <guid>https://electronjs.org/blog/electron-33-0</guid>
            <pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 33.0.0 has been released! It includes upgrades to Chromium 130.0.6723.44, V8 13.0, and Node 20.18.0.]]></description>
            <content:encoded><![CDATA[<p>Electron 33.0.0 has been released! It includes upgrades to Chromium 130.0.6723.44, V8 13.0, and Node 20.18.0.</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 33.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on <a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-33-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/electron-33-0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h3>
<ul>
<li>Added a handler, <code>app.setClientCertRequestPasswordHandler(handler)</code>, to help unlock cryptographic devices when a PIN is needed. <a href="https://github.com/electron/electron/pull/41205" target="_blank" rel="noopener noreferrer">#41205</a></li>
<li>Extended <code>navigationHistory</code> API with 2 new functions for better history management. <a href="https://github.com/electron/electron/pull/42014" target="_blank" rel="noopener noreferrer">#42014</a></li>
<li>Improved native theme transparency checking. <a href="https://github.com/electron/electron/pull/42862" target="_blank" rel="noopener noreferrer">#42862</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-33-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>130.0.6723.44</code>
<ul>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-130/" target="_blank" rel="noopener noreferrer">New in 130</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-129/" target="_blank" rel="noopener noreferrer">New in 129</a></li>
</ul>
</li>
<li>Node <code>20.18.0</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v20.18.0/" target="_blank" rel="noopener noreferrer">Node 20.18.0 blog post</a></li>
<li><a href="https://nodejs.org/en/blog/release/v20.17.0/" target="_blank" rel="noopener noreferrer">Node 20.17.0 blog post</a></li>
</ul>
</li>
<li>V8 <code>13.0</code></li>
</ul>
<p>Electron 33 upgrades Chromium from <code>128.0.6613.36</code> to <code>130.0.6723.44</code>, Node from <code>20.16.0</code> to <code>20.18.0</code>, and V8 from <code>12.8</code> to <code>13.0</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-33-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added a handler, <code>app.setClientCertRequestPasswordHandler(handler)</code>, to help unlock cryptographic devices when a PIN is needed. <a href="https://github.com/electron/electron/pull/41205" target="_blank" rel="noopener noreferrer">#41205</a></li>
<li>Added error event in utility process to support diagnostic reports on V8 fatal errors. <a href="https://github.com/electron/electron/pull/43997" target="_blank" rel="noopener noreferrer">#43997</a></li>
<li>Added <code>View.setBorderRadius(radius)</code> for customizing the border radius of views—with compatibility for <code>WebContentsView</code>. <a href="https://github.com/electron/electron/pull/42320" target="_blank" rel="noopener noreferrer">#42320</a></li>
<li>Extended <code>navigationHistory</code> API with 2 new functions for better history management. <a href="https://github.com/electron/electron/pull/42014" target="_blank" rel="noopener noreferrer">#42014</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-33-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-macos-1015-support">Removed: macOS 10.15 support<a href="https://electronjs.org/blog/electron-33-0#removed-macos-1015-support" class="hash-link" aria-label="Direct link to Removed: macOS 10.15 support" title="Direct link to Removed: macOS 10.15 support">​</a></h4>
<p>macOS 10.15 (Catalina) is no longer supported by <a href="https://chromium-review.googlesource.com/c/chromium/src/+/5734361" target="_blank" rel="noopener noreferrer">Chromium</a>.</p>
<p>Older versions of Electron will continue to run on Catalina, but macOS 11 (Big Sur)
or later will be required to run Electron v33.0.0 and higher.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-native-modules-now-require-c20">Behavior Changed: Native modules now require C++20<a href="https://electronjs.org/blog/electron-33-0#behavior-changed-native-modules-now-require-c20" class="hash-link" aria-label="Direct link to Behavior Changed: Native modules now require C++20" title="Direct link to Behavior Changed: Native modules now require C++20">​</a></h4>
<p>Due to changes made upstream, both <a href="https://chromium-review.googlesource.com/c/v8/v8/+/5587859" target="_blank" rel="noopener noreferrer">V8</a> and <a href="https://github.com/nodejs/node/pull/45427" target="_blank" rel="noopener noreferrer">Node.js</a> now require C++20 as a minimum version. Developers using native node modules should build their modiles with <code>--std=c++20</code> rather than <code>--std=c++17</code>. Images using gcc9 or lower may need to update to gcc10 in order to compile. See <a href="https://github.com/electron/electron/pull/43555" target="_blank" rel="noopener noreferrer">#43555</a> for more details.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-custom-protocol-url-handling-on-windows">Behavior Changed: custom protocol URL handling on Windows<a href="https://electronjs.org/blog/electron-33-0#behavior-changed-custom-protocol-url-handling-on-windows" class="hash-link" aria-label="Direct link to Behavior Changed: custom protocol URL handling on Windows" title="Direct link to Behavior Changed: custom protocol URL handling on Windows">​</a></h4>
<p>Due to changes made in Chromium to support <a href="http://bit.ly/url-non-special" target="_blank" rel="noopener noreferrer">Non-Special Scheme URLs</a>, custom protocol URLs that use Windows file paths will no longer work correctly with the deprecated <code>protocol.registerFileProtocol</code> and the <code>baseURLForDataURL</code> property on <code>BrowserWindow.loadURL</code>, <code>WebContents.loadURL</code>, and <code>&lt;webview&gt;.loadURL</code>. <code>protocol.handle</code> will also not work with these types of URLs but this is not a change since it has always worked that way.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// No longer works</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">registerFileProtocol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'other'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">callback</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">filePath</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/path/to/my/file'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> mainWindow </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">BrowserWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mainWindow</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">loadURL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'data:text/html,&lt;script src="loaded-from-dataurl.js"&gt;&lt;/script&gt;'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">baseURLForDataURL</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'other://C:\\myapp'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mainWindow</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">loadURL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'other://C:\\myapp\\index.html'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'node:path'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> nodeUrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'node:url'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">handle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">other</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> srcPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'C:\\myapp\\'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> reqURL </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">URL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> net</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nodeUrl</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">pathToFileURL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">srcPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> reqURL</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">pathname</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mainWindow</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">loadURL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token string" style="color:#e3116c">'data:text/html,&lt;script src="loaded-from-dataurl.js"&gt;&lt;/script&gt;'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">baseURLForDataURL</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'other://'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mainWindow</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">loadURL</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'other://index.html'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-webcontents-property-on-login-on-app">Behavior Changed: <code>webContents</code> property on <code>login</code> on <code>app</code><a href="https://electronjs.org/blog/electron-33-0#behavior-changed-webcontents-property-on-login-on-app" class="hash-link" aria-label="Direct link to behavior-changed-webcontents-property-on-login-on-app" title="Direct link to behavior-changed-webcontents-property-on-login-on-app">​</a></h4>
<p>The <code>webContents</code> property in the <code>login</code> event from <code>app</code> will be <code>null</code>
when the event is triggered for requests from the <a href="https://www.electronjs.org/docs/latest/api/utility-process" target="_blank" rel="noopener noreferrer">utility process</a>
created with <code>respondToAuthRequestsFromMainProcess</code> option.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-textured-option-in-browserwindowconstructoroptiontype">Deprecated: <code>textured</code> option in <code>BrowserWindowConstructorOption.type</code><a href="https://electronjs.org/blog/electron-33-0#deprecated-textured-option-in-browserwindowconstructoroptiontype" class="hash-link" aria-label="Direct link to deprecated-textured-option-in-browserwindowconstructoroptiontype" title="Direct link to deprecated-textured-option-in-browserwindowconstructoroptiontype">​</a></h4>
<p>The <code>textured</code> option of <code>type</code> in <code>BrowserWindowConstructorOptions</code> has been deprecated with no replacement. This option relied on the <a href="https://developer.apple.com/documentation/appkit/nswindowstylemask/nswindowstylemasktexturedbackground" target="_blank" rel="noopener noreferrer"><code>NSWindowStyleMaskTexturedBackground</code></a> style mask on macOS, which has been deprecated with no alternative.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-systempreferencesaccessibilitydisplayshouldreducetransparency">Deprecated: <code>systemPreferences.accessibilityDisplayShouldReduceTransparency</code><a href="https://electronjs.org/blog/electron-33-0#deprecated-systempreferencesaccessibilitydisplayshouldreducetransparency" class="hash-link" aria-label="Direct link to deprecated-systempreferencesaccessibilitydisplayshouldreducetransparency" title="Direct link to deprecated-systempreferencesaccessibilitydisplayshouldreducetransparency">​</a></h4>
<p>The <code>systemPreferences.accessibilityDisplayShouldReduceTransparency</code> property is now deprecated in favor of the new <code>nativeTheme.prefersReducedTransparency</code>, which provides identical information and works cross-platform.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> shouldReduceTransparency </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">accessibilityDisplayShouldReduceTransparency</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> prefersReducedTransparency </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">prefersReducedTransparency</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-30xy">End of Support for 30.x.y<a href="https://electronjs.org/blog/electron-33-0#end-of-support-for-30xy" class="hash-link" aria-label="Direct link to End of Support for 30.x.y" title="Direct link to End of Support for 30.x.y">​</a></h2>
<p>Electron 30.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E33 (Oct'24)</th><th>E34 (Jan'25)</th><th>E35 (Apr'25)</th></tr></thead><tbody><tr><td>33.x.y</td><td>34.x.y</td><td>35.x.y</td></tr><tr><td>32.x.y</td><td>33.x.y</td><td>34.x.y</td></tr><tr><td>31.x.y</td><td>32.x.y</td><td>33.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-33-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Introducing API History (GSoC 2024)]]></title>
            <link>https://electronjs.org/blog/introducing-api-history</link>
            <guid>https://electronjs.org/blog/introducing-api-history</guid>
            <pubDate>Wed, 21 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Historical changes to Electron APIs will now be detailed in the docs.]]></description>
            <content:encoded><![CDATA[<p>Historical changes to Electron APIs will now be detailed in the docs.</p>
<hr>
<p>Hi 👋, I'm Peter, the 2024 <a href="https://summerofcode.withgoogle.com/" target="_blank" rel="noopener noreferrer">Google Summer of Code (GSoC)</a>
contributor to Electron.</p>
<p>Over the course of the GSoC program, I implemented an API history feature for the
Electron documentation and its functions, classes, etc. in a similar fashion to the
<a href="https://nodejs.org/en/docs" target="_blank" rel="noopener noreferrer">Node.js documentation</a>: by allowing the
use of a simple but powerful YAML schema in the API documentation Markdown files
and displaying it nicely on the Electron documentation website.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="details">Details<a href="https://electronjs.org/blog/introducing-api-history#details" class="hash-link" aria-label="Direct link to Details" title="Direct link to Details">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="api-history-documentation-system--yaml-schema">API history documentation system / YAML schema<a href="https://electronjs.org/blog/introducing-api-history#api-history-documentation-system--yaml-schema" class="hash-link" aria-label="Direct link to API history documentation system / YAML schema" title="Direct link to API history documentation system / YAML schema">​</a></h3>
<p>In the Markdown API documentation, the history for a function/class/etc. is now placed directly after the
header for that item in the form of a YAML code block encapsulated by
an HTML comment.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">#### `win.setTrafficLightPosition(position)` _macOS_</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;</span><span class="token tag" style="color:#00009f">!--</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```YAML history</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">added</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">pr-url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/electron/electron/pull/22533</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">changes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">pr-url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/electron/electron/pull/26789</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Made `trafficLightPosition` option work for `customButtonOnHover` window."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">deprecated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">pr-url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/electron/electron/pull/37094</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">breaking-changes-header</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deprecated</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">browserwindowsettrafficlightpositionposition</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* `position` </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Point</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">(structures/point.md)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Set a custom position for the traffic light buttons. Can only be used with `titleBarStyle` set to `hidden`.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>I believe using YAML like the Node.js docs do was the best approach because it
is easy to read. The API history isn't extremely complicated and should ideally
be as easy to write and read as possible.</p>
<p>The final design shown above is actually significantly different to the one I proposed:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;</span><span class="token tag" style="color:#00009f">!--</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```YAML history</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">added</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v10.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">deprecated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v25.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">removed</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v28.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">changes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v13.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pr-url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/electron/electron/pull/26789</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Made `trafficLightPosition` option work for `customButtonOnHover` window.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>One large change is the removal of version numbers:</p>
<blockquote>
<p>"[...] There’s one somewhat significant change we’d like to call out about
the proposal, which came up during discussion when we were reviewing proposals.
[...]</p>
<p>[we] decided that the approach with the [fewest] drawbacks would be to only
use PR URLs (the root PRs to main) instead of hardcoded version strings as in
the proposal.</p>
<p>This can serve as a single source of truth which can then be used
to derive exact version numbers, and no further documentation changes on main
are necessary if the change is backported to other branches."</p>
<p>— David Sanders <a href="https://github.com/dsanders11" target="_blank" rel="noopener noreferrer">(@dsanders11)</a> via Slack</p>
</blockquote>
<p>We also didn't include removals in the API History, since when an API is removed
from Electron, it is also removed from the documentation.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="javascript-implementation">JavaScript implementation<a href="https://electronjs.org/blog/introducing-api-history#javascript-implementation" class="hash-link" aria-label="Direct link to JavaScript implementation" title="Direct link to JavaScript implementation">​</a></h3>
<p>I originally planned to create a new <code>@electron/docs-api-history-tools</code>
npm package that would contain scripts for extracting, validating/linting and converting
the API history in the documentation files.</p>
<p>About a week before the coding period began, and after some discussion with my
mentors, I realized that was probably unnecessary:</p>
<blockquote>
<p>"Hi everyone, I was thinking about the project after our huddle: Considering
that extraction logic will have to be handled differently in <code>e/website</code> and
<code>e/lint-roller</code> because of their dependencies, maybe there is no need for a
separate package for API history stuff?"</p>
<table><thead><tr><th style="text-align:center">Proposed</th><th style="text-align:center">Revised</th></tr></thead><tbody><tr><td style="text-align:center"><img decoding="async" loading="lazy" src="https://github.com/user-attachments/assets/3ec6c87b-1569-443b-8b63-eb20ee4fd96b" alt="proposed" class="img_ev3q"></td><td style="text-align:center"><img decoding="async" loading="lazy" src="https://github.com/user-attachments/assets/321745a4-ad09-4717-94cc-7b3e08a85d3c" alt="revised" class="img_ev3q"></td></tr></tbody></table>
<p>— Piotr Płaczek (me) via Slack</p>
</blockquote>
<p>We ultimately decided to not go ahead with my original idea:</p>
<blockquote>
<p>"@Piotr Płaczek that seems fine to me! I think we can always refactor out to a
separate module in a later iteration if we find that we need to share a lot of
code between the two implementations anyways <!-- -->🙂<!-- -->"</p>
<p>— Erick Zhao (<a href="https://github.com/erickzhao" target="_blank" rel="noopener noreferrer">@erickzhao</a>) via Slack</p>
</blockquote>
<p>Instead, we divided those various tools across the Electron repos that were most
relevant to them:</p>
<ul>
<li><code>yaml-api-history-schema.json</code>
<ul>
<li>-&gt; <code>electron/electron</code> (<a href="https://github.com/electron/electron/blob/main/docs/api-history.schema.json" target="_blank" rel="noopener noreferrer"><code>api-history.schema.json</code></a>)</li>
</ul>
</li>
<li><code>lint-yaml-api-history.ts</code>
<ul>
<li>-&gt; <code>electron/lint-roller</code> (<a href="https://github.com/electron/lint-roller/blob/3d87b7ba8f99868a28648297f31a1587945045ab/bin/lint-markdown-api-history.ts#L4" target="_blank" rel="noopener noreferrer"><code>lint-markdown-api-history.ts</code></a>)</li>
</ul>
</li>
<li><code>extract-yaml-api-history.ts</code>
<ul>
<li>-&gt; <code>electron/website</code> (<a href="https://github.com/electron/website/blob/f7e9446dd7d04b3369e9454f7c95f638fa061f1e/scripts/tasks/preprocess-api-history.ts#L4" target="_blank" rel="noopener noreferrer"><code>preprocess-api-history.ts</code></a>)</li>
</ul>
</li>
<li><code>yaml-api-history-to-markdown.ts</code>
<ul>
<li>-&gt; <code>electron/website</code> (<a href="https://github.com/electron/website/blob/f7e9446dd7d04b3369e9454f7c95f638fa061f1e/src/transformers/api-history.ts" target="_blank" rel="noopener noreferrer"><code>transformers/api-history.ts</code></a>)</li>
<li>-&gt; <code>electron/website</code> (<a href="https://github.com/electron/website/blob/f7e9446dd7d04b3369e9454f7c95f638fa061f1e/src/components/ApiHistoryTable.tsx" target="_blank" rel="noopener noreferrer"><code>ApiHistoryTable.tsx</code></a>)</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ui-and-styling-for-electron-documentation-website">UI and styling for Electron documentation website<a href="https://electronjs.org/blog/introducing-api-history#ui-and-styling-for-electron-documentation-website" class="hash-link" aria-label="Direct link to UI and styling for Electron documentation website" title="Direct link to UI and styling for Electron documentation website">​</a></h3>
<p>I originally proposed a simple table to display the API History data:</p>
<table><thead><tr><th style="text-align:center">Design Prototype (Closed)</th><th style="text-align:center">Design Prototype (Open)</th></tr></thead><tbody><tr><td style="text-align:center"><img decoding="async" loading="lazy" src="https://github.com/user-attachments/assets/a1c329d0-9f6b-4079-94d3-f9ff5b80c9ea" alt="demo1" class="img_ev3q"></td><td style="text-align:center"><img decoding="async" loading="lazy" src="https://github.com/user-attachments/assets/f1556d89-8fc8-485f-995c-1edaf8ee1413" alt="demo2" class="img_ev3q"></td></tr></tbody></table>
<p>This is what the final implemented design looks like:</p>
<p><img decoding="async" loading="lazy" src="https://github.com/user-attachments/assets/a8ceb931-ac10-46bc-b747-bf8fd97c839f" alt="demo3" class="img_ev3q"></p>
<p>Pretty much the same as the prototype. The most significant addition is the use
of <a href="https://semver.org/" target="_blank" rel="noopener noreferrer">SemVer</a> ranges, which were chosen to better communicate
which versions a feature is present in (thanks Samuel Attard
<a href="https://github.com/MarshallOfSound" target="_blank" rel="noopener noreferrer">(@MarshallOfSound)</a> for the suggestion!).</p>
<p>This is important because changes are frequently backported across supported
Electron release lines e.g. a fix may make it into Electron v32.0.0, v31.1.0 and v30.2.0.
This means it is not present in v31.0.0 which a user might mistakenly deduce based
on the fact it is present in a v30.x.x release.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="usagestyle-guide">Usage/style guide<a href="https://electronjs.org/blog/introducing-api-history#usagestyle-guide" class="hash-link" aria-label="Direct link to Usage/style guide" title="Direct link to Usage/style guide">​</a></h3>
<p>I added a usage/style guide dedicated to writing API history documentation for
new features. I described proper usages of the YAML schema in detail, provided
typical/useful examples, etc. You can find it
<a href="https://github.com/electron/electron/blob/main/docs/styleguide.md#api-history" target="_blank" rel="noopener noreferrer">here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="migration-guide">Migration guide<a href="https://electronjs.org/blog/introducing-api-history#migration-guide" class="hash-link" aria-label="Direct link to Migration guide" title="Direct link to Migration guide">​</a></h3>
<p>Since existing APIs have to be migrated to the new documentation system, I created
a migration guide. It features the typical steps of what a developer has
to do when migrating old APIs: looking through breaking changes, browsing through
the past releases, maybe looking through old commits, etc.
Then instructing the developer to follow the usage/style guide to add API history
documentation for each previously existing class/function/etc.</p>
<p>Sadly, I couldn't think of a way to automate this effectively. This would probably
be a great task for an AI/ML engineer; however, I don't possess those skills and
was too afraid of accidentally introducing <a href="https://en.wikipedia.org/wiki/Hallucination_(artificial_intelligence)" target="_blank" rel="noopener noreferrer">hallucinations</a>
into the API history. Even if automated, the information would still probably have
to be verified by a human in the end 😕. This task will probably have to be done
manually, on a file-by-file basis,
<a href="https://github.com/nodejs/node/issues/6578" target="_blank" rel="noopener noreferrer">just like it was done for the Node.js documentation</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="deliverables">Deliverables<a href="https://electronjs.org/blog/introducing-api-history#deliverables" class="hash-link" aria-label="Direct link to Deliverables" title="Direct link to Deliverables">​</a></h2>
<ul>
<li>
<p><code>api-history.schema.json</code></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li>A comprehensive YAML schema for documenting API history which includes support
for:<!-- -->
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Additions</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Deprecations</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Changes</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Links to relevant pull requests</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Backports</li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Proposed in: <a href="https://github.com/electron/rfcs/pull/6" target="_blank" rel="noopener noreferrer">electron/rfc#6</a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Implemented/Used in: <a href="https://github.com/electron/electron/pull/42982" target="_blank" rel="noopener noreferrer">electron/electron#42982</a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Used in: <a href="https://github.com/electron/website/pull/594" target="_blank" rel="noopener noreferrer">electron/website#594</a></li>
</ul>
</li>
<li>
<p><code>lint-markdown-api-history.ts</code></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li>Script for linting YAML API history written according to a custom YAML
(technically JSON) schema.<!-- -->
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Useful error messages</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Comprehensive documentation / code comments</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Extensive <del>Jest</del> Vitest tests</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Good performance</li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Implemented in: <a href="https://github.com/electron/lint-roller/pull/73" target="_blank" rel="noopener noreferrer">electron/lint-roller#73</a></li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Used in: <a href="https://github.com/electron/electron/pull/42982" target="_blank" rel="noopener noreferrer">electron/electron#42982</a></li>
</ul>
</li>
<li>
<p><code>preprocess-api-history.ts</code></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li>Performs simple validation just in case incorrect API History manages to make
it into the repo. Also strips the HTML comment tags that wrap API History blocks
since <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer">Docusaurus</a> cannot parse them.</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Implemented/Used in: <a href="https://github.com/electron/website/pull/594" target="_blank" rel="noopener noreferrer">electron/website#594</a></li>
</ul>
</li>
<li>
<p><code>transformers/api-history.ts</code></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li>Script for converting YAML API history blocks in the Markdown documentation files
to <del>Markdown/HTML</del> <a href="https://react.dev/" target="_blank" rel="noopener noreferrer">React</a> tables (<code>ApiHistoryTable.tsx</code>).</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Implemented/Used in: <a href="https://github.com/electron/website/pull/594" target="_blank" rel="noopener noreferrer">electron/website#594</a></li>
</ul>
</li>
<li>
<p><code>ApiHistoryTable.tsx</code></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li>React table component used to display parsed API History data on the
documentation website.<!-- -->
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Uses styling that follows the rest of the website's design.</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Responsive, accessible, and generally well written HTML, CSS, and JS.</li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Implemented/Used in: <a href="https://github.com/electron/website/pull/594" target="_blank" rel="noopener noreferrer">electron/website#594</a></li>
</ul>
</li>
<li>
<p><code>styleguide.md</code></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li>Usage/style guide section for new API history documentation system.<!-- -->
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Easy to understand</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Well written</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Includes examples</li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Implemented/Used in: <a href="https://github.com/electron/electron/pull/42982" target="_blank" rel="noopener noreferrer">electron/electron#42982</a></li>
</ul>
</li>
<li>
<p><code>api-history-migration-guide.md</code></p>
<ul class="contains-task-list containsTaskList_mC6p">
<li>Migration guide for new API history documentation system.<!-- -->
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Easy to understand</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Well written</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Includes examples</li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" disabled="" checked=""> <!-- -->Implemented/Used in: <a href="https://github.com/electron/electron/pull/42982" target="_blank" rel="noopener noreferrer">electron/electron#42982</a></li>
</ul>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://electronjs.org/blog/introducing-api-history#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>I had a lot of fun working on this feature and was able to earn valuable experience
from code reviews and discussing its various implementation details with the team.</p>
<p>I believe the addition of API history to the documentation will make the lives of
developers using Electron a lot easier, especially ones attempting to migrate their
existing app from a several year old Electron version.</p>
<p>I also want to sincerely thank my mentors:</p>
<ul>
<li>David Sanders <a href="https://github.com/dsanders11" target="_blank" rel="noopener noreferrer">(@dsanders11)</a></li>
<li>Keeley Hammond <a href="https://github.com/VerteDinde" target="_blank" rel="noopener noreferrer">(@VerteDinde)</a></li>
<li>Erick Zhao <a href="https://github.com/erickzhao" target="_blank" rel="noopener noreferrer">(@erickzhao)</a></li>
</ul>
<p>...and the rest of the Electron team for answering my questions
and taking the time to give me feedback on my pull requests.
It is very much appreciated.</p>]]></content:encoded>
            <category>Community</category>
        </item>
        <item>
            <title><![CDATA[Electron 32.0.0]]></title>
            <link>https://electronjs.org/blog/electron-32-0</link>
            <guid>https://electronjs.org/blog/electron-32-0</guid>
            <pubDate>Tue, 20 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 32.0.0 has been released! It includes upgrades to Chromium 128.0.6613.36, V8 12.8, and Node 20.16.0.]]></description>
            <content:encoded><![CDATA[<p>Electron 32.0.0 has been released! It includes upgrades to Chromium <code>128.0.6613.36</code>, V8 <code>12.8</code>, and Node <code>20.16.0</code>.</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 32.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on <a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-32-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/electron-32-0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h3>
<ul>
<li>Added new API version history in our documentation, a feature created by @piotrpdev as part of Google Summer of Code. You can learn more about it in <a href="https://electronjs.org/blog/introducing-api-history">this blog post</a>. <a href="https://github.com/electron/electron/pull/42982" target="_blank" rel="noopener noreferrer">#42982</a></li>
<li>Removed nonstandard File.path extension from the Web File API. <a href="https://github.com/electron/electron/pull/42053" target="_blank" rel="noopener noreferrer">#42053</a></li>
<li>Aligned failure pathway in Web <a href="https://developer.mozilla.org/en-US/docs/Web/API/File_System_API" target="_blank" rel="noopener noreferrer">File System API</a> with upstream when attempting to open a file or directory in a blocked path. <a href="https://github.com/electron/electron/pull/42993" target="_blank" rel="noopener noreferrer">#42993</a></li>
<li>Added the following existing navigation-related APIs to <code>webcontents.navigationHistory</code>: <code>canGoBack</code>, <code>goBack</code>, <code>canGoForward</code>, <code>goForward</code>, <code>canGoToOffset</code>, <code>goToOffset</code>, <code>clear</code>. The previous navigation APIs are now deprecated. <a href="https://github.com/electron/electron/pull/41752" target="_blank" rel="noopener noreferrer">#41752</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-32-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium<code>128.0.6613.36</code>
<ul>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-128/" target="_blank" rel="noopener noreferrer">New in 128</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-127/" target="_blank" rel="noopener noreferrer">New in 127</a></li>
</ul>
</li>
<li>Node <code>20.16.0</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v20.16.0/" target="_blank" rel="noopener noreferrer">Node 20.16.0 blog post</a></li>
</ul>
</li>
<li>V8 <code>12.8</code></li>
</ul>
<p>Electron 32 upgrades Chromium from <code>126.0.6478.36</code> to <code>128.0.6613.36</code>, Node from <code>20.14.0</code> to <code>20.16.0</code>, and V8 from <code>12.6</code> to <code>12.8</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-32-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added support for responding to auth requests initiated from the utility process via the <code>app</code> module's <a href="https://www.electronjs.org/docs/latest/api/app" target="_blank" rel="noopener noreferrer"><code>'login'</code></a> event. <a href="https://github.com/electron/electron/pull/43317" target="_blank" rel="noopener noreferrer">#43317</a></li>
<li>Added the <code>cumulativeCPUUsage</code> property to the <code>CPUUsage</code> structure, which returns the total seconds of CPU time used since process startup. <a href="https://github.com/electron/electron/pull/41819" target="_blank" rel="noopener noreferrer">#41819</a></li>
<li>Added the following existing navigation related APIs to <code>webContents.navigationHistory</code>: <code>canGoBack</code>, <code>goBack</code>, <code>canGoForward</code>, <code>goForward</code>, <code>canGoToOffset</code>, <code>goToOffset</code>, <code>clear</code>. <a href="https://github.com/electron/electron/pull/41752" target="_blank" rel="noopener noreferrer">#41752</a></li>
<li>Extended <code>WebContentsView</code> to accept pre-existing <code>webContents</code> objects. <a href="https://github.com/electron/electron/pull/42086" target="_blank" rel="noopener noreferrer">#42086</a></li>
<li>Added a new property <code>prefersReducedTransparency</code> to <code>nativeTheme</code>, which indicates whether the user has chosen to reduce OS-level transparency via system accessibility settings. <a href="https://github.com/electron/electron/pull/43137" target="_blank" rel="noopener noreferrer">#43137</a></li>
<li>Aligned failure pathway in File System Access API with upstream when attempting to open a file or directory in a blocked path. <a href="https://github.com/electron/electron/pull/42993" target="_blank" rel="noopener noreferrer">#42993</a></li>
<li>Enabled the Windows Control Overlay API on Linux. <a href="https://github.com/electron/electron/pull/42681" target="_blank" rel="noopener noreferrer">#42681</a></li>
<li>Enabled <code>zstd</code> compression in network requests. <a href="https://github.com/electron/electron/pull/43300" target="_blank" rel="noopener noreferrer">#43300</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-32-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-filepath">Removed: <code>File.path</code><a href="https://electronjs.org/blog/electron-32-0#removed-filepath" class="hash-link" aria-label="Direct link to removed-filepath" title="Direct link to removed-filepath">​</a></h4>
<p>The nonstandard <code>path</code> property of the Web <a href="https://developer.mozilla.org/en-US/docs/Web/API/File" target="_blank" rel="noopener noreferrer"><code>File</code></a> object was added in an early version of Electron as a convenience method for working with native files when doing everything in the renderer was more common. However, it represents a deviation from the standard and poses a minor security risk as well, so beginning in Electron 32.0 it has been removed in favor of the <a href="https://github.com/electron/electron/tree/main/docs/api/web-utils.md#webutilsgetpathforfilefile" target="_blank" rel="noopener noreferrer"><code>webUtils.getPathForFile</code></a> method.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Before (renderer)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> file </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'input[type=file]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">alert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Uploaded file path was: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">file</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// After (renderer)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> file </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token dom variable" style="color:#36acaa">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">querySelector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'input[type=file]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">electron</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">showFilePath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// After (preload)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> contextBridge</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> webUtils </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'electron'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">contextBridge</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">exposeInMainWorld</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'electron'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">showFilePath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">file</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// It's best not to expose the full file path to the web content if</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// possible.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getPathForFile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">alert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">Uploaded file path was: </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-clearhistory-cangoback-goback-cangoforward-goforward-gotoindex-cangotooffset-gotooffset-on-webcontents">Deprecated: <code>clearHistory</code>, <code>canGoBack</code>, <code>goBack</code>, <code>canGoForward</code>, <code>goForward</code>, <code>goToIndex</code>, <code>canGoToOffset</code>, <code>goToOffset</code> on <code>WebContents</code><a href="https://electronjs.org/blog/electron-32-0#deprecated-clearhistory-cangoback-goback-cangoforward-goforward-gotoindex-cangotooffset-gotooffset-on-webcontents" class="hash-link" aria-label="Direct link to deprecated-clearhistory-cangoback-goback-cangoforward-goforward-gotoindex-cangotooffset-gotooffset-on-webcontents" title="Direct link to deprecated-clearhistory-cangoback-goback-cangoforward-goforward-gotoindex-cangotooffset-gotooffset-on-webcontents">​</a></h4>
<p>Navigation-related APIs on <code>WebContents</code> instances are now deprecated. These APIs have been moved to the <code>navigationHistory</code> property of <code>WebContents</code> to provide a more structured and intuitive interface for managing navigation history.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">clearHistory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">canGoBack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">goBack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">canGoForward</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">goForward</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">goToIndex</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">canGoToOffset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">goToOffset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">navigationHistory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">navigationHistory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">canGoBack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">navigationHistory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">goBack</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">navigationHistory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">canGoForward</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">navigationHistory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">goForward</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">navigationHistory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">canGoToOffset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">navigationHistory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">goToOffset</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-29xy">End of Support for 29.x.y<a href="https://electronjs.org/blog/electron-32-0#end-of-support-for-29xy" class="hash-link" aria-label="Direct link to End of Support for 29.x.y" title="Direct link to End of Support for 29.x.y">​</a></h2>
<p>Electron 29.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E32 (Aug'24)</th><th>E33 (Oct'24)</th><th>E34 (Jan'25)</th></tr></thead><tbody><tr><td>32.x.y</td><td>33.x.y</td><td>34.x.y</td></tr><tr><td>31.x.y</td><td>32.x.y</td><td>33.x.y</td></tr><tr><td>30.x.y</td><td>31.x.y</td><td>32.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-32-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Electron 31.0.0]]></title>
            <link>https://electronjs.org/blog/electron-31-0</link>
            <guid>https://electronjs.org/blog/electron-31-0</guid>
            <pubDate>Tue, 11 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 31.0.0 has been released! It includes upgrades to Chromium 126.0.6478.36, V8 12.6, and Node 20.14.0.]]></description>
            <content:encoded><![CDATA[<p>Electron 31.0.0 has been released! It includes upgrades to Chromium <code>126.0.6478.36</code>, V8 <code>12.6</code>, and Node <code>20.14.0</code>.</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 31.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on <a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-31-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/electron-31-0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h3>
<ul>
<li>Extended <code>WebContentsView</code> to accept pre-existing <code>webContents</code> object. <a href="https://github.com/electron/electron/pull/42319" target="_blank" rel="noopener noreferrer">#42319</a></li>
<li>Added support for <code>NODE_EXTRA_CA_CERTS</code>. <a href="https://github.com/electron/electron/pull/41689" target="_blank" rel="noopener noreferrer">#41689</a></li>
<li>Updated window.flashFrame(bool) to flash continuously on macOS. <a href="https://github.com/electron/electron/pull/41391" target="_blank" rel="noopener noreferrer">#41391</a></li>
<li>Removed <code>WebSQL</code> support <a href="https://github.com/electron/electron/pull/41868" target="_blank" rel="noopener noreferrer">#41868</a></li>
<li><code>nativeImage.toDataURL</code> will preserve PNG colorspace <a href="https://github.com/electron/electron/pull/41610" target="_blank" rel="noopener noreferrer">#41610</a></li>
<li>Extended <code>webContents.setWindowOpenHandler</code> to support manual creation of BrowserWindow. <a href="https://github.com/electron/electron/pull/41432" target="_blank" rel="noopener noreferrer">#41432</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-31-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium<code>126.0.6478.36</code>
<ul>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-126/" target="_blank" rel="noopener noreferrer">New in 126</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-125/" target="_blank" rel="noopener noreferrer">New in 125</a></li>
</ul>
</li>
<li>Node <code>20.14.0</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v20.14.0/" target="_blank" rel="noopener noreferrer">Node 20.14.0 blog post</a></li>
</ul>
</li>
<li>V8 <code>12.6</code></li>
</ul>
<p>Electron 31 upgrades Chromium from <code>124.0.6367.49</code> to <code>126.0.6478.36</code>, Node from <code>20.11.1</code> to <code>20.14.0</code>, and V8 from <code>12.4</code> to <code>12.6</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-31-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added <code>clearData</code> method to <code>Session</code>. <a href="https://github.com/electron/electron/pull/40983" target="_blank" rel="noopener noreferrer">#40983</a>
<ul>
<li>Added options parameter to <code>Session.clearData</code> API. <a href="https://github.com/electron/electron/pull/41355" target="_blank" rel="noopener noreferrer">#41355</a></li>
</ul>
</li>
<li>Added support for Bluetooth ports being requested by service class ID in <code>navigator.serial</code>. <a href="https://github.com/electron/electron/pull/41638" target="_blank" rel="noopener noreferrer">#41638</a></li>
<li>Added support for Node's <a href="https://nodejs.org/api/cli.html#node_extra_ca_certsfile" target="_blank" rel="noopener noreferrer"><code>NODE_EXTRA_CA_CERTS</code></a> environment variable. <a href="https://github.com/electron/electron/pull/41689" target="_blank" rel="noopener noreferrer">#41689</a></li>
<li>Extended <code>webContents.setWindowOpenHandler</code> to support manual creation of BrowserWindow. <a href="https://github.com/electron/electron/pull/41432" target="_blank" rel="noopener noreferrer">#41432</a></li>
<li>Implemented support for the web standard <a href="https://developer.mozilla.org/en-US/docs/Web/API/File_System_API" target="_blank" rel="noopener noreferrer">File System API</a>. <a href="https://github.com/electron/electron/pull/41419" target="_blank" rel="noopener noreferrer">#41419</a></li>
<li>Extended <code>WebContentsView</code> to accept pre-existing <code>WebContents</code> instances. <a href="https://github.com/electron/electron/pull/42319" target="_blank" rel="noopener noreferrer">#42319</a></li>
<li>Added a new instance property <code>navigationHistory</code> on webContents API with <code>navigationHistory.getEntryAtIndex</code> method, enabling applications to retrieve the URL and title of any navigation entry within the browsing history. <a href="https://github.com/electron/electron/pull/41577" target="_blank" rel="noopener noreferrer">#41577</a> <sup>(Also in <a href="https://github.com/electron/electron/pull/41661" target="_blank" rel="noopener noreferrer">29</a>, <a href="https://github.com/electron/electron/pull/41662" target="_blank" rel="noopener noreferrer">30</a>)</sup></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-31-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-websql-support">Removed: <code>WebSQL</code> support<a href="https://electronjs.org/blog/electron-31-0#removed-websql-support" class="hash-link" aria-label="Direct link to removed-websql-support" title="Direct link to removed-websql-support">​</a></h4>
<p>Chromium has removed support for WebSQL upstream, transitioning it to Android only. See
<a href="https://groups.google.com/a/chromium.org/g/blink-dev/c/fWYb6evVA-w/m/pziWcvboAgAJ" target="_blank" rel="noopener noreferrer">Chromium's intent to remove discussion</a>
for more information.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-nativeimagetodataurl-will-preseve-png-colorspace">Behavior Changed: <code>nativeImage.toDataURL</code> will preseve PNG colorspace<a href="https://electronjs.org/blog/electron-31-0#behavior-changed-nativeimagetodataurl-will-preseve-png-colorspace" class="hash-link" aria-label="Direct link to behavior-changed-nativeimagetodataurl-will-preseve-png-colorspace" title="Direct link to behavior-changed-nativeimagetodataurl-will-preseve-png-colorspace">​</a></h4>
<p>PNG decoder implementation has been changed to preserve colorspace data. The
encoded data returned from this function now matches it.</p>
<p>See <a href="https://issues.chromium.org/issues/332584706" target="_blank" rel="noopener noreferrer">crbug.com/332584706</a> for more information.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-winflashframebool-will-flash-dock-icon-continuously-on-macos">Behavior Changed: <code>win.flashFrame(bool)</code> will flash dock icon continuously on macOS<a href="https://electronjs.org/blog/electron-31-0#behavior-changed-winflashframebool-will-flash-dock-icon-continuously-on-macos" class="hash-link" aria-label="Direct link to behavior-changed-winflashframebool-will-flash-dock-icon-continuously-on-macos" title="Direct link to behavior-changed-winflashframebool-will-flash-dock-icon-continuously-on-macos">​</a></h4>
<p>This brings the behavior to parity with Windows and Linux. Prior behavior: The first <code>flashFrame(true)</code> bounces the dock icon only once (using the <a href="https://developer.apple.com/documentation/appkit/nsrequestuserattentiontype/nsinformationalrequest" target="_blank" rel="noopener noreferrer">NSInformationalRequest</a> level) and <code>flashFrame(false)</code> does nothing. New behavior: Flash continuously until <code>flashFrame(false)</code> is called. This uses the <a href="https://developer.apple.com/documentation/appkit/nsrequestuserattentiontype/nscriticalrequest" target="_blank" rel="noopener noreferrer">NSCriticalRequest</a> level instead. To explicitly use <code>NSInformationalRequest</code> to cause a single dock icon bounce, it is still possible to use <a href="https://www.electronjs.org/docs/latest/api/dock#dockbouncetype-macos" target="_blank" rel="noopener noreferrer"><code>dock.bounce('informational')</code></a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-28xy">End of Support for 28.x.y<a href="https://electronjs.org/blog/electron-31-0#end-of-support-for-28xy" class="hash-link" aria-label="Direct link to End of Support for 28.x.y" title="Direct link to End of Support for 28.x.y">​</a></h2>
<p>Electron 28.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E31 (Jun'24)</th><th>E32 (Aug'24)</th><th>E33 (Oct'24)</th></tr></thead><tbody><tr><td>31.x.y</td><td>32.x.y</td><td>33.x.y</td></tr><tr><td>30.x.y</td><td>31.x.y</td><td>32.x.y</td></tr><tr><td>28.x.y</td><td>29.x.y</td><td>31.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-31-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Electron 30.0.0]]></title>
            <link>https://electronjs.org/blog/electron-30-0</link>
            <guid>https://electronjs.org/blog/electron-30-0</guid>
            <pubDate>Tue, 16 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 30.0.0 has been released! It includes upgrades to Chromium 124.0.6367.49, V8 12.4, and Node.js 20.11.1.]]></description>
            <content:encoded><![CDATA[<p>Electron 30.0.0 has been released! It includes upgrades to Chromium <code>124.0.6367.49</code>, V8 <code>12.4</code>, and Node.js <code>20.11.1</code>.</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 30.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on <a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-30-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/electron-30-0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h3>
<ul>
<li>ASAR Integrity fuse now supported on Windows (<a href="https://github.com/electron/electron/pull/40504" target="_blank" rel="noopener noreferrer">#40504</a>)<!-- -->
<ul>
<li>Existing apps with ASAR Integrity enabled may not work on Windows if not configured correctly. Apps using Electron packaging tools should upgrade to <code>@electron/packager@18.3.1</code> or <code>@electron/forge@7.4.0</code>.</li>
<li>Take a look at our <a href="https://www.electronjs.org/docs/latest/tutorial/asar-integrity" target="_blank" rel="noopener noreferrer">ASAR Integrity tutorial</a> for more information.</li>
</ul>
</li>
<li>Added <a href="https://www.electronjs.org/docs/latest/api/web-contents-view" target="_blank" rel="noopener noreferrer"><code>WebContentsView</code></a> and <a href="https://www.electronjs.org/docs/latest/api/base-window" target="_blank" rel="noopener noreferrer"><code>BaseWindow</code></a> main process modules, deprecating &amp; replacing <code>BrowserView</code> (<a href="https://github.com/electron/electron/pull/35658" target="_blank" rel="noopener noreferrer">#35658</a>). Learn more about how to migrate from <code>BrowserView</code> to <code>WebContentsView</code> in <a href="https://electronjs.org/blog/migrate-to-webcontentsview">this blog post</a>.<!-- -->
<ul>
<li><code>BrowserView</code> is now a shim over <code>WebContentsView</code> and the old implementation has been removed.</li>
<li>See <a href="https://www.electronjs.org/docs/latest/tutorial/web-embeds" target="_blank" rel="noopener noreferrer">our Web Embeds documentation</a> for a comparison of the new <code>WebContentsView</code> API to other similar APIs.</li>
</ul>
</li>
<li>Implemented support for the <a href="https://developer.mozilla.org/en-US/docs/Web/API/File_System_API" target="_blank" rel="noopener noreferrer">File System API</a> (<a href="https://github.com/electron/electron/commit/cf1087badd437906f280373decb923733a8523e6" target="_blank" rel="noopener noreferrer">#41827</a>)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-30-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>124.0.6367.49</code>
<ul>
<li>New in <a href="https://developer.chrome.com/blog/new-in-chrome-124/" target="_blank" rel="noopener noreferrer">Chrome 124</a> and in <a href="https://developer.chrome.com/blog/new-in-devtools-124/" target="_blank" rel="noopener noreferrer">DevTools 124</a></li>
<li>New in <a href="https://developer.chrome.com/blog/new-in-chrome-123/" target="_blank" rel="noopener noreferrer">Chrome 123</a> and in <a href="https://developer.chrome.com/blog/new-in-devtools-123/" target="_blank" rel="noopener noreferrer">DevTools 123</a></li>
</ul>
</li>
<li>Node <code>20.11.1</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v20.11.1/" target="_blank" rel="noopener noreferrer">Node 20.11.1 notes</a></li>
</ul>
</li>
<li>V8 <code>12.4</code></li>
</ul>
<p>Electron 30 upgrades Chromium from <code>122.0.6261.39</code> to <code>124.0.6367.49</code>, Node from <code>20.9.0</code> to <code>20.11.1</code>, and V8 from <code>12.2</code> to <code>12.4</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-30-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added a <code>transparent</code> webpreference to webviews. (<a href="https://github.com/electron/electron/pull/40301" target="_blank" rel="noopener noreferrer">#40301</a>)</li>
<li>Added a new instance property <code>navigationHistory</code> on webContents API with <code>navigationHistory.getEntryAtIndex</code> method, enabling applications to retrieve the URL and title of any navigation entry within the browsing history. (<a href="https://github.com/electron/electron/pull/41662" target="_blank" rel="noopener noreferrer">#41662</a>)</li>
<li>Added new <code>BrowserWindow.isOccluded()</code> method to allow apps to check occlusion status. (<a href="https://github.com/electron/electron/pull/38982" target="_blank" rel="noopener noreferrer">#38982</a>)</li>
<li>Added proxy configuring support for requests made with the <code>net</code> module from the utility process. (<a href="https://github.com/electron/electron/pull/41417" target="_blank" rel="noopener noreferrer">#41417</a>)</li>
<li>Added support for Bluetooth ports being requested by service class ID in <code>navigator.serial</code>. (<a href="https://github.com/electron/electron/pull/41734" target="_blank" rel="noopener noreferrer">#41734</a>)</li>
<li>Added support for the Node.js <a href="https://nodejs.org/api/cli.html#node_extra_ca_certsfile" target="_blank" rel="noopener noreferrer"><code>NODE_EXTRA_CA_CERTS</code></a> CLI flag. (<a href="https://github.com/electron/electron/pull/41822" target="_blank" rel="noopener noreferrer">#41822</a>)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-30-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-cross-origin-iframes-now-use-permission-policy-to-access-features">Behavior Changed: cross-origin iframes now use Permission Policy to access features<a href="https://electronjs.org/blog/electron-30-0#behavior-changed-cross-origin-iframes-now-use-permission-policy-to-access-features" class="hash-link" aria-label="Direct link to Behavior Changed: cross-origin iframes now use Permission Policy to access features" title="Direct link to Behavior Changed: cross-origin iframes now use Permission Policy to access features">​</a></h4>
<p>Cross-origin iframes must now specify features available to a given <code>iframe</code> via the <code>allow</code>
attribute in order to access them.</p>
<p>See <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#allow" target="_blank" rel="noopener noreferrer">documentation</a> for
more information.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-the---disable-color-correct-rendering-command-line-switch">Removed: The <code>--disable-color-correct-rendering</code> command line switch<a href="https://electronjs.org/blog/electron-30-0#removed-the---disable-color-correct-rendering-command-line-switch" class="hash-link" aria-label="Direct link to removed-the---disable-color-correct-rendering-command-line-switch" title="Direct link to removed-the---disable-color-correct-rendering-command-line-switch">​</a></h4>
<p>This switch was never formally documented but its removal is being noted here regardless. Chromium itself now has better support for color spaces so this flag should not be needed.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-browserviewsetautoresize-behavior-on-macos">Behavior Changed: <code>BrowserView.setAutoResize</code> behavior on macOS<a href="https://electronjs.org/blog/electron-30-0#behavior-changed-browserviewsetautoresize-behavior-on-macos" class="hash-link" aria-label="Direct link to behavior-changed-browserviewsetautoresize-behavior-on-macos" title="Direct link to behavior-changed-browserviewsetautoresize-behavior-on-macos">​</a></h4>
<p>In Electron 30, BrowserView is now a wrapper around the new <a href="https://www.electronjs.org/docs/latest/api/web-contents-view" target="_blank" rel="noopener noreferrer">WebContentsView</a> API.</p>
<p>Previously, the <code>setAutoResize</code> function of the <code>BrowserView</code> API was backed by <a href="https://developer.apple.com/documentation/appkit/nsview/1483281-autoresizingmask?language=objc" target="_blank" rel="noopener noreferrer">autoresizing</a> on macOS, and by a custom algorithm on Windows and Linux.
For simple use cases such as making a BrowserView fill the entire window, the behavior of these two approaches was identical.
However, in more advanced cases, BrowserViews would be autoresized differently on macOS than they would be on other platforms, as the custom resizing algorithm for Windows and Linux did not perfectly match the behavior of macOS's autoresizing API.
The autoresizing behavior is now standardized across all platforms.</p>
<p>If your app uses <code>BrowserView.setAutoResize</code> to do anything more complex than making a BrowserView fill the entire window, it's likely you already had custom logic in place to handle this difference in behavior on macOS.
If so, that logic will no longer be needed in Electron 30 as autoresizing behavior is consistent.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-paramsinputformtype-property-on-context-menu-on-webcontents">Removed: <code>params.inputFormType</code> property on <code>context-menu</code> on <code>WebContents</code><a href="https://electronjs.org/blog/electron-30-0#removed-paramsinputformtype-property-on-context-menu-on-webcontents" class="hash-link" aria-label="Direct link to removed-paramsinputformtype-property-on-context-menu-on-webcontents" title="Direct link to removed-paramsinputformtype-property-on-context-menu-on-webcontents">​</a></h4>
<p>The <code>inputFormType</code> property of the params object in the <code>context-menu</code>
event from <code>WebContents</code> has been removed. Use the new <code>formControlType</code>
property instead.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-processgetiocounters">Removed: <code>process.getIOCounters()</code><a href="https://electronjs.org/blog/electron-30-0#removed-processgetiocounters" class="hash-link" aria-label="Direct link to removed-processgetiocounters" title="Direct link to removed-processgetiocounters">​</a></h4>
<p>Chromium has removed access to this information.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-27xy">End of Support for 27.x.y<a href="https://electronjs.org/blog/electron-30-0#end-of-support-for-27xy" class="hash-link" aria-label="Direct link to End of Support for 27.x.y" title="Direct link to End of Support for 27.x.y">​</a></h2>
<p>Electron 27.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E30 (Apr'24)</th><th>E31 (Jun'24)</th><th>E32 (Aug'24)</th></tr></thead><tbody><tr><td>30.x.y</td><td>31.x.y</td><td>32.x.y</td></tr><tr><td>29.x.y</td><td>30.x.y</td><td>31.x.y</td></tr><tr><td>28.x.y</td><td>29.x.y</td><td>30.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-30-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Google Summer of Code 2024]]></title>
            <link>https://electronjs.org/blog/2024-summer-of-code</link>
            <guid>https://electronjs.org/blog/2024-summer-of-code</guid>
            <pubDate>Fri, 23 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[We are excited to announce that Electron has been accepted as a mentoring organization for]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce that Electron has been accepted as a mentoring organization for
the 20th edition of Google Summer of Code (GSoC) 2024! Google Summer of Code is a global
program focused on bringing new contributors into open source software development.</p>
<p>For more program details, check out Google’s <a href="https://summerofcode.withgoogle.com/" target="_blank" rel="noopener noreferrer">Summer of Code homepage</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="about-us">About us<a href="https://electronjs.org/blog/2024-summer-of-code#about-us" class="hash-link" aria-label="Direct link to About us" title="Direct link to About us">​</a></h2>
<p>Electron is a JavaScript framework for building cross-platform desktop applications using
web technologies. The core Electron framework is a compiled binary executable built with
<a href="https://chromium.org/" target="_blank" rel="noopener noreferrer">Chromium</a> and <a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">Node.js</a>, and is mostly written in C++.</p>
<p>Outside of Electron core, we also work on a variety of projects to help sustain the
Electron organization, such as:</p>
<ul>
<li>End-user distribution tooling (e.g. <a href="https://www.electronforge.io/" target="_blank" rel="noopener noreferrer">Electron Forge</a>
and <a href="https://github.com/electron/update.electronjs.org" target="_blank" rel="noopener noreferrer">update.electronjs.org</a>).</li>
<li>Learning materials for Electron developers (e.g. <a href="http://electronjs.org/" target="_blank" rel="noopener noreferrer">electronjs.org</a>
and <a href="https://github.com/electron/fiddle" target="_blank" rel="noopener noreferrer">Electron Fiddle</a>).</li>
<li>Internal tools to streamline developer productivity (e.g. <a href="https://github.com/electron/build-tools" target="_blank" rel="noopener noreferrer">Electron Build Tools</a>
and <a href="https://github.com/electron/sheriff" target="_blank" rel="noopener noreferrer">Sheriff</a>).</li>
</ul>
<p>As a Summer of Code contributor, you would be collaborating with some of Electron’s core contributors
on one of many projects under the <a href="http://github.com/electron" target="_blank" rel="noopener noreferrer">github.com/electron</a> umbrella.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="before-applying">Before applying<a href="https://electronjs.org/blog/2024-summer-of-code#before-applying" class="hash-link" aria-label="Direct link to Before applying" title="Direct link to Before applying">​</a></h2>
<p>If you aren’t very familiar with Electron, we would recommend you start by reading the
<a href="https://electronjs.org/docs/latest" target="_blank" rel="noopener noreferrer">documentation</a> and trying out examples in <a href="https://electronjs.org/fiddle" target="_blank" rel="noopener noreferrer">Electron Fiddle</a>.</p>
<p>To learn more about Electron app distribution, you can also play around with
<a href="https://www.electronforge.io/" target="_blank" rel="noopener noreferrer">Electron Forge</a> by creating a sample application:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm init electron-app@latest my-app</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>After familiarizing yourself with the code a bit, come join the conversation on the
<a href="https://discord.gg/electronjs" target="_blank" rel="noopener noreferrer">Electron Discord server</a>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>If this is your first time participating in Google Summer of Code or if you’re new to open source in general,
we recommend reading Google’s <a href="https://google.github.io/gsocguides/student/" target="_blank" rel="noopener noreferrer">Contributor Guide</a> as a first step
before engaging with the community.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="drafting-your-proposal">Drafting your proposal<a href="https://electronjs.org/blog/2024-summer-of-code#drafting-your-proposal" class="hash-link" aria-label="Direct link to Drafting your proposal" title="Direct link to Drafting your proposal">​</a></h2>
<p>Interested in collaborating with Electron? First, check out the&nbsp;<a href="https://electronhq.notion.site/Electron-Google-Summer-of-Code-2024-Ideas-List-a1cb01daab3c48a98c30e411e96b218d?pvs=74" target="_blank" rel="noopener noreferrer">seven project idea drafts</a>
that we have prepared. All of the listed ideas are currently open for proposals.</p>
<p>Have a different idea you’d like us to consider? We’re also open to accepting new ideas that
are not on the proposed project list, but make sure your approach is thoroughly outlined and detailed.
When in doubt, we recommend sticking with our listed ideas.</p>
<p>Your application should include:</p>
<ul>
<li>Your proposal: a written document that describes in detail what you plan to achieve over
the course of the summer.</li>
<li>Your background as a developer. If you have a resume, please include a copy. Otherwise,
tell us about your past technical experience.<!-- -->
<ul>
<li>Lack of experience in certain areas won’t disqualify you, but it will help our mentors
work out a plan to best support you and make sure your summer project is successful.</li>
</ul>
</li>
</ul>
<p><a href="https://electronhq.notion.site/Electron-GSoC-2024-Contributor-Guidance-f1f4de7a0d9a4664a96c8d4dd70cb208?pvs=4" target="_blank" rel="noopener noreferrer">A detailed guide of what to submit as part of your Electron application is here.</a>
Submit proposals directly to the Google Summer of Code portal. Note that proposals emailed to the
Electron team rather than submitted through the application portal will not be considered as a final submission.</p>
<p>If you want more guidance on your proposal or are unsure of what to include, we also recommend that
you follow <a href="https://google.github.io/gsocguides/student/writing-a-proposal" target="_blank" rel="noopener noreferrer">the official Google Summer of Code proposal writing advice here</a>.</p>
<p>Applications open on&nbsp;<strong>March 18th, 2024</strong>&nbsp;and close on&nbsp;<strong>April 2nd, 2024</strong>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Our 2022 Google Summer of Code intern, <a href="https://github.com/aryanshridhar" target="_blank" rel="noopener noreferrer">@aryanshridhar</a>,
did an amazing job! If you want to see what Aryan worked on during his summer with Electron,
you can read his report in the <a href="https://summerofcode.withgoogle.com/archive/2022/organizations/electron" target="_blank" rel="noopener noreferrer">2022 GSoC program archives</a>.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="questions">Questions?<a href="https://electronjs.org/blog/2024-summer-of-code#questions" class="hash-link" aria-label="Direct link to Questions?" title="Direct link to Questions?">​</a></h2>
<p>If you have questions we didn’t address in the blog post or inquiries for your proposal draft,
please send us an email at <a href="mailto:summer-of-code@electronjs.org" target="_blank" rel="noopener noreferrer">summer-of-code@electronjs.org</a> or check <a href="https://developers.google.com/open-source/gsoc/faq" target="_blank" rel="noopener noreferrer">GSoC FAQ</a>!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a href="https://electronjs.org/blog/2024-summer-of-code#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources">​</a></h2>
<ul>
<li><a href="https://electronhq.notion.site/Electron-Google-Summer-of-Code-2024-Ideas-List-a1cb01daab3c48a98c30e411e96b218d?pvs=74" target="_blank" rel="noopener noreferrer">Electron Google Summer of Code 2024 Ideas List</a></li>
<li><a href="https://electronhq.notion.site/Electron-GSoC-2024-Contributor-Guidance-f1f4de7a0d9a4664a96c8d4dd70cb208?pvs=4" target="_blank" rel="noopener noreferrer">Electron Google Summer of Code 2024 Contributor Guidance</a></li>
<li><a href="https://google.github.io/gsocguides/student/" target="_blank" rel="noopener noreferrer">Google Summer of Code Student/Contributor Guide</a></li>
</ul>]]></content:encoded>
            <category>Community</category>
        </item>
        <item>
            <title><![CDATA[Electron 29.0.0]]></title>
            <link>https://electronjs.org/blog/electron-29-0</link>
            <guid>https://electronjs.org/blog/electron-29-0</guid>
            <pubDate>Tue, 20 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 29.0.0 has been released! It includes upgrades to Chromium 122.0.6261.39, V8 12.2, and Node.js 20.9.0.]]></description>
            <content:encoded><![CDATA[<p>Electron 29.0.0 has been released! It includes upgrades to Chromium <code>122.0.6261.39</code>, V8 <code>12.2</code>, and Node.js <code>20.9.0</code>.</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 29.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on <a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-29-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/electron-29-0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h3>
<ul>
<li>Added a new top-level <code>webUtils</code> module, a renderer process module that provides a utility layer to interact with Web API objects. The first available API in the module is <code>webUtils.getPathForFile</code>. Electron's previous <code>File.path</code> augmentation was a deviation from web standards; this new API is more in line with current web standards behavior.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-29-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>122.0.6261.39</code>
<ul>
<li>New in <a href="https://developer.chrome.com/blog/new-in-chrome-122/" target="_blank" rel="noopener noreferrer">Chrome 122</a> and in <a href="https://developer.chrome.com/blog/new-in-devtools-122/" target="_blank" rel="noopener noreferrer">DevTools 122</a></li>
<li>New in <a href="https://developer.chrome.com/blog/new-in-chrome-121/" target="_blank" rel="noopener noreferrer">Chrome 121</a> and in <a href="https://developer.chrome.com/blog/new-in-devtools-121/" target="_blank" rel="noopener noreferrer">DevTools 121</a></li>
</ul>
</li>
<li>Node <code>20.9.0</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v20.9.0/" target="_blank" rel="noopener noreferrer">Node 20.9.0 notes</a></li>
<li><a href="https://nodejs.org/en/blog/release/v20.0.0/" target="_blank" rel="noopener noreferrer">Node 20.0.0 notes</a></li>
</ul>
</li>
<li>V8 <code>12.2</code></li>
</ul>
<p>Electron 29 upgrades Chromium from <code>120.0.6099.56</code> to <code>122.0.6261.39</code>, Node from <code>18.18.2</code> to <code>20.9.0</code>, and V8 from <code>12.0</code> to <code>12.2</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-29-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added new <code>webUtils</code> module, a utility layer to interact with Web API objects, to replace <code>File.path</code> augmentation. <a href="https://github.com/electron/electron/pull/38776" target="_blank" rel="noopener noreferrer">#38776</a></li>
<li>Added <a href="https://www.electronjs.org/docs/latest/api/net" target="_blank" rel="noopener noreferrer">net</a> module to <a href="https://www.electronjs.org/docs/latest/glossary#utility-process" target="_blank" rel="noopener noreferrer">utility process</a>. <a href="https://github.com/electron/electron/pull/40890" target="_blank" rel="noopener noreferrer">#40890</a></li>
<li>Added a new <a href="https://www.electronjs.org/docs/latest/tutorial/fuses" target="_blank" rel="noopener noreferrer">Electron Fuse</a>, <code>grantFileProtocolExtraPrivileges</code>, that opts the <code>file://</code> protocol into more secure and restrictive behaviour that matches Chromium. <a href="https://github.com/electron/electron/pull/40372" target="_blank" rel="noopener noreferrer">#40372</a></li>
<li>Added an option in <code>protocol.registerSchemesAsPrivileged</code> to allow V8 code cache in custom schemes. <a href="https://github.com/electron/electron/pull/40544" target="_blank" rel="noopener noreferrer">#40544</a></li>
<li>Migrated <code>app.{set|get}LoginItemSettings(settings)</code> to use Apple's new recommended underlying framework on macOS 13.0+. <a href="https://github.com/electron/electron/pull/37244" target="_blank" rel="noopener noreferrer">#37244</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-29-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-ipcrenderer-can-no-longer-be-sent-over-the-contextbridge">Behavior Changed: <code>ipcRenderer</code> can no longer be sent over the <code>contextBridge</code><a href="https://electronjs.org/blog/electron-29-0#behavior-changed-ipcrenderer-can-no-longer-be-sent-over-the-contextbridge" class="hash-link" aria-label="Direct link to behavior-changed-ipcrenderer-can-no-longer-be-sent-over-the-contextbridge" title="Direct link to behavior-changed-ipcrenderer-can-no-longer-be-sent-over-the-contextbridge">​</a></h4>
<p>Attempting to send the entire <code>ipcRenderer</code> module as an object over the <code>contextBridge</code> will now result in
an empty object on the receiving side of the bridge. This change was made to remove / mitigate
a security footgun. You should not directly expose ipcRenderer or its methods over the bridge.
Instead, provide a safe wrapper like below:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">contextBridge</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">exposeInMainWorld</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'app'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function-variable function" style="color:#d73a49">onEvent</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">cb</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> ipcRenderer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'foo'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">e</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> </span><span class="token parameter spread operator" style="color:#393A34">...</span><span class="token parameter">args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cb</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">args</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-renderer-process-crashed-event-on-app">Removed: <code>renderer-process-crashed</code> event on <code>app</code><a href="https://electronjs.org/blog/electron-29-0#removed-renderer-process-crashed-event-on-app" class="hash-link" aria-label="Direct link to removed-renderer-process-crashed-event-on-app" title="Direct link to removed-renderer-process-crashed-event-on-app">​</a></h4>
<p>The <code>renderer-process-crashed</code> event on <code>app</code> has been removed.
Use the new <code>render-process-gone</code> event instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'renderer-process-crashed'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> webContents</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> killed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'render-process-gone'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> webContents</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> details</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-crashed-event-on-webcontents-and-webview">Removed: <code>crashed</code> event on <code>WebContents</code> and <code>&lt;webview&gt;</code><a href="https://electronjs.org/blog/electron-29-0#removed-crashed-event-on-webcontents-and-webview" class="hash-link" aria-label="Direct link to removed-crashed-event-on-webcontents-and-webview" title="Direct link to removed-crashed-event-on-webcontents-and-webview">​</a></h4>
<p>The <code>crashed</code> events on <code>WebContents</code> and <code>&lt;webview&gt;</code> have been removed.
Use the new <code>render-process-gone</code> event instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'crashed'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> killed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">webview</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'crashed'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'render-process-gone'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> details</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">webview</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'render-process-gone'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-gpu-process-crashed-event-on-app">Removed: <code>gpu-process-crashed</code> event on <code>app</code><a href="https://electronjs.org/blog/electron-29-0#removed-gpu-process-crashed-event-on-app" class="hash-link" aria-label="Direct link to removed-gpu-process-crashed-event-on-app" title="Direct link to removed-gpu-process-crashed-event-on-app">​</a></h4>
<p>The <code>gpu-process-crashed</code> event on <code>app</code> has been removed.
Use the new <code>child-process-gone</code> event instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'gpu-process-crashed'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> killed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'child-process-gone'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> details</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-26xy">End of Support for 26.x.y<a href="https://electronjs.org/blog/electron-29-0#end-of-support-for-26xy" class="hash-link" aria-label="Direct link to End of Support for 26.x.y" title="Direct link to End of Support for 26.x.y">​</a></h2>
<p>Electron 26.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E29 (Feb'24)</th><th>E30 (Apr'24)</th><th>E31 (Jun'24)</th></tr></thead><tbody><tr><td>29.x.y</td><td>30.x.y</td><td>31.x.y</td></tr><tr><td>28.x.y</td><td>29.x.y</td><td>30.x.y</td></tr><tr><td>27.x.y</td><td>28.x.y</td><td>29.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-29-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>Did you know that Electron recently added a community Request for Comments (RFC) process? If you want to add a feature to the framework, RFCs can be a useful tool to start a dialogue with maintainers on its design. You can also see upcoming changes being discussed in the Pull Requests. To learn more, check out our <a href="https://www.electronjs.org/blog/rfcs" target="_blank" rel="noopener noreferrer">Introducing electron/rfcs</a> blog post, or check out the README of the <a href="https://www.github.com/electron/rfcs" target="_blank" rel="noopener noreferrer">electron/rfcs</a> repository directly.</p>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Introducing electron/rfcs]]></title>
            <link>https://electronjs.org/blog/rfcs</link>
            <guid>https://electronjs.org/blog/rfcs</guid>
            <pubDate>Tue, 13 Feb 2024 12:00:00 GMT</pubDate>
            <description><![CDATA[Electron’s API Working Group is]]></description>
            <content:encoded><![CDATA[<p>Electron’s <a href="https://github.com/electron/governance/tree/main/wg-api" target="_blank" rel="noopener noreferrer">API Working Group</a> is
adopting an open <strong>Requests for Comments (RFC)</strong> process to help shepherd larger changes
to Electron core.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-rfcs">Why RFCs?<a href="https://electronjs.org/blog/rfcs#why-rfcs" class="hash-link" aria-label="Direct link to Why RFCs?" title="Direct link to Why RFCs?">​</a></h2>
<p>In short, we want to smooth out the process of landing significant changes to Electron core.</p>
<p>Currently, new code changes are mostly discussed through issues and pull requests on GitHub.
For most changes to Electron, this is a good system. Many bug fixes, documentation changes,
and even new features are straightforward enough to review and merge asynchronously through
standard GitHub flows.</p>
<p>For changes that are more significant—for instance, large API surfaces or breaking changes
that would affect the majority of Electron apps—it makes sense for review to happen at the
ideation stage before most of the code is written.</p>
<p>This process is designed to be open to the public, which will also make it easier for the
open source community at large to give feedback on potential changes before they land in
Electron.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-it-work">How does it work?<a href="https://electronjs.org/blog/rfcs#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?">​</a></h2>
<!-- -->
<p>The entire RFC process lives in the <a href="https://github.com/electron/rfcs" target="_blank" rel="noopener noreferrer">electron/rfcs</a> repository
on GitHub. The steps are described in detail in the repository
<a href="https://github.com/electron/rfcs/blob/main/README.md" target="_blank" rel="noopener noreferrer">README</a>.</p>
<p>In brief, an RFC is <strong>Proposed</strong> once a PR is made to the <code>electron/rfcs</code> repository.
A Proposed RFC becomes:</p>
<ul>
<li><strong>Active</strong> when the PR is merged into the <code>main</code> branch of the repository, which means that Electron
maintainers are amenable to an implementation in <code>electron/electron</code>, or</li>
<li><strong>Declined</strong> if the PR is ultimately rejected.</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>For the RFC to become <strong>Active</strong>, the PR must be approved by at least 2 API Working Group members.
Before merging, the RFC should be presented synchronously and accepted unanimously by a quorum of at
least two-thirds of the WG members. If consensus is reached, a one-month final comment period will
be triggered, after which the PR will be merged.</p></div></div>
<p>An Active RFC is <strong>Completed</strong> if the implementation has been merged into <code>electron/electron</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="who-can-participate">Who can participate?<a href="https://electronjs.org/blog/rfcs#who-can-participate" class="hash-link" aria-label="Direct link to Who can participate?" title="Direct link to Who can participate?">​</a></h2>
<p>Anyone in the Electron community can submit RFCs or leave feedback on the <code>electron/rfcs</code> repository!</p>
<ul>
<li>To see the list of active RFCs, refer to <a href="https://github.com/electron/rfcs/tree/main/text" target="_blank" rel="noopener noreferrer">the <code>text</code> folder in the repository</a>.</li>
<li>To leave feedback on proposed RFCs, check out <a href="https://github.com/electron/rfcs/pulls" target="_blank" rel="noopener noreferrer">the list of open PRs</a>.</li>
<li>To submit a new RFC, check out the repo’s <a href="https://github.com/electron/rfcs" target="_blank" rel="noopener noreferrer">README</a> and <a href="https://github.com/electron/rfcs/blob/main/0000-template.md" target="_blank" rel="noopener noreferrer">the RFC template</a>.</li>
</ul>
<p>We wanted to make this process a two-way dialogue and encourage community participation to get a
diverse set of opinions from Electron apps that might consume these APIs in the future. If you’re
interested in leaving feedback on currently proposed RFCs, the Electron maintainers have already created
a few:</p>
<ul>
<li><a href="https://github.com/electron/rfcs/pull/3" target="_blank" rel="noopener noreferrer">Electron C APIs</a></li>
<li><a href="https://github.com/electron/rfcs/pull/4" target="_blank" rel="noopener noreferrer">Preload Realm for Service Workers</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="credits">Credits<a href="https://electronjs.org/blog/rfcs#credits" class="hash-link" aria-label="Direct link to Credits" title="Direct link to Credits">​</a></h2>
<p>Electron's RFC process was modeled on many established open source RFC processes.
Inspiration for many ideas and major portions of copywriting go to:</p>
<ul>
<li><a href="https://github.com/emberjs/rfcs" target="_blank" rel="noopener noreferrer">emberjs/rfcs</a></li>
<li><a href="https://github.com/reactjs/rfcs" target="_blank" rel="noopener noreferrer">reactjs/rfcs</a></li>
<li><a href="https://github.com/rust-lang/rfcs" target="_blank" rel="noopener noreferrer">rust-lang/rfcs</a></li>
<li><a href="https://github.com/tauri-apps/rfcs" target="_blank" rel="noopener noreferrer">tauri-apps/rfcs</a></li>
<li><a href="https://github.com/vuejs/rfcs" target="_blank" rel="noopener noreferrer">vuejs/rfcs</a></li>
<li><a href="https://github.com/yarnpkg/rfcs" target="_blank" rel="noopener noreferrer">yarnpkg/rfcs</a></li>
</ul>]]></content:encoded>
            <category>Community</category>
            <category>Features</category>
        </item>
        <item>
            <title><![CDATA[Statement regarding "runAsNode" CVEs]]></title>
            <link>https://electronjs.org/blog/statement-run-as-node-cves</link>
            <guid>https://electronjs.org/blog/statement-run-as-node-cves</guid>
            <pubDate>Wed, 07 Feb 2024 12:00:00 GMT</pubDate>
            <description><![CDATA[Earlier today, the Electron team was alerted to several public CVEs recently filed against several notable Electron apps. The CVEs are related to two of Electron’s fuses - runAsNode and enableNodeCliInspectArguments - and incorrectly claim that a remote attacker is able to execute arbitrary code via these components if they have not been actively disabled.]]></description>
            <content:encoded><![CDATA[<p>Earlier today, the Electron team was alerted to several public CVEs recently filed against several notable Electron apps. The CVEs are related to two of Electron’s <a href="https://www.electronjs.org/docs/latest/tutorial/fuses" target="_blank" rel="noopener noreferrer">fuses</a> - <code>runAsNode</code> and <code>enableNodeCliInspectArguments</code> - and incorrectly claim that a remote attacker is able to execute arbitrary code via these components if they have not been actively disabled.</p>
<p>We do not believe that these CVEs were filed in good faith. First of all, the statement is incorrect - the configuration does <em>not</em> enable remote code execution. Secondly, companies called out in these CVEs have not been notified despite having bug bounty programs. Lastly, while we do believe that disabling the components in question enhances app security, we do not believe that the CVEs have been filed with the correct severity. “Critical” is reserved for issues of the highest danger, which is certainly not the case here.</p>
<p>Anyone is able to request a CVE. While this is good for the overall health of the software industry, “farming CVEs” to bolster the reputation of a single security researcher is not helpful.</p>
<p>That said, we understand that the mere existence of a CVE with the scary <code>critical</code> severity might lead to end user confusion, so as a project, we’d like to offer guidance and assistance in dealing with the issue.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-might-this-impact-me">How might this impact me?<a href="https://electronjs.org/blog/statement-run-as-node-cves#how-might-this-impact-me" class="hash-link" aria-label="Direct link to How might this impact me?" title="Direct link to How might this impact me?">​</a></h3>
<p>After reviewing the CVEs, the Electron team believes that these CVEs are not critical.</p>
<p>An attacker needs to already be able to execute arbitrary commands on the machine, either by having physical access to the hardware or by having achieved full remote code execution. This bears repeating: The vulnerability described <em>requires an attacker to already have access to the attacked system</em>.</p>
<p>Chrome, for example, <a href="https://chromium.googlesource.com/chromium/src/+/master/docs/security/faq.md#Why-arent-physically_local-attacks-in-Chromes-threat-model" target="_blank" rel="noopener noreferrer">does not consider physically-local attacks in their threat model</a>:</p>
<blockquote>
<p>We consider these attacks outside Chrome's threat model, because there is no way for Chrome (or any application) to defend against a malicious user who has managed to log into your device as you, or who can run software with the privileges of your operating system user account. Such an attacker can modify executables and DLLs, change environment variables like&nbsp;<code>PATH</code>, change configuration files, read any data your user account owns, email it to themselves, and so on. Such an attacker has total control over your device, and nothing Chrome can do would provide a serious guarantee of defense. This problem is not special to Chrome ­— all applications must trust the physically-local user.</p>
</blockquote>
<p>The exploit described in the CVEs allows an attacker to then use the impacted app as a generic Node.js process with inherited TCC permissions. So if the app, for example, has been granted access to the address book, the attacker can run the app as Node.js and execute arbitrary code which will inherit that address book access. This is commonly known as a “<a href="https://www.crowdstrike.com/cybersecurity-101/living-off-the-land-attacks-lotl/" target="_blank" rel="noopener noreferrer">living off the land</a>” attack. Attackers usually use PowerShell, Bash, or similar tools to run arbitrary code.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="am-i-impacted">Am I impacted?<a href="https://electronjs.org/blog/statement-run-as-node-cves#am-i-impacted" class="hash-link" aria-label="Direct link to Am I impacted?" title="Direct link to Am I impacted?">​</a></h3>
<p>By default, all released versions of Electron have the <code>runAsNode</code> and <code>enableNodeCliInspectArguments</code> features enabled. If you have not turned them off as described in the <a href="https://www.electronjs.org/docs/latest/tutorial/fuses" target="_blank" rel="noopener noreferrer">Electron Fuses documentation</a>, your app is equally vulnerable to being used as a “living off the land” attack. Again, we need to stress that an attacker needs to <em>already</em> be able to execute code and programs on the victim’s machine.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="mitigation">Mitigation<a href="https://electronjs.org/blog/statement-run-as-node-cves#mitigation" class="hash-link" aria-label="Direct link to Mitigation" title="Direct link to Mitigation">​</a></h3>
<p>The easiest way to mitigate this issue is to disable the <code>runAsNode</code> fuse within your Electron app. The <code>runAsNode</code> fuse toggles whether the <code>ELECTRON_RUN_AS_NODE</code> environment variable is respected or not. Please see the <a href="https://www.electronjs.org/docs/latest/tutorial/fuses" target="_blank" rel="noopener noreferrer">Electron Fuses documentation</a> for information on how to toggle theses fuses.</p>
<p>Please note that if this fuse is disabled, then <code>process.fork</code> in the main process will not function as expected as it depends on this environment variable to function. Instead, we recommend that you use <a href="https://www.electronjs.org/docs/latest/api/utility-process" target="_blank" rel="noopener noreferrer">Utility Processes</a>, which work for many use cases where you need a standalone Node.js process (like a Sqlite server process or similar scenarios).</p>
<p>You can find more info about security best practices we recommend for Electron apps in our <a href="https://www.electronjs.org/docs/latest/tutorial/security" target="_blank" rel="noopener noreferrer">Security Checklist</a>.</p>]]></content:encoded>
            <category>Security</category>
        </item>
        <item>
            <title><![CDATA[Electron 28.0.0]]></title>
            <link>https://electronjs.org/blog/electron-28-0</link>
            <guid>https://electronjs.org/blog/electron-28-0</guid>
            <pubDate>Wed, 06 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 28.0.0 has been released! It includes upgrades to Chromium 120.0.6099.56, V8 12.0, and Node.js 18.18.2.]]></description>
            <content:encoded><![CDATA[<p>Electron 28.0.0 has been released! It includes upgrades to Chromium <code>120.0.6099.56</code>, V8 <code>12.0</code>, and Node.js <code>18.18.2</code>.</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 28.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on <a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-28-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/electron-28-0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h2>
<ul>
<li>Implemented support for ECMAScript modules or ESM (What are ECMAScript modules? <a href="https://nodejs.org/api/esm.html#modules-ecmascript-modules" target="_blank" rel="noopener noreferrer">learn more here</a>. This includes support for ESM in Electron proper, as well as areas such as the <code>UtilityProcess</code> API entrypoints. <a href="https://www.electronjs.org/docs/latest/tutorial/esm" target="_blank" rel="noopener noreferrer">See our ESM documentation</a> for more details.</li>
<li>In addition to enabling ESM support in Electron itself, Electron Forge also supports using ESM to package, build and develop Electron applications. You can find this support in <a href="https://github.com/electron/forge/releases/tag/v7.0.0" target="_blank" rel="noopener noreferrer">Forge v7.0.0</a> or higher.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-28-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>120.0.6099.56</code>
<ul>
<li>New in <a href="https://developer.chrome.com/blog/new-in-chrome-119/" target="_blank" rel="noopener noreferrer">Chrome 119</a> and in <a href="https://developer.chrome.com/blog/new-in-devtools-119/" target="_blank" rel="noopener noreferrer">DevTools 119</a></li>
<li>New in <a href="https://developer.chrome.com/blog/new-in-chrome-120/" target="_blank" rel="noopener noreferrer">Chrome 120</a> and in <a href="https://developer.chrome.com/blog/new-in-devtools-120/" target="_blank" rel="noopener noreferrer">DevTools 120</a></li>
</ul>
</li>
<li>Node <code>18.18.2</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v18.18.0/" target="_blank" rel="noopener noreferrer">Node 18.18.0 notes</a></li>
<li><a href="https://nodejs.org/en/blog/release/v18.18.1/" target="_blank" rel="noopener noreferrer">Node 18.18.1 notes</a></li>
<li><a href="https://nodejs.org/en/blog/release/v18.18.2/" target="_blank" rel="noopener noreferrer">Node 18.18.2 notes</a></li>
</ul>
</li>
<li>V8 <code>12.0</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-28-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Enabled ESM support. <a href="https://github.com/electron/electron/pull/37535" target="_blank" rel="noopener noreferrer">#37535</a>
<ul>
<li>For more details, see the <a href="https://www.electronjs.org/docs/latest/tutorial/esm" target="_blank" rel="noopener noreferrer">ESM documentation</a>.</li>
</ul>
</li>
<li>Added ESM entrypoints to the <code>UtilityProcess</code> API. <a href="https://github.com/electron/electron/pull/40047" target="_blank" rel="noopener noreferrer">#40047</a></li>
<li>Added several properties to the <code>display</code> object including <code>detected</code>, <code>maximumCursorSize</code>, and <code>nativeOrigin</code>. <a href="https://github.com/electron/electron/pull/40554" target="_blank" rel="noopener noreferrer">#40554</a></li>
<li>Added support for <code>ELECTRON_OZONE_PLATFORM_HINT</code> environment variable on Linux. <a href="https://github.com/electron/electron/pull/39792" target="_blank" rel="noopener noreferrer">#39792</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-28-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="behavior-changed-webcontentsbackgroundthrottling-set-to-false-affects-all-webcontents-in-the-host-browserwindow">Behavior Changed: <code>WebContents.backgroundThrottling</code> set to false affects all <code>WebContents</code> in the host <code>BrowserWindow</code><a href="https://electronjs.org/blog/electron-28-0#behavior-changed-webcontentsbackgroundthrottling-set-to-false-affects-all-webcontents-in-the-host-browserwindow" class="hash-link" aria-label="Direct link to behavior-changed-webcontentsbackgroundthrottling-set-to-false-affects-all-webcontents-in-the-host-browserwindow" title="Direct link to behavior-changed-webcontentsbackgroundthrottling-set-to-false-affects-all-webcontents-in-the-host-browserwindow">​</a></h4>
<p><code>WebContents.backgroundThrottling</code> set to false will disable frames throttling
in the <code>BrowserWindow</code> for all <code>WebContents</code> displayed by it.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-browserwindowsettrafficlightpositionposition">Removed: <code>BrowserWindow.setTrafficLightPosition(position)</code><a href="https://electronjs.org/blog/electron-28-0#removed-browserwindowsettrafficlightpositionposition" class="hash-link" aria-label="Direct link to removed-browserwindowsettrafficlightpositionposition" title="Direct link to removed-browserwindowsettrafficlightpositionposition">​</a></h4>
<p><code>BrowserWindow.setTrafficLightPosition(position)</code> has been removed, the
<code>BrowserWindow.setWindowButtonPosition(position)</code> API should be used instead
which accepts <code>null</code> instead of <code>{ x: 0, y: 0 }</code> to reset the position to
system default.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed in Electron 28</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setTrafficLightPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setTrafficLightPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setWindowButtonPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setWindowButtonPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-browserwindowgettrafficlightposition">Removed: <code>BrowserWindow.getTrafficLightPosition()</code><a href="https://electronjs.org/blog/electron-28-0#removed-browserwindowgettrafficlightposition" class="hash-link" aria-label="Direct link to removed-browserwindowgettrafficlightposition" title="Direct link to removed-browserwindowgettrafficlightposition">​</a></h4>
<p><code>BrowserWindow.getTrafficLightPosition()</code> has been removed, the
<code>BrowserWindow.getWindowButtonPosition()</code> API should be used instead
which returns <code>null</code> instead of <code>{ x: 0, y: 0 }</code> when there is no custom
position.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed in Electron 28</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> pos </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getTrafficLightPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// No custom position.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ret </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getWindowButtonPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ret </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// No custom position.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-ipcrenderersendto">Removed: <code>ipcRenderer.sendTo()</code><a href="https://electronjs.org/blog/electron-28-0#removed-ipcrenderersendto" class="hash-link" aria-label="Direct link to removed-ipcrenderersendto" title="Direct link to removed-ipcrenderersendto">​</a></h4>
<p>The <code>ipcRenderer.sendTo()</code> API has been removed. It should be replaced by setting up a <a href="https://www.electronjs.org/docs/latest/tutorial/message-ports#setting-up-a-messagechannel-between-two-renderers" target="_blank" rel="noopener noreferrer"><code>MessageChannel</code></a> between the renderers.</p>
<p>The <code>senderId</code> and <code>senderIsMainFrame</code> properties of <code>IpcRendererEvent</code> have been removed as well.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="removed-apprunningunderrosettatranslation">Removed: <code>app.runningUnderRosettaTranslation</code><a href="https://electronjs.org/blog/electron-28-0#removed-apprunningunderrosettatranslation" class="hash-link" aria-label="Direct link to removed-apprunningunderrosettatranslation" title="Direct link to removed-apprunningunderrosettatranslation">​</a></h4>
<p>The <code>app.runningUnderRosettaTranslation</code> property has been removed.
Use <code>app.runningUnderARM64Translation</code> instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">runningUnderRosettaTranslation</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">runningUnderARM64Translation</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-25xy">End of Support for 25.x.y<a href="https://electronjs.org/blog/electron-28-0#end-of-support-for-25xy" class="hash-link" aria-label="Direct link to End of Support for 25.x.y" title="Direct link to End of Support for 25.x.y">​</a></h2>
<p>Electron 25.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E28 (Dec'23)</th><th>E29 (Feb'24)</th><th>E30 (Apr'24)</th></tr></thead><tbody><tr><td>28.x.y</td><td>29.x.y</td><td>30.x.y</td></tr><tr><td>27.x.y</td><td>28.x.y</td><td>29.x.y</td></tr><tr><td>26.x.y</td><td>27.x.y</td><td>28.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-28-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Ecosystem 2023 Recap]]></title>
            <link>https://electronjs.org/blog/ecosystem-2023-eoy-recap</link>
            <guid>https://electronjs.org/blog/ecosystem-2023-eoy-recap</guid>
            <pubDate>Thu, 30 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Reflecting on the improvements and changes in Electron's developer ecosystem in 2023.]]></description>
            <content:encoded><![CDATA[<p>Reflecting on the improvements and changes in Electron's developer ecosystem in 2023.</p>
<hr>
<p>In the past few months, we've been cooking up some changes across the Electron ecosystem to supercharge the developer experience for Electron apps! Here’s a swift rundown of the latest additions straight from Electron HQ.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="electron-forge-7-and-beyond">Electron Forge 7 and beyond<a href="https://electronjs.org/blog/ecosystem-2023-eoy-recap#electron-forge-7-and-beyond" class="hash-link" aria-label="Direct link to Electron Forge 7 and beyond" title="Direct link to Electron Forge 7 and beyond">​</a></h2>
<p>Electron Forge 7 — the newest major version of our all-in-one tool for packaging and distributing Electron applications — is now available.</p>
<p>While Forge 6 was a complete rewrite from v5, v7 is smaller in scope but still contains a few breaking changes. Going forward, we will continue to publish major versions of Forge as breaking changes need to be made.</p>
<p>For more details, see the full <a href="https://github.com/electron/forge/releases/tag/v7.0.0" target="_blank" rel="noopener noreferrer">Forge v7.0.0 changelog</a> on GitHub.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking changes<a href="https://electronjs.org/blog/ecosystem-2023-eoy-recap#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes">​</a></h3>
<ul>
<li><strong>Switched to <code>notarytool</code> for macOS notarization:</strong> As of 2023-11-01, Apple sunset the legacy <code>altool</code> for macOS notarization, and this release removes it from Electron Forge entirely.</li>
<li><strong>Minimum Node.js increased to v16.4.0:</strong> With this release, we’ve set the minimum required Node.js version to 16.4.0.</li>
<li><strong>Dropped support for <code>electron-prebuilt</code> and <code>electron-prebuilt-compile</code></strong>: <code>electron-prebuilt</code> <a href="https://www.electronjs.org/blog/npm-install-electron" target="_blank" rel="noopener noreferrer">was the original name for Electron’s npm module</a>, but was replaced by <code>electron</code> in v1.3.1. <code>electron-prebuilt-compile</code> was an alternative to that binary that came with enhanced DX features, but was eventually abandoned as a project.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/ecosystem-2023-eoy-recap#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h3>
<ul>
<li><strong><a href="https://github.com/electron/forge/pull/2100" target="_blank" rel="noopener noreferrer">Google Cloud Storage publisher</a>:</strong> As part of our push to better support static auto updating, Electron Forge now supports publishing directly to Google Cloud Storage!</li>
<li><strong><a href="https://github.com/electron/forge/pull/3358" target="_blank" rel="noopener noreferrer">ESM forge.config.js support</a>:</strong> Electron Forge now supports ESM <code>forge.config.js</code> files. (P.S. Look forward to ESM entrypoint support in Electron 28.)</li>
<li><strong><a href="https://github.com/electron/forge/pull/3363" target="_blank" rel="noopener noreferrer">Makers now run in parallel</a>:</strong> In Electron Forge 6, Makers ran sequentially for ✨&nbsp;legacy ✨&nbsp;reasons. Since then, we’ve tested out parallelization for the Make step with no adverse side effects, so you should see a speed-up when building multiple targets for the same platform!</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Thank you!</div><div class="admonitionContent_BuS1"><p>🙇 Big thanks to <strong><a href="https://github.com/mahnunchik" target="_blank" rel="noopener noreferrer">mahnunchik</a></strong> for the contributions for both the GCS Publisher and ESM support in Forge configurations!</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="better-static-storage-auto-updates">Better static storage auto updates<a href="https://electronjs.org/blog/ecosystem-2023-eoy-recap#better-static-storage-auto-updates" class="hash-link" aria-label="Direct link to Better static storage auto updates" title="Direct link to Better static storage auto updates">​</a></h2>
<p>Squirrel.Windows and Squirrel.Mac are platform-specific updater technologies that back Electron’s built-in <code>autoUpdater</code> module. Both projects support auto updates via two methods:</p>
<ul>
<li>A Squirrel-compatible update server</li>
<li>A manifest URL hosted on a static storage provider (e.g. AWS, Google Cloud Platform, Microsoft Azure, etc.)</li>
</ul>
<p>The update server method has traditionally been the recommended approach for Electron apps (and provides additional customization of update logic), but it has a major downside—it requires apps to maintain their own server instance if they are closed-source.</p>
<p>On the other hand, the static storage method has always been possible, but was undocumented within Electron and poorly supported across Electron tooling packages.</p>
<p>With some great work from <code>@MarshallOfSound</code>, the update story for serverless automatic app updates has been drastically streamlined:</p>
<ul>
<li>Electron Forge’s Zip and Squirrel.Windows makers can now be configured to output <code>autoUpdater</code>-compatible update manifests.</li>
<li>A new major version of <code>update-electron-app</code> (v2.0.0) can now read these generated manifests as an alternative to the <a href="https://update.electronjs.org/" target="_blank" rel="noopener noreferrer">update.electronjs.org</a> server.</li>
</ul>
<p>Once your Makers and Publishers are configured to upload update manifests to cloud file storage, you can enable auto updates with only a few lines of configuration:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> updateElectronApp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token maybe-class-name">UpdateSourceType</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'update-electron-app'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">updateElectronApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">updateSource</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">UpdateSourceType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">StaticStorage</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">baseUrl</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">https://my-manifest.url/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">platform</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">process</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">arch</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Further reading</div><div class="admonitionContent_BuS1"><p>📦 Want to learn more? For a detailed guide, see <a href="https://www.electronforge.io/advanced/auto-update" target="_blank" rel="noopener noreferrer">Forge’s auto update documentation</a>.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-electron-extended-universe">The <code>@electron/</code> extended universe<a href="https://electronjs.org/blog/ecosystem-2023-eoy-recap#the-electron-extended-universe" class="hash-link" aria-label="Direct link to the-electron-extended-universe" title="Direct link to the-electron-extended-universe">​</a></h2>
<p>When Electron first started, the community published many packages to enhance the experience of developing, packaging, and distributing Electron apps. Over time, many of these packages were incorporated into Electron’s GitHub organization, with the core team taking on the maintenance burden.</p>
<p>In 2022, we began unifying all these first-party tools under the <code>@electron/</code> namespace on npm. This change means that packages that used to be <code>electron-foo</code> are now <code>@electron/foo</code> on npm, and repositories that used to be named <code>electron/electron-foo</code> are now <code>electron/foo</code> on GitHub. These changes help clearly delineate first-party projects from userland projects. This includes many commonly used packages, such as:</p>
<ul>
<li><code>@electron/asar</code></li>
<li><code>@electron/fuses</code></li>
<li><code>@electron/get</code></li>
<li><code>@electron/notarize</code></li>
<li><code>@electron/osx-sign</code></li>
<li><code>@electron/packager</code></li>
<li><code>@electron/rebuild</code></li>
<li><code>@electron/remote</code></li>
<li><code>@electron/symbolicate-mac</code></li>
<li><code>@electron/universal</code></li>
</ul>
<p>Going forward, all first-party packages we release will also be in the <code>@electron/</code> namespace. There are two exceptions to this rule:</p>
<ul>
<li>Electron core will continue to be published under the <code>electron</code> package.</li>
<li>Electron Forge will continue to publish all of its monorepo packages under the <code>@electron-forge/</code> namespace.</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Star seeking</div><div class="admonitionContent_BuS1"><p>⭐ During this process, we also accidentally took the electron/packager repository private, which has the unfortunate side effect of erasing our GitHub star count (over 9000 before the erasure). If you are an active user of Packager, we’d appreciate a ⭐&nbsp;<strong>Star</strong> ⭐!</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="introducing-electronwindows-sign">Introducing <code>@electron/windows-sign</code><a href="https://electronjs.org/blog/ecosystem-2023-eoy-recap#introducing-electronwindows-sign" class="hash-link" aria-label="Direct link to introducing-electronwindows-sign" title="Direct link to introducing-electronwindows-sign">​</a></h2>
<p>Starting on 2023-06-01, industry standards began requiring keys for Windows code signing certificates to be stored on FIPS-compliant hardware.</p>
<p>In practice, this meant that code signing became a lot harder for apps that build and sign in CI environments, since many Electron tools take in a certificate file and password as config parameters and attempt to sign from there using hardcoded logic.</p>
<p>This situation has been a common pain point for Electron developers, which is why we have been working on a better solution that isolates Windows code signing into its own standalone step, similar to what <code>@electron/osx-sign</code> does on macOS.</p>
<p>In the future, we plan on fully integrating this package into the Electron Forge toolchain, but it currently lives on its own. The package is currently available for installation at <code>npm install --save-dev @electron/windows-sign</code> and can used programmatically or via CLI.</p>
<p>Please try it out and give us your feedback in the <a href="https://github.com/electron/windows-sign/issues" target="_blank" rel="noopener noreferrer">repo’s issue tracker</a>!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a href="https://electronjs.org/blog/ecosystem-2023-eoy-recap#whats-next" class="hash-link" aria-label="Direct link to What's next?" title="Direct link to What's next?">​</a></h2>
<p>We'll be entering our annual December quiet period next month. While we do, we'll be thinking about how we can make the Electron development experience even better in 2024.</p>
<p>Is there anything you'd like to see us work on next? Let us know!</p>]]></content:encoded>
            <category>Ecosystem</category>
            <category>Showcase</category>
        </item>
        <item>
            <title><![CDATA[December Quiet Month (Dec'23)]]></title>
            <link>https://electronjs.org/blog/dec-quiet-period-23</link>
            <guid>https://electronjs.org/blog/dec-quiet-period-23</guid>
            <pubDate>Mon, 20 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[The Electron project will pause for the month of December 2023, then return to full speed in]]></description>
            <content:encoded><![CDATA[<p>The Electron project will pause for the month of December 2023, then return to full speed in
January 2024.</p>
<iframe src="https://giphy.com/embed/7ShQBUr50tPfvgrwX9" width="480" height="270" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe>
<p><a href="https://giphy.com/gifs/disneyplus-7ShQBUr50tPfvgrwX9">via GIPHY</a></p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-will-be-the-same-in-december">What will be the same in December<a href="https://electronjs.org/blog/dec-quiet-period-23#what-will-be-the-same-in-december" class="hash-link" aria-label="Direct link to What will be the same in December" title="Direct link to What will be the same in December">​</a></h2>
<ol>
<li>Zero-day and other major security-related releases will be published as necessary. Security
incidents should be reported via <a href="https://github.com/electron/electron/tree/main/SECURITY.md" target="_blank" rel="noopener noreferrer">SECURITY.md</a>.</li>
<li><a href="https://github.com/electron/electron/blob/main/CODE_OF_CONDUCT.md" target="_blank" rel="noopener noreferrer">Code of Conduct</a> reports
and moderation will continue.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-will-be-different-in-december">What will be different in December<a href="https://electronjs.org/blog/dec-quiet-period-23#what-will-be-different-in-december" class="hash-link" aria-label="Direct link to What will be different in December" title="Direct link to What will be different in December">​</a></h2>
<ol>
<li>Electron 28.0.0 will be released on December 5th. After Electron 28, there will be no new Stable releases in December.</li>
<li>No Nightly and Alpha releases for the last two weeks of December.</li>
<li>With few exceptions, no pull request reviews or merges.</li>
<li>No issue tracker updates on any repositories.</li>
<li>No Discord debugging help from maintainers.</li>
<li>No social media content updates.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="going-forward">Going forward<a href="https://electronjs.org/blog/dec-quiet-period-23#going-forward" class="hash-link" aria-label="Direct link to Going forward" title="Direct link to Going forward">​</a></h2>
<p>This is our third year running our quiet period experiment, and we've had a lot of success so far
in balancing a month of rest with maintaining our normal release cadence afterwards. Therefore,
we've decided to make this a regular part of our release calendar going forward. We'll still be
putting a reminder into the last stable release of every calendar year.</p>
<p>See you all in 2024!</p>]]></content:encoded>
            <category>Project News</category>
        </item>
        <item>
            <title><![CDATA[Electron 27.0.0]]></title>
            <link>https://electronjs.org/blog/electron-27-0</link>
            <guid>https://electronjs.org/blog/electron-27-0</guid>
            <pubDate>Tue, 10 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 27.0.0 has been released! It includes upgrades to Chromium 118.0.5993.32, V8 11.8, and Node.js 18.17.1.]]></description>
            <content:encoded><![CDATA[<p>Electron 27.0.0 has been released! It includes upgrades to Chromium <code>118.0.5993.32</code>, V8 <code>11.8</code>, and Node.js <code>18.17.1</code>.</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 27.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on <a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> or <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-27-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-27-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>118.0.5993.32</code>
<ul>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-118/" target="_blank" rel="noopener noreferrer">New in Chrome 118</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-devtools-118/" target="_blank" rel="noopener noreferrer">New in DevTools 118</a></li>
</ul>
</li>
<li>Node.js <code>18.17.1</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v18.17.1/" target="_blank" rel="noopener noreferrer">Node 18.17.1 blog post</a></li>
<li><a href="https://nodejs.org/en/blog/release/v18.17.0/" target="_blank" rel="noopener noreferrer">Node 18.17.0 blog post</a></li>
</ul>
</li>
<li>V8 <code>11.8</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-27-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="removed-macos-1013--1014-support">Removed: macOS 10.13 / 10.14 support<a href="https://electronjs.org/blog/electron-27-0#removed-macos-1013--1014-support" class="hash-link" aria-label="Direct link to Removed: macOS 10.13 / 10.14 support" title="Direct link to Removed: macOS 10.13 / 10.14 support">​</a></h3>
<p>macOS 10.13 (High Sierra) and macOS 10.14 (Mojave) are no longer supported by <a href="https://chromium-review.googlesource.com/c/chromium/src/+/4629466" target="_blank" rel="noopener noreferrer">Chromium</a>.</p>
<p>Older versions of Electron will continue to run on these operating systems, but macOS 10.15 (Catalina)
or later will be required to run Electron v27.0.0 and higher.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-ipcrenderersendto">Deprecated: <code>ipcRenderer.sendTo()</code><a href="https://electronjs.org/blog/electron-27-0#deprecated-ipcrenderersendto" class="hash-link" aria-label="Direct link to deprecated-ipcrenderersendto" title="Direct link to deprecated-ipcrenderersendto">​</a></h3>
<p>The <code>ipcRenderer.sendTo()</code> API has been deprecated. It should be replaced by setting up a <a href="https://www.electronjs.org/docs/latest/tutorial/message-ports#setting-up-a-messagechannel-between-two-renderers" target="_blank" rel="noopener noreferrer"><code>MessageChannel</code></a> between the renderers.</p>
<p>The <code>senderId</code> and <code>senderIsMainFrame</code> properties of <code>IpcRendererEvent</code> have been deprecated as well.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="removed-color-scheme-events-in-systempreferences">Removed: color scheme events in <code>systemPreferences</code><a href="https://electronjs.org/blog/electron-27-0#removed-color-scheme-events-in-systempreferences" class="hash-link" aria-label="Direct link to removed-color-scheme-events-in-systempreferences" title="Direct link to removed-color-scheme-events-in-systempreferences">​</a></h3>
<p>The following <code>systemPreferences</code> events have been removed:</p>
<ul>
<li><code>inverted-color-scheme-changed</code></li>
<li><code>high-contrast-color-scheme-changed</code></li>
</ul>
<p>Use the new <code>updated</code> event on the <code>nativeTheme</code> module instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'inverted-color-scheme-changed'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'high-contrast-color-scheme-changed'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'updated'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="removed-webcontentsgetprinters">Removed: <code>webContents.getPrinters</code><a href="https://electronjs.org/blog/electron-27-0#removed-webcontentsgetprinters" class="hash-link" aria-label="Direct link to removed-webcontentsgetprinters" title="Direct link to removed-webcontentsgetprinters">​</a></h3>
<p>The <code>webContents.getPrinters</code> method has been removed. Use
<code>webContents.getPrintersAsync</code> instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> w </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">BrowserWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">show</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">w</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getPrinters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">w</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getPrintersAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">printers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">printers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="removed-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance">Removed: <code>systemPreferences.{get,set}AppLevelAppearance</code> and <code>systemPreferences.appLevelAppearance</code><a href="https://electronjs.org/blog/electron-27-0#removed-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance" class="hash-link" aria-label="Direct link to removed-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance" title="Direct link to removed-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance">​</a></h3>
<p>The <code>systemPreferences.getAppLevelAppearance</code> and <code>systemPreferences.setAppLevelAppearance</code>
methods have been removed, as well as the <code>systemPreferences.appLevelAppearance</code> property.
Use the <code>nativeTheme</code> module instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getAppLevelAppearance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">shouldUseDarkColors</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">appLevelAppearance</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">shouldUseDarkColors</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setAppLevelAppearance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'dark'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">themeSource</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dark'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="removed-alternate-selected-control-text-value-for-systempreferencesgetcolor">Removed: <code>alternate-selected-control-text</code> value for <code>systemPreferences.getColor</code><a href="https://electronjs.org/blog/electron-27-0#removed-alternate-selected-control-text-value-for-systempreferencesgetcolor" class="hash-link" aria-label="Direct link to removed-alternate-selected-control-text-value-for-systempreferencesgetcolor" title="Direct link to removed-alternate-selected-control-text-value-for-systempreferencesgetcolor">​</a></h3>
<p>The <code>alternate-selected-control-text</code> value for <code>systemPreferences.getColor</code>
has been removed. Use <code>selected-content-background</code> instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Removed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'alternate-selected-control-text'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'selected-content-background'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-27-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added app accessibility transparency settings api <a href="https://github.com/electron/electron/pull/39631" target="_blank" rel="noopener noreferrer">#39631</a></li>
<li>Added support for <code>chrome.scripting</code> extension APIs <a href="https://github.com/electron/electron/pull/39675" target="_blank" rel="noopener noreferrer">#39675</a></li>
<li>Enabled <code>WaylandWindowDecorations</code> by default <a href="https://github.com/electron/electron/pull/39644" target="_blank" rel="noopener noreferrer">#39644</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-24xy">End of Support for 24.x.y<a href="https://electronjs.org/blog/electron-27-0#end-of-support-for-24xy" class="hash-link" aria-label="Direct link to End of Support for 24.x.y" title="Direct link to End of Support for 24.x.y">​</a></h2>
<p>Electron 24.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E27 (Oct'23)</th><th>E28 (Dec'23)</th><th>E29 (Feb'24)</th></tr></thead><tbody><tr><td>27.x.y</td><td>28.x.y</td><td>29.x.y</td></tr><tr><td>26.x.y</td><td>27.x.y</td><td>28.x.y</td></tr><tr><td>25.x.y</td><td>26.x.y</td><td>27.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-extended-support-for-22xy">End of Extended Support for 22.x.y<a href="https://electronjs.org/blog/electron-27-0#end-of-extended-support-for-22xy" class="hash-link" aria-label="Direct link to End of Extended Support for 22.x.y" title="Direct link to End of Extended Support for 22.x.y">​</a></h2>
<p>Earlier this year, the Electron team extended Electron 22's planned end of life date from May 30, 2023 to October 10, 2023, in order to match Chrome's extended support for Windows 7/8/8.1 (see <a href="https://www.electronjs.org/blog/windows-7-to-8-1-deprecation-notice" target="_blank" rel="noopener noreferrer">Farewell, Windows 7/8/8.1</a> for more details).</p>
<p>Electron 22.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a> and this support extension. This will drop support back to the latest three stable major versions, and will end official support for Windows 7/8/8.1.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-27-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Breach to Barrier: Strengthening Apps with the Sandbox]]></title>
            <link>https://electronjs.org/blog/breach-to-barrier</link>
            <guid>https://electronjs.org/blog/breach-to-barrier</guid>
            <pubDate>Fri, 29 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[It’s been more than a week since CVE-2023-4863 macOS, iOS, Chrome, Firefox, and various Linux distributions all received updates. This followed investigations by Citizen Lab, discovering that an iPhone used by a “Washington DC-based civil society organization” was under attack using a zero-click exploit within iMessage.]]></description>
            <content:encoded><![CDATA[<p>It’s been more than a week since <a href="https://chromereleases.googleblog.com/2023/09/stable-channel-update-for-desktop_11.html" target="_blank" rel="noopener noreferrer">CVE-2023-4863: Heap buffer overflow in WebP</a> was made public, leading to a flurry of new releases of software rendering <code>webp</code> images: macOS, iOS, Chrome, Firefox, and various Linux distributions all received updates. This followed investigations by Citizen Lab, discovering that an iPhone used by a “Washington DC-based civil society organization” was under attack using a zero-click exploit within iMessage.</p>
<p>Electron, too, spun into action and released new versions the same day: If your app renders any user-provided content, you should update your version of Electron - v27.0.0-beta.2, v26.2.1, v25.8.1, v24.8.3, and v22.3.24 all contain a fixed version of <code>libwebp</code>, the library responsible for rendering <code>webp</code> images.</p>
<p>Now that we are all freshly aware that an interaction as innocent as “rendering an image” is a potentially dangerous activity, we want to use this opportunity to remind everyone that Electron comes with a process sandbox that will limit the blast radius of the next big attack — whatever it may be.</p>
<p>The sandbox was available ever since Electron v1 and enabled by default in v20, but we know that many apps (especially those that have been around for a while) may have a <code>sandbox: false</code> somewhere in their code – or a <code>nodeIntegration: true</code>, which equally disables the sandbox when there is no explicit <code>sandbox</code> setting. That’s understandable: If you’ve been with us for a long time, you probably enjoyed the power of throwing a <code>require("child_process")</code> or <code>require("fs")</code> into the same code that runs your HTML/CSS.</p>
<p>Before we talk about <em>how</em> you migrate to the sandbox, let’s first discuss <em>why</em> you want it.</p>
<p>The sandbox puts a hard cage around all renderer processes, ensuring that no matter what happens inside, code is executed inside a restricted environment. As a concept, it's a lot older than Chromium, and provided as a feature by all major operating systems. Electron's and Chromium's sandbox build on top of these system features. Even if you never display user-generated content, you should consider the possibility that your renderer might get compromised: Scenarios as sophisticated as supply chain attacks and as simple as little bugs can lead to your renderer doing things you didn't fully intend for it to do.</p>
<p>The sandbox makes that scenario a lot less scary: A process inside gets to freely use CPU cycles and memory — that’s it. Processes cannot write to disk or display their own windows. In the case of our <code>libwep</code> bug, the sandbox makes sure that an attacker cannot install or run malware. In fact, in the case of the original Pegasus attack on the employee’s iPhone, the attack specifically targeted a non-sandboxed image process to gain access to the phone, first breaking out of the boundaries of the normally sandboxed iMessage. When a CVE like the one in this example is announced, you still have to upgrade your Electron apps to a secure version — but in the meantime, the amount of damage an attacker can do is limited dramatically.</p>
<p>Migrating a vanilla Electron application from <code>sandbox: false</code> to <code>sandbox: true</code> is an undertaking. I know, because even though I have personally written the first draft of the <a href="https://www.electronjs.org/docs/latest/tutorial/security" target="_blank" rel="noopener noreferrer">Electron Security Guidelines</a>, I have not managed to migrate one of my own apps to use it. That changed this weekend, and I recommend that you change it, too.</p>
<p><img decoding="async" loading="lazy" alt="Don’t be scared by the number of line changes, most of it is in package-lock.json" src="https://electronjs.org/assets/images/breach-to-barrier-741ae594fea92cc24532491071794e18.png" width="1500" height="676" class="img_ev3q"></p>
<p>There are two things you need to tackle:</p>
<ol>
<li>
<p>If you’re using Node.js code in either <code>preload</code> scripts or the actual <code>WebContents</code>, you need to move all that Node.js interaction to the main process (or, if you are fancy, a utility process). Given how powerful renderers have become, chances are high that the vast majority of your code doesn’t really need refactoring.</p>
<p>Consult our documentation on <a href="https://www.electronjs.org/docs/latest/tutorial/ipc" target="_blank" rel="noopener noreferrer">Inter-Process Communication</a>. In my case, I moved a lot of code and wrapped it in <code>ipcRenderer.invoke()</code> and <code>ipcMain.handle()</code>, but the process was straightforward and quickly done. Be a little mindful of your APIs here - if you build an API called <code>executeCodeAsRoot(code)</code>, the sandbox won't protect your users much.</p>
</li>
<li>
<p>Since enabling the sandbox disables Node.js integration in your preload scripts, you can no longer use <code>require("../my-script")</code>. In other words, your preload script needs to be a single file.</p>
<p>There are multiple ways to do that: Webpack, esbuild, parcel, and rollup will all get the job done. I used <a href="https://www.electronforge.io/config/plugins/webpack" target="_blank" rel="noopener noreferrer">Electron Forge’s excellent Webpack plugin</a>, users of the equally popular <code>electron-builder</code> can use <a href="https://webpack.electron.build/" target="_blank" rel="noopener noreferrer"><code>electron-webpack</code></a>.</p>
</li>
</ol>
<p>All in all, the entire process took me around four days — and that includes a lot of scratching my head at how to wrangle Webpack’s massive power, since I decided to use the opportunity to refactor my code in plenty of other ways, too.</p>]]></content:encoded>
            <category>Security</category>
        </item>
        <item>
            <title><![CDATA[Electron 26.0.0]]></title>
            <link>https://electronjs.org/blog/electron-26-0</link>
            <guid>https://electronjs.org/blog/electron-26-0</guid>
            <pubDate>Tue, 15 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 26.0.0 has been released! It includes upgrades to Chromium 116.0.5845.62, V8 11.2, and Node.js 18.16.1. Read below for more details!]]></description>
            <content:encoded><![CDATA[<p>Electron 26.0.0 has been released! It includes upgrades to Chromium <code>116.0.5845.62</code>, V8 <code>11.2</code>, and Node.js <code>18.16.1</code>. Read below for more details!</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 26.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on Twitter, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-26-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-26-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>116.0.5845.62</code>
<ul>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-116/" target="_blank" rel="noopener noreferrer">New in Chrome 116</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-devtools-116/" target="_blank" rel="noopener noreferrer">New in DevTools 116</a></li>
</ul>
</li>
<li>Node.js <code>18.16.1</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v18.16.1/" target="_blank" rel="noopener noreferrer">Node 18.16.1 blog post</a></li>
</ul>
</li>
<li>V8 <code>11.2</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-26-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-webcontentsgetprinters">Deprecated: <code>webContents.getPrinters</code><a href="https://electronjs.org/blog/electron-26-0#deprecated-webcontentsgetprinters" class="hash-link" aria-label="Direct link to deprecated-webcontentsgetprinters" title="Direct link to deprecated-webcontentsgetprinters">​</a></h3>
<p>The <code>webContents.getPrinters</code> method has been deprecated. Use
<code>webContents.getPrintersAsync</code> instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> w </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">BrowserWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">show</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">w</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getPrinters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">w</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">webContents</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getPrintersAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">printers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">printers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance">Deprecated: <code>systemPreferences.{get,set}AppLevelAppearance</code> and <code>systemPreferences.appLevelAppearance</code><a href="https://electronjs.org/blog/electron-26-0#deprecated-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance" class="hash-link" aria-label="Direct link to deprecated-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance" title="Direct link to deprecated-systempreferencesgetsetapplevelappearance-and-systempreferencesapplevelappearance">​</a></h3>
<p>The <code>systemPreferences.getAppLevelAppearance</code> and <code>systemPreferences.setAppLevelAppearance</code>
methods have been deprecated, as well as the <code>systemPreferences.appLevelAppearance</code> property.
Use the <code>nativeTheme</code> module instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getAppLevelAppearance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">shouldUseDarkColors</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">appLevelAppearance</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">shouldUseDarkColors</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setAppLevelAppearance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'dark'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeTheme</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">themeSource</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'dark'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-alternate-selected-control-text-value-for-systempreferencesgetcolor">Deprecated: <code>alternate-selected-control-text</code> value for <code>systemPreferences.getColor</code><a href="https://electronjs.org/blog/electron-26-0#deprecated-alternate-selected-control-text-value-for-systempreferencesgetcolor" class="hash-link" aria-label="Direct link to deprecated-alternate-selected-control-text-value-for-systempreferencesgetcolor" title="Direct link to deprecated-alternate-selected-control-text-value-for-systempreferencesgetcolor">​</a></h3>
<p>The <code>alternate-selected-control-text</code> value for <code>systemPreferences.getColor</code>
has been deprecated. Use <code>selected-content-background</code> instead.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'alternate-selected-control-text'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemPreferences</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getColor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'selected-content-background'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-26-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added <code>safeStorage.setUsePlainTextEncryption</code> and <code>safeStorage.getSelectedStorageBackend</code> api. <a href="https://github.com/electron/electron/pull/39107" target="_blank" rel="noopener noreferrer">#39107</a></li>
<li>Added <code>safeStorage.setUsePlainTextEncryption</code> and <code>safeStorage.getSelectedStorageBackend</code> api. <a href="https://github.com/electron/electron/pull/39155" target="_blank" rel="noopener noreferrer">#39155</a></li>
<li>Added <code>senderIsMainFrame</code> to messages sent via <code>ipcRenderer.sendTo()</code>. <a href="https://github.com/electron/electron/pull/39206" target="_blank" rel="noopener noreferrer">#39206</a></li>
<li>Added support for flagging a Menu as being keyboard initiated. <a href="https://github.com/electron/electron/pull/38954" target="_blank" rel="noopener noreferrer">#38954</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-23xy">End of Support for 23.x.y<a href="https://electronjs.org/blog/electron-26-0#end-of-support-for-23xy" class="hash-link" aria-label="Direct link to End of Support for 23.x.y" title="Direct link to End of Support for 23.x.y">​</a></h2>
<p>Electron 23.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<table><thead><tr><th>E26 (Aug'23)</th><th>E27 (Oct'23)</th><th>E28 (Jan'24)</th></tr></thead><tbody><tr><td>26.x.y</td><td>27.x.y</td><td>28.x.y</td></tr><tr><td>25.x.y</td><td>26.x.y</td><td>27.x.y</td></tr><tr><td>24.x.y</td><td>25.x.y</td><td>26.x.y</td></tr><tr><td>22.x.y</td><td></td><td></td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-26-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Electron 25.0.0]]></title>
            <link>https://electronjs.org/blog/electron-25-0</link>
            <guid>https://electronjs.org/blog/electron-25-0</guid>
            <pubDate>Tue, 30 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 25.0.0 has been released! It includes upgrades to Chromium 114, V8 11.4, and Node.js 18.15.0. Read below for more details!]]></description>
            <content:encoded><![CDATA[<p>Electron 25.0.0 has been released! It includes upgrades to Chromium <code>114</code>, V8 <code>11.4</code>, and Node.js <code>18.15.0</code>. Read below for more details!</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 25.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on Twitter, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-25-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="highlights">Highlights<a href="https://electronjs.org/blog/electron-25-0#highlights" class="hash-link" aria-label="Direct link to Highlights" title="Direct link to Highlights">​</a></h3>
<ul>
<li>Implemented <code>net.fetch</code> within Electron's net module, using Chromium's networking stack. This differs from Node's <code>fetch()</code>, which uses Node.js' HTTP stack. See <a href="https://github.com/electron/electron/pull/36733" target="_blank" rel="noopener noreferrer">#36733</a> and <a href="https://github.com/electron/electron/pull/36606" target="_blank" rel="noopener noreferrer">#36606</a>.</li>
<li>Added <code>protocol.handle</code>, which replaces and deprecates <code>protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol</code>. <a href="https://github.com/electron/electron/pull/36674" target="_blank" rel="noopener noreferrer">#36674</a></li>
<li>Extended support for Electron 22, in order to match Chromium and Microsoft's Windows 7/8/8.1 deprecation plan. See additional details at the end of this blog post.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-25-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>114</code>
<ul>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-114/" target="_blank" rel="noopener noreferrer">New in Chrome 114</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-113/" target="_blank" rel="noopener noreferrer">New in Chrome 113</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-devtools-114/" target="_blank" rel="noopener noreferrer">New in DevTools 114</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-devtools-113/" target="_blank" rel="noopener noreferrer">New in DevTools 113</a></li>
</ul>
</li>
<li>Node.js <code>18.15.0</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v18.15.0/" target="_blank" rel="noopener noreferrer">Node 18.15.0 blog post</a></li>
</ul>
</li>
<li>V8 <code>11.4</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-25-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-protocolregisterinterceptbufferstringstreamfilehttpprotocol">Deprecated: <code>protocol.{register,intercept}{Buffer,String,Stream,File,Http}Protocol</code><a href="https://electronjs.org/blog/electron-25-0#deprecated-protocolregisterinterceptbufferstringstreamfilehttpprotocol" class="hash-link" aria-label="Direct link to deprecated-protocolregisterinterceptbufferstringstreamfilehttpprotocol" title="Direct link to deprecated-protocolregisterinterceptbufferstringstreamfilehttpprotocol">​</a></h4>
<p>The <code>protocol.register*Protocol</code> and <code>protocol.intercept*Protocol</code> methods have
been replaced with <a href="https://www.electronjs.org/docs/latest/api/protocol#protocolhandlescheme-handler" target="_blank" rel="noopener noreferrer"><code>protocol.handle</code></a>.</p>
<p>The new method can either register a new protocol or intercept an existing
protocol, and responses can be of any type.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated in Electron 25</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">registerBufferProtocol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'some-protocol'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">callback</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">mimeType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'text/html'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">data</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'&lt;h5&gt;Response&lt;/h5&gt;'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">handle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'some-protocol'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Response</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'&lt;h5&gt;Response&lt;/h5&gt;'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Could also be a string or ReadableStream.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">headers</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token string-property property" style="color:#36acaa">'content-type'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'text/html'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated in Electron 25</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">registerHttpProtocol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'some-protocol'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">callback</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">url</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://electronjs.org'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">handle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'some-protocol'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> net</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'https://electronjs.org'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated in Electron 25</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">registerFileProtocol</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'some-protocol'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">callback</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">filePath</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/path/to/my/file'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">protocol</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">handle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'some-protocol'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> net</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'file:///path/to/my/file'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-browserwindowsettrafficlightpositionposition">Deprecated: <code>BrowserWindow.setTrafficLightPosition(position)</code><a href="https://electronjs.org/blog/electron-25-0#deprecated-browserwindowsettrafficlightpositionposition" class="hash-link" aria-label="Direct link to deprecated-browserwindowsettrafficlightpositionposition" title="Direct link to deprecated-browserwindowsettrafficlightpositionposition">​</a></h4>
<p><code>BrowserWindow.setTrafficLightPosition(position)</code> has been deprecated, the
<code>BrowserWindow.setWindowButtonPosition(position)</code> API should be used instead
which accepts <code>null</code> instead of <code>{ x: 0, y: 0 }</code> to reset the position to
system default.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated in Electron 25</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setTrafficLightPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setTrafficLightPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setWindowButtonPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">setWindowButtonPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="deprecated-browserwindowgettrafficlightposition">Deprecated: <code>BrowserWindow.getTrafficLightPosition()</code><a href="https://electronjs.org/blog/electron-25-0#deprecated-browserwindowgettrafficlightposition" class="hash-link" aria-label="Direct link to deprecated-browserwindowgettrafficlightposition" title="Direct link to deprecated-browserwindowgettrafficlightposition">​</a></h4>
<p><code>BrowserWindow.getTrafficLightPosition()</code> has been deprecated, the
<code>BrowserWindow.getWindowButtonPosition()</code> API should be used instead
which returns <code>null</code> instead of <code>{ x: 0, y: 0 }</code> when there is no custom
position.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Deprecated in Electron 25</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> pos </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getTrafficLightPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">x</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> pos</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">y</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// No custom position.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Replace with</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ret </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> win</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getWindowButtonPosition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ret </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// No custom position.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-25-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added <code>net.fetch()</code>. <a href="https://github.com/electron/electron/pull/36733" target="_blank" rel="noopener noreferrer">#36733</a>
<ul>
<li><code>net.fetch</code> supports requests to <code>file:</code> URLs and custom protocols registered with <code>protocol.register*Protocol</code>. <a href="https://github.com/electron/electron/pull/36606" target="_blank" rel="noopener noreferrer">#36606</a></li>
</ul>
</li>
<li>Added BrowserWindow.set/getWindowButtonPosition APIs. <a href="https://github.com/electron/electron/pull/37094" target="_blank" rel="noopener noreferrer">#37094</a></li>
<li>Added <code>protocol.handle</code>, replacing and deprecating <code>protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol</code>. <a href="https://github.com/electron/electron/pull/36674" target="_blank" rel="noopener noreferrer">#36674</a></li>
<li>Added a <code>will-frame-navigate</code> event to <code>webContents</code> and the <code>&lt;webview&gt;</code> tag, which fires whenever any frame within the frame hierarchy attempts to navigate. <a href="https://github.com/electron/electron/pull/34418" target="_blank" rel="noopener noreferrer">#34418</a></li>
<li>Added initiator information to navigator events. This information allows distinguishing <code>window.open</code> from a parent frame causing a navigation, as opposed to a child-initiated navigation. <a href="https://github.com/electron/electron/pull/37085" target="_blank" rel="noopener noreferrer">#37085</a></li>
<li>Added net.resolveHost that resolves hosts using defaultSession object. <a href="https://github.com/electron/electron/pull/38152" target="_blank" rel="noopener noreferrer">#38152</a></li>
<li>Added new 'did-resign-active' event to <code>app</code>. <a href="https://github.com/electron/electron/pull/38018" target="_blank" rel="noopener noreferrer">#38018</a></li>
<li>Added several standard page size options to <code>webContents.print()</code>. <a href="https://github.com/electron/electron/pull/37159" target="_blank" rel="noopener noreferrer">#37159</a></li>
<li>Added the <code>enableLocalEcho</code> flag to the session handler <code>ses.setDisplayMediaRequestHandler()</code> callback for allowing remote audio input to be echoed in the local output stream when <code>audio</code> is a <code>WebFrameMain</code>. <a href="https://github.com/electron/electron/pull/37315" target="_blank" rel="noopener noreferrer">#37315</a></li>
<li>Added thermal management information to <code>powerMonitor</code>. <a href="https://github.com/electron/electron/pull/38028" target="_blank" rel="noopener noreferrer">#38028</a></li>
<li>Allows an absolute path to be passed to the session.fromPath() API. <a href="https://github.com/electron/electron/pull/37604" target="_blank" rel="noopener noreferrer">#37604</a></li>
<li>Exposes the <code>audio-state-changed</code> event on <code>webContents</code>. <a href="https://github.com/electron/electron/pull/37366" target="_blank" rel="noopener noreferrer">#37366</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="22xy-continued-support">22.x.y Continued Support<a href="https://electronjs.org/blog/electron-25-0#22xy-continued-support" class="hash-link" aria-label="Direct link to 22.x.y Continued Support" title="Direct link to 22.x.y Continued Support">​</a></h2>
<p>As noted in <a href="https://www.electronjs.org/blog/windows-7-to-8-1-deprecation-notice" target="_blank" rel="noopener noreferrer">Farewell, Windows 7/8/8.1</a>, Electron 22's (Chromium 108) planned end of life date will be extended from May 30, 2023 to October 10, 2023. The Electron team will continue to backport any security fixes that are part of this program to Electron 22 until October 10, 2023. The October
support date follows the extended support dates from both Chromium and Microsoft. On October 11, the Electron team will drop support back to the latest three stable major versions, which will no longer support Windows 7/8/8.1.</p>
<table><thead><tr><th>E25 (May'23)</th><th>E26 (Aug'23)</th><th>E27 (Oct'23)</th></tr></thead><tbody><tr><td>25.x.y</td><td>26.x.y</td><td>27.x.y</td></tr><tr><td>24.x.y</td><td>25.x.y</td><td>26.x.y</td></tr><tr><td>23.x.y</td><td>24.x.y</td><td>25.x.y</td></tr><tr><td>22.x.y</td><td>22.x.y</td><td>--</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-25-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[Electron 24.0.0]]></title>
            <link>https://electronjs.org/blog/electron-24-0</link>
            <guid>https://electronjs.org/blog/electron-24-0</guid>
            <pubDate>Tue, 04 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Electron 24.0.0 has been released! It includes upgrades to Chromium 112.0.5615.49, V8 11.2, and Node.js 18.14.0. Read below for more details!]]></description>
            <content:encoded><![CDATA[<p>Electron 24.0.0 has been released! It includes upgrades to Chromium <code>112.0.5615.49</code>, V8 <code>11.2</code>, and Node.js <code>18.14.0</code>. Read below for more details!</p>
<hr>
<p>The Electron team is excited to announce the release of Electron 24.0.0! You can install it with npm via <code>npm install electron@latest</code> or download it from our <a href="https://releases.electronjs.org/releases/stable" target="_blank" rel="noopener noreferrer">releases website</a>. Continue reading for details about this release.</p>
<p>If you have any feedback, please share it with us on Twitter, or join our community <a href="https://discord.com/invite/electronjs" target="_blank" rel="noopener noreferrer">Discord</a>! Bugs and feature requests can be reported in Electron's <a href="https://github.com/electron/electron/issues" target="_blank" rel="noopener noreferrer">issue tracker</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notable-changes">Notable Changes<a href="https://electronjs.org/blog/electron-24-0#notable-changes" class="hash-link" aria-label="Direct link to Notable Changes" title="Direct link to Notable Changes">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="stack-changes">Stack Changes<a href="https://electronjs.org/blog/electron-24-0#stack-changes" class="hash-link" aria-label="Direct link to Stack Changes" title="Direct link to Stack Changes">​</a></h3>
<ul>
<li>Chromium <code>112.0.5615.49</code>
<ul>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-112/" target="_blank" rel="noopener noreferrer">New in Chrome 112</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-chrome-111/" target="_blank" rel="noopener noreferrer">New in Chrome 111</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-devtools-112/" target="_blank" rel="noopener noreferrer">New in DevTools 112</a></li>
<li><a href="https://developer.chrome.com/blog/new-in-devtools-111/" target="_blank" rel="noopener noreferrer">New in DevTools 111</a></li>
</ul>
</li>
<li>Node.js <code>18.14.0</code>
<ul>
<li><a href="https://nodejs.org/en/blog/release/v18.14.0/" target="_blank" rel="noopener noreferrer">Node 18.14.0 blog post</a></li>
</ul>
</li>
<li>V8 <code>11.2</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="https://electronjs.org/blog/electron-24-0#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="api-changed-nativeimagecreatethumbnailfrompathpath-size">API Changed: <code>nativeImage.createThumbnailFromPath(path, size)</code><a href="https://electronjs.org/blog/electron-24-0#api-changed-nativeimagecreatethumbnailfrompathpath-size" class="hash-link" aria-label="Direct link to api-changed-nativeimagecreatethumbnailfrompathpath-size" title="Direct link to api-changed-nativeimagecreatethumbnailfrompathpath-size">​</a></h4>
<p>The <code>maxSize</code> parameter has been changed to <code>size</code> to reflect that the size passed in will be the size the thumbnail created. Previously, Windows would not scale the image up if it were smaller than <code>maxSize</code>, and macOS would always set the size to <code>maxSize</code>. Behavior is now the same across platforms.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// a 128x128 image.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> imagePath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'path'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'to'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'capybara.png'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Scaling up a smaller image.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> upSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">width</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">256</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">height</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">256</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeImage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createThumbnailFromPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">imagePath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> upSize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getSize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// { width: 256, height: 256 }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Scaling down a larger image.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> downSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">width</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">height</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">64</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nativeImage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">createThumbnailFromPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">imagePath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> downSize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token console class-name">console</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getSize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// { width: 64, height: 64 }</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="new-features">New Features<a href="https://electronjs.org/blog/electron-24-0#new-features" class="hash-link" aria-label="Direct link to New Features" title="Direct link to New Features">​</a></h3>
<ul>
<li>Added the ability to filter <code>HttpOnly</code> cookies with <code>cookies.get()</code>. <a href="https://github.com/electron/electron/pull/37365" target="_blank" rel="noopener noreferrer">#37365</a></li>
<li>Added <code>logUsage</code> to <code>shell.openExternal()</code> options, which allows passing the <code>SEE_MASK_FLAG_LOG_USAGE</code> flag to <code>ShellExecuteEx</code> on Windows. The <code>SEE_MASK_FLAG_LOG_USAGE</code> flag indicates a user initiated launch that enables tracking of frequently used programs and other behaviors. <a href="https://github.com/electron/electron/pull/37291" target="_blank" rel="noopener noreferrer">#37291</a></li>
<li>Added <code>types</code> to the <code>webRequest</code> filter, adding the ability to filter the requests you listen to.<a href="https://github.com/electron/electron/pull/37427" target="_blank" rel="noopener noreferrer">#37427</a></li>
<li>Added a new <code>devtools-open-url</code> event to <code>webContents</code> to allow developers to open new windows with them. <a href="https://github.com/electron/electron/pull/36774" target="_blank" rel="noopener noreferrer">#36774</a></li>
<li>Added several standard page size options to <code>webContents.print()</code>. <a href="https://github.com/electron/electron/pull/37265" target="_blank" rel="noopener noreferrer">#37265</a></li>
<li>Added the <code>enableLocalEcho</code> flag to the session handler <code>ses.setDisplayMediaRequestHandler()</code> callback for allowing remote audio input to be echoed in the local output stream when <code>audio</code> is a <code>WebFrameMain</code>. <a href="https://github.com/electron/electron/pull/37528" target="_blank" rel="noopener noreferrer">#37528</a></li>
<li>Allow an application-specific username to be passed to <code>inAppPurchase.purchaseProduct()</code>. <a href="https://github.com/electron/electron/pull/35902" target="_blank" rel="noopener noreferrer">#35902</a></li>
<li>Exposed <code>window.invalidateShadow()</code> to clear residual visual artifacts on macOS. <a href="https://github.com/electron/electron/pull/32452" target="_blank" rel="noopener noreferrer">#32452</a></li>
<li>Whole-program optimization is now enabled by default in electron node headers config file, allowing the compiler to perform opimizations with information from all modules in a program as opposed to a per-module (compiland) basis. <a href="https://github.com/electron/electron/pull/36937" target="_blank" rel="noopener noreferrer">#36937</a></li>
<li><code>SystemPreferences::CanPromptTouchID</code> (macOS) now supports Apple Watch. <a href="https://github.com/electron/electron/pull/36935" target="_blank" rel="noopener noreferrer">#36935</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="end-of-support-for-21xy">End of Support for 21.x.y<a href="https://electronjs.org/blog/electron-24-0#end-of-support-for-21xy" class="hash-link" aria-label="Direct link to End of Support for 21.x.y" title="Direct link to End of Support for 21.x.y">​</a></h2>
<p>Electron 21.x.y has reached end-of-support as per the project's <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy" target="_blank" rel="noopener noreferrer">support policy</a>. Developers and applications are encouraged to upgrade to a newer version of Electron.</p>
<p>As noted in <a href="https://www.electronjs.org/blog/windows-7-to-8-1-deprecation-notice" target="_blank" rel="noopener noreferrer">Farewell, Windows 7/8/8.1</a>, Electron 22's (Chromium 108) planned end of life date will be extended from May 30, 2023 to October 10, 2023. The Electron team will continue to backport any security fixes that are part of this program to Electron 22 until October 10, 2023.</p>
<table><thead><tr><th>E24 (Apr'23)</th><th>E25 (May'23)</th><th>E26 (Aug'23)</th></tr></thead><tbody><tr><td>24.x.y</td><td>25.x.y</td><td>26.x.y</td></tr><tr><td>23.x.y</td><td>24.x.y</td><td>25.x.y</td></tr><tr><td>22.x.y</td><td>23.x.y</td><td>24.x.y</td></tr><tr><td>--</td><td>22.x.y</td><td>22.x.y</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's Next<a href="https://electronjs.org/blog/electron-24-0#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next">​</a></h2>
<p>In the short term, you can expect the team to continue to focus on keeping up with the development of the major components that make up Electron, including Chromium, Node, and V8.</p>
<p>You can find <a href="https://www.electronjs.org/docs/latest/tutorial/electron-timelines" target="_blank" rel="noopener noreferrer">Electron's public timeline here</a>.</p>
<p>More information about future changes can be found on the <a href="https://github.com/electron/electron/blob/main/docs/breaking-changes.md" target="_blank" rel="noopener noreferrer">Planned Breaking Changes</a> page.</p>]]></content:encoded>
            <category>Release</category>
        </item>
        <item>
            <title><![CDATA[10 years of Electron 🎉]]></title>
            <link>https://electronjs.org/blog/10-years-of-electron</link>
            <guid>https://electronjs.org/blog/10-years-of-electron</guid>
            <pubDate>Mon, 13 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[The first commit to the electron/electron repository was on March 13, 2013.]]></description>
            <content:encoded><![CDATA[<p>The first commit to the <code>electron/electron</code> repository was on March 13, 2013<sup><a href="https://electronjs.org/blog/10-years-of-electron#user-content-fn-1-8ed87e" id="user-content-fnref-1-8ed87e" data-footnote-ref="true" aria-describedby="footnote-label">1</a></sup>.</p>
<p><img decoding="async" loading="lazy" alt="Initial commit on electron/electron by @aroben" src="https://electronjs.org/assets/images/first-commit-5f8ec3d1e3a503b28aa098198e12e1ef.png" width="936" height="333" class="img_ev3q"></p>
<p>10 years and 27,147 more commits from 1192 unique contributors later, Electron has become one of the
most popular frameworks for building desktop applications today. This milestone is the perfect
opportunity to celebrate and reflect on our journey so far, and to share what we’ve learned along
the way.</p>
<p>We would not be here today without everyone who has dedicated their time and effort to contribute to
the project. Although source code commits are always the most visible contributions, we also have to
acknowledge the effort of folks who report bugs, maintain userland modules, provide documentation
and translations, and participate in the Electron community across cyberspace.
Every contribution is invaluable to us as maintainers.</p>
<p><strong>Before we continue with the rest of the blog post: thank you. ❤️</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-did-we-get-here">How did we get here?<a href="https://electronjs.org/blog/10-years-of-electron#how-did-we-get-here" class="hash-link" aria-label="Direct link to How did we get here?" title="Direct link to How did we get here?">​</a></h2>
<p><strong>Atom Shell</strong> was built as the backbone for GitHub’s <a href="https://atom.io/" target="_blank" rel="noopener noreferrer">Atom editor</a>, which launched in
public beta in April 2014. It was built from the ground up as an alternative to the web-based
desktop frameworks available at the time (node-webkit and Chromium Embedded Framework). It had a
killer feature: embedding Node.js and Chromium to provide a powerful desktop runtime for web
technologies.</p>
<p>Within a year, Atom Shell began seeing immense growth in capabilities and popularity.
Large companies, startups, and individual developers alike had started building apps with it
(some early adopters include <a href="https://slack.com/" target="_blank" rel="noopener noreferrer">Slack</a>, <a href="https://gitkraken.com/" target="_blank" rel="noopener noreferrer">GitKraken</a>, and
<a href="https://webtorrent.io/" target="_blank" rel="noopener noreferrer">WebTorrent</a>), and the project was aptly renamed to <strong>Electron</strong>.</p>
<p>From then on, Electron hit the ground running and never stopped. Here’s a look at our weekly
download count over time, courtesy of <a href="https://npmtrends.com/electron" target="_blank" rel="noopener noreferrer">npmtrends.com</a>:</p>
<p><img decoding="async" loading="lazy" alt="Electron weekly downloads graph over time" src="https://electronjs.org/assets/images/weekly-download-graph-4626defd22a1516f5d335e0a6f40beb2.png" width="1524" height="1030" class="img_ev3q"></p>
<p>Electron v1 was released in 2016, promising increased API stability and better docs and tooling.
Electron v2 was released in 2018 and introduced semantic versioning, making it easier for Electron
developers to keep track of the release cycle.</p>
<p>By Electron v6, we shifted to a regular 12-week major release cadence to match Chromium’s. This
decision was a change in mentality for the project, bringing “having the most up-to-date Chromium
version” from a nice-to-have to a priority. This has reduced the amount of tech debt between
upgrades, making it easier for us to keep Electron updated and secure.</p>
<p>Since then, we’ve been a well-oiled machine, releasing a new Electron version on the same day as
every Chromium stable. By the time Chromium sped up their release schedule to 4 weeks in 2021,
we were able to shrug our shoulders and increase our release cadence to 8 weeks accordingly.</p>
<p>We’re now on Electron v23 (and counting), and are still dedicated to building the best runtime for
building cross-platform desktop applications. Even with the boom in JavaScript developer tools in
recent years, Electron has remained a stable, battle-tested stalwart of the desktop app framework
landscape. Electron apps are ubiquitous nowadays: you can program with Visual Studio Code, design
with Figma, communicate with Slack, and take notes with Notion (amongst many other use cases).
We’re incredibly proud of this achievement and grateful to everyone who has made it possible.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-did-we-learn-along-the-way">What did we learn along the way?<a href="https://electronjs.org/blog/10-years-of-electron#what-did-we-learn-along-the-way" class="hash-link" aria-label="Direct link to What did we learn along the way?" title="Direct link to What did we learn along the way?">​</a></h2>
<p>The road to the decade mark has been long and winding. Here are some key things that have
helped us run a sustainable large open source project.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scaling-distributed-decision-making-with-a-governance-model">Scaling distributed decision-making with a governance model<a href="https://electronjs.org/blog/10-years-of-electron#scaling-distributed-decision-making-with-a-governance-model" class="hash-link" aria-label="Direct link to Scaling distributed decision-making with a governance model" title="Direct link to Scaling distributed decision-making with a governance model">​</a></h3>
<p>One challenge we had to overcome was handling the long-term direction of the project once Electron
first exploded in popularity. How do we handle being a team of a couple dozen engineers distributed
across companies, countries, and time zones?</p>
<p>In the early days, Electron’s maintainer group relied on informal coordination, which is fast and
lightweight for smaller projects, but doesn’t scale to wider collaboration. In 2019, we shifted to
a governance model where different working groups have formal areas of responsibility. This has been
instrumental in streamlining processes and assigning portions of project ownership to specific
maintainers. What is each Working Group (WG) responsible for nowadays?</p>
<ul>
<li>Getting Electron releases out the door (Releases WG)</li>
<li>Upgrading Chromium and Node.js (Upgrades WG)</li>
<li>Overseeing public API design (API WG)</li>
<li>Keeping Electron secure (Security WG)</li>
<li>Running the website, documentation, and tooling (Ecosystem WG)</li>
<li>Community and corporate outreach (Outreach WG)</li>
<li>Community moderation (Community &amp; Safety WG)</li>
<li>Maintaining our build infrastructure, maintainer tools, and cloud services (Infrastructure WG)</li>
</ul>
<p>Around the same time we shifted to the governance model, we also moved Electron's ownership from
GitHub <a href="https://www.electronjs.org/blog/electron-joins-openjsf" target="_blank" rel="noopener noreferrer">to the OpenJS Foundation</a>.
Although the original core team still works at Microsoft today, they are only a part of a larger
group of collaborators that form Electron governance.<sup><a href="https://electronjs.org/blog/10-years-of-electron#user-content-fn-2-8ed87e" id="user-content-fnref-2-8ed87e" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup></p>
<p>While this model isn’t perfect, it has suited us well through a global pandemic and ongoing
macroeconomic headwinds. Going forward, we plan on revamping the governance charter to
guide us through the second decade of Electron.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>If you want to learn more, check out the
<a href="https://github.com/electron/governance" target="_blank" rel="noopener noreferrer">electron/governance</a> repository!</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="community">Community<a href="https://electronjs.org/blog/10-years-of-electron#community" class="hash-link" aria-label="Direct link to Community" title="Direct link to Community">​</a></h3>
<p>The community part of open source is hard, especially when your Outreach team is a dozen engineers
in a trench coat that says “community manager”. That said, being a large open source project means
that we have a lot of users, and harnessing their energy for Electron to build a userland ecosystem
is a crucial part of sustaining project health.</p>
<p>What have we been doing to develop our community presence?</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="building-virtual-communities">Building virtual communities<a href="https://electronjs.org/blog/10-years-of-electron#building-virtual-communities" class="hash-link" aria-label="Direct link to Building virtual communities" title="Direct link to Building virtual communities">​</a></h4>
<ul>
<li>In 2020, we launched our community Discord server. We previously had a section in Atom’s forum,
but decided to have a more informal messaging platform to have a space for discussions between
maintainers and Electron developers and for general debugging help.</li>
<li>In 2021, we established the <a href="https://github.com/electronjs-cn" target="_blank" rel="noopener noreferrer">Electron China</a> user group with the help of
<a href="https://github.com/BlackHole1" target="_blank" rel="noopener noreferrer">@BlackHole1</a>. This group has been instrumental in Electron growth
in users from China’s booming tech scene, providing a space for them to collaborate on ideas and
discuss Electron outside of our English-language spaces. We’d also like to thank
<a href="https://npmmirror.com/" target="_blank" rel="noopener noreferrer">cnpm</a> for their work in supporting Electron’s nightly releases in their
Chinese mirror for npm.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="participating-in-high-visibility-open-source-programs">Participating in high-visibility open source programs<a href="https://electronjs.org/blog/10-years-of-electron#participating-in-high-visibility-open-source-programs" class="hash-link" aria-label="Direct link to Participating in high-visibility open source programs" title="Direct link to Participating in high-visibility open source programs">​</a></h4>
<ul>
<li>We have been celebrating <a href="https://hacktoberfest.com/" target="_blank" rel="noopener noreferrer">Hacktoberfest</a> every year since 2019.
Hacktoberfest is yearly celebration of open source organized by DigitalOcean, and we get dozens of
enthusiastic contributors every year looking to make their mark on open source software.</li>
<li>In 2020, we participated in the initial iteration of Google Season of Docs, where we worked with
<a href="https://github.com/bandantonio" target="_blank" rel="noopener noreferrer">@bandantonio</a> to rework Electron’s new user tutorial flow.</li>
<li>In 2022, we mentored a Google Summer of Code student for the first time.
<a href="https://github.com/aryanshridhar" target="_blank" rel="noopener noreferrer">@aryanshridhar</a> did some awesome work to refactor
<a href="https://github.com/electron/fiddle" target="_blank" rel="noopener noreferrer">Electron Fiddle</a>'s core version loading logic and migrate its bundler
to <a href="https://webpack.js.org/" target="_blank" rel="noopener noreferrer">webpack</a>.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="automate-all-the-things">Automate all the things!<a href="https://electronjs.org/blog/10-years-of-electron#automate-all-the-things" class="hash-link" aria-label="Direct link to Automate all the things!" title="Direct link to Automate all the things!">​</a></h3>
<p>Today, Electron governance has about 30 active maintainers. Less than half of us are full-time
contributors, which means that there’s a lot of work to go around. What’s our trick to keeping
everything running smoothly? Our motto is that computers are cheap, and human time is expensive.
In typical engineer fashion, we’ve developed a suite of automated support tooling to make our lives
easier.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="not-goma">Not Goma<a href="https://electronjs.org/blog/10-years-of-electron#not-goma" class="hash-link" aria-label="Direct link to Not Goma" title="Direct link to Not Goma">​</a></h4>
<p>The core Electron codebase is a behemoth of C++ code, and build times have always been a limiting
factor in how fast we can ship bug fixes and new features. In 2020, we deployed
<a href="https://www.electronjs.org/docs/latest/development/goma" target="_blank" rel="noopener noreferrer">Not Goma</a>, a custom
Electron-specific backend for Google’s <a href="https://chromium.googlesource.com/infra/goma/client/" target="_blank" rel="noopener noreferrer">Goma</a>
distributed compiler service.
Not Goma processes compilation requests from authorized user’s machines and distributes the process
across hundreds of cores in the backend. It also caches the compilation result so that someone else
compiling the same files will only need to download the pre-compiled result.</p>
<p>Since launching Not Goma, compilation times for maintainers have decreased from the scale of hours
to minutes. A stable internet connection became the minimum requirement for contributors to compile
Electron!</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>If you’re an open source contributor, you can also try Not Goma’s read-only cache, which is
available by default with <a href="https://github.com/electron/build-tools" target="_blank" rel="noopener noreferrer">Electron Build Tools</a>.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="continuous-factor-authentication">Continuous Factor Authentication<a href="https://electronjs.org/blog/10-years-of-electron#continuous-factor-authentication" class="hash-link" aria-label="Direct link to Continuous Factor Authentication" title="Direct link to Continuous Factor Authentication">​</a></h4>
<p><a href="http://continuousauth.dev/" target="_blank" rel="noopener noreferrer">Continuous Factor Authentication (CFA)</a> is a layer of automation
around npm’s two-factor authentication (2FA) system that we combine with
<a href="https://github.com/semantic-release/semantic-release" target="_blank" rel="noopener noreferrer">semantic-release</a> to manage
secure and automated releases of our various <code>@electron/</code> npm packages.</p>
<p>While semantic-release already automates the npm package publishing process, it requires turning off
two-factor authentication or passing in a secret token that bypasses this restriction.</p>
<p>We built CFA to deliver a time-based one-time password (TOTP) for npm 2FA to arbitrary CI jobs,
allowing us to harness the automation of semantic-release while keeping the additional security of
two-factor authentication.</p>
<p>We use CFA with a Slack integration front-end, allowing maintainers to validate package publishing
from any device they have Slack on, as long as they have their TOTP generator handy.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>If you want to try CFA out in your own projects, check out
<a href="https://github.com/continuousauth/web" target="_blank" rel="noopener noreferrer">the GitHub repository</a> or
<a href="https://docs.continuousauth.dev/" target="_blank" rel="noopener noreferrer">the docs</a>!
If you use CircleCI as your CI provider, we also have
<a href="https://github.com/continuousauth/npm-orb" target="_blank" rel="noopener noreferrer">a handy orb</a> to quickly scaffold a project with CFA.</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="sheriff">Sheriff<a href="https://electronjs.org/blog/10-years-of-electron#sheriff" class="hash-link" aria-label="Direct link to Sheriff" title="Direct link to Sheriff">​</a></h4>
<p><a href="https://github.com/electron/sheriff" target="_blank" rel="noopener noreferrer">Sheriff</a> is an open source tool we wrote to automate the
management of permissions across GitHub, Slack, and Google Workspace.</p>
<p>Sheriff’s key value proposition is that permission management should be a transparent process.
It uses a single YAML config file that designates permissions across all the above listed services.
With Sheriff, getting collaborator status on a repo or creating a new mailing list is as easy as
getting a PR approved and merged.</p>
<p>Sheriff also has an audit log that posts to Slack, warning admins when suspicious activity occurs
anywhere in the Electron organization.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="and-all-our-github-bots">…and all our GitHub bots<a href="https://electronjs.org/blog/10-years-of-electron#and-all-our-github-bots" class="hash-link" aria-label="Direct link to …and all our GitHub bots" title="Direct link to …and all our GitHub bots">​</a></h4>
<p>GitHub is a platform with rich API extensibility and a first-party bot application framework called
<a href="https://probot.github.io/" target="_blank" rel="noopener noreferrer">Probot</a>. To help us focus on the more creative parts of our job,
we built out a suite of smaller bots that help do the dirty work for us. Here are a
few examples:</p>
<ul>
<li><a href="https://github.com/apps/sudowoodo-release-bot" target="_blank" rel="noopener noreferrer">Sudowoodo</a> automates the Electron release process
from start to finish, from kicking off builds to uploading the release assets to GitHub and npm.</li>
<li><a href="https://github.com/electron/trop" target="_blank" rel="noopener noreferrer">Trop</a> automates the backporting process for Electron by
attempting to cherry-pick patches to previous release branches based on GitHub PR labels.</li>
<li><a href="https://github.com/electron/roller" target="_blank" rel="noopener noreferrer">Roller</a> automates rolling upgrades of Electron’s Chromium
and Node.js dependencies.</li>
<li><a href="https://github.com/electron/cation" target="_blank" rel="noopener noreferrer">Cation</a> is our status check bot for electron/electron PRs.</li>
</ul>
<p>Altogether, our little family of bots has given us a huge boost in developer productivity!</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What’s next?<a href="https://electronjs.org/blog/10-years-of-electron#whats-next" class="hash-link" aria-label="Direct link to What’s next?" title="Direct link to What’s next?">​</a></h4>
<p>As we enter our second decade as a project, you might be asking: what’s next for Electron?</p>
<p>We’re going to stay in sync with Chromium's release cadence, releasing new major versions of
Electron every 8 weeks, keeping the framework updated with the latest and greatest from the web
platform and Node.js while maintaining stability and security for enterprise-grade applications.</p>
<p>We generally announce news on upcoming initiatives when they become concrete. If you want to
keep up with future releases, features, and general project updates, you can read
<a href="https://electronjs.org/blog" target="_blank" rel="noopener noreferrer">our blog</a> and follow our social media profiles
(<a href="https://twitter.com/electronjs" target="_blank" rel="noopener noreferrer">Twitter</a> and <a href="https://social.lfx.dev/@electronjs" target="_blank" rel="noopener noreferrer">Mastodon</a>)!</p>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorWithStickyNavbar_LWe7 sr-only" id="footnote-label">Footnotes<a href="https://electronjs.org/blog/10-years-of-electron#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes">​</a></h2>
<ol>
<li id="user-content-fn-1-8ed87e">
<p>This is actually the first commit from the
<a href="https://github.com/electron-archive/brightray" target="_blank" rel="noopener noreferrer">electron-archive/brightray project</a>, which got
absorbed into Electron in 2017 and had its git history merged. But who’s counting?
It’s our birthday, so we get to make the rules! <a href="https://electronjs.org/blog/10-years-of-electron#user-content-fnref-1-8ed87e" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-2-8ed87e">
<p>Contrary to popular belief, Electron is no longer owned by GitHub or Microsoft, and is part of
the <a href="https://openjsf.org/" target="_blank" rel="noopener noreferrer">OpenJS Foundation</a> nowadays. <a href="https://electronjs.org/blog/10-years-of-electron#user-content-fnref-2-8ed87e" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>Community</category>
            <category>Project News</category>
        </item>
    </channel>
</rss>