<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gyu</title>
    <description>The latest articles on DEV Community by Gyu (@gyugyu86).</description>
    <link>https://dev.to/gyugyu86</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4042098%2F1b700e17-0783-43cf-ac23-74518a95da8b.jpg</url>
      <title>DEV Community: Gyu</title>
      <link>https://dev.to/gyugyu86</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gyugyu86"/>
    <language>en</language>
    <item>
      <title>Electron's docs quietly dropped their recommended security tool. What now?</title>
      <dc:creator>Gyu</dc:creator>
      <pubDate>Wed, 22 Jul 2026 13:41:36 +0000</pubDate>
      <link>https://dev.to/gyugyu86/electrons-docs-quietly-dropped-their-recommended-security-tool-what-now-23fm</link>
      <guid>https://dev.to/gyugyu86/electrons-docs-quietly-dropped-their-recommended-security-tool-what-now-23fm</guid>
      <description>&lt;h1&gt;
  
  
  Electron's docs quietly dropped their recommended security tool. What now?
&lt;/h1&gt;

&lt;p&gt;If you've worked on an Electron app, you've probably seen the &lt;a href="https://www.electronjs.org/docs/latest/tutorial/security" rel="noopener noreferrer"&gt;security checklist&lt;/a&gt; in the official docs. Until recently, that page also pointed to a static analysis tool called &lt;strong&gt;Electronegativity&lt;/strong&gt; to help you check it automatically.&lt;/p&gt;

&lt;p&gt;That recommendation is gone.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR: &lt;a href="https://github.com/electron/electron/pull/48878" rel="noopener noreferrer"&gt;electron/electron#48878 "docs: remove electronegativity"&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Closes: &lt;a href="https://github.com/electron/website/issues/906" rel="noopener noreferrer"&gt;electron/website#906&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So right now, the docs just say "here are 20 items, check them by hand, and keep checking them on every release" — no tool recommendation at all.&lt;/p&gt;

