<?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: takundanashebmuchena-pixel</title>
    <description>The latest articles on DEV Community by takundanashebmuchena-pixel (@takundanashebmuchenapixel).</description>
    <link>https://dev.to/takundanashebmuchenapixel</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%2F3972666%2F18328969-b257-419e-b136-9ce713744c3f.jpg</url>
      <title>DEV Community: takundanashebmuchena-pixel</title>
      <link>https://dev.to/takundanashebmuchenapixel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/takundanashebmuchenapixel"/>
    <language>en</language>
    <item>
      <title>Hybrid Classical-Quantum Cryptography — What It Is and How quantum-audit Handles It</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Tue, 21 Jul 2026 05:40:49 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/hybrid-classical-quantum-cryptography-what-it-is-and-how-quantum-audit-handles-it-24hl</link>
      <guid>https://dev.to/takundanashebmuchenapixel/hybrid-classical-quantum-cryptography-what-it-is-and-how-quantum-audit-handles-it-24hl</guid>
      <description>&lt;h1&gt;
  
  
  Hybrid Classical-Quantum Cryptography — What It Is and How quantum-audit Handles It
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Part 4 of the quantum-audit series. &lt;a href="https://dev.to/takundanashebmuchenapixel/i-scanned-200-blockchain-npm-packages-for-quantum-vulnerable-cryptography-heres-what-i-found-3oe1"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/takundanashebmuchenapixel/how-i-built-an-ast-scanner-to-detect-quantum-vulnerable-cryptography-in-javascript-projects-120"&gt;Part 2&lt;/a&gt; | &lt;a href="https://dev.to/takundanashebmuchenapixel/how-to-gate-your-ci-pipeline-on-quantum-vulnerability-with-quantum-audit-5bbe"&gt;Part 3&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://quantum-audit-site.vercel.app" rel="noopener noreferrer"&gt;quantum-audit-site.vercel.app&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;After Part 1 dropped, a reader asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How does quantum-audit handle hybrid classical-quantum systems? I'm curious if it can audit both types simultaneously."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the right question. And it's more nuanced than it looks.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a hybrid classical-quantum system?
&lt;/h2&gt;

&lt;p&gt;A hybrid system uses &lt;strong&gt;both&lt;/strong&gt; classical cryptography and post-quantum cryptography simultaneously — typically during a migration period.&lt;/p&gt;

&lt;p&gt;The most common pattern looks like this:&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;// Classical signing (vulnerable to Shor's algorithm)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;classicalSig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secp256k1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Post-quantum signing (quantum-resistant)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pqcSig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dilithium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pqcPrivateKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Send both — verifier checks both&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;classicalSig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pqcSig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea: a verifier that understands both can validate the PQC signature. A legacy verifier that only understands ECDSA can still validate the classical one. You get backwards compatibility while adding quantum resistance.&lt;/p&gt;

&lt;p&gt;This is called &lt;strong&gt;hybrid key encapsulation&lt;/strong&gt; or &lt;strong&gt;hybrid signing&lt;/strong&gt; and it's the approach recommended by NIST during the transition period.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why hybrid instead of just switching?
&lt;/h2&gt;

&lt;p&gt;Because the ecosystem doesn't switch overnight.&lt;/p&gt;

&lt;p&gt;Consider Ethereum: wallets, nodes, smart contracts, hardware signers, exchanges — all rely on ECDSA/secp256k1. You can't flip a switch. Even if a new post-quantum standard is chosen tomorrow, the migration would take years.&lt;/p&gt;

&lt;p&gt;Hybrid is the bridge. You add PQC without breaking existing systems.&lt;/p&gt;

&lt;p&gt;The same pattern applies to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TLS&lt;/strong&gt; — hybrid key exchange (X25519 + Kyber)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JWT&lt;/strong&gt; — HS256 (symmetric) alongside RS256 (classical asymmetric)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH&lt;/strong&gt; — hybrid key algorithms in OpenSSH 9.0+&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The problem with hybrid systems
&lt;/h2&gt;

&lt;p&gt;Hybrid systems introduce a subtle security question: &lt;strong&gt;which signature do you actually trust?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If an attacker can selectively strip the PQC signature and present only the classical one to a legacy verifier — you've gained nothing. The system is only as strong as its weakest link.&lt;/p&gt;

&lt;p&gt;This is called a &lt;strong&gt;downgrade attack&lt;/strong&gt;. Good hybrid implementations defend against it explicitly.&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;// Vulnerable — verifier accepts classical-only&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&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;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classicalSig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;secp256k1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classicalSig&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;span class="c1"&gt;// Secure — verifier requires both&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&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;classicalValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secp256k1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classicalSig&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;pqcValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dilithium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pqcSig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;classicalValid&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;pqcValid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// BOTH required&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How quantum-audit v0.2.3 handles hybrid systems
&lt;/h2&gt;

&lt;p&gt;quantum-audit now detects hybrid setups automatically.&lt;/p&gt;

&lt;p&gt;When it finds both a vulnerable classical library &lt;strong&gt;and&lt;/strong&gt; a post-quantum library in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚡ Hybrid Mode: Post-quantum library detected (@noble/post-quantum,
   sphincs) — hybrid transition in progress.
   Critical penalties reduced by 50%.

🔒 Multi-layer PQC detected (@noble/post-quantum + sphincs)
   — +10 bonus applied.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this means in practice:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A project with &lt;code&gt;ethers&lt;/code&gt; (ECDSA — critical) and &lt;code&gt;@noble/post-quantum&lt;/code&gt; (Dilithium — safe) would normally score:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 - 40 (ethers ECDSA weight) = 60/100 — Grade C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In hybrid mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 - 20 (50% reduction) + 0 = 80/100 — Grade B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool recognises you're actively migrating, not ignoring the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  What quantum-audit does NOT yet do
&lt;/h2&gt;

