<?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: tim</title>
    <description>The latest articles on DEV Community by tim (@tixy).</description>
    <link>https://dev.to/tixy</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%2F4087112%2Ff760a7b4-d081-4580-96a5-8638945dd10f.png</url>
      <title>DEV Community: tim</title>
      <link>https://dev.to/tixy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tixy"/>
    <language>en</language>
    <item>
      <title>npm v12 silently skips install scripts — here's how to check if that breaks you</title>
      <dc:creator>tim</dc:creator>
      <pubDate>Thu, 20 Aug 2026 19:05:39 +0000</pubDate>
      <link>https://dev.to/tixy/npm-v12-silently-skips-install-scripts-heres-how-to-check-if-that-breaks-you-5hmj</link>
      <guid>https://dev.to/tixy/npm-v12-silently-skips-install-scripts-heres-how-to-check-if-that-breaks-you-5hmj</guid>
      <description>&lt;p&gt;npm v12 shipped on 2026-07-08 with a real security-motivated change: &lt;code&gt;preinstall&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, and &lt;code&gt;postinstall&lt;/code&gt; scripts are now disabled by default. The stated reason is legitimate — supply-chain attacks (Shai-Hulud, the Nx attack, event-stream) have repeatedly used install scripts to run arbitrary code the moment someone runs &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The part that's easy to miss: &lt;strong&gt;&lt;code&gt;npm ci&lt;/code&gt; doesn't fail when a script is blocked. It just skips it, silently, and exits 0.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your project depends on a package that needs its install script to actually work — &lt;code&gt;sharp&lt;/code&gt; (downloads a prebuilt binary), &lt;code&gt;bcrypt&lt;/code&gt; or &lt;code&gt;better-sqlite3&lt;/code&gt; or &lt;code&gt;canvas&lt;/code&gt; (compile a native addon via node-gyp), &lt;code&gt;esbuild&lt;/code&gt; or &lt;code&gt;node-sass&lt;/code&gt; (download a platform binary), &lt;code&gt;husky&lt;/code&gt; (installs git hooks) — your CI can stay green while the thing it built is quietly broken. You find out later, sometimes in production, sometimes as a confusing runtime error that has nothing obviously to do with npm.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I looked for and didn't find
&lt;/h2&gt;

&lt;p&gt;There are several good written guides to the migration already (installsafe.dev, npmv12guide.com, a Semgrep write-up). What none of them do is look at your actual &lt;code&gt;package.json&lt;/code&gt; and tell you which of your dependencies are the ones to check. So I built the small missing piece: a free, static, client-side page — paste your package.json, get a list of your dependencies that are known to rely on an install script, with the specific reason each one is flagged.&lt;/p&gt;

&lt;p&gt;Nothing is uploaded. It's a static page with a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag — check the source if you don't believe the privacy claim, it's not minified.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it can't tell you
&lt;/h2&gt;

&lt;p&gt;It only knows about a curated list of commonly-affected packages — not your transitive dependencies, and not packages nobody's reported issues with yet. Absence from the list is not a guarantee. Think of it as a fast first pass before you actually test on a real npm v12 environment, not a replacement for that test.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://timo6pi-glitch.github.io/npm-v12-checker/" rel="noopener noreferrer"&gt;https://timo6pi-glitch.github.io/npm-v12-checker/&lt;/a&gt; (source: &lt;a href="https://github.com/timo6pi-glitch/npm-v12-checker" rel="noopener noreferrer"&gt;https://github.com/timo6pi-glitch/npm-v12-checker&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;If there's a package that should be on the list and isn't, I'd like to know — that's the main way this gets more useful over time.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