&lt;p&gt;This post covers what got removed, why, what you can use instead today, and (if you don't want to add a tool) the five spots worth checking by hand, with code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is an English write-up of &lt;a href="https://qiita.com/gyugyu86/items/6aeec085623a9ea69411" rel="noopener noreferrer"&gt;an article I posted on Qiita&lt;/a&gt;, expanded a bit for a different audience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why it got removed
&lt;/h2&gt;

&lt;p&gt;Electronegativity was released by Doyensec back in 2019 — an OSS tool that parses AST and DOM to catch Electron-specific misconfigurations and anti-patterns. For years it was the one tool the official docs pointed to.&lt;/p&gt;

&lt;p&gt;Problem: feature development stopped around 2022. The repo itself says it's no longer being actively maintained, and it doesn't reliably keep up with newer Electron versions.&lt;/p&gt;

&lt;p&gt;There was a paid successor, &lt;strong&gt;ElectroNG&lt;/strong&gt; ($688/year, launched 2022), but that's not for sale anymore either — the buy page now just says to email them if you're interested in acquiring the source and infrastructure.&lt;/p&gt;

&lt;p&gt;So the entire "dedicated Electron static analysis tool" slot is empty right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can you use instead
&lt;/h2&gt;

&lt;p&gt;Here's what I found when I went looking for what to actually run in CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeQL
&lt;/h3&gt;

&lt;p&gt;General-purpose, but its standard query set includes some &lt;code&gt;frameworks/electron&lt;/code&gt; queries that cover a handful of Electron-specific sinks. If you're already running CodeQL, this is close to free. It's not built around the Electron checklist specifically though, so don't expect full coverage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Semgrep
&lt;/h3&gt;

&lt;p&gt;You can write your own rules for individual checklist items. This works well in practice — writing a handful of narrow rules for the exact things that bit &lt;em&gt;your&lt;/em&gt; app is a solid, low-effort first move.&lt;/p&gt;

&lt;p&gt;One catch: dataflow analysis (taint tracking) in the free tier only works within a single function's scope. Cross-function/cross-file taint tracking is a paid Pro feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  What general tools miss
&lt;/h3&gt;

&lt;p&gt;ESLint plugins, &lt;code&gt;npm audit&lt;/code&gt;, Snyk — these catch dependency CVEs and general JS lint issues just fine. What they don't catch, as a group, is the stuff specific to Electron's process model: misconfigured &lt;code&gt;webPreferences&lt;/code&gt;, unsafe things exposed from preload, IPC handlers that don't validate their input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five things worth checking by hand
&lt;/h2&gt;

&lt;p&gt;Whether or not you add a tool, these are the spots I'd actually look at in review.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. webPreferences
&lt;/h3&gt;

&lt;p&gt;The basics, and also where most apps get bitten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// dangerous&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BrowserWindow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;webPreferences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;nodeIntegration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;contextIsolation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives the renderer direct access to Node. One XSS and you're looking at filesystem access or command execution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// fixed&lt;/span&gt;
&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BrowserWindow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;webPreferences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;nodeIntegration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;contextIsolation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sandbox&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;preload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;preload.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worth noting: Electron's own docs say &lt;code&gt;nodeIntegration: false&lt;/code&gt; alone isn't enough — you need &lt;code&gt;contextIsolation: true&lt;/code&gt; alongside it to actually block Node primitives. Treat these two as a pair.&lt;/p&gt;

&lt;p&gt;Also, &lt;code&gt;contextIsolation&lt;/code&gt; has been the default (&lt;code&gt;true&lt;/code&gt;) since Electron 12, and &lt;code&gt;sandbox&lt;/code&gt; since Electron 20. If you're on a reasonably current version and haven't explicitly turned these off, you're probably fine here already. &lt;strong&gt;The thing worth flagging in review is someone deliberately turning them off.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Inconsistent settings across windows
&lt;/h3&gt;

&lt;p&gt;This is the one I think gets missed most often.&lt;/p&gt;

&lt;p&gt;Main window is configured safely, but a child window creation site somewhere else in the codebase isn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main window: safe&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mainWindow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BrowserWindow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;webPreferences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;contextIsolation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;nodeIntegration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// child window: got sloppy&lt;/span&gt;
&lt;span class="nx"&gt;ipcMain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open-win&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BrowserWindow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;webPreferences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;nodeIntegration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;contextIsolation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you only check the main window, you'll miss this every time. Worth diffing all the &lt;code&gt;BrowserWindow&lt;/code&gt; creation sites in a project against each other, not just eyeballing the "main" one.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Command execution, especially with privilege escalation
&lt;/h3&gt;

&lt;p&gt;Highest severity item on this list, full stop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// dangerous: untrusted value interpolated into a shell command,&lt;/span&gt;
&lt;span class="c1"&gt;// combined with privilege escalation&lt;/span&gt;
&lt;span class="nx"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`networksetup -setdnsservers Wi-Fi &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;userInput&lt;/code&gt; isn't validated, an attacker gets arbitrary command execution with admin privileges. Combined with something like &lt;code&gt;sudo-prompt&lt;/code&gt;, the blast radius is the whole machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// fixed: args as an array, no shell involved&lt;/span&gt;
&lt;span class="nf"&gt;execFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;networksetup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-setdnsservers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Wi-Fi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;validatedInput&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;execFile&lt;/code&gt; with an array of arguments means the value never gets re-interpreted as part of a command — as long as you don't pass &lt;code&gt;shell: true&lt;/code&gt;, which routes it back through a shell anyway.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. CSP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;default&lt;/span&gt;-&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="s1"&gt;'self'&lt;/span&gt;; &lt;span class="n"&gt;script&lt;/span&gt;-&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="s1"&gt;'self'&lt;/span&gt; &lt;span class="s1"&gt;'unsafe-inline'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;unsafe-inline&lt;/code&gt; or &lt;code&gt;unsafe-eval&lt;/code&gt; in your CSP is a hole in your XSS defenses. A wildcard &lt;code&gt;*&lt;/code&gt; in a source list is the same problem.&lt;/p&gt;

&lt;p&gt;If you're writing a checker for this yourself: don't naively string-match for &lt;code&gt;*&lt;/code&gt;, or you'll flag partial wildcards like &lt;code&gt;*.example.com&lt;/code&gt; as false positives. Tokenize the CSP properly — split on &lt;code&gt;;&lt;/code&gt; for directives, then on whitespace for sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. shell.openExternal
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// dangerous: no scheme validation&lt;/span&gt;
&lt;span class="nx"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openExternal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urlFromRenderer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass anything other than &lt;code&gt;http&lt;/code&gt;/&lt;code&gt;https&lt;/code&gt; (say, a &lt;code&gt;file:&lt;/code&gt; URL) and you can end up opening something you didn't intend to.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// fixed: validate scheme against an allowlist&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urlFromRenderer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;protocol&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;protocol&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openExternal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urlFromRenderer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same idea applies to &lt;code&gt;setWindowOpenHandler&lt;/code&gt; and &lt;code&gt;will-navigate&lt;/code&gt; — worth checking whether you're actually controlling navigation there too.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to automate this
&lt;/h2&gt;

&lt;p&gt;Everything above is "remember to check this on every PR," which, honestly, doesn't hold up well in practice. A 40-file PR lands on a Friday afternoon and that one &lt;code&gt;webPreferences&lt;/code&gt; line gets missed. That's a CI problem, not a human-vigilance problem.&lt;/p&gt;

&lt;p&gt;So automating even a narrow slice of this is worth it. As mentioned above, writing 3-4 Semgrep rules for the specific things that have actually bitten your app is a good, cheap first step.&lt;/p&gt;

&lt;p&gt;Full disclosure since this is relevant: I've been building an OSS tool in this space called &lt;code&gt;electron-audit&lt;/code&gt; — parses JS/TS with Babel, never runs your app, outputs SARIF. The thing I cared about most is not becoming the boy who cried wolf: every finding carries a &lt;code&gt;confidence&lt;/code&gt; (high vs. heuristic) separate from severity, and the CI exit code only fails on high-confidence critical/high findings — so the softer, heuristic dataflow-based findings get reported but don't block your build.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/gyugyu86/electron-audit" rel="noopener noreferrer"&gt;https://github.com/gyugyu86/electron-audit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you know of other tools trying to fill this same gap, genuinely curious — would like to hear about them.&lt;/p&gt;

&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Electron's docs removed the Electronegativity recommendation (&lt;a href="https://github.com/electron/electron/pull/48878" rel="noopener noreferrer"&gt;#48878&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Reason: Electronegativity is unmaintained, and its paid successor ElectroNG isn't for sale anymore either&lt;/li&gt;
&lt;li&gt;Right now there's no tool the docs point you to&lt;/li&gt;
&lt;li&gt;Alternatives: CodeQL (general-purpose, a few Electron-specific queries), Semgrep (free tier taint is single-function only), or newer community OSS&lt;/li&gt;
&lt;li&gt;If you're not adding a tool, at minimum check: webPreferences, cross-window setting consistency, command execution, CSP, and openExternal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The checklist itself isn't hard. Keeping it enforced release after release is the actual problem.&lt;/p&gt;

</description>
      <category>electron</category>
      <category>security</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