&lt;p&gt;Full transparency — there are things v0.2.3 doesn't cover yet:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Downgrade attack detection&lt;/strong&gt;&lt;br&gt;
We don't yet check whether your hybrid implementation requires both signatures or accepts classical-only as a fallback. That's source-level analysis that requires understanding your verification logic, not just your dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Protocol-level hybrid awareness&lt;/strong&gt;&lt;br&gt;
If you're using OpenSSL 3.x's provider system or a custom TLS stack with hybrid key exchange — quantum-audit won't understand the protocol context. It sees the libraries, not how they're composed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Smart contract hybrid patterns&lt;/strong&gt;&lt;br&gt;
Solidity scanning is new in v0.2.3 — we detect ECDSA imports in &lt;code&gt;.sol&lt;/code&gt; files but don't yet understand hybrid signing patterns at the contract level.&lt;/p&gt;

&lt;p&gt;These are on the roadmap.&lt;/p&gt;


&lt;h2&gt;
  
  
  The right way to think about hybrid migration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Audit first&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; audit.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Know exactly what you're dealing with before planning migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Add PQC alongside classical&lt;/strong&gt;&lt;br&gt;
Don't replace — add. Keep existing ECDSA signing, add Dilithium on top.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @noble/post-quantum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3 — Require both in verification&lt;/strong&gt;&lt;br&gt;
Make sure your verifier requires both signatures. No classical-only fallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Monitor the ecosystem&lt;/strong&gt;&lt;br&gt;
Ethereum's PQC migration is tracked via EIPs. Bitcoin via BIP-360. Watch these for when the ecosystem is ready to drop classical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Eventually deprecate classical&lt;/strong&gt;&lt;br&gt;
When the ecosystem catches up, drop the classical layer. You're now fully post-quantum.&lt;/p&gt;


&lt;h2&gt;
  
  
  Real-world hybrid: OpenSSL 3.x
&lt;/h2&gt;

&lt;p&gt;OpenSSL 3.x introduced the provider system that allows hybrid key exchange in TLS. The OQS (Open Quantum Safe) provider adds post-quantum algorithms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;liboqs-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the most mature hybrid implementation available today for Node.js projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Install quantum-audit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt;
npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/takundanashebmuchena-pixel/quantum-audit" rel="noopener noreferrer"&gt;takundanashebmuchena-pixel/quantum-audit&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/quantum-audit" rel="noopener noreferrer"&gt;npmjs.com/package/quantum-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you running a hybrid system already? Drop your setup in the comments — especially interested in hearing from anyone using OpenSSL's OQS provider or building hybrid signing into a Web3 project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5cef8xpyhneipiqr9czh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5cef8xpyhneipiqr9czh.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>blockchain</category>
      <category>cryptography</category>
    </item>
    <item>
      <title>quantum-audit v0.2.3 — Hybrid Detection, Migration Guides, and 50+ Libraries</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Sun, 19 Jul 2026 21:50:06 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/quantum-audit-v023-hybrid-detection-migration-guides-and-50-libraries-ld2</link>
      <guid>https://dev.to/takundanashebmuchenapixel/quantum-audit-v023-hybrid-detection-migration-guides-and-50-libraries-ld2</guid>
      <description>&lt;h1&gt;
  
  
  quantum-audit v0.2.3 — Hybrid Detection, Migration Guides, and 50+ Libraries
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Part of the quantum-audit series. &lt;a href="https://dev.to/takundanashebmuchenapixel/i-scanned-200-blockchain-npm-packages-for-quantum-vulnerable-cryptography-heres-what-i-found-3oe1"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/takundanashebmuchenapixel/how-i-built-an-ast-scanner-to-detect-quantum-vulnerable-cryptography-in-javascript-projects-120"&gt;Part 2&lt;/a&gt; | &lt;a href="https://dev.to/takundanashebmuchenapixel/how-to-gate-your-ci-pipeline-on-quantum-vulnerability-with-quantum-audit-5bbe"&gt;Part 3&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://quantum-audit-site.vercel.app" rel="noopener noreferrer"&gt;quantum-audit-site.vercel.app&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;v0.2.3 of &lt;code&gt;quantum-audit&lt;/code&gt; is live. Here's everything that changed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1. Migration suggestions per finding
&lt;/h2&gt;

&lt;p&gt;The biggest request after the series launched. Previously, quantum-audit told you what was broken. Now it tells you what to do about it.&lt;/p&gt;

&lt;p&gt;Every critical finding now includes a migration path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[CRITICAL] ECDSA (secp256k1) — package.json
  ↳ Migration: Replace with @noble/post-quantum (Dilithium) for signatures

[CRITICAL] BLS12-381 (pairing-based) — package.json
  ↳ Migration: Pairing-based crypto broken by quantum. Monitor for PQC replacements.

[MEDIUM] SHA-256 (crypto.createHash) — src/utils/hash.js:14
  ↳ Migration: Consider SHA-3 for stronger quantum resistance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Hybrid detection
&lt;/h2&gt;

&lt;p&gt;A question from the community after Part 1:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How does quantum-audit handle hybrid classical-quantum systems?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;v0.2.3 now detects hybrid setups. If your project has both a quantum-vulnerable library &lt;strong&gt;and&lt;/strong&gt; a post-quantum one, quantum-audit recognises you're mid-transition and reduces critical penalties by 50%:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚡ Hybrid Mode: Post-quantum library detected (@noble/post-quantum)
   — hybrid transition in progress. Critical penalties reduced by 50%.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means a project actively migrating gets scored fairly — not penalised as heavily as one that hasn't started.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Multi-layer PQC bonus
&lt;/h2&gt;

&lt;p&gt;Inspired by DAC Chain's approach to quantum security — using multiple post-quantum algorithms stacked together rather than relying on a single one.&lt;/p&gt;

&lt;p&gt;If your project uses &lt;strong&gt;two or more&lt;/strong&gt; post-quantum libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔒 Multi-layer PQC detected (@noble/post-quantum + sphincs)
   — +10 bonus applied.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rewards the most security-conscious projects and encourages defence in depth.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. 50+ libraries in the detection database
&lt;/h2&gt;

