<?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>Forem: KhaledSalem</title>
    <description>The latest articles on Forem by KhaledSalem (@khaledmsalem).</description>
    <link>https://forem.com/khaledmsalem</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3565357%2F72721ed3-cc00-44d0-89e6-86b75ca3f59c.png</url>
      <title>Forem: KhaledSalem</title>
      <link>https://forem.com/khaledmsalem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/khaledmsalem"/>
    <language>en</language>
    <item>
      <title>How I reduced React +11K module build time from 2.4s to 459ms</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Mon, 20 Apr 2026 18:38:20 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/how-i-reduced-react-11k-module-build-time-from-24s-to-459ms-56n</link>
      <guid>https://forem.com/khaledmsalem/how-i-reduced-react-11k-module-build-time-from-24s-to-459ms-56n</guid>
      <description>&lt;p&gt;A project with +25K dependencies and +11K Module takes 2.4s on Vite8, not to mention the previous Vite, and each day I might need multiple builds, and we have to wait all that time!&lt;/p&gt;

&lt;p&gt;To address this problem I moved away from Vite and developed a &lt;strong&gt;First Persistent Build Intelligence Engine (#Ionify).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We don't run the same loops twice. Ionify introduces "Build Intelligence" via a Long-Lived Dependency Graph &amp;amp; CAS. Time-to-deploy is now instant.&lt;/p&gt;

&lt;p&gt;If you believe complex builds should be instant (we're talking 4000ms for +11k modules). Join the movement!&lt;/p&gt;

&lt;p&gt;⭐️ Star us on #GitHub and let's kill 'Past Amnesia' together: &lt;a href="https://github.com/ionifyjs/ionify" rel="noopener noreferrer"&gt;https://github.com/ionifyjs/ionify&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fi38752vc5wwnxkz5aiyg.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fi38752vc5wwnxkz5aiyg.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Frontend developers should select Ionify?</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Mon, 20 Apr 2026 03:52:38 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/why-frontend-developers-should-select-ionify-34p7</link>
      <guid>https://forem.com/khaledmsalem/why-frontend-developers-should-select-ionify-34p7</guid>
      <description>&lt;p&gt;Over 10 years of experience in software. I realized that moving from Webpack to Vite was a linear improvement, while the core problem remains: stateless and reprocessing.&lt;/p&gt;

&lt;p&gt;Build tools were getting faster, but not architectural intelligence. Leveraging my background in software engineering and system design, I recognized that this was not just a tooling issue. but a deeper architectural limitation.&lt;/p&gt;

&lt;p&gt;I decided to bridge this gap by applying Content Addressable Storage (CAS) principles. This shift from 'tools that run' to an 'engine that remembers' allows the build process to become cumulative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ionify&lt;/strong&gt; wasn't born from a need for another tool, but from a necessity to fix the fundamental architectural amnesia of modern development pipelines.&lt;/p&gt;

&lt;p&gt;We're #building the future of persistent infrastructure with #Ionify If you believe enterprise builds should be instant (we're talking sub-100ms for +11k modules). Join the movement! ⭐️ Star us on #GitHub and let's kill &lt;strong&gt;'Past Amnesia'&lt;/strong&gt; together: &lt;a href="https://github.com/ionifyjs/ionify" rel="noopener noreferrer"&gt;https://github.com/ionifyjs/ionify&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  React #WebDevelopment #Frontend #Vite #JavaScript #Rust #WebDev #BuildPerformance #OXC #Ionify
&lt;/h1&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.amazonaws.com%2Fuploads%2Farticles%2Fiwlu1bkfzp60z39wan8e.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fiwlu1bkfzp60z39wan8e.png" alt=" " width="800" height="1047"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>rust</category>
      <category>ionify</category>
    </item>
    <item>
      <title>build time from 2.4s to 459ms</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Thu, 16 Apr 2026 23:57:44 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/build-time-from-24s-to-459ms-ae9</link>
      <guid>https://forem.com/khaledmsalem/build-time-from-24s-to-459ms-ae9</guid>
      <description>&lt;p&gt;A project from +11K module had 1500 ms warm build using Ionify. Today we reached 400 ms.&lt;/p&gt;

&lt;p&gt;While Vite8 takes 2.2s.&lt;/p&gt;

&lt;p&gt;I am publishing this new version of Ionify now!&lt;/p&gt;

&lt;p&gt;We don't run the same loops twice. Ionify introduces "Build Intelligence" via a Long-Lived Dependency Graph &amp;amp; CAS. Time-to-deploy is now instant. Join the memory revolution: (&lt;a href="https://ionify.cloud)" rel="noopener noreferrer"&gt;https://ionify.cloud)&lt;/a&gt;]&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.amazonaws.com%2Fuploads%2Farticles%2Fo8p1lmclv7hxgev7ljf2.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fo8p1lmclv7hxgev7ljf2.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>vite</category>
      <category>programming</category>
    </item>
    <item>
      <title>Moving from Webpack and Vite to Ionify is filling this gap</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Mon, 13 Apr 2026 11:12:42 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/moving-from-webpack-and-vite-to-ionify-is-filling-this-gap-281l</link>
      <guid>https://forem.com/khaledmsalem/moving-from-webpack-and-vite-to-ionify-is-filling-this-gap-281l</guid>
      <description>&lt;p&gt;Modern frontend tooling is stateless, forcing repeated work on every build. This leads to slow feedback loops, wasted compute, and poor scalability as applications grow.&lt;/p&gt;

&lt;p&gt;Moving from Webpack and Vite to Ionify is filling this gap!!&lt;/p&gt;

&lt;p&gt;While Vite repeats work and uses plugins to understand React... Ionify uses CAS "content-addressable cache", and a persistent dependency graph.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@ionify/ionify" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@ionify/ionify&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Figc8lqs6303x7k2e52wu.png" 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.amazonaws.com%2Fuploads%2Farticles%2Figc8lqs6303x7k2e52wu.png" alt=" " width="800" height="1047"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>vite</category>
      <category>webpack</category>
    </item>
    <item>
      <title>While #Vite repeats work and uses plugins to understand #React... Ionify uses CAS "content-addressable cache", and a persistent dependency graph.

Explore more at https://ionify.cloud/</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Sun, 12 Apr 2026 09:05:34 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/while-vite-repeats-work-and-uses-plugins-to-understand-react-ionify-uses-cas-3a8e</link>
      <guid>https://forem.com/khaledmsalem/while-vite-repeats-work-and-uses-plugins-to-understand-react-ionify-uses-cas-3a8e</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://ionify.cloud/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fionify.cloud%2Flogo%2FIonify-dark-logo.png" height="1018" class="m-0" width="763"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://ionify.cloud/" rel="noopener noreferrer" class="c-link"&gt;
            Ionify — The Build Engine That Doesn’t Start Over
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Ionify is a Rust-powered build engine with a persistent dependency graph and content-addressable cache. One unified pipeline for dev, build, and test.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fionify.cloud%2Ffavicon.svg" width="64" height="64"&gt;
          ionify.cloud
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Vite is fast, but it's still wasting your time. 🚩</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Sat, 11 Apr 2026 21:29:20 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/vite-is-fast-but-its-still-wasting-your-time-4ae9</link>
      <guid>https://forem.com/khaledmsalem/vite-is-fast-but-its-still-wasting-your-time-4ae9</guid>
      <description>&lt;p&gt;There, I said it. We’ve all been tricked into thinking that a "faster compiler" is the solution to slow development cycles. It’s not.&lt;/p&gt;

&lt;p&gt;If your build tool doesn't have a memory, it’s just a faster treadmill. You’re still running, but you’re going nowhere.&lt;/p&gt;

&lt;p&gt;Every time you hear your laptop fans kick in for a "re-build" of something you built 10 minutes ago, you should be angry. That’s not "Modern Dev," that’s Redundant Work.&lt;/p&gt;

&lt;p&gt;We built Ionify to stop this madness.&lt;br&gt;
While others optimize the "run," we eliminated the "repeat."&lt;/p&gt;

&lt;p&gt;If you’re still okay with your tool forgetting your project state every time you restart, keep using Vite. If you want an engine that actually learns your codebase:&lt;/p&gt;

&lt;p&gt;🔗 ionify.cloud&lt;/p&gt;

&lt;p&gt;Github Repo for latest new and issues: &lt;a href="https://github.com/ionifyjs/ionify/" rel="noopener noreferrer"&gt;https://github.com/ionifyjs/ionify/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>react</category>
      <category>vite</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Move From Vite To Ionify</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Sat, 11 Apr 2026 12:14:35 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/move-from-vite-to-ionify-4dj6</link>
      <guid>https://forem.com/khaledmsalem/move-from-vite-to-ionify-4dj6</guid>
      <description>&lt;p&gt;If you are a Frontend developer. Moving from Vite to Ionify is moving from repeating tool work and plugin hooks to Engine with a memory and no plugin hooks!&lt;/p&gt;

&lt;p&gt;Try Ionify now, and I am totally sure you will not be able to reverse from Engine to tools again!&lt;/p&gt;

&lt;p&gt;It's not about performance only! It's moving from a tool mindset to an engine mindset!&lt;/p&gt;

&lt;p&gt;at Ionify: If the file content changes, the moduleHash changes, so the new transformed output goes to a new CAS path. The old one can still physically exist on disk, but the engine now points to the new hash.&lt;/p&gt;

&lt;p&gt;That means if Ionify grows with your project and learns from the growing path to provid comperhansive analysis and help!&lt;/p&gt;

&lt;p&gt;Explore all of this now and more at &lt;br&gt;
&lt;a href="https://ionify.cloud/" rel="noopener noreferrer"&gt;https://ionify.cloud/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/ionifyjs/ionify" rel="noopener noreferrer"&gt;https://github.com/ionifyjs/ionify&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>vite</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Most tools optimize speed.
I’m trying to eliminate repeated work.

Why are we doing the same transforms again?

Genuinely curious!

Do you see this as a limitation… or just how things are supposed to work?

https://ionify.cloud/

#WebDev #Frontend #Vite</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Thu, 09 Apr 2026 17:06:29 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/most-tools-optimize-speed-im-trying-to-eliminate-repeated-work-why-are-we-doing-the-same-47md</link>
      <guid>https://forem.com/khaledmsalem/most-tools-optimize-speed-im-trying-to-eliminate-repeated-work-why-are-we-doing-the-same-47md</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://ionify.cloud/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fionify.cloud%2Flogo%2FIonify-dark-logo.png" height="1018" class="m-0" width="763"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://ionify.cloud/" rel="noopener noreferrer" class="c-link"&gt;
            Ionify — The Build Engine That Doesn’t Start Over
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Ionify is a Rust-powered build engine with a persistent dependency graph and content-addressable cache. One unified pipeline for dev, build, and test.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fionify.cloud%2Ffavicon.svg" width="64" height="64"&gt;
          ionify.cloud
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>If you’re a Frontend developer .. Does your tool need plugins to understand your framework?</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Thu, 09 Apr 2026 01:59:27 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/if-youre-a-frontend-developer-does-your-tool-need-plugins-to-understand-your-framework-2705</link>
      <guid>https://forem.com/khaledmsalem/if-youre-a-frontend-developer-does-your-tool-need-plugins-to-understand-your-framework-2705</guid>
      <description>&lt;p&gt;If you’re a Frontend developer and your tool needs plugins to understand your framework… Then your transformer doesn’t actually understand it.&lt;/p&gt;

&lt;p&gt;Plugins are not a feature. They’re a workaround.&lt;/p&gt;

&lt;p&gt;Ionify does not require plugins; instead, it understands the framework as a part of its core!&lt;/p&gt;

&lt;p&gt;Explore ionify now at &lt;a href="https://ionify.cloud" rel="noopener noreferrer"&gt;https://ionify.cloud&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Started us at GitHub and get the latest news at &lt;a href="https://lnkd.in/dHiVER9X" rel="noopener noreferrer"&gt;https://lnkd.in/dHiVER9X&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For any issues, we love to talk at &lt;a href="https://lnkd.in/eTcsWzum" rel="noopener noreferrer"&gt;https://lnkd.in/eTcsWzum&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Slimm-Pack Vs Tree-shaking</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:03:42 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/slimm-pack-vs-tree-shaking-3cjk</link>
      <guid>https://forem.com/khaledmsalem/slimm-pack-vs-tree-shaking-3cjk</guid>
      <description>&lt;p&gt;Tree-shaking runs every build.&lt;/p&gt;

&lt;p&gt;Slimm-Pack doesn’t.&lt;/p&gt;




&lt;p&gt;Traditional tools:&lt;br&gt;
analyze → build → forget&lt;/p&gt;

&lt;p&gt;Ionify:&lt;br&gt;
analyze → store → reuse&lt;/p&gt;




&lt;p&gt;This is not optimization.&lt;/p&gt;

&lt;p&gt;This is a different architecture.&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.amazonaws.com%2Fuploads%2Farticles%2F001pte3akyu4icb1li6h.png" 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.amazonaws.com%2Fuploads%2Farticles%2F001pte3akyu4icb1li6h.png" alt=" " width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>react</category>
    </item>
    <item>
      <title>Ionify vs Vite: What Actually Happens Inside Your Build Tool</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Tue, 07 Apr 2026 19:24:35 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/ionify-vs-vite-what-actually-happens-inside-your-build-tool-2end</link>
      <guid>https://forem.com/khaledmsalem/ionify-vs-vite-what-actually-happens-inside-your-build-tool-2end</guid>
      <description>&lt;p&gt;Most developers use Vite and trust it. It's fast, well-designed, and gets out of the way.&lt;/p&gt;

&lt;p&gt;But there's a fundamental assumption baked into Vite's architecture — and every other major build tool — that we decided to challenge when building Ionify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The assumption: every build starts from zero.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post is a deep look at what that means in practice, what we built instead, and the architectural tradeoffs we made along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stateless Build Problem
&lt;/h2&gt;

&lt;p&gt;When you run &lt;code&gt;vite build&lt;/code&gt;, here's roughly what happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vite spins up esbuild/Rollup (now powered by Rolldown + Oxc instead of pure Rollup/Babel in many cases)&lt;/li&gt;
&lt;li&gt;Each file goes through its plugin chain independently&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main.tsx&lt;/code&gt; → TS plugin → JSX plugin → output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils.ts&lt;/code&gt; → TS plugin → output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;index.css&lt;/code&gt; → CSS plugin → output&lt;/li&gt;
&lt;li&gt;Everything gets bundled&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The next time you run it? Same thing. &lt;strong&gt;All of it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's no memory of what already ran. The TS plugin doesn't know the JSX plugin already processed a file. The bundler doesn't know which files actually changed since last time. The entire pipeline is stateless by design.&lt;/p&gt;

&lt;p&gt;This isn't a bug — it's a deliberate architectural choice that keeps the tool simple and predictable. But it has a real cost at scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Ionify Thinks About This Differently
&lt;/h2&gt;

&lt;p&gt;Instead of transforming files, &lt;strong&gt;Ionify addresses them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every module gets a content hash:&lt;/p&gt;

&lt;p&gt;Same content + same config = same hash = skip the transform entirely.&lt;/p&gt;

&lt;p&gt;Not faster transforms. &lt;strong&gt;No transforms at all&lt;/strong&gt; — for everything that hasn't changed.&lt;/p&gt;




&lt;p&gt;When a file changes, Ionify runs a BFS over the reverse dependency index to find exactly which modules are affected:&lt;/p&gt;

&lt;p&gt;This means on a 500-module project, changing one utility file might only invalidate 12 modules — not all 500.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four-Tier CAS Architecture
&lt;/h2&gt;

&lt;p&gt;As the system evolved, we ended up with four distinct caching layers, each solving a different problem:&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 1 — Module Transform Cache
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Tier 2 — Deps Artifact Store
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Tier 3 — Compression CAS
&lt;/h3&gt;

&lt;p&gt;Pre-compressed build outputs. Brotli-11 + gzip-9 computed once, served forever.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 4 — Chunk-Output CAS
&lt;/h3&gt;




&lt;h2&gt;
  
  
  Real Config: Migrating from Vite
&lt;/h2&gt;

&lt;p&gt;Here's an actual &lt;code&gt;ionify.config.ts&lt;/code&gt; from a production project that migrated from Vite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ionify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/src/main.tsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;https&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="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Same aliases as tsconfig — Ionify reads these natively&lt;/span&gt;
    &lt;span class="c1"&gt;// Note: if your tsconfig.json is JSONC (comments/trailing commas),&lt;/span&gt;
    &lt;span class="c1"&gt;// auto-alias parsing currently fails — specify manually here&lt;/span&gt;
    &lt;span class="na"&gt;alias&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="s1"&gt;@@&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="s1"&gt;/&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="s1"&gt;@@/Core&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="s1"&gt;/Core/src&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="s1"&gt;@&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="s1"&gt;/src&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="na"&gt;extensions&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="s1"&gt;.mjs&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="s1"&gt;.js&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="s1"&gt;.mts&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="s1"&gt;.ts&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="s1"&gt;.jsx&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="s1"&gt;.tsx&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="s1"&gt;.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;conditions&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="s1"&gt;import&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="s1"&gt;module&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="s1"&gt;browser&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="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;mainFields&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="s1"&gt;module&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="s1"&gt;jsnext:main&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="s1"&gt;jsnext&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="s1"&gt;main&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="na"&gt;optimizeDeps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;include&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="s1"&gt;moment-hijri&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;   &lt;span class="c1"&gt;// pre-warm known-problem deps&lt;/span&gt;
    &lt;span class="na"&gt;sharedChunks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;packSlimming&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;vendorPacks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auto&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="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esnext&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;h2&gt;
  
  
  This project has more than +10K module and the results of build time at vite roll-down was 2.4 seconds every time with a lot of configs to reach this time! after migrating to Ionify. The time was reduced to 400ms on warm build, and 3.2 seconds for cold build
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The Fundamental Difference
&lt;/h2&gt;

&lt;p&gt;Vite is built around the assumption that each build is independent.&lt;/p&gt;

&lt;p&gt;Ionify is built around the assumption that &lt;strong&gt;most of the work you did last time is still valid.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both assumptions are reasonable. Vite's leads to a simpler, more predictable system. Ours leads to a system where the second build, the tenth build, and the CI build all benefit from everything that happened before.&lt;/p&gt;

&lt;p&gt;The "With Ionify" side of the transform diagram is mostly empty. Not because we're hiding complexity — but because most of the transforms simply don't run.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Ionify is currently in production use. → &lt;a href="https://ionify.cloud" rel="noopener noreferrer"&gt;ionify.cloud&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/khaledM-salem/embed/PwGdqgx?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>tooling</category>
      <category>webpack</category>
    </item>
    <item>
      <title>𝗜𝗳 𝘆𝗼𝘂'𝗿𝗲 𝗮 𝗳𝗿𝗼𝗻𝘁𝗲𝗻𝗱 𝗱𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿, 𝘆𝗼𝘂 𝘀𝗵𝗼𝘂𝗹𝗱 𝘀𝗲𝗿𝗶𝗼𝘂𝘀𝗹𝘆 𝗿𝗲𝘁𝗵𝗶𝗻𝗸 𝘆𝗼𝘂𝗿 𝗮𝗿𝗰𝗵𝗶𝘁𝗲𝗰𝘁𝘂𝗿𝗲. Move to a persistent graph + CAS-first engine.</title>
      <dc:creator>KhaledSalem</dc:creator>
      <pubDate>Mon, 06 Apr 2026 13:32:32 +0000</pubDate>
      <link>https://forem.com/khaledmsalem/-move-to-a-1b43</link>
      <guid>https://forem.com/khaledmsalem/-move-to-a-1b43</guid>
      <description>&lt;p&gt;𝗜𝗳 𝘆𝗼𝘂'𝗿𝗲 𝗮 𝗳𝗿𝗼𝗻𝘁𝗲𝗻𝗱 𝗱𝗲𝘃𝗲𝗹𝗼𝗽𝗲𝗿, 𝘆𝗼𝘂 𝘀𝗵𝗼𝘂𝗹𝗱 𝘀𝗲𝗿𝗶𝗼𝘂𝘀𝗹𝘆 𝗿𝗲𝘁𝗵𝗶𝗻𝗸 𝘆𝗼𝘂𝗿 𝗮𝗿𝗰𝗵𝗶𝘁𝗲𝗰𝘁𝘂𝗿𝗲.&lt;br&gt;
Move to a persistent graph + CAS-first engine.&lt;/p&gt;

&lt;p&gt;╭────────────────────────────────╮&lt;br&gt;
│ pnpm create ionify@latest   │&lt;br&gt;
╰────────────────────────────────╯&lt;/p&gt;

&lt;p&gt;And you’ll feel the difference:&lt;br&gt;
▸ faster cold starts&lt;br&gt;
▸ near-zero repeated work&lt;br&gt;
▸ builds that don’t redo what’s already done&lt;/p&gt;

&lt;p&gt;Ionify isn’t just another tool. It’s built on:&lt;br&gt;
▸ Persistent dependency graph&lt;br&gt;
▸ Content Addressable Storage (CAS)&lt;br&gt;
And this is just the beginning.&lt;/p&gt;

&lt;p&gt;We’re rolling out more — step by step.&lt;/p&gt;

&lt;p&gt;⭐ Follow the journey: &lt;a href="https://lnkd.in/dHiVER9X" rel="noopener noreferrer"&gt;https://lnkd.in/dHiVER9X&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💬 Found an issue? Open one — we actively respond:&lt;br&gt;
&lt;a href="https://lnkd.in/eTcsWzum" rel="noopener noreferrer"&gt;https://lnkd.in/eTcsWzum&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 Try it now: &lt;a href="https://ionify.cloud/" rel="noopener noreferrer"&gt;https://ionify.cloud/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>react</category>
      <category>ionify</category>
    </item>
  </channel>
</rss>