&lt;p&gt;v0.2.2 covered 20 libraries. v0.2.3 covers 50+. New additions include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BLS signatures (Ethereum 2.0 consensus):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@chainsafe/bls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@noble/bls12-381&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noble-bls12-381&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl-wasm&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BLS12-381 is pairing-based cryptography — broken by quantum computers. This is used in Ethereum's Proof of Stake consensus mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JWT libraries:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;jsonwebtoken&lt;/code&gt; — flags RS256/ES256 signing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;passport-jwt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;New ECDSA packages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tiny-secp256k1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@noble/secp256k1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@noble/curves&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eth-sig-util&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Classically broken (flagged as critical):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;md5&lt;/code&gt; — broken without quantum, dangerous with it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rainbow-sig&lt;/code&gt; — multivariate signature scheme broken in 2022&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;New safe/PQC libraries:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ntru&lt;/code&gt; — lattice-based encryption&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;falcon-sign&lt;/code&gt; — NIST alternate standard&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sphincsplus&lt;/code&gt; — hash-based NIST standard&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;liboqs-node&lt;/code&gt; — Open Quantum Safe bindings&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. New CLI flags
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;--threshold&lt;/code&gt;&lt;/strong&gt; — fail CI if score drops below a custom value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;70
&lt;span class="c"&gt;# exits 1 if score &amp;lt; 70&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;--ignore&lt;/code&gt;&lt;/strong&gt; — skip specific packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--ignore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ethers,web3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;--html&lt;/code&gt;&lt;/strong&gt; — generate a full HTML report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--html&lt;/span&gt;
&lt;span class="c"&gt;# writes quantum-audit-report.html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;--csv&lt;/code&gt;&lt;/strong&gt; — export findings to a spreadsheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--csv&lt;/span&gt;
&lt;span class="c"&gt;# writes quantum-audit-report.csv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Solidity file scanning
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.sol&lt;/code&gt; files are now included in the source scan. Solidity contracts that import or use ECDSA libraries directly will be flagged.&lt;/p&gt;




&lt;h2&gt;
  
  
  Install / upgrade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; quantum-audit
&lt;span class="c"&gt;# or&lt;/span&gt;
npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you already have it installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update &lt;span class="nt"&gt;-g&lt;/span&gt; quantum-audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 4&lt;/strong&gt; — Hybrid classical-quantum systems in depth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code extension&lt;/strong&gt; — surface findings inline while you code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Action&lt;/strong&gt; — publish quantum-audit as a marketplace action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your v0.2.3 score in the comments. Has anything changed from your v.0.2.2 scan?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>webdev</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>How to Gate Your CI Pipeline on Quantum Vulnerability — with quantum-audit</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Fri, 17 Jul 2026 03:20:20 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/how-to-gate-your-ci-pipeline-on-quantum-vulnerability-with-quantum-audit-5bbe</link>
      <guid>https://dev.to/takundanashebmuchenapixel/how-to-gate-your-ci-pipeline-on-quantum-vulnerability-with-quantum-audit-5bbe</guid>
      <description>&lt;p&gt;Part 3 of the quantum-audit series. &lt;a href="https://dev.to/takundanashebmuchenapixel/i-scanned-200-blockchain-npm-packages-for-quantum-vulnerable-cryptography-heres-what-i-found-3oe1"&gt;Part 1&lt;/a&gt; | &lt;a href="https://dev.to/takundanashebmuchenapixel/how-i-built-an-ast-scanner-to-detect-quantum-vulnerable-cryptography-in-javascript-projects-120"&gt;Part 2&lt;/a&gt;*&lt;/p&gt;

&lt;p&gt;🌐 Tool: &lt;a href="https://quantum-audit-site.vercel.app" rel="noopener noreferrer"&gt;quantum-audit-site.vercel.app&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Most security tools tell you there's a problem. Then you close the tab and forget about it.&lt;/p&gt;

&lt;p&gt;The only way to actually fix that is to make the problem &lt;strong&gt;block your deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;quantum-audit&lt;/code&gt; exits with a non-zero code when it finds critical quantum-vulnerable cryptography. That means you can drop it into any CI pipeline and have it fail the build automatically.&lt;/p&gt;

&lt;p&gt;Here's how.&lt;/p&gt;




&lt;h2&gt;
  
  
  The exit code behaviour
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;   &lt;span class="c"&gt;# 0 = no critical findings, 1 = critical findings found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exit 0&lt;/strong&gt; — no critical findings (safe to deploy)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exit 1&lt;/strong&gt; — critical findings detected (block the build)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Medium findings (SHA-256, AES-128) don't fail the build — they appear in the output as warnings but don't block deployment. Only CRITICAL findings (RSA, ECDSA, secp256k1) cause a non-zero exit.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Add this to your &lt;code&gt;.github/workflows/ci.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;quantum-audit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node.js&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run quantum-audit&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx quantum-audit .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your project uses &lt;code&gt;ethers&lt;/code&gt;, &lt;code&gt;web3&lt;/code&gt;, &lt;code&gt;elliptic&lt;/code&gt;, or any other ECDSA/RSA library — the step will fail and your PR cannot be merged until the finding is addressed.&lt;/p&gt;




&lt;h2&gt;
  
  
  JSON output for custom reporting
&lt;/h2&gt;

&lt;p&gt;Need to parse the results programmatically? Use the &lt;code&gt;--json&lt;/code&gt; flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-dapp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"grade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C — Moderate Exposure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"findings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"algorithm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ECDSA (secp256k1) signing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"risk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"critical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"package.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ethers"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"algorithm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SHA-256 (crypto.createHash)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"risk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/utils/hash.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can pipe this into a Slack notification, a dashboard, or a custom reporting step.&lt;/p&gt;




&lt;h2&gt;
  
  
  Slack notification on failure
&lt;/h2&gt;

&lt;p&gt;Here's a GitHub Actions step that posts to Slack when critical findings are detected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run quantum-audit&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;audit&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx quantum-audit . --json &amp;gt; audit-result.json || &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check for critical findings&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;SCORE=$(cat audit-result.json | python3 -c "import sys,json; print(json.load(sys.stdin)['score'])")&lt;/span&gt;
    &lt;span class="s"&gt;echo "Quantum readiness score: $SCORE"&lt;/span&gt;
    &lt;span class="s"&gt;if [ "$SCORE" -lt 70 ]; then&lt;/span&gt;
      &lt;span class="s"&gt;echo "CRITICAL: Quantum exposure score below threshold"&lt;/span&gt;
      &lt;span class="s"&gt;exit 1&lt;/span&gt;
    &lt;span class="s"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Soft mode — warn without blocking
&lt;/h2&gt;

&lt;p&gt;If you're not ready to hard-fail on critical findings yet, use this pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run quantum-audit (warn only)&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx quantum-audit . || echo "⚠️ Quantum vulnerabilities detected — review before next release"&lt;/span&gt;
  &lt;span class="na"&gt;continue-on-error&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This surfaces the findings in your CI logs without blocking the build. Good for teams that need a transition period before enforcing the gate.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to do when the build fails
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;quantum-audit&lt;/code&gt; fails your build, you have three options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1 — Accept the risk temporarily&lt;/strong&gt;&lt;br&gt;
Use &lt;code&gt;continue-on-error: true&lt;/code&gt; in your CI step to warn without blocking while you plan a migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2 — Migrate to a post-quantum library&lt;/strong&gt;&lt;br&gt;
NIST standardized the replacements in 2024:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRYSTALS-Dilithium&lt;/strong&gt; — drop-in for ECDSA signatures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRYSTALS-Kyber&lt;/strong&gt; — for key encapsulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPHINCS+&lt;/strong&gt; — hash-based signatures (most conservative choice)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Option 3 — Scope the scan&lt;/strong&gt;&lt;br&gt;
If the vulnerable dependency is isolated to a specific non-critical part of your codebase, you can scope the scan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx quantum-audit ./src/critical-path
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only scan the directories that matter most.&lt;/p&gt;




&lt;h2&gt;
  
  
  Full workflow example
&lt;/h2&gt;

&lt;p&gt;Here's a complete GitHub Actions workflow with quantum-audit integrated alongside your existing checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Security checks&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm audit (classical vulnerabilities)&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm audit --audit-level=high&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quantum-audit (quantum vulnerabilities)&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx quantum-audit .&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quantum-audit JSON report&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always()&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx quantum-audit . --json &amp;gt; quantum-report.json&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload quantum report&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always()&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quantum-audit-report&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quantum-report.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs both &lt;code&gt;npm audit&lt;/code&gt; (for classical CVEs) and &lt;code&gt;quantum-audit&lt;/code&gt; (for quantum exposure) side by side, and uploads the full JSON report as a build artifact for review.&lt;/p&gt;




&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; quantum-audit
&lt;span class="c"&gt;# or&lt;/span&gt;
npx quantum-audit &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/takundanashebmuchena-pixel/quantum-audit" rel="noopener noreferrer"&gt;takundanashebmuchena-pixel/quantum-audit&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/quantum-audit" rel="noopener noreferrer"&gt;npmjs.com/package/quantum-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you running &lt;code&gt;quantum-audit&lt;/code&gt; in CI? Drop your setup in the comments — I'd love to see how others are integrating it.&lt;/p&gt;

</description>
      <category>security</category>
      <category>javascript</category>
      <category>devops</category>
      <category>github</category>
    </item>
    <item>
      <title>How I Built an AST Scanner to Detect Quantum-Vulnerable Cryptography in JavaScript Projects</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Mon, 13 Jul 2026 02:45:03 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/how-i-built-an-ast-scanner-to-detect-quantum-vulnerable-cryptography-in-javascript-projects-120</link>
      <guid>https://dev.to/takundanashebmuchenapixel/how-i-built-an-ast-scanner-to-detect-quantum-vulnerable-cryptography-in-javascript-projects-120</guid>
      <description>&lt;p&gt;`&lt;em&gt;Part 2 of the quantum-audit series. &lt;a href="https://dev.to/takundanashebmuchenapixel/i-scanned-200-blockchain-npm-packages-for-quantum-vulnerable-cryptography-heres-what-i-found-3oe1"&gt;Part 1 here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🌐 Tool: &lt;a href="https://quantum-audit-site.vercel.app" rel="noopener noreferrer"&gt;quantum-audit-site.vercel.app&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;When I published &lt;code&gt;quantum-audit&lt;/code&gt; — a CLI that scans npm projects for quantum-vulnerable cryptography — I got a question immediately:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How does it actually detect crypto calls in source code?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is &lt;strong&gt;AST scanning&lt;/strong&gt;. In this post I'll break down exactly how it works, with real code from the scanner.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is an AST?
&lt;/h2&gt;

&lt;p&gt;AST stands for &lt;strong&gt;Abstract Syntax Tree&lt;/strong&gt;. It's a tree representation of your source code that a parser produces after reading it.&lt;/p&gt;

&lt;p&gt;Think of it like this. When you write:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
crypto.createSign('RSA-SHA256')&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To you, that's a function call. To a parser, it's a tree:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
CallExpression&lt;br&gt;
  ├── callee: MemberExpression&lt;br&gt;
  │     ├── object: Identifier (name: "crypto")&lt;br&gt;
  │     └── property: Identifier (name: "createSign")&lt;br&gt;
  └── arguments:&lt;br&gt;
        └── StringLiteral (value: "RSA-SHA256")&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instead of using regex — which would miss edge cases and produce false positives — we walk this tree and look for specific patterns. That's the core idea.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why not just use regex?
&lt;/h2&gt;

&lt;p&gt;You could try:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
const hasRSA = code.includes('createSign') &amp;amp;&amp;amp; code.includes('RSA');&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But this breaks immediately on:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
// createSign is used for RSA-SHA256&lt;br&gt;
const comment = "createSign";&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Regex doesn't understand code structure. An AST does.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tools: &lt;a class="mentioned-user" href="https://dev.to/babel"&gt;@babel&lt;/a&gt;/parser and &lt;a class="mentioned-user" href="https://dev.to/babel"&gt;@babel&lt;/a&gt;/traverse
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;quantum-audit&lt;/code&gt; uses two packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@babel/parser&lt;/code&gt;&lt;/strong&gt; — reads JavaScript/TypeScript and produces an AST&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@babel/traverse&lt;/code&gt;&lt;/strong&gt; — walks the AST and lets you hook into specific node types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;bash&lt;br&gt;
npm install @babel/parser @babel/traverse&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading the file and parsing it
&lt;/h2&gt;

&lt;p&gt;The first step is reading the source file and converting it into an AST:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`js&lt;br&gt;
const fs = require('fs');&lt;br&gt;
const parser = require('&lt;a class="mentioned-user" href="https://dev.to/babel"&gt;@babel&lt;/a&gt;/parser');&lt;/p&gt;

&lt;p&gt;function scanSourceFile(filePath) {&lt;br&gt;
  const findings = [];&lt;br&gt;
  let code;&lt;/p&gt;

&lt;p&gt;try {&lt;br&gt;
    code = fs.readFileSync(filePath, 'utf8');&lt;br&gt;
  } catch {&lt;br&gt;
    return findings; // skip unreadable files&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;let ast;&lt;br&gt;
  try {&lt;br&gt;
    ast = parser.parse(code, {&lt;br&gt;
      sourceType: 'unambiguous', // handles both CommonJS and ES modules&lt;br&gt;
      plugins: ['jsx', 'typescript'], // supports React and TypeScript&lt;br&gt;
    });&lt;br&gt;
  } catch {&lt;br&gt;
    return findings; // skip files that fail to parse&lt;br&gt;
  }&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sourceType: 'unambiguous'&lt;/code&gt; tells the parser to figure out automatically whether the file uses &lt;code&gt;import/export&lt;/code&gt; or &lt;code&gt;require()&lt;/code&gt;. The &lt;code&gt;plugins&lt;/code&gt; array enables JSX and TypeScript support so the scanner works on React and TS projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Walking the tree with traverse
&lt;/h2&gt;

&lt;p&gt;Once we have the AST, we use &lt;code&gt;traverse&lt;/code&gt; to walk every node and check for dangerous patterns:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`js&lt;br&gt;
const traverse = require('&lt;a class="mentioned-user" href="https://dev.to/babel"&gt;@babel&lt;/a&gt;/traverse').default;&lt;/p&gt;

&lt;p&gt;traverse(ast, {&lt;br&gt;
  CallExpression(path) {&lt;br&gt;
    const callee = path.node.callee;&lt;br&gt;
    const line = path.node.loc ? path.node.loc.start.line : null;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Check for: crypto.createSign('RSA-SHA256')
if (
  callee.type === 'MemberExpression' &amp;amp;&amp;amp;
  callee.property.name === 'createSign'
) {
  const arg = path.node.arguments[0];
  if (arg &amp;amp;&amp;amp; arg.type === 'StringLiteral') {
    if (/RSA/i.test(arg.value)) {
      findings.push({
        algorithm: 'RSA (crypto.createSign)',
        risk: 'critical',
        weight: 35,
        file: filePath,
        line,
      });
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
});&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CallExpression&lt;/code&gt; is the node type for any function call. Every time traverse finds one, our callback fires. We then inspect the node to see:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the callee a &lt;code&gt;MemberExpression&lt;/code&gt; (i.e. &lt;code&gt;something.method()&lt;/code&gt;)?&lt;/li&gt;
&lt;li&gt;Is the method name &lt;code&gt;createSign&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Is the first argument a string containing &lt;code&gt;RSA&lt;/code&gt;?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If all three are true — we've found RSA signing code. Flag it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Detecting all the vulnerable patterns
&lt;/h2&gt;

&lt;p&gt;Here's the full set of patterns &lt;code&gt;quantum-audit&lt;/code&gt; looks for:&lt;/p&gt;

&lt;h3&gt;
  
  
  RSA and DSA via createSign
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
crypto.createSign('RSA-SHA256')  // CRITICAL&lt;br&gt;
crypto.createSign('DSA-SHA1')    // CRITICAL&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Detection:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
if (callee.property.name === 'createSign') {&lt;br&gt;
  const arg = path.node.arguments[0];&lt;br&gt;
  if (arg &amp;amp;&amp;amp; arg.type === 'StringLiteral') {&lt;br&gt;
    if (/RSA/i.test(arg.value)) {&lt;br&gt;
      findings.push({ algorithm: 'RSA (crypto.createSign)', risk: 'critical', weight: 35, file: filePath, line });&lt;br&gt;
    } else if (/DSA/i.test(arg.value)) {&lt;br&gt;
      findings.push({ algorithm: 'DSA (crypto.createSign)', risk: 'critical', weight: 35, file: filePath, line });&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ECDSA and RSA via generateKeyPair
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
crypto.generateKeyPairSync('ec', { namedCurve: 'secp256k1' })  // CRITICAL&lt;br&gt;
crypto.generateKeyPairSync('rsa', { modulusLength: 2048 })      // CRITICAL&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Detection:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
if (/generateKeyPair/.test(callee.property.name || '')) {&lt;br&gt;
  const arg = path.node.arguments[0];&lt;br&gt;
  if (arg &amp;amp;&amp;amp; arg.type === 'StringLiteral') {&lt;br&gt;
    if (arg.value === 'rsa') {&lt;br&gt;
      findings.push({ algorithm: 'RSA (generateKeyPair)', risk: 'critical', weight: 35, file: filePath, line });&lt;br&gt;
    } else if (arg.value === 'ec') {&lt;br&gt;
      findings.push({ algorithm: 'ECDSA (generateKeyPair)', risk: 'critical', weight: 40, file: filePath, line });&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SHA-256 via createHash (medium risk)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
crypto.createHash('sha256')  // MEDIUM — weakened by Grover's algorithm&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Detection:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
if (callee.property.name === 'createHash') {&lt;br&gt;
  const arg = path.node.arguments[0];&lt;br&gt;
  if (arg &amp;amp;&amp;amp; arg.type === 'StringLiteral' &amp;amp;&amp;amp; /^sha256$/i.test(arg.value)) {&lt;br&gt;
    findings.push({ algorithm: 'SHA-256 (crypto.createHash)', risk: 'medium', weight: 8, file: filePath, line });&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;SHA-256 isn't broken by Shor's algorithm — but Grover's algorithm halves its effective security from 256 bits to ~128 bits. It's a medium risk, not critical.&lt;/p&gt;




&lt;h2&gt;
  
  
  Walking the entire project
&lt;/h2&gt;

&lt;p&gt;The scanner doesn't just check one file. It walks your entire project directory recursively, skipping &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;dist&lt;/code&gt;, and other non-source folders:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`js&lt;br&gt;
const SOURCE_EXTENSIONS = new Set(['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs']);&lt;br&gt;
const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', 'coverage']);&lt;/p&gt;

&lt;p&gt;function walkSourceFiles(dir, fileList = []) {&lt;br&gt;
  const entries = fs.readdirSync(dir, { withFileTypes: true });&lt;br&gt;
  for (const entry of entries) {&lt;br&gt;
    if (SKIP_DIRS.has(entry.name)) continue;&lt;br&gt;
    const fullPath = path.join(dir, entry.name);&lt;br&gt;
    if (entry.isDirectory()) {&lt;br&gt;
      walkSourceFiles(fullPath, fileList);&lt;br&gt;
    } else if (SOURCE_EXTENSIONS.has(path.extname(entry.name))) {&lt;br&gt;
      fileList.push(fullPath);&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  return fileList;&lt;br&gt;
}&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Every &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.ts&lt;/code&gt;, &lt;code&gt;.jsx&lt;/code&gt;, &lt;code&gt;.tsx&lt;/code&gt;, &lt;code&gt;.mjs&lt;/code&gt;, and &lt;code&gt;.cjs&lt;/code&gt; file gets scanned.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two layers working together
&lt;/h2&gt;

&lt;p&gt;The AST scanner is Layer 2. Layer 1 is a dependency scan — checking your &lt;code&gt;package.json&lt;/code&gt; against a database of known vulnerable libraries:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;js&lt;br&gt;
// known-libs.js — excerpt&lt;br&gt;
module.exports = {&lt;br&gt;
  'elliptic': { algorithm: 'ECDSA (secp256k1/p256)', risk: 'critical', weight: 40 },&lt;br&gt;
  'ethers':   { algorithm: 'ECDSA (secp256k1) signing', risk: 'critical', weight: 40 },&lt;br&gt;
  'node-rsa': { algorithm: 'RSA', risk: 'critical', weight: 35 },&lt;br&gt;
};&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The dependency scan catches high-level exposure. The AST scan catches the specific lines in your source where vulnerable crypto is called directly.&lt;/p&gt;

&lt;p&gt;Together they produce a score:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
Score = 100 - (sum of weights of all findings)&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With deduplication so the same finding doesn't penalise you twice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it on your project
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;bash&lt;br&gt;
npx quantum-audit .&lt;br&gt;
npx quantum-audit . --json   # machine-readable for CI&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/takundanashebmuchena-pixel/quantum-audit" rel="noopener noreferrer"&gt;takundanashebmuchena-pixel/quantum-audit&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/quantum-audit" rel="noopener noreferrer"&gt;npmjs.com/package/quantum-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What patterns are you seeing in your own codebase? Drop your score in the comments.`&lt;/p&gt;

</description>
      <category>security</category>
      <category>javascript</category>
      <category>blockchain</category>
      <category>node</category>
    </item>
    <item>
      <title>Web3-to-viem</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Sat, 11 Jul 2026 04:08:12 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/web3-to-viem-pkf</link>
      <guid>https://dev.to/takundanashebmuchenapixel/web3-to-viem-pkf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>I scanned 200 blockchain npm packages for quantum-vulnerable cryptography. Here's what I found.</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Fri, 10 Jul 2026 04:22:49 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/i-scanned-200-blockchain-npm-packages-for-quantum-vulnerable-cryptography-heres-what-i-found-3oe1</link>
      <guid>https://dev.to/takundanashebmuchenapixel/i-scanned-200-blockchain-npm-packages-for-quantum-vulnerable-cryptography-heres-what-i-found-3oe1</guid>
      <description>&lt;p&gt;🌐 Live: &lt;a href="https://quantum-audit-site.vercel.app" rel="noopener noreferrer"&gt;https://quantum-audit-site.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;---I scanned 200 blockchain npm packages for quantum-vulnerable cryptography. Here's what I found.&lt;br&gt;
TL;DR: Most Ethereum/Web3 npm packages rely on ECDSA/secp256k1 — an algorithm that a sufficiently large quantum computer will break. I built a CLI tool to scan your project and score its quantum readiness.&lt;br&gt;
The problem nobody in Web3 is talking about&lt;br&gt;
Shor's algorithm — running on a large enough quantum computer — breaks RSA and elliptic curve cryptography (ECDSA, ECDH, secp256k1) completely.&lt;br&gt;
Not "weakens." Breaks. As in: private keys become derivable from public keys.&lt;br&gt;
Every Ethereum wallet, every Bitcoin address, every smart contract signature scheme in production today uses ECDSA on secp256k1. That's the curve. That's the algorithm. That's the exposure.&lt;br&gt;
NIST already saw this coming. In 2024 they standardized the post-quantum replacements:&lt;br&gt;
CRYSTALS-Kyber — key encapsulation&lt;br&gt;
CRYSTALS-Dilithium — signatures&lt;br&gt;
SPHINCS+ — hash-based signatures&lt;br&gt;
But almost no npm packages have migrated. And almost no developer tools tell you which of your dependencies are at risk.&lt;br&gt;
What I built&lt;br&gt;
quantum-audit — a CLI tool that scans your project's dependency tree and source code for quantum-vulnerable cryptography, then gives you a 0–100 readiness score.&lt;br&gt;
Bash&lt;br&gt;
Output:&lt;br&gt;
Code&lt;br&gt;
How it works&lt;br&gt;
Two scanning layers:&lt;br&gt;
Layer 1 — Dependency scan&lt;br&gt;
Checks your package.json against a curated database of 20+ crypto libraries mapped to their underlying algorithms. ethers, web3, elliptic, secp256k1, node-rsa, jsrsasign — all flagged with their actual risk level and weight.&lt;br&gt;
Layer 2 — AST source scan&lt;br&gt;
Uses Babel to walk your JavaScript/TypeScript source files and detect direct node:crypto calls that dependency scanning alone would miss:&lt;br&gt;
Js&lt;br&gt;
Scoring&lt;br&gt;
Grade&lt;br&gt;
Score&lt;br&gt;
Meaning&lt;br&gt;
A&lt;br&gt;
90–100&lt;br&gt;
Quantum ready&lt;br&gt;
B&lt;br&gt;
70–89&lt;br&gt;
Low exposure&lt;br&gt;
C&lt;br&gt;
40–69&lt;br&gt;
Moderate exposure&lt;br&gt;
D&lt;br&gt;
15–39&lt;br&gt;
High exposure&lt;br&gt;
F&lt;br&gt;
0–14&lt;br&gt;
Critical exposure&lt;br&gt;
CI integration: exits non-zero on critical findings so you can gate your pipeline.&lt;br&gt;
What I found scanning blockchain packages&lt;br&gt;
Out of the top blockchain/Web3 npm packages:&lt;br&gt;
ethers — CRITICAL (ECDSA/secp256k1 signing)&lt;br&gt;
web3 — CRITICAL (ECDSA/secp256k1 signing)&lt;br&gt;
bitcoinjs-lib — CRITICAL (ECDSA/secp256k1)&lt;br&gt;
elliptic — CRITICAL (the underlying curve library everything else uses)&lt;br&gt;
ethereumjs-util — CRITICAL (secp256k1 key operations)&lt;br&gt;
Not a single one of the top 10 Ethereum npm packages has a post-quantum migration path documented.&lt;br&gt;
"Quantum computers aren't a threat yet"&lt;br&gt;
True — today. IBM's current largest quantum processor has ~1000 qubits. Breaking 256-bit elliptic curve keys requires an estimated 2,000–4,000 logical (error-corrected) qubits, which translates to millions of physical qubits with current error rates.&lt;br&gt;
But:&lt;br&gt;
"Harvest now, decrypt later" attacks are already happening — adversaries are collecting encrypted traffic today to decrypt when quantum computers are ready&lt;br&gt;
Migration takes years — the SSL/TLS ecosystem took over a decade to move from SHA-1 to SHA-256&lt;br&gt;
NIST already standardized the replacements — there's no reason to wait&lt;br&gt;
The time to audit is now, not when the threat is imminent.&lt;br&gt;
Install and use&lt;br&gt;
Bash&lt;br&gt;
GitHub: &lt;a href="https://github.com/takundanashebmuchena-pixel/quantum-audit" rel="noopener noreferrer"&gt;https://github.com/takundanashebmuchena-pixel/quantum-audit&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/quantum-audit" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/quantum-audit&lt;/a&gt;&lt;br&gt;
What's next&lt;br&gt;
Solidity contract scanning (flag on-chain ECDSA-only signature schemes)&lt;br&gt;
Per-finding migration guidance (suggest the Dilithium equivalent)&lt;br&gt;
Integration with Chain Audit — a broader blockchain dependency risk intelligence platform&lt;br&gt;
If you're building anything on Web3, run npx quantum-audit . on your project right now and drop your score in the comments. Curious what the distribution looks like across the community.&lt;br&gt;
Tags: #javascript #security #blockchain #ethereum #webdev&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>blockchain</category>
      <category>webdev</category>
    </item>
    <item>
      <title>eth-rpc-errors is abandoned (850K+ weekly downloads) — here's the drop-in replacement</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Thu, 18 Jun 2026 04:11:06 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/eth-rpc-errors-is-abandoned-850k-weekly-downloads-heres-the-drop-in-replacement-1g6n</link>
      <guid>https://dev.to/takundanashebmuchenapixel/eth-rpc-errors-is-abandoned-850k-weekly-downloads-heres-the-drop-in-replacement-1g6n</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If you're using &lt;code&gt;eth-rpc-errors&lt;/code&gt; in your project, &lt;br&gt;
you might not have noticed something concerning — &lt;br&gt;
&lt;strong&gt;the package hasn't been maintained in over 5 years.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yet it still gets &lt;strong&gt;850,000+ weekly downloads.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That means hundreds of thousands of Ethereum projects &lt;br&gt;
are depending on an abandoned package. No bug fixes. &lt;br&gt;
No security patches. No responses to issues.&lt;/p&gt;

&lt;p&gt;Even MetaMask — the original creators — have moved &lt;br&gt;
away from it to &lt;code&gt;@metamask/rpc-errors&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I forked it and have been actively maintaining it as:&lt;/p&gt;

&lt;p&gt;👉 &lt;code&gt;eth-rpc-errors-maintained&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration: One Line
&lt;/h2&gt;

&lt;p&gt;This is genuinely the easiest migration you'll ever do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uninstall the old package:&lt;/strong&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
npm uninstall eth-rpc-errors
npm install eth-rpc-errors-maintained
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>blockchain</category>
      <category>ethereum</category>
      <category>web3</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Fix: node-sass is end-of-life — migrate to Dart Sass in one command</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Tue, 09 Jun 2026 03:57:55 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/fix-node-sass-is-end-of-life-migrate-to-dart-sass-in-one-command-13cg</link>
      <guid>https://dev.to/takundanashebmuchenapixel/fix-node-sass-is-end-of-life-migrate-to-dart-sass-in-one-command-13cg</guid>
      <description>&lt;p&gt;node-sass has been officially deprecated since 2022 and is now end-of-life. It breaks on every new Node.js version upgrade with the error:&lt;/p&gt;

&lt;p&gt;"Node Sass does not yet support your current environment"&lt;/p&gt;

&lt;p&gt;Yet it still gets 3 million+ downloads per week from legacy projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;I published an automated migration CLI:&lt;/p&gt;

&lt;p&gt;npm install -g node-sass-migrate&lt;/p&gt;

&lt;p&gt;Or just run it directly:&lt;/p&gt;

&lt;p&gt;npx node-sass-migrate .&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does automatically
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Replaces node-sass with sass (Dart Sass) in package.json&lt;/li&gt;
&lt;li&gt;Fixes /deep/ → ::v-deep in SCSS files (Vue projects)&lt;/li&gt;
&lt;li&gt;Updates webpack.config.js, vite.config.js, and gulpfile.js references&lt;/li&gt;
&lt;li&gt;Warns about &lt;a class="mentioned-user" href="https://dev.to/import"&gt;@import&lt;/a&gt; deprecations and division operator issues&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why not just swap manually?
&lt;/h2&gt;

&lt;p&gt;Dart Sass is stricter than node-sass. These things break silently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;/deep/ selector throws parse errors&lt;/li&gt;
&lt;li&gt;Division operator ($var / 2) is deprecated — need math.div()&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/import"&gt;@import&lt;/a&gt; is deprecated — will be removed in Dart Sass 2.0&lt;/li&gt;
&lt;li&gt;sass-loader needs to be version 13+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CLI handles the safe fixes automatically and warns you about the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  After running the CLI
&lt;/h2&gt;

&lt;p&gt;Just run npm install and your project should build. If you hit errors, the full migration guide is at &lt;a href="https://nodesassmigrate.netlify.app" rel="noopener noreferrer"&gt;https://nodesassmigrate.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;npm: &lt;a href="https://www.npmjs.com/package/node-sass-migrate" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/node-sass-migrate&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/takundanashebmuchena-pixel/node-sass-migrate" rel="noopener noreferrer"&gt;https://github.com/takundanashebmuchena-pixel/node-sass-migrate&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Fix: babel-plugin-transform-flow-strip-types broken in Babel 7 and 8</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Sun, 07 Jun 2026 15:24:45 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/fix-babel-plugin-transform-flow-strip-types-broken-in-babel-7-and-8-3i9j</link>
      <guid>https://dev.to/takundanashebmuchenapixel/fix-babel-plugin-transform-flow-strip-types-broken-in-babel-7-and-8-3i9j</guid>
      <description>&lt;p&gt;The original babel-plugin-transform-flow-strip-types hasn't been updated in 9 years and breaks silently in Babel 7 and 8 environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;I published a maintained fork that works as a drop-in replacement:&lt;/p&gt;

&lt;p&gt;npm install --save-dev babel-plugin-transform-flow-strip-types-maintained&lt;/p&gt;

&lt;p&gt;Then update your .babelrc:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "plugins": ["transform-flow-strip-types-maintained"]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;That's it. No other changes needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's fixed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Babel 7 and 8 peer dependency conflicts&lt;/li&gt;
&lt;li&gt;Missing syntax plugin declaration&lt;/li&gt;
&lt;li&gt;Deprecated visitor patterns&lt;/li&gt;
&lt;li&gt;allowDeclareFields support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automated migration
&lt;/h2&gt;

&lt;p&gt;If you want to update your entire project automatically:&lt;/p&gt;

&lt;p&gt;npx flow-strip-migrate .&lt;/p&gt;

&lt;p&gt;This updates your package.json and babel config in one command.&lt;/p&gt;

&lt;p&gt;More info: &lt;a href="https://flowstrip.netlify.app" rel="noopener noreferrer"&gt;https://flowstrip.netlify.app&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/babel-plugin-transform-flow-strip-types-maintained" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/babel-plugin-transform-flow-strip-types-maintained&lt;/a&gt;&lt;/p&gt;

</description>
      <category>babel</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Fix: babel-plugin-transform-flow-strip-types broken in Babel 7 and 8</title>
      <dc:creator>takundanashebmuchena-pixel</dc:creator>
      <pubDate>Sun, 07 Jun 2026 15:03:04 +0000</pubDate>
      <link>https://dev.to/takundanashebmuchenapixel/fix-babel-plugin-transform-flow-strip-types-broken-in-babel-7-and-8-493l</link>
      <guid>https://dev.to/takundanashebmuchenapixel/fix-babel-plugin-transform-flow-strip-types-broken-in-babel-7-and-8-493l</guid>
      <description>&lt;p&gt;The original babel-plugin-transform-flow-strip-types hasn't been updated in 9 years and breaks silently in Babel 7 and 8 environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;I published a maintained fork that works as a drop-in replacement:&lt;/p&gt;

&lt;p&gt;npm install --save-dev babel-plugin-transform-flow-strip-types-maintained&lt;/p&gt;

&lt;p&gt;Then update your .babelrc:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "plugins": ["transform-flow-strip-types-maintained"]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;That's it. No other changes needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's fixed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Babel 7 and 8 peer dependency conflicts&lt;/li&gt;
&lt;li&gt;Missing syntax plugin declaration&lt;/li&gt;
&lt;li&gt;Deprecated visitor patterns&lt;/li&gt;
&lt;li&gt;allowDeclareFields support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automated migration
&lt;/h2&gt;

&lt;p&gt;If you want to update your entire project automatically:&lt;/p&gt;

&lt;p&gt;npx flow-strip-migrate .&lt;/p&gt;

&lt;p&gt;This updates your package.json and babel config in one command.&lt;/p&gt;

&lt;p&gt;More info: &lt;a href="https://flowstrip.netlify.app" rel="noopener noreferrer"&gt;https://flowstrip.netlify.app&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/babel-plugin-transform-flow-strip-types-maintained" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/babel-plugin-transform-flow-strip-types-maintained&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
