<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>VoidZero</title>
        <link>https://voidzero.dev</link>
        <description></description>
        <lastBuildDate>Mon, 06 Apr 2026 00:07:04 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>VoidZero</title>
            <url>https://voidzero.dev/logo.svg</url>
            <link>https://voidzero.dev</link>
        </image>
        <copyright>Copyright (c) 2024-present, VoidZero Inc.</copyright>
        <item>
            <title><![CDATA[Tales from the Void: March 2026 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-mar-2026</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-mar-2026</guid>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>Tales from the Void!</em></p>
<p>Regularly, we recap the project updates for Void, Vite+, Vite, Vitest, Rolldown, Oxc, and what’s happening in our community.</p>
<h2 id="well-integrated-not-stitched-together" tabindex="-1">Well-Integrated, Not Stitched Together <a class="header-anchor" href="#well-integrated-not-stitched-together" aria-label="Permalink to “Well-Integrated, Not Stitched Together”">&#8203;</a></h2>
<p>In March we came closer to realizing our vision of a unified toolchain:</p>
<ul>
<li><a href="https://oxc.rs/blog/2026-03-11-oxlint-js-plugins-alpha.html" target="_blank" rel="noreferrer">Oxlint JS plugins</a> let you run your existing ESLint plugins.</li>
<li><a href="https://vite.dev/blog/announcing-vite8" target="_blank" rel="noreferrer">Vite 8</a> now ships with Rolldown as its bundler, meaning every Vite user runs on Oxc under the hood.</li>
<li><a href="/posts/announcing-vite-plus-alpha.html">Vite+</a> takes it further by combining Vite, Vitest, tsdown, Oxlint, and Oxfmt into a single CLI.</li>
</ul>
<p>With <a href="/posts/whats-new-march-launch-week-2026.html">all of that shipping in one month</a>, it's worth stepping back and talking about what ties it together.</p>
<p>Most JavaScript toolchains are independent tools plumbed together. Each parses your code separately, each has its own config, and they often conflict with each other. Your linter disagrees with your formatter, your bundler doesn't understand your test setup, and you end up debugging the gaps between tools instead of shipping features.</p>
<p>Our tools take a different approach. Rolldown, Oxlint, and Oxfmt share a common foundation: one parser, one resolver, and one module interop layer provided by Oxc. Vite is powered by Rolldown, so the whole stack benefits from the shared core and works together seamlessly. <strong>Every further improvement to Oxc benefits the entire tooling suite</strong> and those improvements come with <a href="https://oxc.rs/docs/guide/benchmarks.html#all-benchmarks" target="_blank" rel="noreferrer">significant performance gains</a> across the board.</p>
<p>Good integration leads to good compatibility. The biggest mistake in building a new generation of tools is to ignore the existing ecosystem. By prioritizing compatibility with existing tools, migration and adoption become much easier. That's why:</p>
<ul>
<li>Rolldown supports Rollup's plugin API,</li>
<li>Oxfmt <a href="https://oxc.rs/blog/2026-02-24-oxfmt-beta.html#_100-prettier-compatibility" target="_blank" rel="noreferrer">is 100% conformant</a> with Prettier's formatting rules, and</li>
<li>Oxlint <a href="https://oxc.rs/blog/2026-03-11-oxlint-js-plugins-alpha.html" target="_blank" rel="noreferrer">can run existing ESLint plugins</a> significantly faster, <em>with zero code changes</em>.</li>
</ul>
<p>Thanks to <a href="https://viteplus.dev/" target="_blank" rel="noreferrer">Vite+</a>, you get all of this as a single CLI and can focus on your app instead of wiring your toolchain together.</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="void" tabindex="-1">Void <a class="header-anchor" href="#void" aria-label="Permalink to “Void”">&#8203;</a></h3>
<p><strong>Void was announced</strong>: Evan You presented the new deployment platform built for Vite applications. Run <code>void deploy</code> and Void builds, provisions, and deploys your app. Need a database, auth, or AI inference? Import the SDK and Void provisions it automatically from your code. <a href="https://void.cloud/" target="_blank" rel="noreferrer">Sign up for the early access</a> to be among the first to try it out.</p>
<div class="video-embed">
  <iframe src="https://www.youtube.com/embed/Bp86buftbX8" title="Announcing Void" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div>
<h3 id="vite" tabindex="-1">Vite+ <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite+”">&#8203;</a></h3>
<ul>
<li><a href="https://viteplus.dev/" target="_blank" rel="noreferrer">Vite+</a> is now <a href="https://github.com/voidzero-dev/vite-plus" target="_blank" rel="noreferrer">fully open-sourced under MIT license</a>. A single <code>vp</code> binary that combines Vite, Vitest, Oxlint, Oxfmt, Rolldown, and tsdown with built-in task running, caching, and monorepo support.</li>
<li>First <a href="https://github.com/voidzero-dev/vite-plus/releases" target="_blank" rel="noreferrer">post-launch updates already shipped</a>: Svelte template, tab completion, Linux musl support, and more.</li>
<li>Vite+ now <a href="https://github.com/voidzero-dev/vite-plus/issues/557" target="_blank" rel="noreferrer">supports Bun as package manager</a> in addition to pnpm, npm, and Yarn.</li>
<li>Vite Task (<code>vp run</code>) has a new <a href="https://github.com/voidzero-dev/vite-task/pull/309" target="_blank" rel="noreferrer"><code>--parallel</code> flag</a> to run multiple tasks in parallel.</li>
</ul>
<div class="video-embed">
  <iframe src="https://www.youtube.com/embed/AJxH3Gvb-PU" title="Announcing Vite+ Alpha" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div>
<TwitterEmbed url="https://x.com/boshen_c/status/2034481371641712967" /><h3 id="vite-1" tabindex="-1">Vite <a class="header-anchor" href="#vite-1" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li><a href="https://vite.dev/blog/announcing-vite8" target="_blank" rel="noreferrer">Vite 8</a> has been released, bringing major architectural improvements with Rolldown as the new bundler.</li>
<li>Subsequent Vite patch versions <a href="https://github.com/vitejs/vite/releases/tag/v8.0.1" target="_blank" rel="noreferrer">8.0.1</a> and <a href="https://github.com/vitejs/vite/releases/tag/v8.0.2" target="_blank" rel="noreferrer">8.0.2</a> and <a href="https://github.com/vitejs/vite/releases/tag/v8.0.3" target="_blank" rel="noreferrer">8.0.3</a> shipped with early bug fixes based on community feedback.</li>
<li>The Vite React plugin major version 6 is now available, coming with Vite 8 support and without Babel by default, reducing its install size.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2034733477082365984" /><h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li><a href="https://vitest.dev/blog/vitest-4-1.html" target="_blank" rel="noreferrer">Vitest 4.1</a> is now stable with first-class Vite 8 support from day one and a bunch of new features, including async leak detection, test tags, and more.</li>
<li><a href="https://github.com/vitest-dev/vitest/discussions/9664" target="_blank" rel="noreferrer">Planning for Vitest 5</a> has started! Share your feedback and thoughts in the GitHub discussion.</li>
<li>In the future you can <a href="https://github.com/vitest-dev/vitest/pull/9928/" target="_blank" rel="noreferrer">integrate a custom version control provider</a> via <code>experimental.vcsProvider</code> for better change detection in Vitest.</li>
</ul>
<h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li><a href="https://github.com/rolldown/rolldown/pull/8465" target="_blank" rel="noreferrer">DCE-only minification</a> and <a href="https://github.com/rolldown/rolldown/pull/8444" target="_blank" rel="noreferrer">smart constant inlining</a> now enabled by default, allowing smaller bundles without extra config.</li>
<li>Full filesystem watcher landed <a href="https://github.com/rolldown/rolldown/pull/8575" target="_blank" rel="noreferrer">in WASM builds</a> enabling proper watch mode in browser-based tooling. In collaboration with StackBlitz, watcher support was also brought to WebContainer environments.</li>
<li>Better <a href="https://github.com/rolldown/rolldown/pull/8565" target="_blank" rel="noreferrer"><code>new URL()</code> detection</a> with <code>import.meta.url</code> which leads to more reliable static asset handling.</li>
<li>You can now omit source content from sourcemaps for smaller output files via <a href="https://rolldown.rs/reference/OutputOptions.sourcemapExcludeSources#sourcemapexcludesources" target="_blank" rel="noreferrer"><code>output.sourcemapExcludeSources</code></a>.</li>
<li>Bundle analyzer outputs <a href="https://github.com/rolldown/rolldown/pull/8242" target="_blank" rel="noreferrer">LLM-friendly markdown</a>, which can be sent directly to your agent for an efficient analysis.</li>
</ul>
<TwitterEmbed url="https://x.com/sanxiaozhizi/status/2033593069992612339" /><h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li><a href="https://oxc.rs/blog/2026-03-11-oxlint-js-plugins-alpha.html" target="_blank" rel="noreferrer">Oxlint JS Plugins Alpha</a> shipped, bringing near-100% ESLint plugin compatibility with up to 100x faster linting.</li>
<li>New React rules added to Oxlint to discourage legacy patterns: <a href="https://github.com/oxc-project/oxc/pull/20129" target="_blank" rel="noreferrer"><code>react/no-clone-element</code></a> and <a href="https://github.com/oxc-project/oxc/pull/20104" target="_blank" rel="noreferrer"><code>react/no-react-children</code></a>.</li>
<li>Oxlint and Oxfmt both support dynamic configs: If you don't use Vite+ already, you can now utilize <a href="https://github.com/oxc-project/oxc/pull/17563" target="_blank" rel="noreferrer"><code>oxlint.config.ts</code></a> or <a href="https://github.com/oxc-project/oxc/pull/20135" target="_blank" rel="noreferrer"><code>oxfmt.config.ts</code></a> for maximum flexibility in your linting and formatting rules.</li>
<li>New <a href="https://github.com/oxc-project/oxc/pull/19799" target="_blank" rel="noreferrer"><code>reportUnusedDisableDirectives</code></a> option catches unnecessary lint disable comments when using Oxlint.</li>
<li>Oxfmt added <a href="https://github.com/oxc-project/oxc/pull/19703" target="_blank" rel="noreferrer">GraphQL template literal formatting</a> and <a href="https://github.com/oxc-project/oxc/pull/20130" target="_blank" rel="noreferrer">improved Vue SFC support</a>.</li>
<li>Oxfmt can <a href="https://oxc.rs/docs/guide/usage/formatter/config-file-reference.html#jsdoc" target="_blank" rel="noreferrer">now format your JSDoc comments</a> for a consistent documentation style.</li>
<li><a href="https://github.com/oxc-project/oxc/pull/19102" target="_blank" rel="noreferrer">&quot;Did you mean?&quot; suggestions</a> now appear for undefined variable names, catching typos earlier.</li>
</ul>
<TwitterEmbed url="https://x.com/Cameron_C2/status/2031298150573482198" /><TwitterEmbed url="https://x.com/Cameron_C2/status/2029876142224572641" /><h2 id="upcoming-events" tabindex="-1">Upcoming Events <a class="header-anchor" href="#upcoming-events" aria-label="Permalink to “Upcoming Events”">&#8203;</a></h2>
<p>To catch talks and presentations from VoidZero team members, see the following events where they will present:</p>
<ul>
<li>Catch Jim aka. overlookmotel at <a href="https://london.cityjsconf.org/" target="_blank" rel="noreferrer">CityJS London</a> running from April 15th to 17th.</li>
<li><a href="https://laravellive.jp/en#speakers" target="_blank" rel="noreferrer">Laravel Live Japan 2026</a> will feature a talk from Alexander Lichter on VoidZero's unified toolchain vision on May 26th.</li>
<li>Alexander Lichter will join <a href="https://enterjs.de/veranstaltung-86570-0-vue-im-jahr-2026-zukunftssicher-oder-sackgasse.html" target="_blank" rel="noreferrer">enterJS 2026</a> in Mannheim, Germany on June 16th.</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From The Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From The Community”">&#8203;</a></h2>
<ul>
<li>Boshen <a href="https://x.com/boshen_c/status/2031729404758655276" target="_blank" rel="noreferrer">shared the story</a> of his involvement from Rome all the way to Vite+</li>
<li>Listen to the <a href="https://www.youtube.com/watch?v=A673RO0xnjs" target="_blank" rel="noreferrer">new SyntaxFM podcast episode about Vite+</a> and find out what Scott, Wes, and CJ think about the new toolchain.</li>
<li>The Syntax crew also discussed our upcoming Void platform <a href="https://www.youtube.com/watch?v=wtkZUdkUHhc" target="_blank" rel="noreferrer">in their recent video</a>.</li>
<li><a href="https://npmx.dev/blog/alpha-release" target="_blank" rel="noreferrer">npmx.dev launched in alpha</a>, a fast, modern npm registry browser built on top of Vite and using Vite+.</li>
<li>Alvaro Saburido <a href="https://www.youtube.com/watch?v=7M7kEOXeRBY" target="_blank" rel="noreferrer">tried to migrate Tres.js over to Vite+</a> and recorded his experience.</li>
<li>James Long discussed <a href="https://softwareengineeringdaily.com/2026/03/19/prettier-and-opinionated-code-formatting-with-james-long/" target="_blank" rel="noreferrer">Oxfmt, Prettier, and opinionated code formatting</a> on the Software Engineering Daily podcast.</li>
<li>Krzysztof Sordyl shared <a href="https://bsky.app/profile/krzysztof-sordyl.bsky.social/post/3mgzl75oyq22l" target="_blank" rel="noreferrer">practical experiences with Vitest's async leak detection</a> feature.</li>
<li>Analog <a href="https://github.com/analogjs/analog/pull/2114" target="_blank" rel="noreferrer">migrated from ESLint to Oxlint</a> with type-aware linting support.</li>
<li>Anthropic <a href="https://x.com/felixrieseberg/status/2034688574239776778" target="_blank" rel="noreferrer">migrated Claude to TanStack Start + Vite</a>.</li>
<li>Nuno Maduro <a href="https://youtu.be/FVXKm3vrDR4?t=4686" target="_blank" rel="noreferrer">tried out Vite+</a> live on stream and shared his experience with the migration.</li>
<li>Elise Patrikainen <a href="https://www.youtube.com/watch?v=BnjjUAQZ4CI" target="_blank" rel="noreferrer">gave a talk</a> about the future of The JavaScript toolchain, sharing the latest updates on VoidZero tooling and the vision behind it at React Paris.</li>
<li>Syntax's <a href="https://www.youtube.com/watch?v=6fj1WC-JuQc" target="_blank" rel="noreferrer">StateOfJS review</a> covered Vite, Vitest, Oxlint, and the broader ecosystem.</li>
<li>A community writer published <a href="https://idrank.vodka/void-validates" target="_blank" rel="noreferrer">their perspective on the Void platform and vendor lock-in</a>.</li>
<li>Erik Hanchett wrote about <a href="https://dev.to/erikch/i-tried-vite-and-replaced-my-entire-frontend-toolchain-4cgb" target="_blank" rel="noreferrer">replacing his entire frontend toolchain with Vite+</a>.</li>
<li>The author of PostCSS moved their open source projects <a href="https://x.com/sitnikcode/status/2038927761977266579" target="_blank" rel="noreferrer">to Oxfmt and Oxlint</a>.</li>
<li>Cloudflare <a href="https://x.com/rozenmd/status/2037582692355621289" target="_blank" rel="noreferrer">saves 3.75 days compute per day</a> by switching from ESLint to Oxlint</li>
</ul>
<TwitterEmbed url="https://twitter.com/zeeg/status/2034301383311319363" /><TwitterEmbed url="https://twitter.com/thdxr/status/2034085421848649742" /><TwitterEmbed url="https://x.com/shuding/status/2034228876856209850" /><TwitterEmbed url="https://x.com/kentcdodds/status/2036692778735022449" />]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Tales from the Void: March Launch Week Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-march-launch-week-2026</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-march-launch-week-2026</guid>
            <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>Welcome to a special edition of <em>Tales from the Void</em>! Last weeks <strong>VoidZero Launch Week</strong> brought changes to how you build, test, lint, and deploy JavaScript.</p>
<p>Here's what shipped and why it matters.</p>
<h2 id="oxlint-js-plugins-alpha" tabindex="-1">Oxlint: JS Plugins Alpha <a class="header-anchor" href="#oxlint-js-plugins-alpha" aria-label="Permalink to “Oxlint: JS Plugins Alpha”">&#8203;</a></h2>
<p>Oxlint's JS Plugins Alpha brings <strong>near-100% compatibility</strong> with the ESLint plugin ecosystem. Your existing ESLint plugins run inside Oxlint <strong>unmodified</strong>, alongside 650+ native Rust rules, while linting <strong>up to 100x faster</strong> than ESLint.</p>
<p><strong>Why it matters</strong>: For around 80% of ESLint users Oxlint is a <strong>true drop-in replacement.</strong> Thanks to <code>@oxlint/migrate</code> you can migrate automatically without changing your ruleset.
That means you get significantly faster linting in CI and locally, shorter feedback loops while coding, and less time waiting on pre-commit hooks.
Already in production at Midjourney, Preact, and PostHog.</p>
<p>Make sure to <a href="https://oxc.rs/blog/2026-03-11-oxlint-js-plugins-alpha.html" target="_blank" rel="noreferrer"><strong>read the Oxlint JS Plugins alpha announcement</strong></a> for more technical details and to <a href="https://oxc.rs/docs/guide/usage/linter/migrate-from-eslint" target="_blank" rel="noreferrer"><strong>check out the Oxlint migration guide</strong></a>.</p>
<div  class="info custom-block"><p class="custom-block-title">Known Gaps</p>
<p>Plugins with custom parsers (e.g. for Vue or Svelte templates) and custom type-aware rules in JavaScript aren't supported yet.</p>
<p>Both are on the roadmap, and the built-in type-aware rules cover most use cases in the meantime.</p>
</div>
<h2 id="vite-8-one-bundler-to-replace-two" tabindex="-1">Vite 8: One Bundler to Replace Two <a class="header-anchor" href="#vite-8-one-bundler-to-replace-two" aria-label="Permalink to “Vite 8: One Bundler to Replace Two”">&#8203;</a></h2>
<p>Vite 8 is the most significant architectural change since Vite 2. <strong>Rolldown</strong>, a Rust-based bundler, now replaces both esbuild and Rollup. This change unifies development and production into a single bundler that is <strong>10-30x faster than Rollup</strong> while maintaining full plugin compatibility.</p>
<p>Beyond the new bundler, Vite 8 ships with:</p>
<ul>
<li>Integrated <a href="https://github.com/vitejs/devtools" target="_blank" rel="noreferrer"><strong>Vite Devtools</strong></a> for debugging and build analysis,</li>
<li>built-in <a href="https://vite.dev/guide/features#paths" target="_blank" rel="noreferrer"><strong><code>tsconfig</code> paths support</strong></a>,</li>
<li><a href="https://vite.dev/guide/features#emitdecoratormetadata" target="_blank" rel="noreferrer">automatic <strong><code>emitDecoratorMetadata</code></strong></a> without plugins,</li>
<li>and <a href="https://github.com/vitejs/vite-plugin-react/releases/tag/plugin-react%406.0.0" target="_blank" rel="noreferrer"><strong><code>@vitejs/plugin-react</code> v6</strong></a> which replaces Babel with Oxc for React transforms.</li>
</ul>
<p><strong>Real-world results</strong>: Linear cut builds from 46s to 6s, Ramp saw a 57% reduction and Beehiiv 64%.</p>
<p><strong>Why it matters</strong>: Less dev/prod inconsistencies and build speed gains through the Rust-based bundler are significant. Beyond that, customizing chunk splitting is now easier than ever with the new <code>codeSplitting</code> API.
And Rolldown opens the door to future innovations: <strong>Full Bundle Mode</strong> (3x faster dev startup, 10x fewer network requests), <strong>persistent caching</strong>, and more.</p>
<p>Migration is smooth because Vite 8 was battle-tested through various betas, and a compatibility layer auto-converts existing esbuild and Rollup configs.</p>
<p><a href="https://vite.dev/blog/announcing-vite8" target="_blank" rel="noreferrer"><strong>Read the Vite 8 announcement</strong></a> and <a href="https://vite.dev/guide/migration" target="_blank" rel="noreferrer"><strong>explore the migration guide</strong></a>.</p>
<div  class="tip custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!">We saw around an 8x improvement (4m -> 30s) in our prod build, and it was nearly a drop-in replacement. Congrats to the Vite team!</p>
<cite> — johnfn on HackerNews</cite>
</div>
<h2 id="vitest-4-1-tags-leak-detection-and-agent-reporter" tabindex="-1">Vitest 4.1: Tags, Leak Detection, and Agent Reporter <a class="header-anchor" href="#vitest-4-1-tags-leak-detection-and-agent-reporter" aria-label="Permalink to “Vitest 4.1: Tags, Leak Detection, and Agent Reporter”">&#8203;</a></h2>
<p>Vitest 4.1 shipped and includes:</p>
<ul>
<li>first-class Vite 8 support from day one,</li>
<li><a href="https://vitest.dev/guide/test-tags.html" target="_blank" rel="noreferrer"><strong>test tags</strong></a> to label and filter tests,</li>
<li><a href="https://vitest.dev/config/detectasyncleaks" target="_blank" rel="noreferrer"><strong>async leak detection</strong></a> to catch leaked timers that silently break CI,</li>
<li>new <strong><a href="https://vitest.dev/api/hooks.html#aroundeach" target="_blank" rel="noreferrer"><code>aroundEach</code></a></strong> / <strong><a href="https://vitest.dev/api/hooks.html#aroundall" target="_blank" rel="noreferrer"><code>aroundAll</code></a></strong> hooks for wrapping tests in transactions or tracing spans,</li>
<li>and an <a href="https://vitest.dev/guide/reporters.html#agent-reporter" target="_blank" rel="noreferrer"><strong><code>agent</code> reporter</strong></a> that minimizes output for AI coding agents (enabled by default when an agent is detected).</li>
</ul>
<p>Beyond that, Vitest 4.1 adds a <a href="https://vitest.dev/guide/reporters.html#github-actions-reporter" target="_blank" rel="noreferrer">built-in <strong>GitHub Actions reporter</strong></a> that generates Job Summaries with test stats and flaky test permalinks, new mock methods like <a href="https://vitest.dev/api/mock.html#mockthrow" target="_blank" rel="noreferrer"><code>mockThrow()</code></a>, and a <a href="https://vitest.dev/config/coverage.html#coverage-changed" target="_blank" rel="noreferrer"><strong><code>coverage.changed</code></strong></a> flag that limits reporting to modified files only.</p>
<p><strong>Why it matters</strong>: Managing large test suits just became much less painful. Tags let you slice your test suite by what matters and pass options to test groups, while the async leak detection prevents phantom CI failures. The agent reporter shows that we're thinking about how to optimize for both, human and AI-assisted development workflows.</p>
<p><a href="https://vitest.dev/blog/vitest-4-1.html" target="_blank" rel="noreferrer"><strong>Read the Vitest 4.1 announcement</strong></a> for more details.</p>
<h2 id="vite-alpha-one-cli-to-rule-them-all" tabindex="-1">Vite+ Alpha: One CLI to Rule Them All <a class="header-anchor" href="#vite-alpha-one-cli-to-rule-them-all" aria-label="Permalink to “Vite+ Alpha: One CLI to Rule Them All”">&#8203;</a></h2>
<p><strong>Vite+</strong> is <a href="https://github.com/voidzero-dev/vite-plus" target="_blank" rel="noreferrer">fully open-sourced under MIT</a>. A single <code>vp</code> binary that combines Vite, Vitest, Oxlint, Oxfmt, Rolldown, and tsdown, brings an own task runner with caching and monorepo support and also manages your Node.js runtime and package manager.</p>
<p><strong>One <code>vite.config.ts</code> configures everything.</strong></p>
<p>Getting started is simple:</p>
<ul>
<li><code>vp create</code> scaffolds a new project,</li>
<li><code>vp dev</code> starts the dev server,</li>
<li><code>vp check</code> lints, formats, and type-checks in one go,</li>
<li><code>vp test</code> runs Vitest,</li>
<li><code>vp build</code> creates optimized production builds,</li>
<li><code>vp run</code> orchestrates monorepo tasks with automatic input tracking and caching</li>
</ul>
<p><strong>Why it matters</strong>: No more juggling separate tools, config files, and version managers. Teams get faster onboarding, consistent environments, and built-in caching that speeds up CI. A single binary with a consistent interface also makes it easier for AI coding agents to interact with your toolchain.</p>
<p><a href="https://voidzero.dev/posts/announcing-vite-plus-alpha" target="_blank" rel="noreferrer"><strong>Read the Vite+ alpha announcement</strong></a>, <a href="https://viteplus.dev/" target="_blank" rel="noreferrer"><strong>explore the Vite+ website</strong></a>, or <a href="https://www.youtube.com/watch?v=AJxH3Gvb-PU" target="_blank" rel="noreferrer"><strong>watch the announcement video</strong></a>.</p>
<h2 id="void-ship-vite-apps-at-warp-speed" tabindex="-1">Void: Ship Vite Apps at Warp Speed <a class="header-anchor" href="#void-ship-vite-apps-at-warp-speed" aria-label="Permalink to “Void: Ship Vite Apps at Warp Speed”">&#8203;</a></h2>
<div class="video-embed">
  <iframe src="https://www.youtube.com/embed/Bp86buftbX8" title="Announcing Vite+ Alpha" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div>
<br>
<p>Evan You announced <a href="https://void.cloud/" target="_blank" rel="noreferrer"><strong>Void</strong></a>, a deployment platform purpose-built for Vite applications. Run <code>void deploy</code> and Void builds, provisions, and deploys your app. Need a database, auth, or AI inference? Import the SDK, and Void provisions it automatically from your code.</p>
<p>Void:</p>
<ul>
<li>Works with all Vite-based frameworks and meta-frameworks through its SDK</li>
<li>Supports SSR, SSG, ISR, and islands architecture out of the box.</li>
<li>Is built with AI-native development in mind, including an MCP support so coding agents can scaffold and deploy full-stack apps easily.</li>
</ul>
<p><strong>Why it matters</strong>: Vite+ gives you a unified local development experience, Void gives you a unified deployment experience. Together, they cover the entire lifecycle from <code>vp create</code> to production. No YAML, no Terraform, no infrastructure tickets. <strong>Your code is your infra.</strong></p>
<p>Make sure to <a href="https://void.cloud/" target="_blank" rel="noreferrer">sign up at void.cloud</a> for early access and be one of the first to deploy your Vite apps to Void.</p>
]]></description>
            <content:encoded><![CDATA[<p>Welcome to a special edition of <em>Tales from the Void</em>! Last weeks <strong>VoidZero Launch Week</strong> brought changes to how you build, test, lint, and deploy JavaScript.</p>
<p>Here's what shipped and why it matters.</p>
<h2 id="oxlint-js-plugins-alpha" tabindex="-1">Oxlint: JS Plugins Alpha <a class="header-anchor" href="#oxlint-js-plugins-alpha" aria-label="Permalink to “Oxlint: JS Plugins Alpha”">&#8203;</a></h2>
<p>Oxlint's JS Plugins Alpha brings <strong>near-100% compatibility</strong> with the ESLint plugin ecosystem. Your existing ESLint plugins run inside Oxlint <strong>unmodified</strong>, alongside 650+ native Rust rules, while linting <strong>up to 100x faster</strong> than ESLint.</p>
<p><strong>Why it matters</strong>: For around 80% of ESLint users Oxlint is a <strong>true drop-in replacement.</strong> Thanks to <code>@oxlint/migrate</code> you can migrate automatically without changing your ruleset.
That means you get significantly faster linting in CI and locally, shorter feedback loops while coding, and less time waiting on pre-commit hooks.
Already in production at Midjourney, Preact, and PostHog.</p>
<p>Make sure to <a href="https://oxc.rs/blog/2026-03-11-oxlint-js-plugins-alpha.html" target="_blank" rel="noreferrer"><strong>read the Oxlint JS Plugins alpha announcement</strong></a> for more technical details and to <a href="https://oxc.rs/docs/guide/usage/linter/migrate-from-eslint" target="_blank" rel="noreferrer"><strong>check out the Oxlint migration guide</strong></a>.</p>
<div  class="info custom-block"><p class="custom-block-title">Known Gaps</p>
<p>Plugins with custom parsers (e.g. for Vue or Svelte templates) and custom type-aware rules in JavaScript aren't supported yet.</p>
<p>Both are on the roadmap, and the built-in type-aware rules cover most use cases in the meantime.</p>
</div>
<h2 id="vite-8-one-bundler-to-replace-two" tabindex="-1">Vite 8: One Bundler to Replace Two <a class="header-anchor" href="#vite-8-one-bundler-to-replace-two" aria-label="Permalink to “Vite 8: One Bundler to Replace Two”">&#8203;</a></h2>
<p>Vite 8 is the most significant architectural change since Vite 2. <strong>Rolldown</strong>, a Rust-based bundler, now replaces both esbuild and Rollup. This change unifies development and production into a single bundler that is <strong>10-30x faster than Rollup</strong> while maintaining full plugin compatibility.</p>
<p>Beyond the new bundler, Vite 8 ships with:</p>
<ul>
<li>Integrated <a href="https://github.com/vitejs/devtools" target="_blank" rel="noreferrer"><strong>Vite Devtools</strong></a> for debugging and build analysis,</li>
<li>built-in <a href="https://vite.dev/guide/features#paths" target="_blank" rel="noreferrer"><strong><code>tsconfig</code> paths support</strong></a>,</li>
<li><a href="https://vite.dev/guide/features#emitdecoratormetadata" target="_blank" rel="noreferrer">automatic <strong><code>emitDecoratorMetadata</code></strong></a> without plugins,</li>
<li>and <a href="https://github.com/vitejs/vite-plugin-react/releases/tag/plugin-react%406.0.0" target="_blank" rel="noreferrer"><strong><code>@vitejs/plugin-react</code> v6</strong></a> which replaces Babel with Oxc for React transforms.</li>
</ul>
<p><strong>Real-world results</strong>: Linear cut builds from 46s to 6s, Ramp saw a 57% reduction and Beehiiv 64%.</p>
<p><strong>Why it matters</strong>: Less dev/prod inconsistencies and build speed gains through the Rust-based bundler are significant. Beyond that, customizing chunk splitting is now easier than ever with the new <code>codeSplitting</code> API.
And Rolldown opens the door to future innovations: <strong>Full Bundle Mode</strong> (3x faster dev startup, 10x fewer network requests), <strong>persistent caching</strong>, and more.</p>
<p>Migration is smooth because Vite 8 was battle-tested through various betas, and a compatibility layer auto-converts existing esbuild and Rollup configs.</p>
<p><a href="https://vite.dev/blog/announcing-vite8" target="_blank" rel="noreferrer"><strong>Read the Vite 8 announcement</strong></a> and <a href="https://vite.dev/guide/migration" target="_blank" rel="noreferrer"><strong>explore the migration guide</strong></a>.</p>
<div  class="tip custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!">We saw around an 8x improvement (4m -> 30s) in our prod build, and it was nearly a drop-in replacement. Congrats to the Vite team!</p>
<cite> — johnfn on HackerNews</cite>
</div>
<h2 id="vitest-4-1-tags-leak-detection-and-agent-reporter" tabindex="-1">Vitest 4.1: Tags, Leak Detection, and Agent Reporter <a class="header-anchor" href="#vitest-4-1-tags-leak-detection-and-agent-reporter" aria-label="Permalink to “Vitest 4.1: Tags, Leak Detection, and Agent Reporter”">&#8203;</a></h2>
<p>Vitest 4.1 shipped and includes:</p>
<ul>
<li>first-class Vite 8 support from day one,</li>
<li><a href="https://vitest.dev/guide/test-tags.html" target="_blank" rel="noreferrer"><strong>test tags</strong></a> to label and filter tests,</li>
<li><a href="https://vitest.dev/config/detectasyncleaks" target="_blank" rel="noreferrer"><strong>async leak detection</strong></a> to catch leaked timers that silently break CI,</li>
<li>new <strong><a href="https://vitest.dev/api/hooks.html#aroundeach" target="_blank" rel="noreferrer"><code>aroundEach</code></a></strong> / <strong><a href="https://vitest.dev/api/hooks.html#aroundall" target="_blank" rel="noreferrer"><code>aroundAll</code></a></strong> hooks for wrapping tests in transactions or tracing spans,</li>
<li>and an <a href="https://vitest.dev/guide/reporters.html#agent-reporter" target="_blank" rel="noreferrer"><strong><code>agent</code> reporter</strong></a> that minimizes output for AI coding agents (enabled by default when an agent is detected).</li>
</ul>
<p>Beyond that, Vitest 4.1 adds a <a href="https://vitest.dev/guide/reporters.html#github-actions-reporter" target="_blank" rel="noreferrer">built-in <strong>GitHub Actions reporter</strong></a> that generates Job Summaries with test stats and flaky test permalinks, new mock methods like <a href="https://vitest.dev/api/mock.html#mockthrow" target="_blank" rel="noreferrer"><code>mockThrow()</code></a>, and a <a href="https://vitest.dev/config/coverage.html#coverage-changed" target="_blank" rel="noreferrer"><strong><code>coverage.changed</code></strong></a> flag that limits reporting to modified files only.</p>
<p><strong>Why it matters</strong>: Managing large test suits just became much less painful. Tags let you slice your test suite by what matters and pass options to test groups, while the async leak detection prevents phantom CI failures. The agent reporter shows that we're thinking about how to optimize for both, human and AI-assisted development workflows.</p>
<p><a href="https://vitest.dev/blog/vitest-4-1.html" target="_blank" rel="noreferrer"><strong>Read the Vitest 4.1 announcement</strong></a> for more details.</p>
<h2 id="vite-alpha-one-cli-to-rule-them-all" tabindex="-1">Vite+ Alpha: One CLI to Rule Them All <a class="header-anchor" href="#vite-alpha-one-cli-to-rule-them-all" aria-label="Permalink to “Vite+ Alpha: One CLI to Rule Them All”">&#8203;</a></h2>
<p><strong>Vite+</strong> is <a href="https://github.com/voidzero-dev/vite-plus" target="_blank" rel="noreferrer">fully open-sourced under MIT</a>. A single <code>vp</code> binary that combines Vite, Vitest, Oxlint, Oxfmt, Rolldown, and tsdown, brings an own task runner with caching and monorepo support and also manages your Node.js runtime and package manager.</p>
<p><strong>One <code>vite.config.ts</code> configures everything.</strong></p>
<p>Getting started is simple:</p>
<ul>
<li><code>vp create</code> scaffolds a new project,</li>
<li><code>vp dev</code> starts the dev server,</li>
<li><code>vp check</code> lints, formats, and type-checks in one go,</li>
<li><code>vp test</code> runs Vitest,</li>
<li><code>vp build</code> creates optimized production builds,</li>
<li><code>vp run</code> orchestrates monorepo tasks with automatic input tracking and caching</li>
</ul>
<p><strong>Why it matters</strong>: No more juggling separate tools, config files, and version managers. Teams get faster onboarding, consistent environments, and built-in caching that speeds up CI. A single binary with a consistent interface also makes it easier for AI coding agents to interact with your toolchain.</p>
<p><a href="https://voidzero.dev/posts/announcing-vite-plus-alpha" target="_blank" rel="noreferrer"><strong>Read the Vite+ alpha announcement</strong></a>, <a href="https://viteplus.dev/" target="_blank" rel="noreferrer"><strong>explore the Vite+ website</strong></a>, or <a href="https://www.youtube.com/watch?v=AJxH3Gvb-PU" target="_blank" rel="noreferrer"><strong>watch the announcement video</strong></a>.</p>
<h2 id="void-ship-vite-apps-at-warp-speed" tabindex="-1">Void: Ship Vite Apps at Warp Speed <a class="header-anchor" href="#void-ship-vite-apps-at-warp-speed" aria-label="Permalink to “Void: Ship Vite Apps at Warp Speed”">&#8203;</a></h2>
<div class="video-embed">
  <iframe src="https://www.youtube.com/embed/Bp86buftbX8" title="Announcing Vite+ Alpha" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div>
<br>
<p>Evan You announced <a href="https://void.cloud/" target="_blank" rel="noreferrer"><strong>Void</strong></a>, a deployment platform purpose-built for Vite applications. Run <code>void deploy</code> and Void builds, provisions, and deploys your app. Need a database, auth, or AI inference? Import the SDK, and Void provisions it automatically from your code.</p>
<p>Void:</p>
<ul>
<li>Works with all Vite-based frameworks and meta-frameworks through its SDK</li>
<li>Supports SSR, SSG, ISR, and islands architecture out of the box.</li>
<li>Is built with AI-native development in mind, including an MCP support so coding agents can scaffold and deploy full-stack apps easily.</li>
</ul>
<p><strong>Why it matters</strong>: Vite+ gives you a unified local development experience, Void gives you a unified deployment experience. Together, they cover the entire lifecycle from <code>vp create</code> to production. No YAML, no Terraform, no infrastructure tickets. <strong>Your code is your infra.</strong></p>
<p>Make sure to <a href="https://void.cloud/" target="_blank" rel="noreferrer">sign up at void.cloud</a> for early access and be one of the first to deploy your Vite apps to Void.</p>
<hr>
<p>Launch Week was just the beginning. Every part of the toolchain is designed to work together, creating the most integrated JavaScript development experience available today, from local development to the platform itself.</p>
<p><strong>The VoidZero Team</strong></p>
]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Announcing Vite+ Alpha]]></title>
            <link>https://voidzero.dev/posts/announcing-vite-plus-alpha</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-vite-plus-alpha</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>We’re excited to <a href="https://github.com/voidzero-dev/vite-plus" target="_blank" rel="noreferrer">open-source</a> <strong>Vite+</strong> under the MIT license. Vite+ is a new unified toolchain and entry point to web application development that manages your runtime, package manager, and frontend toolchain. <em>Give it a try today!</em></p>
<h2 id="what-is-vite" tabindex="-1"><strong>What is Vite+?</strong> <a class="header-anchor" href="#what-is-vite" aria-label="Permalink to “What is Vite+?”">&#8203;</a></h2>
<p><a href="https://viteplus.dev" target="_blank" rel="noreferrer">Vite+</a> combines <a href="https://vite.dev/" target="_blank" rel="noreferrer">Vite</a>, <a href="https://vitest.dev/" target="_blank" rel="noreferrer">Vitest</a>, <a href="https://oxc.rs/docs/guide/usage/linter.html" target="_blank" rel="noreferrer">Oxlint</a>, <a href="https://oxc.rs/docs/guide/usage/formatter.html" target="_blank" rel="noreferrer">Oxfmt</a>, <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>, and <a href="https://tsdown.dev/" target="_blank" rel="noreferrer">tsdown</a> into a single, unified web development toolchain for developing, testing, linting, formatting, and building projects for production driven by our new task runner <a href="https://github.com/voidzero-dev/vite-task" target="_blank" rel="noreferrer">Vite Task</a>. Since web development requires a runtime such as Node.js and a package manager, Vite+ can also manage them for you, covering the full local development cycle.</p>
<p>With Vite+, web development becomes simpler, faster, and more lightweight:</p>
<ul>
<li><strong><code>vp env</code>:</strong> Manages Node.js globally and per project</li>
<li><strong><code>vp install</code>:</strong> Installs dependencies using the correct package manager automatically</li>
<li><strong><code>vp dev</code>:</strong> Uses Vite’s fast dev experience with native ES modules and instant HMR</li>
<li><strong><code>vp check</code>:</strong> Lints with Oxlint, formats code using Oxfmt and checks types with <a href="https://github.com/microsoft/typescript-go" target="_blank" rel="noreferrer">tsgo</a></li>
<li><strong><code>vp test</code>:</strong> Seamlessly integrates and runs Vitest with fast feedback loops</li>
<li><strong><code>vp build</code>:</strong> Generates optimized production builds using Rolldown and Oxc</li>
<li><strong><code>vp run</code>:</strong> Executes monorepo tasks with automated caching and dependency resolution</li>
<li><strong><code>vp pack</code>:</strong> Bundles libraries for publishing on npm or creates standalone app binaries</li>
<li><strong><code>vp create</code>:</strong> Scaffolds new projects and monorepos with recommended settings</li>
</ul>
<p>All these commands work seamlessly together out of the box, with one configuration file at the project root, and are compatible with all frameworks in Vite’s ecosystem, such as React, Vue, Svelte, or metaframeworks built on top of Vite.</p>
<p><strong>Watch the video:</strong></p>
<div class="video-embed">
  <iframe src="https://www.youtube.com/embed/AJxH3Gvb-PU" title="Announcing Vite+ Alpha" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div>
<h2 id="performance-scale" tabindex="-1">Performance &amp; Scale <a class="header-anchor" href="#performance-scale" aria-label="Permalink to “Performance &amp; Scale”">&#8203;</a></h2>
<p>Vite+ is built to scale with your codebase while reducing your devtools to a single dependency. By leveraging VoidZero’s Rust-based JavaScript tooling, every interaction with the toolchain becomes significantly faster and scales better:</p>
<ul>
<li><strong>Vite + Rolldown:</strong> <a href="https://vite.dev/blog/announcing-vite8-beta#how-vite-migrated-to-rolldown" target="_blank" rel="noreferrer">~1.6× to ~7.7× faster production builds</a> compared to Vite 7</li>
<li><strong>Oxlint (ESLint compatible linter):</strong> <a href="https://github.com/oxc-project/bench-linter" target="_blank" rel="noreferrer">~50× to ~100× faster than ESLint</a></li>
<li><strong>Oxfmt (Prettier compatible formatter):</strong> <a href="https://github.com/oxc-project/bench-formatter" target="_blank" rel="noreferrer">Up to 30× faster than Prettier</a></li>
</ul>
<h2 id="getting-started" tabindex="-1">Getting Started <a class="header-anchor" href="#getting-started" aria-label="Permalink to “Getting Started”">&#8203;</a></h2>
<p>Install <code>vp</code> globally by running:</p>
<h3 id="macos-linux" tabindex="-1">macOS / Linux <a class="header-anchor" href="#macos-linux" aria-label="Permalink to “macOS / Linux”">&#8203;</a></h3>
<div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -fsSL</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://vite.plus</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> bash</span></span></code></pre>
</div><h3 id="windows-powershell" tabindex="-1">Windows (PowerShell) <a class="header-anchor" href="#windows-powershell" aria-label="Permalink to “Windows (PowerShell)”">&#8203;</a></h3>
<div class="language-powershell"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">irm https:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">//</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">vite.plus</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ps1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> iex</span></span></code></pre>
</div><h3 id="ci" tabindex="-1">CI <a class="header-anchor" href="#ci" aria-label="Permalink to “CI”">&#8203;</a></h3>
<p>Use the <a href="https://github.com/voidzero-dev/setup-vp" target="_blank" rel="noreferrer">setup-vp GitHub Action</a> for CI environments.</p>
<p>After installing Vite+, open a new terminal session, run <code>vp help</code>, and <a href="https://viteplus.dev/guide/" target="_blank" rel="noreferrer">check out our docs</a>.</p>
<h2 id="using-vite" tabindex="-1">Using Vite+ <a class="header-anchor" href="#using-vite" aria-label="Permalink to “Using Vite+”">&#8203;</a></h2>
<p>To get started with web development, you need a JavaScript runtime, a package manager, and many other tools. In recent years, configuration files have proliferated, and complexity has increased at every level of the stack.</p>
<p>One of our goals with Vite+ was to <em>simplify</em> the web development process: All you need is <code>vp</code> and a <code>vite.config.ts</code> file at the root of your project to configure every tool in one place. This is what the development process looks like with Vite+:</p>
<ol>
<li>Start with <code>vp create</code> to interactively create a new project, monorepo, or app within a monorepo. The new project will be ready to go immediately, including pre-commit hooks!</li>
<li>Run <code>vp install</code> to install JavaScript dependencies. This command delegates to the package manager of your choice (we recommend and default to <a href="https://pnpm.io/" target="_blank" rel="noreferrer">pnpm</a>).</li>
<li>Use <code>vp dev</code> to start the Vite development server.</li>
<li>When you are done making changes, run <code>vp check</code> to type-check, lint, and format your project all at once. Run <code>vp check --fix</code> to automatically fix formatting and linting issues (Pro tip: Run <code>vp prepare</code> to install Vite+’s pre-commit hooks!).</li>
<li>Run <code>vp test</code> to run JavaScript tests.</li>
<li>Build your project for production using <code>vp build</code>.</li>
<li>Execute <code>package.json</code> scripts through Vite Task by using <code>vp run &lt;name&gt;</code> and execute local package binaries with <code>vp exec &lt;name&gt;</code>. Give <code>vpx &lt;name&gt;</code> a try for running local or remote binaries!</li>
<li>Your Node.js version and package manager are automatically selected based on <code>.node-version</code> or your <code>package.json</code>.</li>
</ol>
<p>A single binary with a consistent interface makes it easier to get started, faster to iterate, and simpler to work with for humans and AI. You no longer have to juggle Node.js version managers, package managers, a multitude of individual tools, their configuration files – or complex upgrades to any of them.</p>
<h2 id="vite-task" tabindex="-1">Vite Task <a class="header-anchor" href="#vite-task" aria-label="Permalink to “Vite Task”">&#8203;</a></h2>
<p>Vite Task is a powerful new <a href="https://github.com/voidzero-dev/vite-task" target="_blank" rel="noreferrer">open source project</a> shipping as part of Vite+. It provides the core task runner for Vite+’s built-in commands as well as <code>package.json</code> scripts via <code>vp run</code>. Vite Task orchestrates tasks across workspace packages with:</p>
<ul>
<li><strong>Automated Input Tracking:</strong> Vite Task fingerprints input files used by commands to determine what should be cached locally without manual configuration. If nothing has changed, it skips the task entirely and replays the output instantly.</li>
<li><strong>Dependency-aware execution:</strong> Tasks run in the correct order based on your <code>package.json</code> dependency graph and explicit <code>dependsOn</code> declarations. Multi-command scripts like <code>tsc &amp;&amp; vp build</code> are split into sub-tasks and cached independently.</li>
<li><strong>Familiar CLI:</strong> <code>vp run</code> mirrors the interface of <a href="https://pnpm.io/cli/run" target="_blank" rel="noreferrer"><code>pnpm run</code></a>, including monorepo support, reducing the number of new concepts you need to learn to adopt Vite+.</li>
</ul>
<p>For simple tasks that don’t depend on external inputs like environment variables, you can simply use <code>vp run --cache &lt;script&gt;</code> to cache the task run. Custom tasks, inputs and caching can be configured in your <code>vite.config.ts</code>:</p>
<div class="language-tsx"><button title="Copy Code" class="copy"></button><span class="lang">tsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> defineConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  run: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    tasks: {</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">      'generate:icons'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        command: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'node scripts/generate-icons.js'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cache: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Caching is enabled by default, set to `false` to disable.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        envs: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'ICON_THEME'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
</div><p>Running <code>vp run generate:icons</code> generates icons on the first run and is skipped entirely if nothing changed on subsequent runs. If you edit a source file or the specified <code>ICON_THEME</code> environment variable changes, the task will re-run. Check out the <a href="https://viteplus.dev/vite/guide/" target="_blank" rel="noreferrer">Vite Task documentation</a> for a comprehensive overview.</p>
<h2 id="migrating-a-project-to-vite" tabindex="-1">Migrating a Project to Vite+ <a class="header-anchor" href="#migrating-a-project-to-vite" aria-label="Permalink to “Migrating a Project to Vite+”">&#8203;</a></h2>
<p>Migrating a project to Vite+ is straightforward, whether you are only using Vite or already using many of VoidZero’s tools. While <code>vp</code> is a new global binary, the <code>vite-plus</code> package must be installed in your project to unify all tooling under one dependency. We recommend first upgrading to Vite 8.</p>
<p>To get started, run <code>vp migrate</code> in a project or paste this migration prompt into your favorite coding agent:</p>
<blockquote class="migration-prompt">
  <p>
    Migrate this project to Vite+. Run <code>vp help</code> to understand Vite+’s capabilities.
    Migrations can be run using <code>vp migrate</code>. Run <code>vp help migrate</code> for options.
    After the migration, verify the changes and make sure that type checking, linting, formatting,
    and tests pass. High-five your human when you are done.
  </p>
</blockquote>
<p>If you are using ESLint or Prettier and would like to migrate to Oxlint and Oxfmt prior to migrating to Vite+, check out the <a href="https://oxc.rs/docs/guide/usage/linter/migrate-from-eslint" target="_blank" rel="noreferrer">Oxlint</a> and <a href="https://oxc.rs/docs/guide/usage/formatter/migrate-from-prettier.html" target="_blank" rel="noreferrer">Oxfmt</a> migration guides.</p>
<h2 id="mit-license" tabindex="-1">MIT License <a class="header-anchor" href="#mit-license" aria-label="Permalink to “MIT License”">&#8203;</a></h2>
<p>We initially considered a paid license for companies when we <a href="https://voidzero.dev/posts/announcing-vite-plus#licensing" target="_blank" rel="noreferrer">announced Vite+</a>. We decided that Vite+ can only achieve our mission of making JavaScript developers more productive than ever before when it is truly free and open source. We got tired of debating which features should be paid and how they should be gated, as this only creates friction in the workflows our open-source users already enjoy and love. Feedback from the community helped us reinforce our conviction. Therefore, we decided to <a href="https://github.com/voidzero-dev/vite-plus/blob/main/LICENSE" target="_blank" rel="noreferrer">fully open source Vite+ under the MIT license</a>.</p>
<p>In case you are wondering how we are going to build a sustainable business: <a href="https://void.cloud/" target="_blank" rel="noreferrer">Step into the Void</a>.</p>
<h2 id="next-steps" tabindex="-1">Next Steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to “Next Steps”">&#8203;</a></h2>
<p>Vite+ ships with the latest versions of our tools such as Vite 8, Vitest 4.1, Oxlint 1.52, Oxfmt beta. We’ll add more features and make frequent releases as we stabilize this alpha release of Vite+. We’d love to hear your feedback on Vite+ and are excited to see how it improves your workflow.</p>
<p><strong>Connect with us:</strong></p>
<ul>
<li><strong>Discord</strong>: <a href="https://discord.gg/cAnsqHh5PX" target="_blank" rel="noreferrer">Step into the Void community Discord server</a> for real-time discussions</li>
<li><strong>GitHub</strong>: <a href="https://github.com/voidzero-dev/vite-plus" target="_blank" rel="noreferrer">Star the repo, start discussions and report issues</a></li>
<li><strong>Contribute:</strong> <a href="https://github.com/voidzero-dev/vite-plus/blob/main/CONTRIBUTING.md" target="_blank" rel="noreferrer">Check our contributing guide and send pull requests</a></li>
<li><strong>X / Bluesky:</strong> <a href="https://x.com/voidzerodev" target="_blank" rel="noreferrer">Follow VoidZero for updates on X</a> or on <a href="https://bsky.app/profile/voidzero.dev" target="_blank" rel="noreferrer">Bluesky</a></li>
<li><strong>Stay up to date:</strong> <a href="https://voidzero.dev/newsletter" target="_blank" rel="noreferrer">Join our newsletter</a> to not miss any future announcements</li>
</ul>
]]></content:encoded>
            <author>LONG Yinan</author>
            <author>MK</author>
            <author>WANG Chi</author>
            <author>Evan You</author>
            <author>Christoph Nakazawa</author>
        </item>
        <item>
            <title><![CDATA[VoidZero and npmx: Building Better Tools Together]]></title>
            <link>https://voidzero.dev/posts/npmx-alpha</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/npmx-alpha</guid>
            <pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>Today, <a href="https://npmx.dev" target="_blank" rel="noreferrer">npmx.dev</a> officially enters alpha: a fast, modern browser for the npm registry. We've been watching this project closely at VoidZero, because npmx is built on our toolchain and feedback from its developers has already made our tools measurably faster. Here's how that relationship works.</p>
<h2 id="a-shared-mission" tabindex="-1">A shared mission <a class="header-anchor" href="#a-shared-mission" aria-label="Permalink to “A shared mission”">&#8203;</a></h2>
<p>VoidZero's mission is to make JavaScript developers more productive than ever before, including how developers find and choose packages. That's exactly what npmx is tackling. Beyond browsing packages, npmx surfaces details that help you decide which package to adopt in your project: package sizes, performance recommendations, outdated dependency warnings and more.</p>
<h2 id="shipping-fast-with-voidzero-s-tools" tabindex="-1">Shipping fast with VoidZero's tools <a class="header-anchor" href="#shipping-fast-with-voidzero-s-tools" aria-label="Permalink to “Shipping fast with VoidZero's tools”">&#8203;</a></h2>
<p>What makes this relationship especially exciting is that npmx doesn't just share our vision, it is also built with our tools. The <a href="https://github.com/npmx-dev/npmx.dev" target="_blank" rel="noreferrer">npmx.dev codebase</a> runs on the full VoidZero toolchain:</p>
<ul>
<li><a href="https://vite.dev/" target="_blank" rel="noreferrer"><strong>Vite</strong></a> as the build engine via Nuxt, giving the team instant HMR during development and optimized production builds</li>
<li><a href="https://vitest.dev/" target="_blank" rel="noreferrer"><strong>Vitest</strong></a> for the test suite, with consistent transforms and config shared from the Vite setup</li>
<li><a href="https://rolldown.rs/" target="_blank" rel="noreferrer"><strong>Rolldown</strong></a> through the Vite 8 beta, producing smaller, faster production bundles</li>
<li><a href="https://oxc.rs/docs/guide/usage/linter.html" target="_blank" rel="noreferrer"><strong>oxlint</strong></a> for linting that runs in milliseconds, even across the full codebase</li>
<li><a href="https://oxc.rs/docs/guide/usage/formatter.html" target="_blank" rel="noreferrer"><strong>oxfmt</strong></a> for consistent formatting with near-zero overhead</li>
</ul>
<p>The npmx team has also been using a preview release of <a href="https://viteplus.dev/" target="_blank" rel="noreferrer">Vite+</a>, the unified toolchain composed of all the above tools in a single package.</p>
<h2 id="a-feedback-loop-that-benefits-everyone" tabindex="-1">A feedback loop that benefits everyone <a class="header-anchor" href="#a-feedback-loop-that-benefits-everyone" aria-label="Permalink to “A feedback loop that benefits everyone”">&#8203;</a></h2>
<p>The folks building npmx are real builders and maintainers from across the JavaScript ecosystem. When they use our tools day-to-day, they hit edge cases and surface issues that synthetic benchmarks and internal testing simply can't. Running on cutting-edge builds means they catch rough edges early: from unexpected performance regressions to configuration quirks that only show up in production-scale codebases.</p>
<p>One concrete example:</p>
<ul>
<li>An npmx maintainer <a href="https://github.com/voidzero-dev/vite-plus-discussions/issues/9" target="_blank" rel="noreferrer">noticed</a> that <code>lint</code> and <code>fmt</code> were unexpectedly running postinstall scripts, making Vite+ commands over 3x slower than calling oxlint and oxfmt directly</li>
<li>They filed the issue with concrete benchmarks from the npmx codebase</li>
<li>We fixed it, and the overhead <a href="https://github.com/npmx-dev/npmx.dev/pull/1668" target="_blank" rel="noreferrer">dropped from 3.23x to 1.10x</a></li>
</ul>
<p>That's the kind of real-world signal that makes our tools better for everyone.</p>
<p>npmx is an open-source project fully developed by volunteers. They adopted our tools because they are fast and provide a great developer experience. They push our tools to their limits, and it helps us make them better. To make sure npmx can keep pushing forward, we started sponsoring the project and are excited to see where they take it next.</p>
<p>This is what a healthy open-source ecosystem looks like: independent projects pushing each other forward. npmx helps developers find better packages, and their real-world usage helps us build better tools to create them with. Check out <a href="https://npmx.dev" target="_blank" rel="noreferrer">npmx.dev</a> and see for yourself.</p>
]]></description>
            <content:encoded><![CDATA[<p>Today, <a href="https://npmx.dev" target="_blank" rel="noreferrer">npmx.dev</a> officially enters alpha: a fast, modern browser for the npm registry. We've been watching this project closely at VoidZero, because npmx is built on our toolchain and feedback from its developers has already made our tools measurably faster. Here's how that relationship works.</p>
<h2 id="a-shared-mission" tabindex="-1">A shared mission <a class="header-anchor" href="#a-shared-mission" aria-label="Permalink to “A shared mission”">&#8203;</a></h2>
<p>VoidZero's mission is to make JavaScript developers more productive than ever before, including how developers find and choose packages. That's exactly what npmx is tackling. Beyond browsing packages, npmx surfaces details that help you decide which package to adopt in your project: package sizes, performance recommendations, outdated dependency warnings and more.</p>
<h2 id="shipping-fast-with-voidzero-s-tools" tabindex="-1">Shipping fast with VoidZero's tools <a class="header-anchor" href="#shipping-fast-with-voidzero-s-tools" aria-label="Permalink to “Shipping fast with VoidZero's tools”">&#8203;</a></h2>
<p>What makes this relationship especially exciting is that npmx doesn't just share our vision, it is also built with our tools. The <a href="https://github.com/npmx-dev/npmx.dev" target="_blank" rel="noreferrer">npmx.dev codebase</a> runs on the full VoidZero toolchain:</p>
<ul>
<li><a href="https://vite.dev/" target="_blank" rel="noreferrer"><strong>Vite</strong></a> as the build engine via Nuxt, giving the team instant HMR during development and optimized production builds</li>
<li><a href="https://vitest.dev/" target="_blank" rel="noreferrer"><strong>Vitest</strong></a> for the test suite, with consistent transforms and config shared from the Vite setup</li>
<li><a href="https://rolldown.rs/" target="_blank" rel="noreferrer"><strong>Rolldown</strong></a> through the Vite 8 beta, producing smaller, faster production bundles</li>
<li><a href="https://oxc.rs/docs/guide/usage/linter.html" target="_blank" rel="noreferrer"><strong>oxlint</strong></a> for linting that runs in milliseconds, even across the full codebase</li>
<li><a href="https://oxc.rs/docs/guide/usage/formatter.html" target="_blank" rel="noreferrer"><strong>oxfmt</strong></a> for consistent formatting with near-zero overhead</li>
</ul>
<p>The npmx team has also been using a preview release of <a href="https://viteplus.dev/" target="_blank" rel="noreferrer">Vite+</a>, the unified toolchain composed of all the above tools in a single package.</p>
<h2 id="a-feedback-loop-that-benefits-everyone" tabindex="-1">A feedback loop that benefits everyone <a class="header-anchor" href="#a-feedback-loop-that-benefits-everyone" aria-label="Permalink to “A feedback loop that benefits everyone”">&#8203;</a></h2>
<p>The folks building npmx are real builders and maintainers from across the JavaScript ecosystem. When they use our tools day-to-day, they hit edge cases and surface issues that synthetic benchmarks and internal testing simply can't. Running on cutting-edge builds means they catch rough edges early: from unexpected performance regressions to configuration quirks that only show up in production-scale codebases.</p>
<p>One concrete example:</p>
<ul>
<li>An npmx maintainer <a href="https://github.com/voidzero-dev/vite-plus-discussions/issues/9" target="_blank" rel="noreferrer">noticed</a> that <code>lint</code> and <code>fmt</code> were unexpectedly running postinstall scripts, making Vite+ commands over 3x slower than calling oxlint and oxfmt directly</li>
<li>They filed the issue with concrete benchmarks from the npmx codebase</li>
<li>We fixed it, and the overhead <a href="https://github.com/npmx-dev/npmx.dev/pull/1668" target="_blank" rel="noreferrer">dropped from 3.23x to 1.10x</a></li>
</ul>
<p>That's the kind of real-world signal that makes our tools better for everyone.</p>
<p>npmx is an open-source project fully developed by volunteers. They adopted our tools because they are fast and provide a great developer experience. They push our tools to their limits, and it helps us make them better. To make sure npmx can keep pushing forward, we started sponsoring the project and are excited to see where they take it next.</p>
<p>This is what a healthy open-source ecosystem looks like: independent projects pushing each other forward. npmx helps developers find better packages, and their real-world usage helps us build better tools to create them with. Check out <a href="https://npmx.dev" target="_blank" rel="noreferrer">npmx.dev</a> and see for yourself.</p>
<hr>
<p><em>This post is part of the npmx alpha announcement web ring. Read the <a href="https://npmx.dev/blog/alpha-release" target="_blank" rel="noreferrer">official announcement on the npmx blog</a> and discover more perspectives from the community.</em></p>
]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: February 2026 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-feb-2026</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-feb-2026</guid>
            <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>What’s new in ViteLand!</em></p>
<p>Regularly, we recap the project updates for Vite+, Vite, Vitest, Rolldown, Oxc, and what’s happening in our community.</p>
<h2 id="oxfmt-beta-full-prettier-compatibility" tabindex="-1">Oxfmt Beta: Full Prettier Compatibility <a class="header-anchor" href="#oxfmt-beta-full-prettier-compatibility" aria-label="Permalink to “Oxfmt Beta: Full Prettier Compatibility”">&#8203;</a></h2>
<p>Three months after <a href="/posts/announcing-oxfmt-alpha.html">the alpha release</a>, Oxfmt has reached beta. The formatter now passes 100% of Prettier's JavaScript and TypeScript conformance tests while running <a href="https://github.com/oxc-project/bench-formatter/" target="_blank" rel="noreferrer">up to 36x faster</a>. We aimed for Prettier compatibility because <strong>migration should be easy</strong>. Matching Prettier's output keeps your migration PR minimal and reviewable. Along the way, we also found and <a href="https://github.com/oxc-project/oxc/issues/18717" target="_blank" rel="noreferrer">reported bugs in Prettier itself</a> so they can be fixed upstream. The beta is only a milestone, which opens the door for more opinionated features.</p>
<p>The beta stabilizes experimental features from the Oxfmt alpha, such as <a href="https://oxc.rs/docs/guide/usage/formatter/sorting.html#sort-imports" target="_blank" rel="noreferrer">import sorting</a>, <a href="https://oxc.rs/docs/guide/usage/formatter/sorting.html#sort-tailwind-css-classes" target="_blank" rel="noreferrer">Tailwind CSS class sorting</a>, and <a href="https://oxc.rs/docs/guide/usage/formatter/embedded-formatting.html" target="_blank" rel="noreferrer">embedded language formatting</a>. To reach 1.0, a few more features like native Prettier plugin support (e.g. to format Svelte components) and additional options are planned. Track progress on the <a href="https://github.com/oxc-project/oxc/milestone/19" target="_blank" rel="noreferrer">Oxfmt 1.0 milestone</a>.</p>
<p>Oxfmt is already used by teams at:</p>
<ul>
<li><a href="https://turborepo.com/docs/guides/tools/oxc" target="_blank" rel="noreferrer">Turborepo</a>,</li>
<li><a href="https://github.com/huggingface/huggingface.js/pull/1924" target="_blank" rel="noreferrer">Hugging Face</a>,</li>
<li><a href="https://github.com/lichess-org/lila/pull/19179" target="_blank" rel="noreferrer">Lichess</a>,</li>
<li><a href="https://github.com/oxidecomputer/console/pull/3066" target="_blank" rel="noreferrer">Oxide Computer</a>,</li>
<li>and many more.</li>
</ul>
<p>With the beta, Oxfmt is ready for wider adoption. <a href="https://oxc.rs/docs/guide/usage/formatter.html" target="_blank" rel="noreferrer">Give it a try now</a> and let us know your feedback!</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li>The experimental <a href="https://github.com/vitejs/vite/pull/21331" target="_blank" rel="noreferrer">Vite devtools are now available</a> in the Vite 8 beta through a flag, which let you inspect the module graph, analyze transform timelines, and debug HMR updates directly in your browser.</li>
<li>Vite now has a <a href="https://registry.vite.dev/" target="_blank" rel="noreferrer">plugin registry</a> to help you discover plugins for Vite that are published on npm.</li>
</ul>
<h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li>The recent 4.1 beta ships with <a href="https://main.vitest.dev/api/hooks#aroundeach" target="_blank" rel="noreferrer"><code>aroundEach</code> and <code>aroundAll</code> hooks</a>, which are especially useful for wrapping tests in a context or tracing span.</li>
<li>The next Vitest beta will include a <a href="https://github.com/vitest-dev/vitest/pull/9705" target="_blank" rel="noreferrer">filter for slow tests in Vitest's UI</a>, helping you to identify and optimize slow tests in your suite.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2024222834483192077" /><h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li>Rolldown became <a href="https://github.com/rolldown/rolldown/pull/8432" target="_blank" rel="noreferrer">up to 9.6% faster</a> by optimizing internal file path handling.</li>
<li>Wonder how Dead Code Elimination works in Rolldown? There is <a href="https://rolldown.rs/in-depth/dead-code-elimination" target="_blank" rel="noreferrer">a new in-depth chapter</a> in the docs that explains how it works under the hood.</li>
<li>tsdown added experimental support for <a href="https://github.com/rolldown/tsdown/pull/777" target="_blank" rel="noreferrer">bundling as Node.js single executables</a> via the new <code>--exe</code> flag in their latest beta.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2024620333639086214" /><h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>Oxc's semantic analysis <a href="https://github.com/oxc-project/oxc/pull/19143" target="_blank" rel="noreferrer">became ~4-6% faster</a> because of hash precomputing for identifiers. As usual, the performance improvement carries over to tools using Oxc, such as Rolldown and Vite 8.</li>
<li>Oxlint introduced <a href="https://github.com/oxc-project/oxc/pull/19764" target="_blank" rel="noreferrer">a config option to enable type-aware linting</a>, no longer requiring the CLI flag.</li>
<li>Oxlint adds support for <a href="https://github.com/oxc-project/tsgolint#implemented-rules" target="_blank" rel="noreferrer">12 more type-aware rules via tsgolint</a>, now supporting 59 out of the 61 <code>typescript-eslint</code> rules.</li>
<li>Want to migrate from webpack to Rolldown and Vite 8? <a href="https://npmx.dev/package/oxc-webpack-loader" target="_blank" rel="noreferrer"><code>oxc-webpack-loader</code></a> can help you to do so in smaller steps.</li>
</ul>
<TwitterEmbed url="https://x.com/boshen_c/status/2026953907788980396" /><h2 id="upcoming-events" tabindex="-1">Upcoming Events <a class="header-anchor" href="#upcoming-events" aria-label="Permalink to “Upcoming Events”">&#8203;</a></h2>
<p>To catch talks and presentations from VoidZero team members, see the following events where they will present:</p>
<ul>
<li>Don't miss Evan You's talk at <a href="https://vuejs.amsterdam/" target="_blank" rel="noreferrer">Vue.js Amsterdam</a> on March 13th for exciting announcements.</li>
<li><a href="https://laravellive.jp/en#speakers" target="_blank" rel="noreferrer">Laravel Live Japan 2026</a> will feature a talk from Alexander Lichter on VoidZero's unified toolchain vision on May 26th.</li>
<li>Alexander Lichter will join <a href="https://enterjs.de/veranstaltung-86570-0-vue-im-jahr-2026-zukunftssicher-oder-sackgasse.html" target="_blank" rel="noreferrer">enterJS 2026</a> in Mannheim, Germany on June 16th.</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From The Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From The Community”">&#8203;</a></h2>
<ul>
<li>Evan You joined the <a href="https://www.youtube.com/watch?v=LSGZtHafiM4" target="_blank" rel="noreferrer">Better Stack Podcast</a> and shared news about Vite+, Vite 8, and the future of the ecosystem.</li>
<li>Cloudflare released <code>vinext</code>, a <a href="https://blog.cloudflare.com/vinext/" target="_blank" rel="noreferrer">Next.js on top of Vite 8</a>.</li>
<li>Astro is working on <a href="https://github.com/withastro/compiler/pull/1143" target="_blank" rel="noreferrer">its own Rust compiler</a> based on Oxc.</li>
<li>Nest.js migrated <a href="https://github.com/nestjs/nest/pull/16370" target="_blank" rel="noreferrer">to Vitest</a> from Mocha, Chai, and Sinon.</li>
<li>Atriiy wrote a blog series about how Rolldown works under the hood, with his latest post covering <a href="https://www.atriiy.dev/blog/rolldown-high-performance-code-splitting" target="_blank" rel="noreferrer">code splitting</a>.</li>
<li>Kazupon gave a talk on how <a href="https://speakerdeck.com/kazupon/oxlint-js-plugins" target="_blank" rel="noreferrer">Oxlint's JS Plugins</a> work under the hood. The slides are available now.</li>
<li><a href="https://schemabenchmarks.dev/" target="_blank" rel="noreferrer">Schema Benchmarks</a>, an open-source benchmarking tool for schema validators, is using Rolldown for bundle comparisons.</li>
<li>Nuno Maduro's Laravel <a href="https://github.com/nunomaduro/laravel-starter-kit-inertia-vue" target="_blank" rel="noreferrer">Starter</a> <a href="https://github.com/nunomaduro/laravel-starter-kit-inertia-react" target="_blank" rel="noreferrer">Kits</a> now use Oxlint by default and are in the process of migrating to Oxfmt as well.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2026582966076338340" /><TwitterEmbed url="https://twitter.com/nullvoxpopuli/status/2020673790166925530" /><TwitterEmbed url="https://x.com/_chenglou/status/2026408795857981610" /><TwitterEmbed url="https://twitter.com/OskarLebuda/status/2025955625268625798" />]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: January 2026 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-jan-2026</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-jan-2026</guid>
            <pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>What’s new in ViteLand!</em></p>
<p>Regularly, we recap the project updates for Vite+, Vite, Vitest, Rolldown, Oxc, and what’s happening in our community.</p>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-jan-2026/voidzero-bento-grid.jpg" alt="Unified Design across VoidZero, Vite, Vitest, Rolldown, and Oxc" width="760" height="380" />
  <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
    Design elements of the new unified identity across VoidZero, Vite, Vitest, Rolldown, and Oxc
  </figcaption>
</figure>
<h2 id="unified-by-design" tabindex="-1">Unified by Design <a class="header-anchor" href="#unified-by-design" aria-label="Permalink to “Unified by Design”">&#8203;</a></h2>
<p>VoidZero's mission is clear: <strong>Make web developers more productive than ever before.</strong> To achieve this, we brought Vite, Vitest, Rolldown, and Oxc together under one roof, working toward a unified toolchain.</p>
<p>But until now, each project maintained its own distinct visual identity.</p>
<p>This month, that changed. We rolled out a comprehensive redesign across <a href="https://voidzero.dev" target="_blank" rel="noreferrer">voidzero.dev</a>, <a href="https://vite.dev" target="_blank" rel="noreferrer">vite.dev</a>, <a href="https://vitest.dev" target="_blank" rel="noreferrer">vitest.dev</a>, <a href="https://rolldown.rs" target="_blank" rel="noreferrer">rolldown.rs</a>, and <a href="https://oxc.rs" target="_blank" rel="noreferrer">oxc.rs</a>.</p>
<p>The redesign includes:</p>
<ul>
<li><strong>New websites</strong> with improved landing pages and a cohesive visual language across all projects</li>
<li><strong>Refreshed logos</strong> that maintain each project's identity while sharing design DNA</li>
<li><strong>Updated Vite starter templates</strong> with the new branding built in from the start</li>
</ul>
<p>These changes aren't just cosmetic. When you use <a href="/posts/announcing-vite-8-beta.html">Vite 8</a>, you're using Rolldown and Oxc under the hood. When you run Oxlint or Oxfmt, you benefit from the same parser that powers Rolldown. Our tools are deeply integrated, and now they look the part too.</p>
<p>The new designs set the stage for Vite+, giving us a consistent foundation as we bring everything into a single, cohesive developer experience. More on that soon.</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li>Vite crossed 3 billion total npm downloads since being published in April 2020.</li>
<li>The Vite React Server Components plugin <a href="https://github.com/vitejs/vite-plugin-react/pull/1037" target="_blank" rel="noreferrer">has been tweaked</a> to make it easier for frameworks to integrate custom environment setups. It powers not only Nitro's and Cloudflare's plugins, but also the new TanStack Start RSC integration.</li>
</ul>
<TwitterEmbed url="https://x.com/youyuxi/status/2018873177603268616" /><h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li>The <a href="https://github.com/vitest-dev/vitest/releases/tag/v4.1.0-beta.3" target="_blank" rel="noreferrer">Vitest 4.1 beta</a> started, bringing new features and bug fixes.</li>
<li>One major new feature in the upcoming Vitest 4.1 version is <a href="https://main.vitest.dev/guide/test-tags.html" target="_blank" rel="noreferrer">Test Tags</a>, allowing you to filter tests by tags and apply custom configurations like timeout per tag.</li>
<li>Want to run Vitest <em>without Vite</em>? You might be able to do so <a href="https://github.com/vitest-dev/vitest/discussions/9501" target="_blank" rel="noreferrer">via disabling the <code>viteModuleRunner</code> option</a> that was introduced in the latest 4.1 beta.</li>
<li>Extending your test context is now possible with <a href="https://main.vitest.dev/guide/test-context.html#extend-test-context" target="_blank" rel="noreferrer">the new builder pattern</a>, allowing type inference for each fixture.</li>
</ul>
<h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li>Rolldown <a href="/posts/announcing-rolldown-rc.html">reached Release Candidate status</a>, promising no further breaking changes to the API except for experimental features.</li>
<li><a href="https://rolldown.rs/in-depth/lazy-barrel-optimization" target="_blank" rel="noreferrer">Lazy Barrel Optimization</a> landed in Rolldown, compiling only the modules you actually use from barrel files instead of everything they re-export. Real-world impact: Enabling the optimization and importing a single Button component from AntDesign resulted in <strong>92% fewer compiled modules and 2x faster builds</strong>.</li>
<li>Rolldown got another round of <a href="https://github.com/rolldown/rolldown/pull/7742" target="_blank" rel="noreferrer">chunking algorithm improvements</a>, reducing the amount of chunks generated when modules are both statically and dynamically imported.</li>
<li>tsdown <a href="https://github.com/rolldown/tsdown/releases/tag/v0.20.0" target="_blank" rel="noreferrer">v0.20 has been released</a> with Rolldown RC support, performance improvements, and further bug fixes.</li>
<li>tsdown now provides <a href="https://tsdown.dev/guide/skills" target="_blank" rel="noreferrer">an official skill</a> for AI coding agents, making it easier to integrate tsdown into your AI-assisted workflows.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2016813794152816818" /><h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>Oxlint supports a dynamic config <a href="https://github.com/oxc-project/oxc/pull/17563" target="_blank" rel="noreferrer">like <code>oxlint.config.ts</code></a> now.</li>
<li>9 new native rules were added to Oxlint, including the long-awaited <a href="https://github.com/oxc-project/oxc/pull/18687" target="_blank" rel="noreferrer">prefer-const</a> rule.</li>
<li>tsgolint just got 20% faster thanks to a <a href="https://github.com/oxc-project/tsgolint/pull/555" target="_blank" rel="noreferrer">concurrent lookup for <code>tsconfig.json</code> files</a>.</li>
<li><a href="https://oxc.rs/docs/guide/usage/formatter/sorting.html#tailwind-css-class-sorting" target="_blank" rel="noreferrer">Tailwind CSS class sorting</a> landed in Oxfmt as an experimental option, allowing you to sort classes according to Tailwind's recommended order.</li>
<li>The RFC for the default order for import group sorting <a href="https://github.com/oxc-project/oxc/discussions/18688" target="_blank" rel="noreferrer">is available</a>, make sure to share your thoughts!</li>
<li>Oxfmt <a href="https://github.com/oxc-project/oxc/issues/18717" target="_blank" rel="noreferrer">has reached 100% conformance with Prettier</a> and reported several bugs that were fixed upstream <em>in Prettier</em> on the way.</li>
</ul>
<TwitterEmbed url="https://x.com/Cameron_C2/status/2017299362175430953" /><h2 id="upcoming-events" tabindex="-1">Upcoming Events <a class="header-anchor" href="#upcoming-events" aria-label="Permalink to “Upcoming Events”">&#8203;</a></h2>
<p>To catch talks and presentations from VoidZero team members, see the following events where they will present:</p>
<ul>
<li>Don't miss Evan You's Keynote at <a href="https://singapore.cityjsconf.org/" target="_blank" rel="noreferrer">CityJS Singapore</a> on Feb 6th, 2026.</li>
<li><a href="https://laravellive.jp/en#speakers" target="_blank" rel="noreferrer">Laravel Live Japan 2026</a> will feature a talk from Alexander Lichter on VoidZero's unified toolchain vision on May 26th.</li>
<li>Alexander Lichter will join <a href="https://enterjs.de/veranstaltung-86570-0-vue-im-jahr-2026-zukunftssicher-oder-sackgasse.html" target="_blank" rel="noreferrer">enterJS 2026</a> in Mannheim, Germany on June 16th.</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From The Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From The Community”">&#8203;</a></h2>
<ul>
<li>The <a href="https://risingstars.js.org/2025/en#section-build" target="_blank" rel="noreferrer">2025 JavaScript Rising Stars</a> have been announced, with Vite being the 2nd fastest growing project in the Tooling category, while Oxc came in 4th place, Rolldown in 6th, and tsdown in 10th.</li>
<li><code>jsshaker</code>, a JavaScript code size optimizer based on abstract interpretation using Oxc <a href="https://github.com/kermanx/jsshaker" target="_blank" rel="noreferrer">was published</a>.</li>
<li>Want a TUI for your Oxlint rules? Try out <a href="https://github.com/holoflash/oxlint-tui" target="_blank" rel="noreferrer"><code>oxlint-tui</code></a>, which provides a lightweight, dependency-free TUI just for that.</li>
<li>Turborepo migrated <a href="https://github.com/vercel/turborepo/pull/11392" target="_blank" rel="noreferrer">their own code base to Oxlint and Oxfmt</a>.</li>
<li>Turborepo also added <a href="https://turborepo.com/docs/guides/tools/oxc" target="_blank" rel="noreferrer">a guide for using Oxlint and Oxfmt</a> with turborepo-based projects.</li>
<li>Hugging Face <a href="https://github.com/huggingface/huggingface.js/pull/1924" target="_blank" rel="noreferrer">switched from Prettier to Oxfmt</a> for their TypeScript code base. The largest diff is based on a deliberate trailing comma setting change.</li>
<li>Lichess <a href="https://github.com/lichess-org/lila/pull/19179" target="_blank" rel="noreferrer">migrated from ESLint and Prettier to Oxlint and Oxfmt</a>, catching a faulty rule from the previous process.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2019043119539306880" /><TwitterEmbed url="https://x.com/ixahmedxii/status/2011128514171592729" /><TwitterEmbed url="https://twitter.com/rdraward/status/2013663452238110994" />]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Announcing Rolldown 1.0 RC]]></title>
            <link>https://voidzero.dev/posts/announcing-rolldown-rc</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-rolldown-rc</guid>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Today we are thrilled to announce the Release Candidate for Rolldown 1.0.</p>
<p><strong>TL;DR:</strong> Rolldown is a JavaScript/TypeScript bundler written in Rust. It is 10-30x faster than Rollup while maintaining compatibility with Rollup's plugin API. This RC marks API stability. No breaking changes are planned before 1.0. We encourage you to test it on your projects and <a href="https://github.com/rolldown/rolldown/issues" target="_blank" rel="noreferrer">report any issues</a>.</p>
<div  class="tip custom-block"><p class="custom-block-title">Using Vite?</p>
<p>Try Rolldown today with the <a href="/posts/announcing-vite-8-beta.html">Vite 8 beta</a>, which uses Rolldown as the default bundler.</p>
</div>
<h2 id="what-is-rolldown" tabindex="-1">What is Rolldown? <a class="header-anchor" href="#what-is-rolldown" aria-label="Permalink to “What is Rolldown?”">&#8203;</a></h2>
<p>Rolldown is a high-performance JavaScript bundler designed to serve as the future bundler for <a href="https://vite.dev/" target="_blank" rel="noreferrer">Vite</a>. It combines the best of both worlds: the speed of <a href="https://esbuild.github.io/" target="_blank" rel="noreferrer">esbuild</a> and the ecosystem compatibility of <a href="https://rollupjs.org/" target="_blank" rel="noreferrer">Rollup</a>. It also goes beyond both with features like <a href="https://rolldown.rs/reference/OutputOptions.codeSplitting" target="_blank" rel="noreferrer"><code>output.codeSplitting</code></a>, which provides webpack-like granular chunking control.</p>
<h2 id="key-features" tabindex="-1">Key Features <a class="header-anchor" href="#key-features" aria-label="Permalink to “Key Features”">&#8203;</a></h2>
<ul>
<li><strong>10-30x faster than Rollup</strong>: Native Rust performance with parallel processing, plus a WASM build for portability</li>
<li><strong>Rollup-compatible plugin API</strong>: Existing Rollup plugins work out of the box</li>
<li><strong>Built-in transforms</strong>: TypeScript, JSX, and syntax lowering powered by <a href="https://oxc.rs/" target="_blank" rel="noreferrer">Oxc</a></li>
<li><strong>Native CJS/ESM interop</strong>: No <code>@rollup/plugin-commonjs</code> needed</li>
<li><strong>Built-in Node.js module resolution</strong>: No <code>@rollup/plugin-node-resolve</code> needed</li>
<li><strong>Granular code splitting</strong>: Webpack-like chunking control via <a href="https://rolldown.rs/reference/OutputOptions.codeSplitting" target="_blank" rel="noreferrer"><code>output.codeSplitting</code></a>, unavailable in Rollup</li>
</ul>
<p>See the full list in <a href="https://rolldown.rs/guide/notable-features" target="_blank" rel="noreferrer">Notable Features</a>.</p>
<h2 id="try-it-out" tabindex="-1">Try It Out <a class="header-anchor" href="#try-it-out" aria-label="Permalink to “Try It Out”">&#8203;</a></h2>
<p>Getting started with Rolldown takes seconds:</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-61" id="tab-62" checked><label data-title="npm" for="tab-62">npm</label><input type="radio" name="group-61" id="tab-63" ><label data-title="pnpm" for="tab-63">pnpm</label><input type="radio" name="group-61" id="tab-64" ><label data-title="yarn" for="tab-64">yarn</label><input type="radio" name="group-61" id="tab-65" ><label data-title="bun" for="tab-65">bun</label></div><div class="blocks">
<div class="language-sh active"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">bun</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> add</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span></span></code></pre>
</div></div></div>
<p>Create a config file:</p>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { defineConfig } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'rolldown'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> defineConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  input: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'src/main.js'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  output: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    file: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'dist/bundle.js'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
</div><p>Run the build:</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-74" id="tab-75" checked><label data-title="npm" for="tab-75">npm</label><input type="radio" name="group-74" id="tab-76" ><label data-title="pnpm" for="tab-76">pnpm</label><input type="radio" name="group-74" id="tab-77" ><label data-title="yarn" for="tab-77">yarn</label><input type="radio" name="group-74" id="tab-78" ><label data-title="bun" for="tab-78">bun</label></div><div class="blocks">
<div class="language-sh active"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">bunx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> rolldown</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -c</span></span></code></pre>
</div></div></div>
<h2 id="what-rc-means" tabindex="-1">What &quot;RC&quot; Means <a class="header-anchor" href="#what-rc-means" aria-label="Permalink to “What &quot;RC&quot; Means”">&#8203;</a></h2>
<p>This Release Candidate signals &quot;API stability&quot;. We do not plan any breaking changes to Rolldown's public API before the 1.0 stable release.</p>
<p><strong>A note on experimental features:</strong> Some features are still marked as experimental. For example:</p>
<ul>
<li><a href="https://rolldown.rs/in-depth/module-types" target="_blank" rel="noreferrer">Module types</a></li>
<li><a href="https://rolldown.rs/reference/Function.watch" target="_blank" rel="noreferrer">Watch mode</a></li>
</ul>
<p>Experimental features are clearly documented and may see breaking changes even after 1.0. We recommend testing experimental features thoroughly before using them in production.</p>
<h2 id="what-we-ve-been-working-on" tabindex="-1">What We've Been Working On <a class="header-anchor" href="#what-we-ve-been-working-on" aria-label="Permalink to “What We've Been Working On”">&#8203;</a></h2>
<p>Since beta.1, we have landed over 3,400 commits: <strong>749</strong> features, <strong>682</strong> bug fixes, <strong>109</strong> perf optimizations, and <strong>166</strong> doc updates.</p>
<h3 id="vite-integration" tabindex="-1">Vite Integration <a class="header-anchor" href="#vite-integration" aria-label="Permalink to “Vite Integration”">&#8203;</a></h3>
<p>We ported multiple Vite internal plugins to Rust, improving performance for common use cases. We have been testing it in <a href="https://v7.vite.dev/guide/rolldown" target="_blank" rel="noreferrer">rolldown-vite</a> and the successor Vite 8 beta, battle-testing stability along the way.</p>
<h3 id="performance" tabindex="-1">Performance <a class="header-anchor" href="#performance" aria-label="Permalink to “Performance”">&#8203;</a></h3>
<p>109 performance commits including SIMD JSON escaping, parallel chunk generation, optimized symbol renaming, and faster sourcemap processing. Beyond Rolldown itself, <a href="https://oxc.rs/" target="_blank" rel="noreferrer">Oxc</a>, which powers our transforms and resolver, also got faster.</p>
<h3 id="better-chunking" tabindex="-1">Better Chunking <a class="header-anchor" href="#better-chunking" aria-label="Permalink to “Better Chunking”">&#8203;</a></h3>
<p>We improved the chunking algorithm to produce fewer chunks. Dynamic imports that reference already-loaded modules are now inlined, and small wrapper chunks are merged with their target chunks when possible.</p>
<h3 id="compatibility" tabindex="-1">Compatibility <a class="header-anchor" href="#compatibility" aria-label="Permalink to “Compatibility”">&#8203;</a></h3>
<p>We continue to expand Rollup and esbuild compatibility. Rolldown now passes 900+ Rollup tests and 670+ esbuild tests. Examples of newly added Rollup options:</p>
<ul>
<li><a href="https://rolldown.rs/reference/OutputOptions.dynamicImportInCjs" target="_blank" rel="noreferrer"><code>output.dynamicImportInCjs</code></a> (control how dynamic imports are rendered in CJS output)</li>
<li><a href="https://rolldown.rs/reference/InputOptions.watch#oninvalidate" target="_blank" rel="noreferrer"><code>watch.onInvalidate</code></a> (hook for when a watched file triggers a rebuild)</li>
<li><a href="https://rolldown.rs/reference/OutputOptions.minifyInternalExports" target="_blank" rel="noreferrer"><code>output.minifyInternalExports</code></a> (minify internal export names for smaller bundles)</li>
</ul>
<p>We also added support for Node.js <code>module.exports</code> ESM export, aligning with <a href="https://nodejs.org/docs/latest-v24.x/api/modules.html#loading-ecmascript-modules-using-require" target="_blank" rel="noreferrer">Node.js's new behavior with <code>require(ESM)</code></a>.</p>
<h3 id="api-stabilization" tabindex="-1">API Stabilization <a class="header-anchor" href="#api-stabilization" aria-label="Permalink to “API Stabilization”">&#8203;</a></h3>
<p>We promoted APIs from experimental and aligned defaults. For example:</p>
<ul>
<li><a href="https://rolldown.rs/reference/OutputOptions.strictExecutionOrder" target="_blank" rel="noreferrer"><code>output.strictExecutionOrder</code></a> (moved from <code>experimental</code>)</li>
<li><a href="https://rolldown.rs/reference/OutputOptions.codeSplitting" target="_blank" rel="noreferrer"><code>output.codeSplitting</code></a> (renamed from <code>output.advancedChunks</code>)</li>
<li><a href="https://rolldown.rs/reference/InputOptions.tsconfig" target="_blank" rel="noreferrer"><code>tsconfig</code> auto-discovery</a> enabled by default</li>
<li><a href="https://rolldown.rs/reference/InputOptions.preserveEntrySignatures" target="_blank" rel="noreferrer"><code>preserveEntrySignatures</code></a> defaults to <code>'exports-only'</code></li>
<li>Plugin timing diagnostics via <a href="https://rolldown.rs/reference/InputOptions.checks#plugintimings" target="_blank" rel="noreferrer"><code>checks.pluginTimings</code></a></li>
</ul>
<h3 id="developer-experience" tabindex="-1">Developer Experience <a class="header-anchor" href="#developer-experience" aria-label="Permalink to “Developer Experience”">&#8203;</a></h3>
<p>Better errors with documentation links, custom panic hooks for crash reporting, and new diagnostics aligned with Rollup like <code>CIRCULAR_REEXPORT</code> and <code>CANNOT_CALL_NAMESPACE</code>.</p>
<h3 id="documentation" tabindex="-1">Documentation <a class="header-anchor" href="#documentation" aria-label="Permalink to “Documentation”">&#8203;</a></h3>
<p>We filled in the missing docs:</p>
<ul>
<li>Dedicated pages for all options and functions and types in the <a href="https://rolldown.rs/reference/" target="_blank" rel="noreferrer">API reference</a></li>
<li><a href="https://rolldown.rs/apis/plugin-api" target="_blank" rel="noreferrer">Plugin API</a> based on Rollup's documentation with Rolldown specific additions</li>
<li><a href="https://rolldown.rs/apis/cli" target="_blank" rel="noreferrer">CLI reference</a></li>
</ul>
<h2 id="roadmap-to-1-0-and-vite-8" tabindex="-1">Roadmap to 1.0 and Vite 8 <a class="header-anchor" href="#roadmap-to-1-0-and-vite-8" aria-label="Permalink to “Roadmap to 1.0 and Vite 8”">&#8203;</a></h2>
<p>Our path forward:</p>
<ol>
<li><strong>RC period</strong>: Gather community feedback, fix critical bugs, and ensure API stability. We aim to keep breaking changes to zero.</li>
<li><strong>Vite 8</strong>: Ships with Rolldown as the default bundler, replacing both esbuild and Rollup in the build pipeline.</li>
<li><strong>Rolldown 1.0</strong>: Stable release once the RC has proven reliable in production use cases.</li>
</ol>
<p>The integration into Vite will unify the build pipeline, eliminating the current two-bundler architecture and providing consistent behavior between development and production. Vite 8 will likely ship before Rolldown 1.0, as some features targeted for 1.0 are not required for the Vite integration.</p>
<h2 id="acknowledgements" tabindex="-1">Acknowledgements <a class="header-anchor" href="#acknowledgements" aria-label="Permalink to “Acknowledgements”">&#8203;</a></h2>
<p>Rolldown 1.0 RC represents the collective effort of <a href="https://github.com/rolldown/rolldown/graphs/contributors" target="_blank" rel="noreferrer">over 150 contributors</a>. Thank you to everyone who has contributed code, reported issues, or helped spread the word.</p>
<p>We also owe a great debt to the projects that inspired Rolldown:</p>
<ul>
<li><a href="https://github.com/rollup/rollup" target="_blank" rel="noreferrer">Rollup</a> by Rich Harris and Lukas Taegert-Atkinson</li>
<li><a href="https://github.com/evanw/esbuild" target="_blank" rel="noreferrer">esbuild</a> by Evan Wallace</li>
</ul>
<h2 id="join-the-community" tabindex="-1">Join the Community <a class="header-anchor" href="#join-the-community" aria-label="Permalink to “Join the Community”">&#8203;</a></h2>
<ul>
<li><a href="https://chat.rolldown.rs" target="_blank" rel="noreferrer">Discord</a> - Chat with the team and other users</li>
<li><a href="https://github.com/rolldown/rolldown" target="_blank" rel="noreferrer">GitHub</a> - Star the repo, report issues, contribute</li>
<li><a href="https://rolldown.rs/contribution-guide/" target="_blank" rel="noreferrer">Contributing Guide</a> - Get started contributing</li>
</ul>
<h2 id="give-it-a-try" tabindex="-1">Give It a Try <a class="header-anchor" href="#give-it-a-try" aria-label="Permalink to “Give It a Try”">&#8203;</a></h2>
<p>Rolldown is ready for real-world testing. Try it on your projects and let us know how it goes. If you encounter issues, please <a href="https://github.com/rolldown/rolldown/issues" target="_blank" rel="noreferrer">open an issue</a> on GitHub. Your feedback during this RC period directly shapes the 1.0 release.</p>
<p>We can't wait to see what you build with Rolldown.</p>
]]></content:encoded>
            <author>sapphi-red</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: December 2025 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-dec-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-dec-2025</guid>
            <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Happy new year and welcome to another edition of <em>What’s new in ViteLand!</em></p>
<p>Regularly, we recap the project updates for Vite+, Vite, Vitest, Rolldown, Oxc, and what’s happening in our community.</p>
<h2 id="faster-linting-and-formatting-with-oxc" tabindex="-1">Faster Linting and Formatting with Oxc <a class="header-anchor" href="#faster-linting-and-formatting-with-oxc" aria-label="Permalink to “Faster Linting and Formatting with Oxc”">&#8203;</a></h2>
<p>For most developers, the daily interaction with tooling means linting and formatting. Oxc delivers both through Oxlint and Oxfmt: a linter that runs 50-100x faster than ESLint and a formatter that outpaces Prettier by 30x. But speed is only part of the story.</p>
<p>Since <a href="/posts/announcing-oxlint-1-stable.html">Oxlint 1.0</a> shipped in June, the team has added <a href="/posts/announcing-oxlint-type-aware-linting-alpha.html">type-aware linting</a> (now in alpha, 8-12x faster than typescript-eslint) and <a href="/posts/announcing-oxlint-js-plugins.html">ESLint-compatible JS plugins</a>. The new <a href="/posts/announcing-oxfmt-alpha.html">Oxfmt alpha</a> already includes features like embedded language support and experimental import sorting.</p>
<p>All kinds of projects are switching for faster feedback:</p>
<ul>
<li>Runtimes like Bun</li>
<li>Frameworks such as Vue and Preact</li>
<li>Popular libraries like date-fns and Inquirer.js</li>
<li>Production-grade apps like Shopify, Miro, and Airbnb</li>
</ul>
<p>Oxlint and Oxfmt can replace traditional tools today, and they keep getting better. The change is here. Curious what comes next? Check out our <a href="https://github.com/oxc-project/oxc/issues/17411" target="_blank" rel="noreferrer">2026 roadmap</a>.</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li>Multiple new Vite 8 beta builds were released, fixing bugs and improving stability. Check out the <a href="https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md" target="_blank" rel="noreferrer">release notes</a> for details.</li>
<li>Version two of Vite native plugins is available in the Vite 8 beta with <a href="https://github.com/vitejs/vite/pull/21268" target="_blank" rel="noreferrer">improved alignment</a> of the native dynamic import variables and native import glob plugins.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2008744657732485364" /><h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li>Vitest has built-in (experimental) <a href="https://vitest.dev/guide/open-telemetry.html" target="_blank" rel="noreferrer">OpenTelemetry support</a> to help developers understand why certain tests run slow.</li>
<li>With Vitest UI, the CLI, or the VS Code extension, users can <a href="https://vitest.dev/config/experimental.html#experimental-printimportbreakdown" target="_blank" rel="noreferrer">break down imports</a> and identify which dependencies are slowing down their tests.</li>
<li>To improve speed in subsequent test runs, Vitest now <a href="https://vitest.dev/config/experimental#experimental-fsmodulecache" target="_blank" rel="noreferrer">caches transformed files on disk</a> between runs when using the <code>experimental.fsCache</code> flag via config or CLI.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/2008116404667441327" /><h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li>TypeScript project references are supported when <a href="https://rolldown.rs/options/tsconfig" target="_blank" rel="noreferrer">manually specifying a <code>tsconfig</code></a>.</li>
<li>The default chunking algorithm of Rolldown has been improved to reduce the number of chunks generated in certain scenarios, leading to fewer network requests.</li>
<li>Rolldown provides a <code>postBanner</code> and <code>postFooter</code> option to append code after all modules have been bundled. This is useful for adding runtime code, comments, or scripts that shouldn't be altered. <a href="https://repl.rolldown.rs/#eNptkD9vwyAQxb/KicWJZDk7mdqqrbq0HTqyEPtwqPCdhXGTyuK7B+P8GzLBcb/3jnuTMEJOwlKDx+p3mO8k5K0uRZ3KzQZ+9naAmrsOKcDBOgc7hJYJFdVMAzusHLerQu/qYq0oCVHI4EeMpfDsXMMHqhJpbHs350FnmWi7nn2ACRo0lvAltyGC8dyBuuqU2CpShMdMJ1aPLp9XzWpSBMBj6McgIRcAnSVr/iXM/yuXp56H8KyJ0Eso0r5PfY8phAYCA+p6D8Y6LM6wYQ4X8EOpYkkju9ok0dTA+9fn6wWfvd/uJN8eH5nPcFQU11sRU2p/KQanAw5BxBOHyIyf" target="_blank" rel="noreferrer">Try it out in the REPL</a>.</li>
<li>You can now <a href="https://github.com/rolldown/rolldown/pull/7540/changes#top" target="_blank" rel="noreferrer">filter by <code>importerId</code></a> in your Rolldown plugin <code>resolveId</code> hook to only handle specific modules and improve performance.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/1998477772553949510" /><h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>The Oxc team announced upcoming <a href="https://github.com/oxc-project/oxc/issues/17527" target="_blank" rel="noreferrer">support for dynamic configs</a> in Oxlint.</li>
<li>Oxlint <a href="https://oxc.rs/docs/guide/usage/linter/rules/typescript/strict-boolean-expressions" target="_blank" rel="noreferrer">adds</a> <a href="https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-deprecated" target="_blank" rel="noreferrer">3</a> <a href="https://oxc.rs/docs/guide/usage/linter/rules/typescript/prefer-includes" target="_blank" rel="noreferrer">additional</a> type-aware rules, parallel <a href="https://github.com/oxc-project/oxc/pull/15917" target="_blank" rel="noreferrer">type checking</a> for even faster performance, <a href="https://github.com/oxc-project/oxc/pull/15286" target="_blank" rel="noreferrer">configuration</a> for type-aware rules, and auto-fixing support.</li>
<li>Oxfmt now supports non-JS/TS files like JSON, Markdown, Vue, and HTML (see <a href="https://oxc.rs/docs/guide/usage/formatter.html#supported-languages" target="_blank" rel="noreferrer">full list</a>).</li>
<li>Planning to migrate from Prettier to Oxfmt? You can now use <code>npx oxfmt --migrate prettier</code> for a seamless change.</li>
<li>All users of Zed can now use the <a href="https://github.com/oxc-project/oxc-zed" target="_blank" rel="noreferrer">Oxc extension for Zed</a> to get Oxlint and Oxfmt diagnostics and actions directly in their editor.</li>
<li>The performance work continues: VoidZero's Cameron Clark achieved a 10% improvement in Oxc's semantics performance by <a href="https://github.com/oxc-project/oxc/pull/17459" target="_blank" rel="noreferrer">always inlining functions to enable compile-time match elimination</a>, and Cam McHenry further optimized it by <a href="https://github.com/oxc-project/oxc/pull/17564" target="_blank" rel="noreferrer">another 8.8%</a>.</li>
</ul>
<TwitterEmbed url="https://x.com/cameron_c2/status/2005613491030483324" /><TwitterEmbed url="https://x.com/cameron_c2/status/2003064699819061395" /><TwitterEmbed url="https://x.com/boshen_c/status/2001878127228891251" /><h2 id="upcoming-events" tabindex="-1">Upcoming Events <a class="header-anchor" href="#upcoming-events" aria-label="Permalink to “Upcoming Events”">&#8203;</a></h2>
<p>To catch talks and presentations from VoidZero team members, see the following events where they will present:</p>
<ul>
<li>Don't miss out Evan You's Keynote at <a href="https://singapore.cityjsconf.org/" target="_blank" rel="noreferrer">CityJS Singapore</a> on Feb 6th, 2026.</li>
<li>Alexander Lichter's JSNation US talk recording on &quot;The End of Frontend Fragmentation? How Rust is Unifying Frameworks &amp; Tooling&quot; <a href="https://gitnation.com/contents/shaping-framework-futures-with-modern-tooling" target="_blank" rel="noreferrer">is now available</a>.</li>
<li>The React Advanced recordings are also published now, including Alex's talk on <a href="https://gitnation.com/contents/rust-meets-react-diving-into-the-next-generation-build-pipeline-for-react-apps" target="_blank" rel="noreferrer">Rust Meets React: Diving Into the Next Generation Build Pipeline for React Apps</a>.</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From The Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From The Community”">&#8203;</a></h2>
<ul>
<li>Framer recently released their case study on <a href="https://www.framer.com/blog/framer-rolldown/" target="_blank" rel="noreferrer">improving performance with Rolldown</a>.</li>
<li>The TypeScript.fm podcast <a href="https://youtu.be/9bpOGGHtQfg?t=824" target="_blank" rel="noreferrer">covers VoidZero project updates</a> in their latest episode.</li>
<li>Syntax.fm went over their 2025 predictions and foresaw that <a href="https://youtu.be/-f2ql_aGIbs?t=2902&amp;si=E-g5odeh7wfAlDh_" target="_blank" rel="noreferrer">Vite is still king</a>.</li>
<li>The folks from Syntax.fm also released their 2026 predictions, including that <a href="https://youtu.be/8YeBQUAjAQM?t=1430" target="_blank" rel="noreferrer">Oxlint will &quot;snowpack&quot; Biome by next year</a>.</li>
<li>The Ninja Squad wrote an in-depth article about <a href="https://blog.ninja-squad.com/2025/11/18/angular-tests-with-vitest-browser-mode" target="_blank" rel="noreferrer">testing Angular with Vitest's browser mode</a>.</li>
<li>Itay Mendelawy created an <a href="https://github.com/itaymendel/oxlint-plugin-complexity" target="_blank" rel="noreferrer">Oxlint plugin for cyclomatic and cognitive complexity</a>, which adds rules to Oxlint to enforce complexity limits in your codebase.</li>
<li>Sotaro Tomikawa released <a href="https://rolldphobia.ssssota.dev/" target="_blank" rel="noreferrer">Roll(down)phobia</a>, a modern web-based bundle size analyzer powered by Rolldown and esm.sh.</li>
<li>Dan Abramov released his <a href="https://rscexplorer.dev/" target="_blank" rel="noreferrer">RSC Explorer</a>, open source and built with Vite 8 and Rolldown as worker.</li>
<li><a href="https://github.com/ecrindigital/facetpack" target="_blank" rel="noreferrer">Facetpack</a> is another new toolkit for React Native, replacing Babel with Oxc under the hood, leading to 36x faster transforms.</li>
<li>MonkeyType saw a <a href="https://github.com/monkeytypegame/monkeytype/pull/7144" target="_blank" rel="noreferrer">~3x improvement in just type-aware linting speed</a> moving to Oxlint.</li>
<li>Better-T-Stack migrated internally <a href="https://github.com/AmanVarshney01/create-better-t-stack/pull/710" target="_blank" rel="noreferrer">from Biome to Oxlint and Oxfmt</a>.</li>
<li>Ultracite <a href="https://github.com/haydenbleasel/ultracite/pull/466" target="_blank" rel="noreferrer">offers Oxlint and Oxfmt-based presets</a> in addition to Biome, ESLint and Prettier.</li>
<li>Lee Geunhyeok built <a href="https://github.com/leegeunhyeok/rollipop" target="_blank" rel="noreferrer">rollipop</a>, a new build toolkit for React Native, fully powered by Rolldown instead of the Metro bundler.</li>
</ul>
<TwitterEmbed url="https://x.com/jaredpalmer/status/1999166426121421063" /><TwitterEmbed url="https://x.com/ahmedelgabri/status/2006358236258238716" /><TwitterEmbed url="https://x.com/zhiyuanzmj/status/2004109574841029117" />]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Announcing Oxlint Type-Aware Linting Alpha]]></title>
            <link>https://voidzero.dev/posts/announcing-oxlint-type-aware-linting-alpha</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-oxlint-type-aware-linting-alpha</guid>
            <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxlint's type-aware linting, see the <a href="https://oxc.rs/blog/2025-12-08-type-aware-alpha.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxlint's type-aware linting has reached alpha status. Type-aware rules can now be manually configured, disabled with comments, and fixed automatically. This milestone also includes more rule coverage, TypeScript diagnostics reporting, and type-checking while linting.</p>
]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxlint's type-aware linting, see the <a href="https://oxc.rs/blog/2025-12-08-type-aware-alpha.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxlint's type-aware linting has reached alpha status. Type-aware rules can now be manually configured, disabled with comments, and fixed automatically. This milestone also includes more rule coverage, TypeScript diagnostics reporting, and type-checking while linting.</p>
<hr>
<p>Less than 6 months after the <a href="/posts/announcing-oxlint-type-aware-linting.html"><strong>technical preview release</strong></a>, Oxlint's type-aware linting has reached alpha status. The goal for the technical preview was to build a proof of concept for type-aware linting in Oxlint. <strong>VoidZero's goal for the alpha release is to better integrate Oxlint with <code>tsgolint</code>, which powers our type-aware lint rules.</strong></p>
<h2 id="what-is-tsgolint" tabindex="-1">What is <code>tsgolint</code>? <a class="header-anchor" href="#what-is-tsgolint" aria-label="Permalink to “What is tsgolint?”">&#8203;</a></h2>
<p>Type-aware rules like <code>no-floating-promises</code> can slow down linting because TypeScript may need to check every file to infer types. VoidZero accelerates this process using <code>tsgolint</code> to perform the underlying type checks and type-aware linting for Oxlint.</p>
<p><strong><code>tsgolint</code> is a high-performant linter backend on top of <code>typescript-go</code>, the Go port of TypeScript.</strong> Originally a proof-of-concept by <a href="https://github.com/auvred" target="_blank" rel="noreferrer">auvred</a> (typescript-eslint team), it's now maintained by VoidZero. Since <code>typescript-go</code> doesn't export internal packages, <code>tsgolint</code> provides a shim, an adapter layer on top of <code>typescript-go</code> that makes these internal APIs accessible. All type-aware rules are written directly against these shimmed internal APIs, keeping Oxlint fast while leveraging TypeScript's type system. <code>tsgolint</code> is not meant to run standalone. It is designed to be used as a backend for linters like Oxlint, providing type-aware linting capabilities.</p>
<p>Preliminary results show that <strong>Oxlint + <code>tsgolint</code></strong> is significantly faster than <strong>ESLint + <code>typescript-eslint</code></strong> (<a href="https://github.com/oxc-project/bench-linter" target="_blank" rel="noreferrer">source</a>), given the same ruleset:</p>
<ul>
<li><strong>8x</strong> faster in <code>vuejs/core</code></li>
<li><strong>12x</strong> faster in <code>outline/outline</code></li>
</ul>
<p>However, a major consideration for this approach is maintenance and staying up-to-date with <code>typescript-go</code>. We regularly update <code>tsgolint</code> to depend on the latest <code>typescript-go</code> release and address any changes. While working on <code>tsgolint</code>, our team also submits pull requests to improve <code>typescript-go</code> and the overall ecosystem.</p>
<figure style="margin-top: 2rem;">
  <img src="/images/oxlint-tsgolint-flow.jpg" alt="Flow chart showing how developer uses Oxlint with `tsgolint` for type-aware linting" />
  <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
    Oxlint is the developer's "frontend" interface that calls <code>tsgolint</code> as "linter backend" for type-aware linting.
  </figcaption>
</figure>
<h2 id="better-tsgolint-integration-with-oxlint" tabindex="-1">Better <code>tsgolint</code> integration with Oxlint <a class="header-anchor" href="#better-tsgolint-integration-with-oxlint" aria-label="Permalink to “Better tsgolint integration with Oxlint”">&#8203;</a></h2>
<p>The goal for the alpha status was to reduce the distinction between type-aware rules and non-type-aware rules when using Oxlint.</p>
<ol>
<li><strong>Rule configurations.</strong> Type-aware rules can be separately configured in <code>.oxlintrc.json</code></li>
</ol>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// .oxlintrc.json</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "rules"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "typescript/no-floating-promises"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">      "error"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "ignoreVoid"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        "allowForKnownSafePromises"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"from"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"file"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"SafePromise"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"from"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"lib"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"PromiseLike"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><ol start="2">
<li><strong>In-line disable comment support</strong>. Type-aware rules can be disabled per file or line.</li>
</ol>
<div class="language-js"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* oxlint-disable typescript/no-floating-promises */</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// oxlint-disable-next-line typescript/no-floating-promises</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><ol start="3">
<li><strong>Automatic fixes</strong>. Type-aware rules now support automatic fixes using the <code>--fix</code> flag.</li>
</ol>
<p>All 3 updates bring type-aware rule features closer to parity with non-type-aware rules.</p>
<h2 id="additional-improvements" tabindex="-1">Additional improvements <a class="header-anchor" href="#additional-improvements" aria-label="Permalink to “Additional improvements”">&#8203;</a></h2>
<p>In addition to more stability, Oxlint's type-aware linting alpha comes with:</p>
<ul>
<li><strong>Type-checking while linting</strong>. Oxlint can emit type checking errors from TypeScript while linting. Meaning, in some cases, it's possible to skip doing a separate type-check command altogether (e.g., <code>tsc --noEmit</code>) and reduce total time spent linting and type-checking in CI. You can enable it via the <code>--type-check</code> flag.</li>
<li><strong>More supported rules</strong>. Oxlint added support for <code>no-deprecated</code>, <code>prefer-includes</code> , <code>strict-boolean-expressions</code> rules. It now covers 43 / 59 <code>typescript-eslint</code> rules. <a href="https://oxc.rs/docs/guide/usage/linter/type-aware.html#supported-rules" target="_blank" rel="noreferrer">All supported rules</a>.</li>
<li><strong>TypeScript diagnostics</strong>. Oxlint reports any TypeScript compiler issues or configuration issues in <code>tsconfig.json</code> files.</li>
</ul>
<h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to “Next steps”">&#8203;</a></h2>
<p>VoidZero is actively working on the following improvements for the beta release:</p>
<ul>
<li><strong>Increase type-aware rules support.</strong> Expand coverage to the remaining <code>typescript-eslint</code> rules.</li>
<li><strong>Memory usage optimization.</strong> In very large monorepos, <code>tsgolint</code> may encounter out-of-memory issues. Our team is working improving memory usage for the next milestone. If you are having memory issues please report it in the <a href="https://github.com/oxc-project/tsgolint/issues" target="_blank" rel="noreferrer">tsgolint repository</a>.</li>
</ul>
<p><strong>Connect with us:</strong></p>
<ul>
<li><strong>Discord</strong>: Join our <a href="https://discord.gg/9uXCAwqQZW" target="_blank" rel="noreferrer"><strong>community server</strong></a> for real-time discussions</li>
<li><strong>GitHub</strong>: Share feedback on <a href="https://github.com/oxc-project/oxc/discussions" target="_blank" rel="noreferrer"><strong>GitHub Discussions</strong></a></li>
<li><strong>Issues</strong>: Report <code>oxlint</code> bugs to <a href="https://github.com/oxc-project/oxc/issues" target="_blank" rel="noreferrer"><strong>oxc</strong></a> and type-aware linting bugs to <a href="https://github.com/oxc-project/tsgolint/issues" target="_blank" rel="noreferrer"><strong>tsgolint</strong></a>.</li>
</ul>
]]></content:encoded>
            <author>Michael Dong</author>
            <author>Cameron Clark</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: November 2025 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-nov-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-nov-2025</guid>
            <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>What’s new in ViteLand!</em></p>
<p>Regularly, we recap the project updates for Vite+, Vite, Vitest, Rolldown, Oxc, and what’s happening in our community.</p>
<h2 id="vite-8-beta-the-rolldown-powered-vite" tabindex="-1">Vite 8 Beta: The Rolldown-powered Vite <a class="header-anchor" href="#vite-8-beta-the-rolldown-powered-vite" aria-label="Permalink to “Vite 8 Beta: The Rolldown-powered Vite”">&#8203;</a></h2>
<p>We are excited to announce that Vite 8 beta is now available! Vite now uses Rolldown as its bundler, replacing the previous combination of esbuild and Rollup. Rolldown is VoidZero's new Rust-based bundler that is designed for Vite use cases and brings significant performance improvement.</p>
<p>However, the impact of Vite’s bundler swap goes beyond performance. Rolldown uses Oxc, another project led by VoidZero, for parsing, resolving, transforming, and minifying. <strong>That makes Vite the entry point to an end-to-end toolchain maintained by the same team: The build tool (Vite), the bundler (Rolldown), and the compiler (Oxc).</strong></p>
<p>This alignment brings consistent behavior, faster adoption of changes like new language features, and improvements like better tree-shaking and chunking that wouldn't be doable in Vite directly.</p>
<p>Want to know more details? Read <a href="/posts/announcing-vite-8-beta.html">our announcement blog post</a> about the new beta release!</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite+ <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite+”">&#8203;</a></h3>
<ul>
<li>We've added a new <a href="/posts/announcing-vite-plus.html#faqs">FAQ section to the Vite+ announcement post</a>, answering common questions about the upcoming toolchain. Make sure to give it a read!</li>
</ul>
<h3 id="vite-1" tabindex="-1">Vite <a class="header-anchor" href="#vite-1" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li><a href="https://github.com/vitejs/vite/releases/tag/v7.2.0" target="_blank" rel="noreferrer">Vite 7.2 was released</a> earlier this month, bringing several smaller features and bug fixes in further patch versions.</li>
</ul>
<TwitterEmbed url="https://x.com/youyuxi/status/1993694943202951269" /><h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li>Vitest now has a <a href="https://bsky.app/profile/macarie.blue/post/3m6hinodnvk2t" target="_blank" rel="noreferrer">diff slider and tabbed view</a> for visual regression testing results! This makes it easier to compare visual changes side by side.</li>
<li>A new <em>experimental</em> <a href="https://vitest.dev/config/experimental.html#experimental-fsmodulecache" target="_blank" rel="noreferrer">file-system based cache</a> is available in Vitest to speed up subsequent test runs by caching transformed modules on disk. It also works in the CI!</li>
<li>With Vitest 4, a <a href="https://vitest.dev/api/expect.html#expect-schemamatching" target="_blank" rel="noreferrer">new standard schema matching API</a> was published, so you can now match against schemas of libraries like Zod, Valibot, Arktype, or Yup directly in your tests.</li>
<li>Vitest introduced <a href="https://vitest.dev/guide/ui.html#import-breakdown" target="_blank" rel="noreferrer">Imports Breakdown</a>, another experimental feature in version 4.0.15. Now you see how long each module took to load, in the Vitest UI, the VS Code extension and your terminal.</li>
</ul>
<h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li>Rolldown now has Vite-like <code>tsconfig</code> auto-discovery. This is opt-in through the <a href="https://rolldown.rs/options/tsconfig" target="_blank" rel="noreferrer">Rolldown config setting <code>tsconfig: true</code></a> and will also scan <code>references</code>.</li>
<li>You can now generate a stable URL to link to assets after bundling. The <a href="https://rolldown.rs/options/experimental#resolvenewurltoasset" target="_blank" rel="noreferrer"><code>experimental.resolveNewUrlToAsset</code> option</a> will transform <code>new URL()</code> calls pointing to assets.</li>
<li>Rolldown <a href="https://x.com/voidzerodev/status/1993314494089462174" target="_blank" rel="noreferrer">now respects the <code>as &quot;module.exports&quot;</code> keyword</a>, improving <code>require(esm)</code> interop and aligning with Node.</li>
<li>While the Vite Devtools are still work in progress, <code>tsdown</code> now <a href="https://github.com/rolldown/tsdown/pull/576" target="_blank" rel="noreferrer">integrates them when run in debug mode</a>.</li>
</ul>
<TwitterEmbed url="https://x.com/voidzerodev/status/1988651062891295229" /><TwitterEmbed url="https://x.com/sanxiaozhizi/status/1994265505088012543" /><TwitterEmbed url="https://x.com/sanxiaozhizi/status/1995621832192590256" /><h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>The <a href="/posts/announcing-oxfmt-alpha.html">first Oxfmt alpha was released</a>, bringing 30x faster formatting compared to Prettier and easy migration.</li>
<li>Oxfmt also updated its <a href="https://github.com/oxc-project/oxc/discussions/15851" target="_blank" rel="noreferrer">default <code>printWidth</code> from 80 to 100 characters</a> for better defaults and reduced LLM token usage.</li>
<li>The Oxc transformer, minifier and parser packages aligned their function naming to be more consistent. As this is a breaking change, make sure <a href="https://github.com/oxc-project/oxc/issues/15576#issuecomment-3546520530" target="_blank" rel="noreferrer">you are aware of the naming changes and new functions</a> when updating.</li>
<li>Boshen Chen, VoidZero's VP of Engineering, published a detailed <a href="https://oxc.rs/docs/contribute/security.html" target="_blank" rel="noreferrer">explanation of Oxc's security policy</a>, including mandatory two factor authentication for all core contributors and the use of trusted publishing.</li>
<li>Oxc's parser became 2~7% faster <a href="https://github.com/oxc-project/oxc/pull/15513" target="_blank" rel="noreferrer">thanks to a lexer optimization</a> by core team member Jim Dummett. This performance gain benefits all Oxc-based tools including Rolldown and Rolldown-Vite.</li>
<li>Type-aware rules in Oxlint <a href="https://github.com/oxc-project/oxc/pull/15286" target="_blank" rel="noreferrer">can now be configured</a>.</li>
</ul>
<TwitterEmbed url="https://x.com/Cameron_C2/status/1991533296455676151" /><TwitterEmbed url="https://x.com/Cameron_C2/status/1985342808916455739" /><TwitterEmbed url="https://x.com/boshen_c/status/1991533371198173677" /><h2 id="from-the-community" tabindex="-1">From The Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From The Community”">&#8203;</a></h2>
<ul>
<li>Angular Version 21 is released, which comes with <a href="https://blog.angular.dev/announcing-angular-v21-57946c34f14b#c8d2" target="_blank" rel="noreferrer">Vitest as the new stable test runner</a>, ending the Angular team's exploration phase, deciding for Vitest and against both, Jest and Web Test Runner, as default testing solutions.</li>
<li>Canva sees <a href="https://www.youtube.com/watch?t=323&amp;v=26CoMExb6FE" target="_blank" rel="noreferrer">66x performance increase using <code>oxc-transform</code></a> for Isolated Declarations vs <code>tsc</code>.</li>
<li>The <a href="https://survey.stackoverflow.co/2025/" target="_blank" rel="noreferrer">StackOverflow Survey results are out</a>, showing that Vite is not only in the top 10 tools for Cloud development but also even more popular among developers that use AI.</li>
<li>The Tailwind CSS Vite Plugin <a href="https://github.com/tailwindlabs/tailwindcss/pull/19308" target="_blank" rel="noreferrer">adds plugin hook filters</a>, which improves performance when used with Rolldown or Rolldown-Vite.</li>
<li>Artem Zakharchenko writes about <a href="https://www.epicweb.dev/vitest-browser-mode-vs-playwright" target="_blank" rel="noreferrer">the differences between Vitest's Browser Mode and vanilla Playwright</a> on EpicWeb and also shares when to use which tool.</li>
<li>HowToTestFrontend released a guide on Vitest's Browser Mode, explaining <a href="https://howtotestfrontend.com/resources/vitest-browser-mode-guide-and-setup-info" target="_blank" rel="noreferrer">how to set it up and use it effectively</a>.</li>
<li>Node.js's new API documentation now uses <a href="https://github.com/nodejs/doc-kit/pull/488" target="_blank" rel="noreferrer">Rolldown's import map feature</a>, just after migrating to Rolldown a few months ago.</li>
<li>TresJS, the interactive 3D library for Vue.js, <a href="https://tresjs.org/blog/tresjs-tsdown-migration" target="_blank" rel="noreferrer">migrated their packages to build with tsdown</a> and shared their thoughts and results in a blog post.</li>
<li>Philippe Serhal, engineer at Netlify, shares how <a href="https://bsky.app/profile/philippeserhal.com/post/3m5c5xozdmc26" target="_blank" rel="noreferrer">modern tooling like <code>tsgo</code>, <code>oxlint</code>, and <code>oxfmt</code> leads to sub-100ms feedback loops</a> in his smaller side project.</li>
<li>Inquirer <a href="https://github.com/SBoudrias/Inquirer.js/pull/1912" target="_blank" rel="noreferrer">replaces Prettier with Oxfmt</a> before an alpha release of the formatter!</li>
<li>Nx released a <a href="https://www.youtube.com/watch?v=7m443a8emJ0" target="_blank" rel="noreferrer">video about Oxlint support in Nx pipelines</a>, showing how to integrate Oxlint with Nx easily.</li>
<li>The scaffolding tool <a href="https://batijs.dev/" target="_blank" rel="noreferrer">Bati</a> adds <a href="https://github.com/vikejs/bati/pull/636" target="_blank" rel="noreferrer">support for Oxlint</a>.</li>
<li>SaaS Pegasus writes a <a href="https://www.saaspegasus.com/guides/modern-javascript-for-django-developers/integrating-javascript-pipeline-vite/" target="_blank" rel="noreferrer">guide about adding Vite to a Django project</a> as part of their Modern JavaScript for Django Developers Series. If you are using Django and want to add Vite to the mix, this is your chance!</li>
</ul>
<TwitterEmbed url="https://x.com/alexanderOpalic/status/1989000354424635809" /><TwitterEmbed url="https://x.com/ryantotweets/status/1990156298684694877" />]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Vite 8 Beta: The Rolldown-powered Vite]]></title>
            <link>https://voidzero.dev/posts/announcing-vite-8-beta</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-vite-8-beta</guid>
            <pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>This post was originally published on the <a href="https://vite.dev/blog/announcing-vite8-beta" target="_blank" rel="noreferrer">Vite blog</a></p>
</blockquote>
<p>TL;DR: The first beta of Vite 8, powered by <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>, is now available. Vite 8 ships significantly faster production builds and unlocks future improvement possibilities. You can try the new release by upgrading <code>vite</code> to version <code>8.0.0-beta.0</code> and reading the <a href="https://main.vite.dev/guide/migration" target="_blank" rel="noreferrer">migration guide</a>.</p>
]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>This post was originally published on the <a href="https://vite.dev/blog/announcing-vite8-beta" target="_blank" rel="noreferrer">Vite blog</a></p>
</blockquote>
<p>TL;DR: The first beta of Vite 8, powered by <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>, is now available. Vite 8 ships significantly faster production builds and unlocks future improvement possibilities. You can try the new release by upgrading <code>vite</code> to version <code>8.0.0-beta.0</code> and reading the <a href="https://main.vite.dev/guide/migration" target="_blank" rel="noreferrer">migration guide</a>.</p>
<hr>
<p>We’re excited to release the first beta of Vite 8. This release marks a major milestone towards <a href="/posts/announcing-vite-plus.html">our goal of a unified JavaScript toolchain</a>. Vite now uses <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a> as its bundler, replacing the previous combination of esbuild and Rollup.</p>
<h2 id="a-new-bundler-for-the-web" tabindex="-1">A new bundler for the web <a class="header-anchor" href="#a-new-bundler-for-the-web" aria-label="Permalink to “A new bundler for the web”">&#8203;</a></h2>
<p>Vite previously relied on two bundlers to meet differing requirements for development and production builds:</p>
<ol>
<li>esbuild for fast compilation during development</li>
<li>Rollup for bundling, chunking, and optimizing production builds</li>
</ol>
<p>This approach lets Vite focus on developer experience and orchestration instead of reinventing parsing and bundling. However, maintaining two separate bundling pipelines introduced inconsistencies: separate transformation pipelines, different plugin systems, and a growing amount of glue code to keep bundling behavior aligned between development and production.</p>
<p>To solve this, we built <strong>Rolldown</strong>, our next-generation bundler designed for:</p>
<ul>
<li><strong>Performance</strong>: Rolldown is written in Rust and operates at native speed. It matches esbuild’s performance level and is <a href="https://github.com/rolldown/benchmarks" target="_blank" rel="noreferrer"><strong>10–30× faster than Rollup</strong></a>.</li>
<li><strong>Compatibility</strong>: Rolldown supports the same plugin API as Rollup and Vite. Most Vite plugins work out of the box with Vite 8.</li>
<li><strong>More Features</strong>: Rolldown unlocks more advanced features for Vite, including full bundle mode, more flexible chunk split control, module-level persistent cache, Module Federation, and more.</li>
</ul>
<h2 id="unifying-the-toolchain" tabindex="-1">Unifying the toolchain <a class="header-anchor" href="#unifying-the-toolchain" aria-label="Permalink to “Unifying the toolchain”">&#8203;</a></h2>
<p>The impact of Vite’s bundler swap goes beyond performance. Bundlers leverage parsers, resolvers, transformers, and minifiers. Rolldown uses Oxc, another project led by VoidZero, for these purposes.</p>
<p><strong>That makes Vite the entry point to an end-to-end toolchain maintained by the same team: The build tool (Vite), the bundler (Rolldown), and the compiler (Oxc).</strong></p>
<p>This alignment ensures behavior consistency across the stack and allows us to rapidly adopt and align with new language specifications as JavaScript continues to evolve. It also unlocks a wide range of improvements that previously couldn’t be done by Vite alone. For example, we can leverage Oxc’s semantic analysis to perform better tree-shaking in Rolldown.</p>
<h2 id="how-vite-migrated-to-rolldown" tabindex="-1">How Vite migrated to Rolldown <a class="header-anchor" href="#how-vite-migrated-to-rolldown" aria-label="Permalink to “How Vite migrated to Rolldown”">&#8203;</a></h2>
<p>The migration to a Rolldown-powered Vite is a foundational change. Therefore, our team took deliberate steps to implement it without sacrificing stability or ecosystem compatibility.</p>
<p>First, a separate <code>rolldown-vite</code> package was <a href="/posts/announcing-rolldown-vite.html">released as a technical preview</a>. This allowed us to work with early adopters without affecting the stable version of Vite. Early adopters benefited from Rolldown’s performance gains while providing valuable feedback. Highlights:</p>
<ul>
<li>Linear’s production build times were reduced from 46s to 6s</li>
<li>Ramp reduced their build time by 57%</li>
<li>Mercedes-Benz.io cut their build time down by up to 38%</li>
<li>Beehiiv reduced their build time by 64%</li>
</ul>
<p>Next, we set up a test suite for validating key Vite plugins against <code>rolldown-vite</code>. This CI job helped us catch regressions and compatibility issues early, especially for frameworks and meta-frameworks such as SvelteKit, react-router and Storybook.</p>
<p>Lastly, we built a compatibility layer to help migrate developers from Rollup and esbuild options to the corresponding Rolldown options.</p>
<p>As a result, there is a smooth migration path to Vite 8 for everyone.</p>
<h2 id="migrating-to-vite-8-beta" tabindex="-1">Migrating to Vite 8 Beta <a class="header-anchor" href="#migrating-to-vite-8-beta" aria-label="Permalink to “Migrating to Vite 8 Beta”">&#8203;</a></h2>
<p>Since Vite 8 touches the core build behavior, we focused on keeping the configuration API and plugin hooks unchanged. We created a <a href="https://main.vite.dev/guide/migration" target="_blank" rel="noreferrer">migration guide</a> to help you upgrade.</p>
<p>There are two available upgrade paths:</p>
<ol>
<li><strong>Direct Upgrade:</strong> Update <code>vite</code> in <code>package.json</code> and run the usual dev and build commands.</li>
<li><strong>Gradual Migration:</strong> Migrate from Vite 7 to the <code>rolldown-vite</code> package, and then to Vite 8. This allows you to identify incompatibilities or issues isolated to Rolldown without other changes to Vite. (Recommended for larger or complex projects)</li>
</ol>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>If you are relying on specific Rollup or esbuild options, you might need to make some adjustments to your Vite config. Please refer to the <a href="https://main.vite.dev/guide/migration" target="_blank" rel="noreferrer">migration guide</a> for detailed instructions and examples.
As with all non-stable, major releases, thorough testing is recommended after upgrading to ensure everything works as expected. Please make sure to report any <a href="https://github.com/vitejs/rolldown-vite/issues" target="_blank" rel="noreferrer">issues</a>.</p>
</div>
<p>If you use a framework or tool that uses Vite as dependency, for example Astro, Nuxt, or Vitest, you have to override the <code>vite</code> dependency in your <code>package.json</code>, which works slightly different depending on your package manager:</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-134" id="tab-135" checked><label data-title="npm" for="tab-135">npm</label><input type="radio" name="group-134" id="tab-136" ><label data-title="Yarn" for="tab-136">Yarn</label><input type="radio" name="group-134" id="tab-137" ><label data-title="pnpm" for="tab-137">pnpm</label><input type="radio" name="group-134" id="tab-138" ><label data-title="Bun" for="tab-138">Bun</label></div><div class="blocks">
<div class="language-json active"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "overrides"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"8.0.0-beta.0"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "resolutions"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"8.0.0-beta.0"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "pnpm"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "overrides"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"8.0.0-beta.0"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "overrides"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"8.0.0-beta.0"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div></div></div>
<p>After adding these overrides, reinstall your dependencies and start your development server or build your project as usual.</p>
<h2 id="additional-features-in-vite-8" tabindex="-1">Additional Features in Vite 8 <a class="header-anchor" href="#additional-features-in-vite-8" aria-label="Permalink to “Additional Features in Vite 8”">&#8203;</a></h2>
<p>In addition to shipping with Rolldown, Vite 8 comes with:</p>
<ul>
<li><strong>Built-in tsconfig <code>paths</code> support:</strong> Developers can enable it by setting <code>resolve.tsconfigPaths</code> to <code>true</code>. This feature has a small performance cost and is not enabled by default.</li>
<li><strong><code>emitDecoratorMetadata</code> support:</strong> Vite 8 now has built-in automatic support for TypeScript’s <a href="https://www.typescriptlang.org/tsconfig/#emitDecoratorMetadata" target="_blank" rel="noreferrer"><code>emitDecoratorMetadata</code> option</a>.</li>
</ul>
<h2 id="looking-ahead" tabindex="-1">Looking Ahead <a class="header-anchor" href="#looking-ahead" aria-label="Permalink to “Looking Ahead”">&#8203;</a></h2>
<p>Speed has always been a defining feature for Vite. The integration with Rolldown and, by extension, Oxc means JavaScript developers benefit from Rust’s speed. Upgrading to Vite 8 should result in performance gains simply from using Rust.</p>
<p>We are also excited to ship Vite’s Full Bundle Mode soon, which drastically improves Vite’s dev server speed for large projects. Preliminary results show 3× faster dev server startup, 40% faster full reloads, and 10× fewer network requests.</p>
<p>Another defining Vite feature is the plugin ecosystem. We want JavaScript developers to continue extending and customizing Vite in JavaScript, the language they’re familiar with, while benefiting from Rust’s performance gains. Our team is working to accelerate JavaScript plugin usage in these Rust-based systems.</p>
<p>Upcoming optimizations that are currently experimental:</p>
<ul>
<li><a href="https://github.com/oxc-project/oxc/issues/2409" target="_blank" rel="noreferrer"><strong>Raw AST transfer</strong></a>. Allow JavaScript plugins to access the Rust-produced AST with minimal overhead.</li>
<li><a href="https://rolldown.rs/in-depth/native-magic-string#native-magicstring" target="_blank" rel="noreferrer"><strong>Native MagicString transforms</strong></a>. Simple custom transforms with logic in JavaScript but computation in Rust.</li>
</ul>
<h2 id="connect-with-us" tabindex="-1"><strong>Connect with us</strong> <a class="header-anchor" href="#connect-with-us" aria-label="Permalink to “Connect with us”">&#8203;</a></h2>
<p>If you’ve tried Vite 8 beta, then we’d love to hear your feedback! Please report any issues or share your experience:</p>
<ul>
<li><strong>Discord</strong>: Join our <a href="https://chat.vite.dev/" target="_blank" rel="noreferrer">community server</a> for real-time discussions</li>
<li><strong>GitHub</strong>: Share feedback on <a href="https://github.com/vitejs/vite/discussions" target="_blank" rel="noreferrer">GitHub discussions</a></li>
<li><strong>Issues</strong>: Report issues on the <a href="https://github.com/vitejs/rolldown-vite/issues" target="_blank" rel="noreferrer">rolldown-vite repository</a> for bugs and regressions</li>
<li><strong>Wins</strong>: Share your improved build times in the <a href="https://github.com/vitejs/rolldown-vite-perf-wins" target="_blank" rel="noreferrer">rolldown-vite-perf-wins repository</a></li>
</ul>
<p>We appreciate all reports and reproduction cases. They help guide us towards the release of a stable 8.0.0.</p>
]]></content:encoded>
            <author>Evan You</author>
            <author>Alexander Lichter</author>
            <author>sapphi-red</author>
        </item>
        <item>
            <title><![CDATA[Announcing Oxfmt Alpha]]></title>
            <link>https://voidzero.dev/posts/announcing-oxfmt-alpha</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-oxfmt-alpha</guid>
            <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxfmt, see the <a href="https://oxc.rs/blog/2025-12-01-oxfmt-alpha.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxfmt is a fast Rust-based formatter that is available now in alpha stage and supports JavaScript and TypeScript files. It is 30x faster than Prettier while having &gt;95% compatibility.</p>
]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxfmt, see the <a href="https://oxc.rs/blog/2025-12-01-oxfmt-alpha.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxfmt is a fast Rust-based formatter that is available now in alpha stage and supports JavaScript and TypeScript files. It is 30x faster than Prettier while having &gt;95% compatibility.</p>
<hr>
<p>VoidZero is excited to announce the alpha release of <strong>Oxfmt</strong> (<code>/oh-eks-for-mat/</code>), the Rust-based code formatter. This release focuses on JavaScript and TypeScript, with support for additional languages coming soon. Oxfmt is a welcome addition to VoidZero’s existing projects of build tool, bundler, test runner, and linter.</p>
<h2 id="why-oxfmt" tabindex="-1">Why Oxfmt? <a class="header-anchor" href="#why-oxfmt" aria-label="Permalink to “Why Oxfmt?”">&#8203;</a></h2>
<p>The <a href="https://oxc.rs/blog/2025-06-10-oxlint-stable.html" target="_blank" rel="noreferrer">first stable version of Oxlint</a> was released half a year ago. Since then, there have been consistent requests for styling changes like <a href="https://github.com/oxc-project/oxc/discussions/2858" target="_blank" rel="noreferrer">sorting imports</a>. We firmly believe that a linter checks for logic, while a formatter focuses on code style. These requests fall within the domain of a formatter.</p>
<p>However, existing tools don't always respect this boundary. Meaning additional configurations are needed to disable overlapping rules. By building both Oxfmt and Oxlint, we're able to reduce setup configurations and create a better developer experience.</p>
<p>Oxfmt is designed with these goals in mind:</p>
<ul>
<li><strong>Performance:</strong> More than 30× faster than Prettier and more than 3× faster than Biome on an initial run without cache (<a href="https://github.com/oxc-project/bench-formatter" target="_blank" rel="noreferrer"><strong>benchmark</strong></a>).</li>
<li><strong>Compatibility:</strong> Prettier-compatible, so developers can adopt Oxfmt in existing projects easily.</li>
<li><strong>Developer Experience:</strong> Upcoming features include import sorting, expanded formatting options, and support for Prettier plugins.</li>
</ul>
<h2 id="prettier-compatibility" tabindex="-1">Prettier compatibility <a class="header-anchor" href="#prettier-compatibility" aria-label="Permalink to “Prettier compatibility”">&#8203;</a></h2>
<p>VoidZero designs tools to be compatible with existing solutions because:</p>
<ol>
<li>It makes the developer’s migration path smooth and painless.</li>
<li>It ladders towards becoming a complete replacement.</li>
</ol>
<p>Like how Vitest is compatible with Jest, Oxfmt is designed to be compatible with Prettier.</p>
<p>Oxfmt currently passes around 95% of Prettier’s JavaScript and TypeScript tests. There should be minimal formatting differences when migrating from Prettier. VoidZero has been actively submitting bug reports and pull requests directly to Prettier to reduce the remaining differences. Many of these improvements landed in the recent Prettier 3.7 release.</p>
<p>While Oxfmt does not yet support all of Prettier’s configuration options, it does support major options like <code>singleQuote</code>, <code>printWidth</code>, and more. (<a href="https://oxc.rs/docs/guide/usage/formatter.html#configuration-file" target="_blank" rel="noreferrer">full list</a>)</p>
<h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to “Next steps”">&#8203;</a></h2>
<p>For Oxfmt’s beta release, VoidZero is working on:</p>
<ul>
<li><strong>Stabilizing experimental options.</strong> Specifically, built in support for import sorting and embedded language formatting like CSS-in-JS.</li>
<li><strong>Enabling more Prettier plugins.</strong> Including researching how to support plugins for popular frameworks like Vue, Svelte, and Astro.</li>
<li>And more.</li>
</ul>
<p>We’d love to hear your feedback on Oxfmt, and are excited to see how it helps improve your development workflow.</p>
<p><strong>Connect with us:</strong></p>
<ul>
<li><strong>Discord</strong>: Join our <a href="https://discord.gg/9uXCAwqQZW" target="_blank" rel="noreferrer"><strong>community server</strong></a> for real-time discussions</li>
<li><strong>RFC</strong>: Propose and discuss planned or new features in our <a href="https://github.com/oxc-project/oxc/discussions/13608" target="_blank" rel="noreferrer">RFC discussion thread</a></li>
<li><strong>GitHub</strong>: Share feedback on <a href="https://github.com/oxc-project/oxc/discussions" target="_blank" rel="noreferrer"><strong>GitHub Discussions</strong></a></li>
<li><strong>Issues</strong>: Report <code>oxfmt</code> bugs to <a href="https://github.com/oxc-project/oxc/issues" target="_blank" rel="noreferrer"><strong>oxc</strong></a></li>
</ul>
<h2 id="acknowledgements" tabindex="-1">Acknowledgements <a class="header-anchor" href="#acknowledgements" aria-label="Permalink to “Acknowledgements”">&#8203;</a></h2>
<p>VoidZero would like to extend our gratitude to:</p>
<ul>
<li><a href="https://github.com/ematipico" target="_blank" rel="noreferrer">@ematipico</a>, <a href="https://github.com/MichaReiser" target="_blank" rel="noreferrer">@MichaReiser</a>, and the entire team and community at <strong>Biome</strong> and <strong>Rome</strong>. Oxfmt is builds on a fork of the <code>biome_formatter</code> infrastructure.</li>
<li><a href="https://github.com/fisker" target="_blank" rel="noreferrer">@fisker</a> for triaging our reported issues for <strong>Prettier</strong></li>
</ul>
]]></content:encoded>
            <author>Michael Dong</author>
            <author>Dunqing</author>
            <author>Yuji Sugiura</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: October 2025 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-oct-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-oct-2025</guid>
            <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>What’s new in ViteLand!</em></p>
<p>Regularly, we recap the project updates for Vite, Vitest, Rolldown, Oxc, and what’s happening in our community.</p>
<h2 id="voidzero-raises-12-5m-series-a" tabindex="-1">VoidZero Raises $12.5M Series A <a class="header-anchor" href="#voidzero-raises-12-5m-series-a" aria-label="Permalink to “VoidZero Raises $12.5M Series A”">&#8203;</a></h2>
<p>VoidZero closes a <strong>$12.5M Series A</strong> to build the next generation of JavaScript Tooling.</p>
<p>Accel led the investment, with participation from Peak XV, Sunflower, Koen Bok, and Eric Simons to <strong>accelerate development of their OSS projects</strong> and work on their unified JavaScript toolchain <strong>Vite+</strong>.</p>
<p>The new funding significantly shortens the timeline to a public Vite+ release.
Expect faster iteration cycles, more reliable native integrations, and quicker feature releases on our open source projects.</p>
<p>Coming up next:</p>
<ul>
<li>The <strong>Vite 8 Beta</strong>, bringing you Vite powered by our Rust-based bundler Rolldown for faster builds, a unified build layer and further optimizations,</li>
<li>Vite's opt‑in <strong>Full Bundle Mode</strong> powered by Rolldown which speeds up the dev server for large projects significantly,</li>
<li>An <strong>alpha version of Oxfmt</strong>, our Prettier-compatible, Rust-based formatter that is ~45x faster than Prettier in initial benchmarks,</li>
<li>And <strong>expanded JS plugin support in Oxlint</strong>. With the first technical preview, ESLint rules already work with Oxlint but some API gaps still have to be filled.</li>
</ul>
<p>Want to know more details? Check out <a href="/posts/announcing-series-a.html">the official announcement</a>.</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite+ <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite+”">&#8203;</a></h3>
<p>ViteConf revealed Vite+: A superset of Vite and a CLI that integrates a suite of essential developer tools into a single, cohesive experience with first-class monorepo support and built-in caching.</p>
<p>Vite+ will be commercially licensed but source-available and will offer a free tier for open source projects, non-commercial use, and small businesses.</p>
<p>Learn more in <a href="/posts/announcing-vite-plus.html">the Vite+ announcement post</a>.</p>
<h3 id="vite-1" tabindex="-1">Vite <a class="header-anchor" href="#vite-1" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=bmWQqAKLgT4" target="_blank" rel="noreferrer">The official Vite Documentary</a> premiered at ViteConf and shows how Vite evolved from just a better Vue development server to the shared infrastructure of JavaScript tooling. A must-watch starring many community members and contributors!</li>
<li>The team released the <a href="https://github.com/vitejs/vite/blob/v7.2.0-beta.1/packages/vite/CHANGELOG.md" target="_blank" rel="noreferrer">first beta versions</a> for the upcoming Vite 7.2. New features include an easy way to emit a license file during build and support for HTTP2 when using a proxy for the development server.</li>
</ul>
<h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li><a href="/posts/announcing-vitest-4.html">We announced Vitest 4</a>, which brings a lot of exciting new features, such as:
<ul>
<li>The Browser Mode which is <strong>now stable</strong> and allows running tests in an <strong>actual browser environment</strong> instead of a Node.js environment with a simulated DOM,</li>
<li>And <strong>built-in Visual Regression Testing</strong> into Vitest itself.</li>
</ul>
</li>
<li>DX also improves further through the VS Code extension, for example via inlay-hints for <code>console.log</code> output or debugging tests running in Browser Mode via the extension.</li>
</ul>
<h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li>Rolldown's <code>inlineConst</code> feature is getting even better! Now, <a href="https://github.com/rolldown/rolldown/issues/6081" target="_blank" rel="noreferrer">named imports from CJS libraries can also be inlined</a>, leading to smaller bundle sizes.</li>
<li>Rolldown's codebase <a href="https://github.com/rolldown/rolldown/pull/5660" target="_blank" rel="noreferrer">is using Oxc's type-aware linting internally</a> now! This is not only a great way for us to dogfood Oxlint, but it also helps us catch more issues and improve code quality.</li>
<li><code>output.minifyInternalExports</code> <a href="https://github.com/rolldown/rolldown/pull/6594" target="_blank" rel="noreferrer">is now enabled by default</a> when enabling minification or using ESM as output format. While renaming exports seems to lead to a bigger bundle at first, it will actually decrease the final bundle size due to better GZIP compression. The original names for exports are still preserved to not break any code relying on them at runtime.</li>
<li>To change how Rolldown processes JSX, projects must use <code>transform.jsx</code>. The deprecated top-level <code>jsx</code> option is removed.</li>
<li>Generating source maps can be a big build performance hit, especially for large projects. To address this, Rolldown now supports source map generation through Rust via <a href="https://rolldown.rs/in-depth/native-magic-string#what-is-magicstring" target="_blank" rel="noreferrer">an own experimental MagicString implementation</a>.</li>
<li>Rolldown can now tree-shake built-in typed array constructors (<code>new Uint8Array()</code>, <code>new Int32Array()</code>, etc.) as they are marked as pure internally.</li>
</ul>
<TwitterEmbed url="https://x.com/rolldown_rs/status/1978470364410753088" /><TwitterEmbed url="https://x.com/rolldown_rs/status/1978802501668266487" /><TwitterEmbed url="https://x.com/voidzerodev/status/1983534711143018550" /><h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>Oxlint now supports JS Plugins! They are <strong>ESLint-compatible</strong> and can be used to run existing ESLint rules in Oxlint. While some APIs are still missing, many popular rules already work out of the box. Read more <a href="https://voidzero.dev/posts/announcing-oxlint-js-plugins" target="_blank" rel="noreferrer">in our announcement</a></li>
<li>Oxfmt is making great progress! Curious developers can try the pre-alpha version with <code>npx oxfmt</code>.</li>
</ul>
<TwitterEmbed url="https://x.com/Cameron_C2/status/1983884690734960748" /><TwitterEmbed url="https://x.com/youyuxi/status/1979839137323864073" /><h2 id="upcoming-events" tabindex="-1">Upcoming Events <a class="header-anchor" href="#upcoming-events" aria-label="Permalink to “Upcoming Events”">&#8203;</a></h2>
<p>To catch talks and presentations from VoidZero team members, see the following events where they will present:</p>
<ul>
<li>ViteConf happened in early October. A <a href="/posts/whats-new-viteconf-2025.html">recap post</a> and recordings on YouTube are available. Time to catch up!</li>
<li>Evan You gave a keynote on the challenges in building faster web tooling at JSConf US. <a href="https://www.youtube.com/watch?v=iTl3sKOYjzA" target="_blank" rel="noreferrer">The recording is available now</a>!</li>
<li><strong>Nov 20:</strong> <a href="https://jsnation.us/" target="_blank" rel="noreferrer">JSNation</a>. Alexander Lichter will present remotely with recent news about Rolldown and Oxc.</li>
<li><strong>Nov 20:</strong> <a href="https://ct-webdev.com" target="_blank" rel="noreferrer">c't webdev</a>. Catch Alexander Lichter's talk about reinventing JavaScript tooling.</li>
<li><strong>Nov 28:</strong> <a href="https://reactadvanced.com/" target="_blank" rel="noreferrer">React Advanced London</a>. Alexander Lichter will give a remote talk on what the VoidZero tooling offers React developers.</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From the Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From the Community”">&#8203;</a></h2>
<ul>
<li>
<p>The New Stack covers how <a href="https://thenewstack.io/vite-aims-to-end-javascripts-fragmented-tooling-nightmare/" target="_blank" rel="noreferrer">Vite+ Aims To End JavaScript’s Fragmented Tooling Nightmare</a> in their recent article!</p>
</li>
<li>
<p>The StackOverflow podcast invited Evan You to talk about <a href="https://stackoverflow.blog/2025/10/10/vite-is-like-the-united-nations-of-javascript/" target="_blank" rel="noreferrer">how Vite became the United Nations of JavaScript tooling</a>.</p>
</li>
<li>
<p>Evan You <a href="https://www.youtube.com/watch?v=xH9ZKsTY73Y" target="_blank" rel="noreferrer">joined the freeCodeCamp Podcast</a> to talk about his journey from an arts school kid to an independent open source maintainer and founder of VoidZero.</p>
</li>
<li>
<p>The Changelog published an episode with Evan You, <a href="https://www.youtube.com/watch?v=-vi0_b7Aj64" target="_blank" rel="noreferrer">discussing the future of Vite, VoidZero, funding OSS, ViteConf and more</a>!</p>
</li>
<li>
<p>Alexander Lichter joined the AngularPlus show to talk about <a href="https://open.spotify.com/episode/1jMa5Xg4N6dmzm7mZ85R9C" target="_blank" rel="noreferrer">Vite's next chapter</a>.</p>
</li>
<li>
<p>Ember 6.8 changed whole build system and <a href="https://blog.emberjs.com/ember-released-6-8/" target="_blank" rel="noreferrer">now uses Vite by default</a>.</p>
</li>
<li>
<p>Nitro released their <a href="https://v3.nitro.build/" target="_blank" rel="noreferrer">first v3 alpha</a>, which is a Vite plugin now.</p>
</li>
<li>
<p>The Nitro team is also looking into <a href="https://github.com/nitrojs/nitro/discussions/3680" target="_blank" rel="noreferrer">interoperability between Nitro modules and Vite plugins</a>, with POCs available.</p>
</li>
<li>
<p><a href="https://vike.dev/blog/photon" target="_blank" rel="noreferrer">Photon</a>, a next-generation infrastructure for deploying JavaScript servers has been released by the author of Vike, formerly known as <code>vite-plugin-ssr</code>.</p>
</li>
<li>
<p>Beehiiv migrated their large code base to Rolldown-Vite and <a href="https://discord.com/channels/804011606160703521/804082744023580704/1430196477895901234" target="_blank" rel="noreferrer">increased their build speed by 64%</a>.</p>
</li>
<li>
<p>Angular's next major version will use Vitest <a href="https://github.com/angular/angular-cli/pull/31578" target="_blank" rel="noreferrer">as the default testing framework</a>!</p>
</li>
<li>
<p>Markus Oberlehner discussed the new Vitest integration <a href="https://markus.oberlehner.net/blog/visual-regression-testing-with-vitest" target="_blank" rel="noreferrer">in his blog post</a>.</p>
</li>
<li>
<p>Ryota Murakami decided <a href="https://bsky.app/profile/ryota-murakami.bsky.social/post/3m2e4v3osw22i" target="_blank" rel="noreferrer">he only wants to write Unit Tests with the Browser Mode</a> for React components from now on, all to simplify and not worry about extra concepts.</p>
</li>
<li>
<p>Better-Auth <a href="https://github.com/better-auth/better-auth/pull/5249" target="_blank" rel="noreferrer">switches to tsdown</a> which simplifies their builds, reduces dependencies, and improves NodeNext/TypeScript compatibility.</p>
</li>
<li>
<p>SnoopLog switched to Rolldown and saw an <a href="https://bsky.app/profile/chrisbarber.dev/post/3m3kr5ia4s22r" target="_blank" rel="noreferrer">8x build time speedup and 2% reduced ESM bundle sizes</a>.</p>
</li>
<li>
<p>Nitro switched from Rollup to Rolldown and <a href="https://github.com/nitrojs/nitro/pull/3704" target="_blank" rel="noreferrer">improved build times by 5.5x</a>.</p>
</li>
<li>
<p>n8n <a href="https://github.com/n8n-io/n8n/pull/20717" target="_blank" rel="noreferrer">moved their entire build system to Rolldown</a> and shaved off two minutes per build for their monorepo.</p>
</li>
</ul>
<TwitterEmbed url="https://x.com/bromann/status/1975843729866182668" /><TwitterEmbed url="https://x.com/RobertPittUK/status/1979884840272163233" /><TwitterEmbed url="https://x.com/JacobMGEvans/status/1979999718798434456" /><TwitterEmbed url="https://x.com/ianberdin/status/1974907286247358788"/><TwitterEmbed url="https://x.com/ImSh4yy/status/1980342286795014330" /><TwitterEmbed url="https://x.com/mattpocockuk/status/1981295785661911338" /><TwitterEmbed url="https://x.com/alexanderOpalic/status/1982871597473247608" /><TwitterEmbed url="https://x.com/dvaji_/status/1983330062004068847" /><TwitterEmbed url="https://x.com/kazu_pon/status/1976531991836360904" /><TwitterEmbed url="https://x.com/jeswin/status/1975383563936932283" />]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[VoidZero Raises $12.5M Series A]]></title>
            <link>https://voidzero.dev/posts/announcing-series-a</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-series-a</guid>
            <pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Last year, <a href="/posts/announcing-voidzero-inc.html">we announced our seed round</a>. The funding was used to validate whether VoidZero’s vision was possible. Is it possible to create a unified JavaScript toolchain that is faster, easier to use, and has a better DX than existing solutions?</p>
<p>Yes.</p>
<p>We’re excited to announce that we raised $12.5M in Series A funding led by our long-time partner <a href="https://www.accel.com/relationships/voidzero" target="_blank" rel="noreferrer">Accel</a>, with participation from <a href="https://www.peakxv.com/" target="_blank" rel="noreferrer">Peak XV Partners</a>, <a href="https://sunflowercapital.co/" target="_blank" rel="noreferrer">Sunflower Capital</a>, Koen Bok (Framer), and Eric Simons (StackBlitz). We’re grateful to have investors who believe in our vision and allow us the breadth to bring it to life.</p>
<h2 id="accelerating-the-next-chapter" tabindex="-1">Accelerating the next chapter <a class="header-anchor" href="#accelerating-the-next-chapter" aria-label="Permalink to “Accelerating the next chapter”">&#8203;</a></h2>
<p>If seed funding is for research, then series A funding is for acceleration. Our lean team has grown to increase development cycles and bandwidth. New team members include the creator of <code>napi-rs</code> and core contributors to our OSS projects who joined full-time.</p>
<p>Thanks to the team’s efforts:</p>
<ul>
<li>Vite surpassed Webpack in weekly downloads</li>
<li>Vitest’s Browser Mode became stable</li>
<li>Rolldown reached 1M weekly downloads</li>
<li>Oxlint added type-aware linting and custom JavaScript plugins</li>
</ul>
<p>Earlier this month, <a href="/posts/announcing-vite-plus.html">we announced Vite+,</a> the unified JavaScript toolchain. It’s also our first step to making VoidZero and our OSS projects sustainable long-term. Vite+ is currently in private beta as we ship features and squash bugs. The new capital shortens the timeline to a stable Vite+ release.</p>
<h2 id="to-our-community" tabindex="-1">To our community <a class="header-anchor" href="#to-our-community" aria-label="Permalink to “To our community”">&#8203;</a></h2>
<p>Thank you. At the core of VoidZero is open source and the developer community. We’re honored that you have embraced our projects, are excited about VoidZero’s vision, and are part of our journey. This is only the beginning!</p>
]]></content:encoded>
            <author>Evan You</author>
        </item>
        <item>
            <title><![CDATA[ViteConf 2025 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-viteconf-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-viteconf-2025</guid>
            <pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>Welcome to a special edition of <em>What’s new in ViteLand!</em> Regularly, we recap the project updates for Vite, Vitest, Oxc, Rolldown and what’s happening in our community.</p>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/viteconf-attendees.jpg" alt="People in the audience looking up to the stage" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Attendees of ViteConf 2025 listening to the keynote
    </figcaption>
</figure>
<h2 id="what-happened-at-viteconf-2025" tabindex="-1">What happened at ViteConf 2025 <a class="header-anchor" href="#what-happened-at-viteconf-2025" aria-label="Permalink to “What happened at ViteConf 2025”">&#8203;</a></h2>
<p><strong>ViteConf 2025</strong> was truly special. For the first time ever, the community gathered in person in Amsterdam, bringing together framework developers, Vite maintainers, and enthusiasts from around the world.</p>
<p>Of course, ViteConf didn't pass without some major announcements, so here is a recap of the biggest news, brought to you by the VoidZero team.</p>
<p>PS: If you've missed it in person or didn't catch the live stream, take a look at the <a href="https://www.youtube.com/playlist?list=PLqGQbXn_GDmkJaoykvHCUmXUPjhgH2bVr" target="_blank" rel="noreferrer">​VODs in the ViteConf playlist</a>​.</p>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-evan-you.jpg" alt="Evan You giving a talk at ViteConf 2025" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Evan You showing an early version of Vite+ in action
    </figcaption>
</figure>
<h2 id="✨-meet-vite-the-unified-toolchain" tabindex="-1">✨ Meet Vite+: The Unified Toolchain <a class="header-anchor" href="#✨-meet-vite-the-unified-toolchain" aria-label="Permalink to “✨ Meet Vite+: The Unified Toolchain”">&#8203;</a></h2>
<p>The biggest news from the keynote was the official unveiling of <strong>Vite+</strong>, a superset of Vite and command line interface that integrates a suite of essential developer tools into a single, cohesive experience with first-class monorepo support and built-in caching.</p>
<p>Vite+ extends the familiar <code>vite</code> CLI with new commands for testing, linting, formatting, library bundling, scaffolding and task running. It all works together out of the box with zero configuration and integrated caching.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Vite+ removes the need for a “tooling PhD.” By unifying all important parts to develop a production-ready application in one CLI, it dramatically simplifies project setup and reduces configuration overhead.</p>
<p>Teams gain a <strong>real productivity boost,</strong> while enterprises benefit from <strong>security</strong>, backed by clear SLAs and <strong>first-class caching.</strong> All without sacrificing Vite’s trademark speed and developer experience.</p>
<p>A standardized toolchain means <strong>better developer mobility</strong> and a <strong>shorter onboarding period</strong> for internal transfers.</p>
<ul>
<li><a href="https://voidzero.dev/posts/announcing-vite-plus" target="_blank" rel="noreferrer"><strong>Read the Full Announcement Blog Post</strong></a></li>
<li><a href="https://viteplus.dev/" target="_blank" rel="noreferrer"><strong>Explore the Vite+ Website</strong></a></li>
<li><a href="https://www.youtube.com/watch?v=x7Jsmt_o9ek" target="_blank" rel="noreferrer"><strong>Watch Evan's talk with a live demo of Vite+</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-jim-dummett.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Jim Dummett explains how to bridge the gap between Rust and JavaScript
    </figcaption>
</figure>
<h2 id="⚡-oxlint-supports-javascript-plugins" tabindex="-1">⚡ Oxlint Supports JavaScript Plugins <a class="header-anchor" href="#⚡-oxlint-supports-javascript-plugins" aria-label="Permalink to “⚡ Oxlint Supports JavaScript Plugins”">&#8203;</a></h2>
<p>Until now, Oxlint’s performance advantage came with a drawback: you had to continue running ESLint while using Oxlint. Even though more than 500 linting rules were rewritten in Rust, you couldn’t utilize your custom ESLint rules, or any of the rules that was not ported over yet.</p>
<p>Oxc Core Team member Jim Dummett presented at ViteConf what people were waiting for: <strong>Oxlint’s JavaScript Plugin support</strong> is now available.</p>
<p>This integration leverages the speed of the Rust-based linter while allowing the use of custom rules and extensions via an <strong>ESLint-compatible JavaScript API</strong>. Next steps are filling in the gaps of missing ESLint APIs and continuously improving performance.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Running JavaScript plugins in Oxlint unlocks the ability to use many of the existing 280,000 ESLint plugins on npm, as well as custom rules, without friction, while still benefiting from Oxc’s blazing-fast performance. Together with true type-aware linting, <strong>Oxlint is becoming a full replacement for ESLint</strong>: Thanks to its performance, features, and extensibility.</p>
<ul>
<li><a href="https://voidzero.dev/posts/announcing-oxlint-js-plugins" target="_blank" rel="noreferrer"><strong>Read the Oxlint JS Plugins Announcement Blog Post</strong></a></li>
<li><a href="https://www.youtube.com/watch?v=ofQV3xiBgT8" target="_blank" rel="noreferrer"><strong>Watch Jim's talk about Oxc</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-anthony-fu.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Anthony Fu is previewing the different parts of Vite DevTools
    </figcaption>
</figure>
<h2 id="💻-a-sneak-peek-at-vite-devtools" tabindex="-1">💻 A Sneak Peek at Vite DevTools <a class="header-anchor" href="#💻-a-sneak-peek-at-vite-devtools" aria-label="Permalink to “💻 A Sneak Peek at Vite DevTools”">&#8203;</a></h2>
<p>When building applications, developers must be able to inspect the build process to understand how different parts of their codebase and dependencies interact. To make this easier, Anthony Fu presents the new Vite DevTools at ViteConf, which include:</p>
<ol>
<li><strong>A visual build analysis tool UI.</strong> It presents an overview over files used for bundling your application, which Vite plugins being used, and much more.</li>
<li><strong>The Vite DevTools plugin API.</strong> Framework and library authors, as well as users will be able to add their own extensions to Vite DevTools. This will allow customization tailored to the user’s tech stack.</li>
</ol>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Vite DevTools will give you insights that were hard to retrieve before, such as which plugins are slowing your build down, how different Vite plugins transform your code, why your code is split up differently in the final bundle and how the different files are related to each other.</p>
<p><strong>Less time spend on debugging, more time spent shipping features</strong></p>
<p>In addition to in-depth analysis of your application’s build step, you will get framework- and library-specific DevTools integrations, thanks to the DevTools plugin API and can even build your own extensions to meet your needs.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=tVd0JeSr8kg" target="_blank" rel="noreferrer"><strong>Watch Anthony's talk about Vite DevTools</strong></a></li>
<li><a href="https://github.com/vitejs/devtools" target="_blank" rel="noreferrer"><strong>Take a look at the Vite DevTools GitHub repository</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-pooya-parsa.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Pooya Parsa explains that Nitro v3 is "just a Vite plugin"
    </figcaption>
</figure>
<h2 id="🌐-full-stack-vite-apps-with-nitro-v3" tabindex="-1">🌐 Full-stack Vite Apps with Nitro v3 <a class="header-anchor" href="#🌐-full-stack-vite-apps-with-nitro-v3" aria-label="Permalink to “🌐 Full-stack Vite Apps with Nitro v3”">&#8203;</a></h2>
<p>If you’ve ever built a frontend app with Vite and then realized you need a backend for things like databases, user accounts, or you wanted to add server-side rendering (SSR), you know it can get complicated. Until now, you typically had three options:</p>
<ol>
<li>Go all-in on a meta-framework,</li>
<li>manage a completely separate backend service,</li>
<li>or work your way to get your own manual SSR setup.</li>
</ol>
<p>Each path added complexity, forcing you to manage two different projects, deal with separate deployments, or a lot of manual plumbing and knowledge.</p>
<p>With Nitro v3, this changes now! The next-gen server toolkit can turn your application into a true full-stack application with minimal friction. The best part? <strong>Nitro now comes as a Vite plugin</strong>.</p>
<p>The creator, Pooya Parsa, shows how you can define API routes, easily set up SSR, and utilize serverless features with zero configuration. And thanks to Nitro, developers can deploy their entire Vite application to any platform, including Cloudflare Workers or Netlify.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>You finally get the benefits of SSR and API routes while eliminating the complexity of managing and deploying separate backend services.</p>
<p>You can stick to your familiar, fast Vite environment and workflows for the whole stack, without opting into more features than you’d be interested in. All, while being able to deploy your application universally.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=189wogO3aCE" target="_blank" rel="noreferrer"><strong>Watch Pooya's talk about Nitro v3</strong></a></li>
<li><a href="https://v3.nitro.build/" target="_blank" rel="noreferrer"><strong>Take a look at the Nitro v3 documentation to get started</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-vladimir-sheremet.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Vladimir Sheremet is giving his State of Vitest presentation at ViteConf 2025
    </figcaption>
</figure>
<h2 id="✅-vitest-4-no-more-simulated-dom" tabindex="-1">✅ Vitest 4: No more Simulated DOM <a class="header-anchor" href="#✅-vitest-4-no-more-simulated-dom" aria-label="Permalink to “✅ Vitest 4: No more Simulated DOM”">&#8203;</a></h2>
<p>Vitest’s journey was a major highlight at ViteConf, with lead maintainer Vladimir Sheremet outlining the existing State of Vitest and its path for the future. With the recent release, <em>Vitest 4.0</em> delivers a stable Browser Mode, covered by Jessica Sachs’ talk at ViteConf. In turn, you can replace simulation DOM libraries like <code>JSDOM</code> or <code>happy-dom</code> with an actual browser, all without changing the actual test code.
Among other features, support for Visual Regression Testing has been added. Vitest can now capture screenshots of your UI components, then compare them against reference images to detect unintended visual changes.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Browser Mode changes how you test UI components, giving you significantly higher confidence that your code will work for real users due to using a real browser. You no longer have to chase down subtle inconsistencies between your DOM library and actual browser behavior. With the new Visual Regression Testing functionality, you’ll have a safety net for your UI, automatically catching these unwanted visual changes before they reach production.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=AGmVjX_iilo&amp;feature=youtu.be" target="_blank" rel="noreferrer">Watch Vladimir’s talk on the State of Vitest</a></li>
<li><a href="https://youtu.be/VFYqwXPgJFw" target="_blank" rel="noreferrer">Watch Jessica’s talk about the Browser Mode</a></li>
<li><a href="https://voidzero.dev/posts/announcing-vitest-4" target="_blank" rel="noreferrer">Read our Vitest 4 announcement</a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-jacob-gross.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px; max-width: 600px; margin-left: auto; margin-right: auto;">
      Jacob Groß, Performance Engineer at Framer sharing why Framer switched to Rolldown and what impact it made at ViteConf 2025
    </figcaption>
</figure>
<h2 id="🚀-ship-better-products-faster" tabindex="-1">🚀 Ship Better Products Faster <a class="header-anchor" href="#🚀-ship-better-products-faster" aria-label="Permalink to “🚀 Ship Better Products Faster”">&#8203;</a></h2>
<p>As applications grow in complexity, engineering teams begin hitting walls: development slows down, CI builds drag on, and product performance suffers. VoidZero provides the tooling to help teams break through, enabling them to ship better products, faster.</p>
<p><strong>Better products</strong>. Product speed is critical to user experience. For Framer, migrating to VoidZero’s Rolldown delivered a major speed improvement. By simply optimizing their configuration, they cut the Largest Contentful Paint (LCP) for large sites by up to 41%, all without touching application code. Rolldown now powers over 200,000 pages built with Framer, boosting the end-user experience.</p>
<p><strong>Faster</strong>. Taking an action and immediately observing the effect is key to experimentation. A fast feedback loop to iterate on. Imagine trying to find which switch turns on a light but there's a 3 minute delay. Swap turning on a light with linting and that’s what Linear’s engineers experienced. It took 3 minutes to locally lint Linear’s codebase. The exact opposite of a fast feedback loop. That’s why Linear adopted VoidZero’s Oxlint, which reduced linting times 90%, along with Rolldown-Vite and Vitest. Fast tools matter for developer experience and developer velocity.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Companies like Framer and Linear are known for being fast. Their products are snappy and create delightful user experiences. Under the hood, they rely on equally fast tooling. VoidZero's products have a meaningful impact on developer velocity and the end-user experience.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=Urci6SsfnWo" target="_blank" rel="noreferrer"><strong>Watch Jacob's talk</strong></a></li>
<li><a href="https://voidzero.dev/posts/case-study-framer-rolldown" target="_blank" rel="noreferrer"><strong>Read how Framer cut down their LCP by up to 41% with Rolldown</strong></a></li>
<li><a href="https://www.youtube.com/watch?v=_m_DgkO9Dgw" target="_blank" rel="noreferrer"><strong>Watch Kenneth's talk</strong></a></li>
</ul>
]]></description>
            <content:encoded><![CDATA[<p>Welcome to a special edition of <em>What’s new in ViteLand!</em> Regularly, we recap the project updates for Vite, Vitest, Oxc, Rolldown and what’s happening in our community.</p>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/viteconf-attendees.jpg" alt="People in the audience looking up to the stage" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Attendees of ViteConf 2025 listening to the keynote
    </figcaption>
</figure>
<h2 id="what-happened-at-viteconf-2025" tabindex="-1">What happened at ViteConf 2025 <a class="header-anchor" href="#what-happened-at-viteconf-2025" aria-label="Permalink to “What happened at ViteConf 2025”">&#8203;</a></h2>
<p><strong>ViteConf 2025</strong> was truly special. For the first time ever, the community gathered in person in Amsterdam, bringing together framework developers, Vite maintainers, and enthusiasts from around the world.</p>
<p>Of course, ViteConf didn't pass without some major announcements, so here is a recap of the biggest news, brought to you by the VoidZero team.</p>
<p>PS: If you've missed it in person or didn't catch the live stream, take a look at the <a href="https://www.youtube.com/playlist?list=PLqGQbXn_GDmkJaoykvHCUmXUPjhgH2bVr" target="_blank" rel="noreferrer">​VODs in the ViteConf playlist</a>​.</p>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-evan-you.jpg" alt="Evan You giving a talk at ViteConf 2025" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Evan You showing an early version of Vite+ in action
    </figcaption>
</figure>
<h2 id="✨-meet-vite-the-unified-toolchain" tabindex="-1">✨ Meet Vite+: The Unified Toolchain <a class="header-anchor" href="#✨-meet-vite-the-unified-toolchain" aria-label="Permalink to “✨ Meet Vite+: The Unified Toolchain”">&#8203;</a></h2>
<p>The biggest news from the keynote was the official unveiling of <strong>Vite+</strong>, a superset of Vite and command line interface that integrates a suite of essential developer tools into a single, cohesive experience with first-class monorepo support and built-in caching.</p>
<p>Vite+ extends the familiar <code>vite</code> CLI with new commands for testing, linting, formatting, library bundling, scaffolding and task running. It all works together out of the box with zero configuration and integrated caching.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Vite+ removes the need for a “tooling PhD.” By unifying all important parts to develop a production-ready application in one CLI, it dramatically simplifies project setup and reduces configuration overhead.</p>
<p>Teams gain a <strong>real productivity boost,</strong> while enterprises benefit from <strong>security</strong>, backed by clear SLAs and <strong>first-class caching.</strong> All without sacrificing Vite’s trademark speed and developer experience.</p>
<p>A standardized toolchain means <strong>better developer mobility</strong> and a <strong>shorter onboarding period</strong> for internal transfers.</p>
<ul>
<li><a href="https://voidzero.dev/posts/announcing-vite-plus" target="_blank" rel="noreferrer"><strong>Read the Full Announcement Blog Post</strong></a></li>
<li><a href="https://viteplus.dev/" target="_blank" rel="noreferrer"><strong>Explore the Vite+ Website</strong></a></li>
<li><a href="https://www.youtube.com/watch?v=x7Jsmt_o9ek" target="_blank" rel="noreferrer"><strong>Watch Evan's talk with a live demo of Vite+</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-jim-dummett.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Jim Dummett explains how to bridge the gap between Rust and JavaScript
    </figcaption>
</figure>
<h2 id="⚡-oxlint-supports-javascript-plugins" tabindex="-1">⚡ Oxlint Supports JavaScript Plugins <a class="header-anchor" href="#⚡-oxlint-supports-javascript-plugins" aria-label="Permalink to “⚡ Oxlint Supports JavaScript Plugins”">&#8203;</a></h2>
<p>Until now, Oxlint’s performance advantage came with a drawback: you had to continue running ESLint while using Oxlint. Even though more than 500 linting rules were rewritten in Rust, you couldn’t utilize your custom ESLint rules, or any of the rules that was not ported over yet.</p>
<p>Oxc Core Team member Jim Dummett presented at ViteConf what people were waiting for: <strong>Oxlint’s JavaScript Plugin support</strong> is now available.</p>
<p>This integration leverages the speed of the Rust-based linter while allowing the use of custom rules and extensions via an <strong>ESLint-compatible JavaScript API</strong>. Next steps are filling in the gaps of missing ESLint APIs and continuously improving performance.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Running JavaScript plugins in Oxlint unlocks the ability to use many of the existing 280,000 ESLint plugins on npm, as well as custom rules, without friction, while still benefiting from Oxc’s blazing-fast performance. Together with true type-aware linting, <strong>Oxlint is becoming a full replacement for ESLint</strong>: Thanks to its performance, features, and extensibility.</p>
<ul>
<li><a href="https://voidzero.dev/posts/announcing-oxlint-js-plugins" target="_blank" rel="noreferrer"><strong>Read the Oxlint JS Plugins Announcement Blog Post</strong></a></li>
<li><a href="https://www.youtube.com/watch?v=ofQV3xiBgT8" target="_blank" rel="noreferrer"><strong>Watch Jim's talk about Oxc</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-anthony-fu.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Anthony Fu is previewing the different parts of Vite DevTools
    </figcaption>
</figure>
<h2 id="💻-a-sneak-peek-at-vite-devtools" tabindex="-1">💻 A Sneak Peek at Vite DevTools <a class="header-anchor" href="#💻-a-sneak-peek-at-vite-devtools" aria-label="Permalink to “💻 A Sneak Peek at Vite DevTools”">&#8203;</a></h2>
<p>When building applications, developers must be able to inspect the build process to understand how different parts of their codebase and dependencies interact. To make this easier, Anthony Fu presents the new Vite DevTools at ViteConf, which include:</p>
<ol>
<li><strong>A visual build analysis tool UI.</strong> It presents an overview over files used for bundling your application, which Vite plugins being used, and much more.</li>
<li><strong>The Vite DevTools plugin API.</strong> Framework and library authors, as well as users will be able to add their own extensions to Vite DevTools. This will allow customization tailored to the user’s tech stack.</li>
</ol>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Vite DevTools will give you insights that were hard to retrieve before, such as which plugins are slowing your build down, how different Vite plugins transform your code, why your code is split up differently in the final bundle and how the different files are related to each other.</p>
<p><strong>Less time spend on debugging, more time spent shipping features</strong></p>
<p>In addition to in-depth analysis of your application’s build step, you will get framework- and library-specific DevTools integrations, thanks to the DevTools plugin API and can even build your own extensions to meet your needs.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=tVd0JeSr8kg" target="_blank" rel="noreferrer"><strong>Watch Anthony's talk about Vite DevTools</strong></a></li>
<li><a href="https://github.com/vitejs/devtools" target="_blank" rel="noreferrer"><strong>Take a look at the Vite DevTools GitHub repository</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-pooya-parsa.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Pooya Parsa explains that Nitro v3 is "just a Vite plugin"
    </figcaption>
</figure>
<h2 id="🌐-full-stack-vite-apps-with-nitro-v3" tabindex="-1">🌐 Full-stack Vite Apps with Nitro v3 <a class="header-anchor" href="#🌐-full-stack-vite-apps-with-nitro-v3" aria-label="Permalink to “🌐 Full-stack Vite Apps with Nitro v3”">&#8203;</a></h2>
<p>If you’ve ever built a frontend app with Vite and then realized you need a backend for things like databases, user accounts, or you wanted to add server-side rendering (SSR), you know it can get complicated. Until now, you typically had three options:</p>
<ol>
<li>Go all-in on a meta-framework,</li>
<li>manage a completely separate backend service,</li>
<li>or work your way to get your own manual SSR setup.</li>
</ol>
<p>Each path added complexity, forcing you to manage two different projects, deal with separate deployments, or a lot of manual plumbing and knowledge.</p>
<p>With Nitro v3, this changes now! The next-gen server toolkit can turn your application into a true full-stack application with minimal friction. The best part? <strong>Nitro now comes as a Vite plugin</strong>.</p>
<p>The creator, Pooya Parsa, shows how you can define API routes, easily set up SSR, and utilize serverless features with zero configuration. And thanks to Nitro, developers can deploy their entire Vite application to any platform, including Cloudflare Workers or Netlify.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>You finally get the benefits of SSR and API routes while eliminating the complexity of managing and deploying separate backend services.</p>
<p>You can stick to your familiar, fast Vite environment and workflows for the whole stack, without opting into more features than you’d be interested in. All, while being able to deploy your application universally.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=189wogO3aCE" target="_blank" rel="noreferrer"><strong>Watch Pooya's talk about Nitro v3</strong></a></li>
<li><a href="https://v3.nitro.build/" target="_blank" rel="noreferrer"><strong>Take a look at the Nitro v3 documentation to get started</strong></a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-vladimir-sheremet.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
      Vladimir Sheremet is giving his State of Vitest presentation at ViteConf 2025
    </figcaption>
</figure>
<h2 id="✅-vitest-4-no-more-simulated-dom" tabindex="-1">✅ Vitest 4: No more Simulated DOM <a class="header-anchor" href="#✅-vitest-4-no-more-simulated-dom" aria-label="Permalink to “✅ Vitest 4: No more Simulated DOM”">&#8203;</a></h2>
<p>Vitest’s journey was a major highlight at ViteConf, with lead maintainer Vladimir Sheremet outlining the existing State of Vitest and its path for the future. With the recent release, <em>Vitest 4.0</em> delivers a stable Browser Mode, covered by Jessica Sachs’ talk at ViteConf. In turn, you can replace simulation DOM libraries like <code>JSDOM</code> or <code>happy-dom</code> with an actual browser, all without changing the actual test code.
Among other features, support for Visual Regression Testing has been added. Vitest can now capture screenshots of your UI components, then compare them against reference images to detect unintended visual changes.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Browser Mode changes how you test UI components, giving you significantly higher confidence that your code will work for real users due to using a real browser. You no longer have to chase down subtle inconsistencies between your DOM library and actual browser behavior. With the new Visual Regression Testing functionality, you’ll have a safety net for your UI, automatically catching these unwanted visual changes before they reach production.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=AGmVjX_iilo&amp;feature=youtu.be" target="_blank" rel="noreferrer">Watch Vladimir’s talk on the State of Vitest</a></li>
<li><a href="https://youtu.be/VFYqwXPgJFw" target="_blank" rel="noreferrer">Watch Jessica’s talk about the Browser Mode</a></li>
<li><a href="https://voidzero.dev/posts/announcing-vitest-4" target="_blank" rel="noreferrer">Read our Vitest 4 announcement</a></li>
</ul>
<figure style="margin-top: 4rem;">
  <img loading="lazy" src="/images/whats-new-viteconf-2025/talk-jacob-gross.jpg" />
    <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px; max-width: 600px; margin-left: auto; margin-right: auto;">
      Jacob Groß, Performance Engineer at Framer sharing why Framer switched to Rolldown and what impact it made at ViteConf 2025
    </figcaption>
</figure>
<h2 id="🚀-ship-better-products-faster" tabindex="-1">🚀 Ship Better Products Faster <a class="header-anchor" href="#🚀-ship-better-products-faster" aria-label="Permalink to “🚀 Ship Better Products Faster”">&#8203;</a></h2>
<p>As applications grow in complexity, engineering teams begin hitting walls: development slows down, CI builds drag on, and product performance suffers. VoidZero provides the tooling to help teams break through, enabling them to ship better products, faster.</p>
<p><strong>Better products</strong>. Product speed is critical to user experience. For Framer, migrating to VoidZero’s Rolldown delivered a major speed improvement. By simply optimizing their configuration, they cut the Largest Contentful Paint (LCP) for large sites by up to 41%, all without touching application code. Rolldown now powers over 200,000 pages built with Framer, boosting the end-user experience.</p>
<p><strong>Faster</strong>. Taking an action and immediately observing the effect is key to experimentation. A fast feedback loop to iterate on. Imagine trying to find which switch turns on a light but there's a 3 minute delay. Swap turning on a light with linting and that’s what Linear’s engineers experienced. It took 3 minutes to locally lint Linear’s codebase. The exact opposite of a fast feedback loop. That’s why Linear adopted VoidZero’s Oxlint, which reduced linting times 90%, along with Rolldown-Vite and Vitest. Fast tools matter for developer experience and developer velocity.</p>
<p><strong class="as-h4">Why it matters</strong></p>
<p>Companies like Framer and Linear are known for being fast. Their products are snappy and create delightful user experiences. Under the hood, they rely on equally fast tooling. VoidZero's products have a meaningful impact on developer velocity and the end-user experience.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=Urci6SsfnWo" target="_blank" rel="noreferrer"><strong>Watch Jacob's talk</strong></a></li>
<li><a href="https://voidzero.dev/posts/case-study-framer-rolldown" target="_blank" rel="noreferrer"><strong>Read how Framer cut down their LCP by up to 41% with Rolldown</strong></a></li>
<li><a href="https://www.youtube.com/watch?v=_m_DgkO9Dgw" target="_blank" rel="noreferrer"><strong>Watch Kenneth's talk</strong></a></li>
</ul>
<hr>
<p>Thank you to everyone who joined us in Amsterdam, watched the live streams or <a href="https://www.youtube.com/playlist?list=PLqGQbXn_GDmkJaoykvHCUmXUPjhgH2bVr" target="_blank" rel="noreferrer">the ​VODs on YouTube</a>​!</p>
<p><strong>The VoidZero Team</strong></p>
]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Announcing Vitest 4.0]]></title>
            <link>https://voidzero.dev/posts/announcing-vitest-4</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-vitest-4</guid>
            <pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>For more technical details about Vitest 4.0, see the <a href="https://vitest.dev/blog/vitest-4.html" target="_blank" rel="noreferrer">blog post on the Vitest website</a> or watch <a href="https://youtu.be/AGmVjX_iilo" target="_blank" rel="noreferrer">Vladimir's</a> and <a href="https://youtu.be/VFYqwXPgJFw" target="_blank" rel="noreferrer">Jessica's</a> talk at ViteConf.</p>
</blockquote>
<p><strong>TL;DR:</strong> Vitest 4.0 is released with Browser Mode being marked stable, Visual Regression testing support, and Playwright Trace support. The Vitest team will focus on performance improvement in the upcoming quarter. This major release includes breaking changes.</p>
]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>For more technical details about Vitest 4.0, see the <a href="https://vitest.dev/blog/vitest-4.html" target="_blank" rel="noreferrer">blog post on the Vitest website</a> or watch <a href="https://youtu.be/AGmVjX_iilo" target="_blank" rel="noreferrer">Vladimir's</a> and <a href="https://youtu.be/VFYqwXPgJFw" target="_blank" rel="noreferrer">Jessica's</a> talk at ViteConf.</p>
</blockquote>
<p><strong>TL;DR:</strong> Vitest 4.0 is released with Browser Mode being marked stable, Visual Regression testing support, and Playwright Trace support. The Vitest team will focus on performance improvement in the upcoming quarter. This major release includes breaking changes.</p>
<hr>
<p>Vitest’s usage has grown from 7M to 17M weekly downloads in the past year. Almost one year after the last major release, we’re excited to announce Vitest 4.0 is now available.</p>
<h2 id="browser-mode-is-stable" tabindex="-1">Browser Mode is stable <a class="header-anchor" href="#browser-mode-is-stable" aria-label="Permalink to “Browser Mode is stable”">&#8203;</a></h2>
<p><strong>Browser Mode is now stable</strong> as part of Vitest 4.0 after being in beta. This has been one of Vitest’s longest-requested features. Browser Mode allows developers to test their UI components in a real browser environment instead of a simulated one like JSDOM.</p>
<p>Because tests run in the browser natively, it provides much higher confidence that components will look and behave correctly for actual users. All while using the same familiar Vitest API without any code changes.</p>
<p>Vitest Browser Mode uses providers like Playwright to run your tests in a real browser. It isn't a new testing framework and doesn't replace E2E tools; it just changes the environment where your existing tests run.</p>
<h2 id="additional-updates" tabindex="-1">Additional updates <a class="header-anchor" href="#additional-updates" aria-label="Permalink to “Additional updates”">&#8203;</a></h2>
<p>In tandem with Browser Mode, <strong>Vitest 4.0 adds support for Visual Regression Test and Playwright Traces:</strong></p>
<ul>
<li>Visual Regression testing in Browser mode takes screenshots of components and compares them against a reference image to catch unintended visual changes during the test.</li>
<li>Playwright Traces generates detailed trace files that can be analyzed in Playwright's Trace Viewer for easier debugging.</li>
</ul>
<p>Other features include reporter updates, type-aware hooks, and more. <a href="https://vitest.dev/blog/vitest-4.html" target="_blank" rel="noreferrer">Read more here</a>.</p>
<h2 id="breaking-changes" tabindex="-1">Breaking changes <a class="header-anchor" href="#breaking-changes" aria-label="Permalink to “Breaking changes”">&#8203;</a></h2>
<p>Vitest 4.0 is a major release and comes with breaking changes. Please review the <a href="https://vitest.dev/guide/migration.html#vitest-4" target="_blank" rel="noreferrer">migration guide</a> before upgrading.</p>
<h2 id="what-s-next" tabindex="-1">What’s next <a class="header-anchor" href="#what-s-next" aria-label="Permalink to “What’s next”">&#8203;</a></h2>
<p>The team will continue to polish Browser Mode while improving overall performance for Vitest.</p>
<p>We would love to hear your feedback on Vitest 4.0, and are excited to see how it helps improve your development workflow.</p>
<p>Connect with us:</p>
<ul>
<li><strong>Discord</strong>: Join our <a href="https://chat.vitest.dev/" target="_blank" rel="noreferrer">community server</a> for real-time discussions</li>
<li><strong>GitHub</strong>: Share feedback on <a href="https://github.com/vitest-dev/vitest/discussions" target="_blank" rel="noreferrer">GitHub Discussions</a></li>
<li><strong>Issues</strong>: Report bugs to <a href="https://github.com/vitest-dev/vitest/issues" target="_blank" rel="noreferrer">GitHub Issues</a></li>
</ul>
]]></content:encoded>
            <author>Michael Dong</author>
        </item>
        <item>
            <title><![CDATA[Announcing Oxlint JavaScript Plugin Support]]></title>
            <link>https://voidzero.dev/posts/announcing-oxlint-js-plugins</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-oxlint-js-plugins</guid>
            <pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxlint's support for JavaScript plugins, see the <a href="https://oxc.rs/blog/2025-10-09-oxlint-js-plugins.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a> or watch the <a href="https://youtu.be/ofQV3xiBgT8" target="_blank" rel="noreferrer">ViteConf talk</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxlint now supports plugins written in JavaScript. Developers can customize and extend Oxlint using JavaScript, but at a speed approaching Rust, due to 'raw transfer' between Rust and JS, and other breakthroughs. Many ESLint plugins can run without any modification.</p>
]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxlint's support for JavaScript plugins, see the <a href="https://oxc.rs/blog/2025-10-09-oxlint-js-plugins.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a> or watch the <a href="https://youtu.be/ofQV3xiBgT8" target="_blank" rel="noreferrer">ViteConf talk</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxlint now supports plugins written in JavaScript. Developers can customize and extend Oxlint using JavaScript, but at a speed approaching Rust, due to 'raw transfer' between Rust and JS, and other breakthroughs. Many ESLint plugins can run without any modification.</p>
<hr>
<p>VoidZero set out with an ambitious goal to improve DX and build a unified toolchain that is <em>fast</em>. Developers have been eagerly waiting for a linter that can function at native speed and is a complete replacement for existing solutions. Oxlint, written in Rust, is VoidZero’s answer. The <a href="https://oxc.rs/blog/2025-06-10-oxlint-stable.html" target="_blank" rel="noreferrer">v1.0 stable</a> version was released in Jun 2025 and <a href="https://voidzero.dev/posts/announcing-oxlint-type-aware-linting" target="_blank" rel="noreferrer">type-aware linting</a> was released in Aug 2025. Today, we’re excited to announce another major milestone:</p>
<p><strong>Oxlint supports plugins written in JavaScript!</strong></p>
<h2 id="why-javascript-plugins-matter" tabindex="-1">Why JavaScript plugins matter <a class="header-anchor" href="#why-javascript-plugins-matter" aria-label="Permalink to “Why JavaScript plugins matter”">&#8203;</a></h2>
<p>Taking a step back, why did tools like Vite, ESLint and Rollup become so popular? While there are many contributing factors, we believe a major reason is customizability. Their plugin ecosystem empowered developers to author plugins and tailor behaviors to their specific needs. And then share the plugins via NPM, building an ecosystem. This makes sense for tools written in JavaScript and used by JavaScript developers.</p>
<p>But what happens when the tool is written in Rust and used JavaScript developers? How will JavaScript developers customize Oxlint? The two naive solutions:</p>
<ol>
<li>Everyone learns Rust.</li>
<li>Tooling authors rewrite every single plugin in Rust.</li>
</ol>
<p>Hopefully, no explanation is needed as to why solution one is unrealistic. While VoidZero has already rewritten many commonly used linting plugins in Rust, it’s unrealistic to rewrite and maintain the entire universe of JavaScript plugins. Including the “long tail” of plugins that have a small user base but are essential and project-specific plugins.</p>
<p>Oxlint is stuck between a rock and a hard place. <strong>The Rust architecture that drastically improved performance also makes it less accessible to developers who only “speak” JavaScript.</strong> A direct departure from the company’s goal to improve DX.</p>
<p>Is there another solution?</p>
<h2 id="javascript-rust-transfer" tabindex="-1">JavaScript-Rust Transfer <a class="header-anchor" href="#javascript-rust-transfer" aria-label="Permalink to “JavaScript-Rust Transfer”">&#8203;</a></h2>
<p>A middle ground that lets JavaScript developers continue using the language they know best while enjoying Rust’s exceptional speed. The conventional method, involves doing the heavy processing in Rust, and then transfering the resulting processed code over to JavaScript, where JavaScript can quickly apply additional tweaks.</p>
<p>Simple in theory. Disastrous in practice. The issue is the cost of the transfer between the &quot;two worlds&quot; of Rust and JavaScript. If the main reason to switch to Oxlint is speed improvements, then the transfer’s overhead would render the switch's reason almost meaningless.</p>
<p>What if, instead, the processed code was transparently shared between JavaScript and Rust, instead of transferred? If there was no transfer, and almost no cost at all?</p>
<p>Over the past year, this is exactly what the Oxc team have achieved, a unique architecture designed to completely destroy the traditional language barrier. This, along with other optimizations, enabled Oxlint plugins written in JavaScript to run 86% faster, or at a speed comparable to Rust. <a href="https://oxc.rs/blog/2025-10-09-oxlint-js-plugins.html#under-the-hood" target="_blank" rel="noreferrer">More implementation details here</a>.</p>
<figure style="margin-top: 4rem;">
  <img src="/images/oxlint-js-plugin-speed.jpg" alt="Bar chart showing Oxlint speed going from 1,360ms to 189ms with JavaScript plugins" />
  <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
    Oxlint speed going from 1,360ms to 189ms with JavaScript plugins
  </figcaption>
</figure>
<h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to “Next steps”">&#8203;</a></h2>
<p>Oxlint’s JavaScript plugin functionality is in its early stages, with further optimizations and implementations in the works. When that happens, because Oxlint plugins are ESLint-compatible, users will soon be able to fully switch from ESLint to Oxlint in under an hour. Everything will simply work just as before, but an order of magnitude faster. <strong>We believe that we can continue to reduce the transfer overhead to the point where it becomes almost negligible.</strong></p>
<p>If a fast linter is something you are interested in, we ask that you test it. It’s easy to get started since Oxlint can run many ESLint plugins without any modifications. An alternative API is also available to unlock even better performance. The more feedback, both positive and negative, we get, the more robust Oxlint’s JavaScript plugins support becomes.</p>
<p>Connect with us:</p>
<ul>
<li><strong>Discord</strong>: Join our <a href="https://discord.gg/9uXCAwqQZW" target="_blank" rel="noreferrer">community server</a> for real-time discussions</li>
<li><strong>GitHub</strong>: Share feedback on <a href="https://github.com/oxc-project/oxc/discussions" target="_blank" rel="noreferrer">GitHub Discussions</a></li>
<li><strong>Issues</strong>: Report <code>oxlint</code> bugs to <a href="https://github.com/oxc-project/oxc/issues" target="_blank" rel="noreferrer">oxc</a></li>
</ul>
]]></content:encoded>
            <author>Michael Dong</author>
        </item>
        <item>
            <title><![CDATA[Announcing Vite+]]></title>
            <link>https://voidzero.dev/posts/announcing-vite-plus</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-vite-plus</guid>
            <pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<h1 id="announcing-vite-a-unified-toolchain-for-javascript" tabindex="-1">Announcing Vite+: a unified toolchain for JavaScript <a class="header-anchor" href="#announcing-vite-a-unified-toolchain-for-javascript" aria-label="Permalink to “Announcing Vite+: a unified toolchain for JavaScript”">&#8203;</a></h1>
<p>Last week, we unveiled <strong>Vite+</strong> at the <a href="https://viteconf.amsterdam/" target="_blank" rel="noreferrer">first-ever in-person ViteConf</a> in Amsterdam. In this post, we’ll share more details about what it is and the motivation behind it.</p>
<h2 id="what-is-vite" tabindex="-1">What is Vite+? <a class="header-anchor" href="#what-is-vite" aria-label="Permalink to “What is Vite+?”">&#8203;</a></h2>
<p>Vite+ is a command-line developer tool you can install from <code>npm</code>, just like Vite itself. It’s a drop-in upgrade to Vite with additional features. Imagine that, in addition to <code>vite dev</code> and <code>vite build</code>, you can now also run:</p>
<ul>
<li>
<p><strong><code>vite new</code></strong> — for scaffolding new projects, especially monorepos, with recommended structure that works best with Vite+. It also supports generating code, for example adding a new package to the monorepo, or invoking custom generators.</p>
</li>
<li>
<p><strong><code>vite test</code></strong> — run unit tests powered by <a href="https://vitest.dev/" target="_blank" rel="noreferrer">Vitest</a>. It provides a <a href="https://jestjs.io/" target="_blank" rel="noreferrer">Jest</a>-compatible API, works out of the box with your main application, and includes comprehensive features like browser mode, sharding, visual regression testing, and more.</p>
</li>
<li>
<p><strong><code>vite lint</code></strong> — lint your code with <a href="https://oxc.rs/docs/guide/usage/linter.html" target="_blank" rel="noreferrer">Oxlint</a>, which ships with 600+ ESLint-compatible rules and is up to 100× faster than ESLint. It also supports type-aware linting, and plugins written in JavaScript with an ESLint-compatible API.</p>
</li>
<li>
<p><strong><code>vite fmt</code></strong> — format your code with Oxfmt (to be released soon), which aims for 99%+ Prettier compatibility while offering more control and flexibility, such as finer control over line wrapping.</p>
</li>
<li>
<p><strong><code>vite lib</code></strong> — bundle libraries with best practices baked in, powered by <a href="https://tsdown.dev/" target="_blank" rel="noreferrer">tsdown</a> and <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>. It includes blazing-fast bundled DTS generation via the <code>isolatedDeclarations</code> transform.</p>
</li>
<li>
<p><strong><code>vite run</code></strong> — a built-in monorepo task runner with intelligent caching. We’ve implemented sophisticated task input inference so that most tasks can be cached without explicit configuration—often with even better granularity than manual setups. Think <a href="https://turborepo.com/" target="_blank" rel="noreferrer">Turborepo</a>, but without having to tell the system how to invalidate the cache.</p>
</li>
<li>
<p><strong><code>vite ui</code></strong> — GUI devtools that offer insights into module resolve / transform behavior, bundle size / tree-shaking analysis, and integration with framework-specific devtools.</p>
</li>
</ul>
<p>All these commands work seamlessly together out of the box, without the need for complex configuration or compatibility plumbing. Vite+ inherits Vite's thriving ecosystem so it is compatible with mainstream frameworks like React and Vue, and also fullstack meta frameworks like Tanstack Start and SvelteKit. And because each command is built on or compatible with widely adopted tools, adopting Vite+ doesn’t require massive refactoring if you are already using those tools.</p>
<p>The entire suite of commands is built on a shared foundation to ensure cohesion and consistency. We’ve implemented the full compiler toolchain in Rust—from the <a href="https://oxc.rs/docs/guide/usage/parser.html" target="_blank" rel="noreferrer">parser</a> to the <a href="https://oxc.rs/docs/guide/usage/resolver.html" target="_blank" rel="noreferrer">resolver</a>, <a href="https://oxc.rs/docs/guide/usage/transformer.html" target="_blank" rel="noreferrer">transformer</a>, <a href="https://oxc.rs/docs/guide/usage/minifier.html" target="_blank" rel="noreferrer">minifier</a>, and <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">bundler</a> — with obsessive performance tuning at every level. All of this infrastructure is open source and already widely adopted by companies like Framer (<a href="https://voidzero.dev/posts/case-study-framer-rolldown" target="_blank" rel="noreferrer">case study</a>), Linear, Atlassian, Shopify, and more. Utilities such as <code>parse</code> and <code>transform</code> are also exported from Vite+ as APIs to support custom tooling.</p>
<p>You can watch <a href="https://youtu.be/x7Jsmt_o9ek?si=BMaXc0grNaOl-V7Z&amp;t=937" target="_blank" rel="noreferrer">the demo from Evan’s talk at ViteConf</a> to get a sneak peek of Vite+ in action.</p>
<h2 id="the-problem-vite-is-trying-to-solve" tabindex="-1">The problem Vite+ is trying to solve <a class="header-anchor" href="#the-problem-vite-is-trying-to-solve" aria-label="Permalink to “The problem Vite+ is trying to solve”">&#8203;</a></h2>
<p>The JavaScript tooling ecosystem has seen its fair share of fragmentation and churn over the years. As a language originally designed in 10 days, no one could have imagined we’d be building apps of today’s scale and complexity with JavaScript. Tooling complexity and performance have become real bottlenecks for companies facing ever-larger web projects but limited internal tooling resources.</p>
<p>These bottlenecks are more severe for companies with multiple teams, each using their own unique tooling choices. Tasks like dependency management or security reviews must be handled separately for each team. Dependency combinations drift out of sync between projects and get harder and harder to reconcile over time. If teams or projects are merged, then developer time must be paid to migrate tools or end up with a convoluted, Frankensteined tool stack.</p>
<p>With Vite+, we aim to offer a unified solution for JavaScript tooling — so teams facing these challenges can focus on shipping products instead of wasting time evaluating, bike-shedding, configuring, and debugging their tool stacks.</p>
<h2 id="licensing" tabindex="-1">Licensing <a class="header-anchor" href="#licensing" aria-label="Permalink to “Licensing”">&#8203;</a></h2>
<p>Sustainability has always been a challenge for open source developer tooling. Our goal with Vite+ is to capture a portion of the value it creates at scale for larger organizations and reinvest it into the open source projects that power Vite+.</p>
<p>To ensure the wider community benefits as well, Vite+ will be free for individuals, open source projects, and small businesses. We plan to offer flat annual license pricing for startups and custom pricing for enterprises. Though Vite+ will be commercially licensed, it will be source-available. Exact tier thresholds and licensing details will be announced closer to public launch.</p>
<p>We understand that commercialization on top of open source can raise concerns within the community. Through our years of open source work, we know this balance is delicate and built on trust. We’re committed to pursuing a commercialization path that serves the best interests of both our OSS and commercial users.</p>
<p>It’s important to emphasize that Vite+ is a <strong>separate, additive layer</strong> built on top of the open source projects we maintain. All existing projects — Vite, Vitest, Rolldown, and Oxc — will remain open source under MIT forever. Since Vite+ relies on these open source projects, improving Vite+ requires improving them as well. You are welcome to hold us accountable to that commitment.</p>
<h2 id="help-us-shape-vite" tabindex="-1">Help us shape Vite+! <a class="header-anchor" href="#help-us-shape-vite" aria-label="Permalink to “Help us shape Vite+!”">&#8203;</a></h2>
<p>Vite+ is still in development, and we’re targeting a public preview in early 2026. We’re currently looking for early adopters to help test-drive it in production environments.</p>
<p>If you’re interested, visit <a href="https://viteplus.dev" target="_blank" rel="noreferrer">viteplus.dev</a> and get in touch!</p>
]]></description>
            <content:encoded><![CDATA[<h1 id="announcing-vite-a-unified-toolchain-for-javascript" tabindex="-1">Announcing Vite+: a unified toolchain for JavaScript <a class="header-anchor" href="#announcing-vite-a-unified-toolchain-for-javascript" aria-label="Permalink to “Announcing Vite+: a unified toolchain for JavaScript”">&#8203;</a></h1>
<p>Last week, we unveiled <strong>Vite+</strong> at the <a href="https://viteconf.amsterdam/" target="_blank" rel="noreferrer">first-ever in-person ViteConf</a> in Amsterdam. In this post, we’ll share more details about what it is and the motivation behind it.</p>
<h2 id="what-is-vite" tabindex="-1">What is Vite+? <a class="header-anchor" href="#what-is-vite" aria-label="Permalink to “What is Vite+?”">&#8203;</a></h2>
<p>Vite+ is a command-line developer tool you can install from <code>npm</code>, just like Vite itself. It’s a drop-in upgrade to Vite with additional features. Imagine that, in addition to <code>vite dev</code> and <code>vite build</code>, you can now also run:</p>
<ul>
<li>
<p><strong><code>vite new</code></strong> — for scaffolding new projects, especially monorepos, with recommended structure that works best with Vite+. It also supports generating code, for example adding a new package to the monorepo, or invoking custom generators.</p>
</li>
<li>
<p><strong><code>vite test</code></strong> — run unit tests powered by <a href="https://vitest.dev/" target="_blank" rel="noreferrer">Vitest</a>. It provides a <a href="https://jestjs.io/" target="_blank" rel="noreferrer">Jest</a>-compatible API, works out of the box with your main application, and includes comprehensive features like browser mode, sharding, visual regression testing, and more.</p>
</li>
<li>
<p><strong><code>vite lint</code></strong> — lint your code with <a href="https://oxc.rs/docs/guide/usage/linter.html" target="_blank" rel="noreferrer">Oxlint</a>, which ships with 600+ ESLint-compatible rules and is up to 100× faster than ESLint. It also supports type-aware linting, and plugins written in JavaScript with an ESLint-compatible API.</p>
</li>
<li>
<p><strong><code>vite fmt</code></strong> — format your code with Oxfmt (to be released soon), which aims for 99%+ Prettier compatibility while offering more control and flexibility, such as finer control over line wrapping.</p>
</li>
<li>
<p><strong><code>vite lib</code></strong> — bundle libraries with best practices baked in, powered by <a href="https://tsdown.dev/" target="_blank" rel="noreferrer">tsdown</a> and <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>. It includes blazing-fast bundled DTS generation via the <code>isolatedDeclarations</code> transform.</p>
</li>
<li>
<p><strong><code>vite run</code></strong> — a built-in monorepo task runner with intelligent caching. We’ve implemented sophisticated task input inference so that most tasks can be cached without explicit configuration—often with even better granularity than manual setups. Think <a href="https://turborepo.com/" target="_blank" rel="noreferrer">Turborepo</a>, but without having to tell the system how to invalidate the cache.</p>
</li>
<li>
<p><strong><code>vite ui</code></strong> — GUI devtools that offer insights into module resolve / transform behavior, bundle size / tree-shaking analysis, and integration with framework-specific devtools.</p>
</li>
</ul>
<p>All these commands work seamlessly together out of the box, without the need for complex configuration or compatibility plumbing. Vite+ inherits Vite's thriving ecosystem so it is compatible with mainstream frameworks like React and Vue, and also fullstack meta frameworks like Tanstack Start and SvelteKit. And because each command is built on or compatible with widely adopted tools, adopting Vite+ doesn’t require massive refactoring if you are already using those tools.</p>
<p>The entire suite of commands is built on a shared foundation to ensure cohesion and consistency. We’ve implemented the full compiler toolchain in Rust—from the <a href="https://oxc.rs/docs/guide/usage/parser.html" target="_blank" rel="noreferrer">parser</a> to the <a href="https://oxc.rs/docs/guide/usage/resolver.html" target="_blank" rel="noreferrer">resolver</a>, <a href="https://oxc.rs/docs/guide/usage/transformer.html" target="_blank" rel="noreferrer">transformer</a>, <a href="https://oxc.rs/docs/guide/usage/minifier.html" target="_blank" rel="noreferrer">minifier</a>, and <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">bundler</a> — with obsessive performance tuning at every level. All of this infrastructure is open source and already widely adopted by companies like Framer (<a href="https://voidzero.dev/posts/case-study-framer-rolldown" target="_blank" rel="noreferrer">case study</a>), Linear, Atlassian, Shopify, and more. Utilities such as <code>parse</code> and <code>transform</code> are also exported from Vite+ as APIs to support custom tooling.</p>
<p>You can watch <a href="https://youtu.be/x7Jsmt_o9ek?si=BMaXc0grNaOl-V7Z&amp;t=937" target="_blank" rel="noreferrer">the demo from Evan’s talk at ViteConf</a> to get a sneak peek of Vite+ in action.</p>
<h2 id="the-problem-vite-is-trying-to-solve" tabindex="-1">The problem Vite+ is trying to solve <a class="header-anchor" href="#the-problem-vite-is-trying-to-solve" aria-label="Permalink to “The problem Vite+ is trying to solve”">&#8203;</a></h2>
<p>The JavaScript tooling ecosystem has seen its fair share of fragmentation and churn over the years. As a language originally designed in 10 days, no one could have imagined we’d be building apps of today’s scale and complexity with JavaScript. Tooling complexity and performance have become real bottlenecks for companies facing ever-larger web projects but limited internal tooling resources.</p>
<p>These bottlenecks are more severe for companies with multiple teams, each using their own unique tooling choices. Tasks like dependency management or security reviews must be handled separately for each team. Dependency combinations drift out of sync between projects and get harder and harder to reconcile over time. If teams or projects are merged, then developer time must be paid to migrate tools or end up with a convoluted, Frankensteined tool stack.</p>
<p>With Vite+, we aim to offer a unified solution for JavaScript tooling — so teams facing these challenges can focus on shipping products instead of wasting time evaluating, bike-shedding, configuring, and debugging their tool stacks.</p>
<h2 id="licensing" tabindex="-1">Licensing <a class="header-anchor" href="#licensing" aria-label="Permalink to “Licensing”">&#8203;</a></h2>
<p>Sustainability has always been a challenge for open source developer tooling. Our goal with Vite+ is to capture a portion of the value it creates at scale for larger organizations and reinvest it into the open source projects that power Vite+.</p>
<p>To ensure the wider community benefits as well, Vite+ will be free for individuals, open source projects, and small businesses. We plan to offer flat annual license pricing for startups and custom pricing for enterprises. Though Vite+ will be commercially licensed, it will be source-available. Exact tier thresholds and licensing details will be announced closer to public launch.</p>
<p>We understand that commercialization on top of open source can raise concerns within the community. Through our years of open source work, we know this balance is delicate and built on trust. We’re committed to pursuing a commercialization path that serves the best interests of both our OSS and commercial users.</p>
<p>It’s important to emphasize that Vite+ is a <strong>separate, additive layer</strong> built on top of the open source projects we maintain. All existing projects — Vite, Vitest, Rolldown, and Oxc — will remain open source under MIT forever. Since Vite+ relies on these open source projects, improving Vite+ requires improving them as well. You are welcome to hold us accountable to that commitment.</p>
<h2 id="help-us-shape-vite" tabindex="-1">Help us shape Vite+! <a class="header-anchor" href="#help-us-shape-vite" aria-label="Permalink to “Help us shape Vite+!”">&#8203;</a></h2>
<p>Vite+ is still in development, and we’re targeting a public preview in early 2026. We’re currently looking for early adopters to help test-drive it in production environments.</p>
<p>If you’re interested, visit <a href="https://viteplus.dev" target="_blank" rel="noreferrer">viteplus.dev</a> and get in touch!</p>
<hr>
<h2 id="faqs" tabindex="-1">FAQs <a class="header-anchor" href="#faqs" aria-label="Permalink to “FAQs”">&#8203;</a></h2>
<ul>
<li>
<p><strong>How do frameworks benefit from Vite+?</strong></p>
<p>Vite+ is an integration on the application-level. Frameworks don't need to rewrite their internals for developers to benefit. They can provide Vite+ plugins for a smoother developer experience (DX) and tighter integration, but they won't have to switch to Vite+ themselves.</p>
<p>Open-source framework repositories can use Vite+ themselves for free in their own development workflows.</p>
</li>
<li>
<p><strong>Is Vite paid software now?</strong></p>
<p>No. Vite remains free and open-source under the MIT license. VoidZero <a href="/posts/announcing-voidzero-inc.html#what-s-next">stated from the beginning</a> that all code and packages released as open-source will remain open-source.</p>
<p>Vite+ is a separate product that provides additional features and services as a superset of Vite to provide an end-to-end JavaScript tooling solution.</p>
</li>
<li>
<p><strong>What impact will Vite+ have on Vite and other open-source projects?</strong></p>
<p>Vite+ is built on top of the existing open-source ecosystem, and can only function if that ecosystem is healthy. As a paid product, Vite+ supports the sustainability of the underlying open-source projects it builds on.</p>
</li>
<li>
<p><strong>Can I use Vite+ with my own tooling?</strong></p>
<p>Yes. Vite+ aims to give the best DX and performance but does not force you to use only Vite+ tools and commands. Its task runner and caching will work with arbitrary tasks, not just with built-in Vite+ commands.</p>
</li>
</ul>
]]></content:encoded>
            <author>Evan You</author>
        </item>
        <item>
            <title><![CDATA[How Framer reduced LCP using Rolldown]]></title>
            <link>https://voidzero.dev/posts/case-study-framer-rolldown</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/case-study-framer-rolldown</guid>
            <pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>Framer is a no-code website builder that lets customers like Miro, Perplexity, and Scale AI rapidly create and update dynamic websites without requiring developer support. The key to their growth is speed. Framer lets their customers ship fast sites. Sites as fast or faster than having a team of the best frontend developers. That means constantly looking at ways to improve their customers’ core web vitals like Large Contentful Paint, LCP.</p>
<h2 id="the-challenge-improving-bundling-and-chunk-splitting" tabindex="-1">The challenge: Improving bundling and chunk splitting <a class="header-anchor" href="#the-challenge-improving-bundling-and-chunk-splitting" aria-label="Permalink to “The challenge: Improving bundling and chunk splitting”">&#8203;</a></h2>
<p>Like most modern websites, Framer bundles their customers’ websites to make the websites faster. The purpose of bundling is to reduce the total number of network requests. But a single big JavaScript file isn’t ideal either - in order to achieve the best possible performance, bundles are often split into “chunks”, and an optimal balance between chunk size and the number of chunks is needed. This relies on a bundler feature called “chunk splitting”.</p>
<div  class="info custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!"><strong>Chunks</strong> are files of optimized code created by bundlers and loaded on demand by browsers.</p>
</div>
<p>Framer used an open-source bundler called esbuild, which redefined performance for JavaScript bundlers. Esbuild was significantly faster than everything else at that time, and it allowed Framer to provide a fast publishing experience when their customers made changes to their websites.</p>
<p>However, esbuild has limitations when it comes to chunk splitting. It sometimes produces too many chunks, affecting the website’s LCP. Framer’s performance engineers were looking for ways to improve LCP with a better chunk splitting strategy. The team had explored alternative bundlers like Rollup, Parcel, and farm-fe - but none were comparable to esbuild’s bundling speed and would negatively impact their customer’s publishing speed. This was when Rolldown came into consideration.</p>
<h2 id="the-solution-rolldown-s-advancedchunks-unlocked-flexibility" tabindex="-1">The solution: Rolldown’s advancedChunks unlocked flexibility <a class="header-anchor" href="#the-solution-rolldown-s-advancedchunks-unlocked-flexibility" aria-label="Permalink to “The solution: Rolldown’s advancedChunks unlocked flexibility”">&#8203;</a></h2>
<p>Rolldown was the new kid on the block. Written in Rust, it promised bundling speed that matches esbuild’s. As important is a configuration feature Rolldown had called <code>advancedChunks</code>, which gives users the option to fine-tune how chunks are created. Instead of relying on a standard algorithm to bundle and split their code, users can set chunking rules to better fit their code repository. This flexibility is a powerful feature and was exactly what Framer was looking for.</p>
<p>The Framer team made a bet. They became a VoidZero customer and started working directly with VoidZero’s Rolldown team. The goal was to fine-tune chunking and improve LCP. The partnership launched a series of rapid Rolldown iterations.</p>
<p>VoidZero prioritized Framer's feature requests and issues. When new versions of Rolldown were released, Framer quickly provided feedback on their impact on code chunks. For instance, Framer requested a rule to place code shared by multiple files into separate chunks, leading Rolldown to add the <code>minShareCount</code> option.</p>
<h2 id="the-results-chunks-decreased-by-67-and-lcp-improved" tabindex="-1">The results: Chunks decreased by 67% and LCP improved <a class="header-anchor" href="#the-results-chunks-decreased-by-67-and-lcp-improved" aria-label="Permalink to “The results: Chunks decreased by 67% and LCP improved”">&#8203;</a></h2>
<p>Framer’s Rolldown implementation decreased chunks by 67% for the majority of Framer’s websites. But how did Framer progress against their ultimate goal of faster LCP? Did the optimized chunks improve caching and make load times faster for returning visitors? Let’s take a look.</p>
<p>| Website size    | LCP* |
| :</p>
]]></description>
            <content:encoded><![CDATA[<p>Framer is a no-code website builder that lets customers like Miro, Perplexity, and Scale AI rapidly create and update dynamic websites without requiring developer support. The key to their growth is speed. Framer lets their customers ship fast sites. Sites as fast or faster than having a team of the best frontend developers. That means constantly looking at ways to improve their customers’ core web vitals like Large Contentful Paint, LCP.</p>
<h2 id="the-challenge-improving-bundling-and-chunk-splitting" tabindex="-1">The challenge: Improving bundling and chunk splitting <a class="header-anchor" href="#the-challenge-improving-bundling-and-chunk-splitting" aria-label="Permalink to “The challenge: Improving bundling and chunk splitting”">&#8203;</a></h2>
<p>Like most modern websites, Framer bundles their customers’ websites to make the websites faster. The purpose of bundling is to reduce the total number of network requests. But a single big JavaScript file isn’t ideal either - in order to achieve the best possible performance, bundles are often split into “chunks”, and an optimal balance between chunk size and the number of chunks is needed. This relies on a bundler feature called “chunk splitting”.</p>
<div  class="info custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!"><strong>Chunks</strong> are files of optimized code created by bundlers and loaded on demand by browsers.</p>
</div>
<p>Framer used an open-source bundler called esbuild, which redefined performance for JavaScript bundlers. Esbuild was significantly faster than everything else at that time, and it allowed Framer to provide a fast publishing experience when their customers made changes to their websites.</p>
<p>However, esbuild has limitations when it comes to chunk splitting. It sometimes produces too many chunks, affecting the website’s LCP. Framer’s performance engineers were looking for ways to improve LCP with a better chunk splitting strategy. The team had explored alternative bundlers like Rollup, Parcel, and farm-fe - but none were comparable to esbuild’s bundling speed and would negatively impact their customer’s publishing speed. This was when Rolldown came into consideration.</p>
<h2 id="the-solution-rolldown-s-advancedchunks-unlocked-flexibility" tabindex="-1">The solution: Rolldown’s advancedChunks unlocked flexibility <a class="header-anchor" href="#the-solution-rolldown-s-advancedchunks-unlocked-flexibility" aria-label="Permalink to “The solution: Rolldown’s advancedChunks unlocked flexibility”">&#8203;</a></h2>
<p>Rolldown was the new kid on the block. Written in Rust, it promised bundling speed that matches esbuild’s. As important is a configuration feature Rolldown had called <code>advancedChunks</code>, which gives users the option to fine-tune how chunks are created. Instead of relying on a standard algorithm to bundle and split their code, users can set chunking rules to better fit their code repository. This flexibility is a powerful feature and was exactly what Framer was looking for.</p>
<p>The Framer team made a bet. They became a VoidZero customer and started working directly with VoidZero’s Rolldown team. The goal was to fine-tune chunking and improve LCP. The partnership launched a series of rapid Rolldown iterations.</p>
<p>VoidZero prioritized Framer's feature requests and issues. When new versions of Rolldown were released, Framer quickly provided feedback on their impact on code chunks. For instance, Framer requested a rule to place code shared by multiple files into separate chunks, leading Rolldown to add the <code>minShareCount</code> option.</p>
<h2 id="the-results-chunks-decreased-by-67-and-lcp-improved" tabindex="-1">The results: Chunks decreased by 67% and LCP improved <a class="header-anchor" href="#the-results-chunks-decreased-by-67-and-lcp-improved" aria-label="Permalink to “The results: Chunks decreased by 67% and LCP improved”">&#8203;</a></h2>
<p>Framer’s Rolldown implementation decreased chunks by 67% for the majority of Framer’s websites. But how did Framer progress against their ultimate goal of faster LCP? Did the optimized chunks improve caching and make load times faster for returning visitors? Let’s take a look.</p>
<table tabindex="0">
<thead>
<tr>
<th style="text-align:left">Website size</th>
<th style="text-align:left">LCP*</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Small (&lt;=1 MB)</td>
<td style="text-align:left">~0%</td>
</tr>
<tr>
<td style="text-align:left">Medium (1-2 MB)</td>
<td style="text-align:left">-4%</td>
</tr>
<tr>
<td style="text-align:left">Large (2+ MB)</td>
<td style="text-align:left">-41%</td>
</tr>
</tbody>
</table>
<p>The bigger the website, the more room for optimization. Small Framer websites, like hobby projects or simple landing pages, already load quickly and have little overhead to further reduce. Whereas, <strong>large Framer websites reduced LCP by a whopping 41%</strong>! Framer’s customers were delighted.</p>
<div  class="info custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!">I’ve been optimising every single page with small incremental gains and then suddenly BANG after the Rolldown drop. Thank you performance team!</p>
<p><cite> <a href="https://tristanowen.io/" target="_blank" rel="noreferrer">Tristan Owen</a> - UX/UI Web Designer &amp; Framer Expert</cite></p>
</div>
<div  class="info custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!">Site performance and publish speed seem significantly better … I just didn’t expect such a visible increase in perf.</p>
<p><cite> <a href="https://ben.gold" target="_blank" rel="noreferrer">Ben Gold</a> - Freelancer &amp; Framer Expert</cite></p>
</div>
<h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to “Next steps”">&#8203;</a></h2>
<p>Framer has 2 distinct and very different build artifacts:</p>
<ol>
<li>Framer website, the website customers publish</li>
<li>Framer canvas, the web app customers design their website in</li>
</ol>
<p>All the <a href="https://www.framer.com/updates/rolldown" target="_blank" rel="noreferrer">Framer websites now use Rolldown</a> in the build process. The next step is to migrate the Framer canvas build process to Rolldown to load faster, improve publishing times, and even reduce storage costs.</p>
<p>In the meantime, Framer is also looking to adopt other VoidZero projects like the native-speed linter, Oxlint, and formatter, when available.</p>
<p><strong>*</strong> Metrics are based on the 75th percentile, which is how Core Web Vitals, like LCP, are calculated. Numbers are TTFB adjusted.</p>
]]></content:encoded>
            <author>Michael Dong</author>
        </item>
        <item>
            <title><![CDATA[VoidZero's 2025 Open Source Pledge Report]]></title>
            <link>https://voidzero.dev/posts/oss-pledge-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/oss-pledge-2025</guid>
            <pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>TLDR: VoidZero is continuing our commitment to the <a href="https://opensourcepledge.com/" target="_blank" rel="noreferrer">Open Source Pledge</a> and donating $48,360 or <strong>$3,454</strong> per VoidZero developer to external open source projects.</p>
]]></description>
            <content:encoded><![CDATA[<p>TLDR: VoidZero is continuing our commitment to the <a href="https://opensourcepledge.com/" target="_blank" rel="noreferrer">Open Source Pledge</a> and donating $48,360 or <strong>$3,454</strong> per VoidZero developer to external open source projects.</p>
<hr>
<p>A year ago, <a href="https://voidzero.dev/posts/oss-pledge" target="_blank" rel="noreferrer">VoidZero joined the Open Source Pledge</a>, an initiative to encourage companies to contribute to the OSS community and ecosystem. Coming from a team of prolific open source maintainers and contributors, we understand the criticality for companies like VoidZero to sponsor projects:</p>
<ul>
<li>OSS project donations create outsized value and impact due to wide adoption.</li>
<li>Donations from individuals do not scale and have less predictability for maintainers.</li>
<li>Cultural and bureaucratic barriers prevent more companies from donating to OSS.</li>
</ul>
<p>We’re proud to continue our commitment and increase our sponsorship in lock step with the company's growth.</p>
<h2 id="who-are-we-sponsoring" tabindex="-1">Who Are We Sponsoring? <a class="header-anchor" href="#who-are-we-sponsoring" aria-label="Permalink to “Who Are We Sponsoring?”">&#8203;</a></h2>
<p>Our funding selection criteria remains unchanged since last year. We are starting with the dependencies that our projects directly rely on, and individual developers that we believe are producing meaningful impact for the entire JavaScript ecosystem.</p>
<p>In the first year, we donated $31,488 to projects across the JavaScript and Rust ecosystems. As our team has grown, so have our sponsorships. We are donating a total of $48,360 per year, which is $3,454 per VoidZero developer.</p>
<p>Notable projects we are now sponsoring include ESLint and typescript-eslint, whose work we rely on heavily. It is thanks to them that VoidZero can build features like <a href="https://voidzero.dev/posts/announcing-oxlint-type-aware-linting" target="_blank" rel="noreferrer">Oxlint’s type-aware linting</a>.</p>
<p>Here is a detailed breakdown of who we are funding:</p>
<table tabindex="0">
<thead>
<tr>
<th>Project(s)</th>
<th>Developer</th>
<th>Monthly Recurring Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://antfu.me/projects" target="_blank" rel="noreferrer">Multiple</a></td>
<td><a href="https://github.com/antfu" target="_blank" rel="noreferrer">Anthony Fu (@antfu)</a>*</td>
<td>$1,012</td>
</tr>
<tr>
<td><a href="https://rollupjs.org/" target="_blank" rel="noreferrer">Rollup</a></td>
<td><a href="https://opencollective.com/rollup" target="_blank" rel="noreferrer">**</a></td>
<td>$800</td>
</tr>
<tr>
<td><a href="https://unjs.io/" target="_blank" rel="noreferrer">UnJS</a></td>
<td><a href="https://github.com/pi0" target="_blank" rel="noreferrer"><strong>Pooya Parsa (@pi0)</strong></a></td>
<td>$512</td>
</tr>
<tr>
<td><a href="https://eslint.org/" target="_blank" rel="noreferrer">ESLint</a></td>
<td><a href="https://opencollective.com/eslint" target="_blank" rel="noreferrer">**</a></td>
<td>$500</td>
</tr>
<tr>
<td><a href="https://pnpm.io/" target="_blank" rel="noreferrer"><strong>pnpm</strong></a></td>
<td><a href="https://opencollective.com/pnpm" target="_blank" rel="noreferrer">**</a></td>
<td>$500</td>
</tr>
<tr>
<td><a href="https://typescript-eslint.io/" target="_blank" rel="noreferrer">typescript-eslint</a></td>
<td><a href="https://opencollective.com/typescript-eslint" target="_blank" rel="noreferrer">**</a></td>
<td>$300</td>
</tr>
<tr>
<td><a href="https://lightningcss.dev/" target="_blank" rel="noreferrer">Lightning CSS</a></td>
<td><a href="https://github.com/devongovett" target="_blank" rel="noreferrer"><strong>Devon Govett (@devongovett)</strong></a></td>
<td>$256</td>
</tr>
<tr>
<td><a href="https://postcss.org/" target="_blank" rel="noreferrer"><strong>PostCSS</strong></a></td>
<td><a href="https://opencollective.com/postcss" target="_blank" rel="noreferrer">**</a></td>
<td>$150</td>
</tr>
</tbody>
</table>
<blockquote>
<p>* Anthony contributes to Vite and Vitest, which are projects related to VoidZero's ecosystem, but also maintains many other projects. We are sponsoring Anthony directly for $1024/month and counting half of that towards the pledge. Additionally, we sponsor Anthony’s <a href="https://opencollective.com/antfu" target="_blank" rel="noreferrer">Open Collective</a> account for $500/month, which is then re-distributed to underlying dependencies across the ecosystem.</p>
<p>**Donations made to projects' respective Open Collective accounts instead of individuals.</p>
</blockquote>
]]></content:encoded>
            <author>Michael Dong</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: September 2025 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-sep-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-sep-2025</guid>
            <pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>What’s new in ViteLand!</em> Every month, we recap the project updates for Vite, Vitest, Oxc, Rolldown and what’s happening in our community.</p>
<h2 id="rolldown-gets-up-to-45-faster-and-also-smaller" tabindex="-1">Rolldown gets up to 45% faster, and also smaller! <a class="header-anchor" href="#rolldown-gets-up-to-45-faster-and-also-smaller" aria-label="Permalink to “Rolldown gets up to 45% faster, and also smaller!”">&#8203;</a></h2>
<p>Rolldown is the fastest JavaScript bundler, but that does not stop us from striving for even better performance. In the last month, three significant improvements were made!</p>
<ol>
<li><a href="https://github.com/oxc-project/oxc-resolver/pull/691" target="_blank" rel="noreferrer">Re-implemented the file metadata retrieval function for Windows</a>. Rust's default standard library runs at suboptimal speed on Windows, and since Rolldown processes large numbers of files during bundling, the new retrieval function improved performance 10-30% for Rolldown builds on Windows.</li>
<li><a href="https://github.com/rolldown/rolldown/pull/6306" target="_blank" rel="noreferrer">Optimized multi-threaded I/O operations specifically for macOS</a>. Counterintuitively, a higher number of threads opening files on a multi-core macOS system causes a performance degradation instead of expected improvements. In turn, we reduced the number of threads to four, which resulted in 10-45% faster bundling on macOS.</li>
<li><a href="https://github.com/rolldown/rolldown/pull/6313" target="_blank" rel="noreferrer">Improved source map ignore list</a>. Building with source maps enabled is now 20-30% faster because of reduced Rust-to-JS function calls.</li>
</ol>
<p>These performance improvements translate directly into faster build times and a smoother development workflow for Rolldown and Oxc users.</p>
<p>Further, the Rolldown team worked on reducing Rolldown's binary size. It was possible to shave off 200KB due to <a href="https://github.com/rolldown/rolldown/pull/6220" target="_blank" rel="noreferrer">a new way of integrating Oxc into Rolldown</a>. Instead of depending on the <code>@oxc/runtime</code> package directly, the helpers from the package will now be embedded directly into the Rolldown binary during compilation.</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li>Ready to create Rolldown-based Vite apps easily? Vite's <code>create-vite</code> wizard <a href="https://github.com/vitejs/vite/issues/20820" target="_blank" rel="noreferrer">has a Rolldown option now</a>!</li>
</ul>
<h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li>Using the browser mode for your tests but want to debug them? You can! The Vitest VS Code extension now <a href="https://github.com/vitest-dev/vscode/pull/662" target="_blank" rel="noreferrer">supports debugging browser tests while being in the browser mode</a>.</li>
<li>Another improvement for the browser mode: In the next version, <a href="https://main.vitest.dev/guide/browser/trace-viewer" target="_blank" rel="noreferrer">it will support playwright's trace viewer natively</a> by passing down a flag.</li>
</ul>
<h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li>The team worked on more optimizations, including <a href="https://github.com/rolldown/rolldown/pull/6207" target="_blank" rel="noreferrer">support for the <code>/* @__NO_SIDE_EFFECTS__ */</code> annotation across chunks</a>, enhanced tree-shaking across module boundaries and a more efficient dead code elimination.</li>
</ul>
<TwitterEmbed url="https://x.com/dalaoshv/status/1971216872407449950" /><TwitterEmbed url="https://x.com/voidzerodev/status/1965491692595024294" /><h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>Oxlint is becoming faster and faster! Oxc core team member Cam McHenry submitted <a href="https://github.com/oxc-project/oxc/pull/13138" target="_blank" rel="noreferrer">two</a> <a href="https://github.com/oxc-project/oxc/pull/13690" target="_blank" rel="noreferrer">PRs</a> which improve linting speed in real-world codebases by 5-50%.</li>
<li>Mentioning every performance improvement for Oxc would be too long for this recap post. So, we've compiled <a href="https://gist.github.com/Boshen/7ee09b4cd22fcb8146b75f55c5ac5321" target="_blank" rel="noreferrer">a list of all the performance-related PRs</a>, grouped by topic and performance gains.</li>
<li>Oxlint now supports the popular <a href="https://github.com/oxc-project/oxc/pull/13748" target="_blank" rel="noreferrer"><code>preserve-caught-error</code> rule</a>, and provides an <a href="https://github.com/oxc-project/oxc/pull/14104" target="_blank" rel="noreferrer">auto-fix</a> for it!</li>
<li>Boshen tackled and resolved a <a href="https://github.com/oxc-project/oxc/pull/14049" target="_blank" rel="noreferrer">nasty memory leak issue</a> with Oxlint when using the import plugin.</li>
<li>Oxlint can be used within various setups. For all Next.js users, there is <a href="https://github.com/vercel/next.js/pull/83842" target="_blank" rel="noreferrer">an official Oxlint example now</a>!</li>
<li>The technical preview for Oxlint's custom JavaScript plugins will be released in the next week. Stay tuned! A sneak peek can be found in the tweet below.</li>
</ul>
<TwitterEmbed url="https://x.com/boshen_c/status/1968329513563230336" /><h2 id="upcoming-events" tabindex="-1">Upcoming Events <a class="header-anchor" href="#upcoming-events" aria-label="Permalink to “Upcoming Events”">&#8203;</a></h2>
<p>Want to catch talks and presentations from VoidZero team members? Then take a look at the following events where they will be sharing insights and giving talks:</p>
<ul>
<li><strong>Oct 2:</strong> <a href="https://lp.jetbrains.com/javascript-day-2025/" target="_blank" rel="noreferrer">JetBrains JavaScript Day</a>. Want to know more about faster builds with fewer headaches? Then join Alex's talk.</li>
<li><strong>Oct 9–10:</strong> <a href="https://viteconf.amsterdam/" target="_blank" rel="noreferrer">ViteConf 2025</a>. The first in-person ViteConf with talks from many of the VoidZero team!</li>
<li><strong>Oct 14–16:</strong> <a href="https://events.linuxfoundation.org/jsconf-north-america/program/schedule/" target="_blank" rel="noreferrer">JSConf North America</a>. Evan shares insights on overcoming challenges in building faster JavaScript tooling.</li>
<li><strong>Oct 25:</strong> <a href="https://vuefes.jp/2025/en/timetable" target="_blank" rel="noreferrer">VueFes Japan</a>. Evan gives the event's keynote, Hiroshi prepared a deep dive into Vitest, and Yuji shares his OSS journey with Oxc.</li>
<li><strong>Nov 20:</strong> <a href="https://jsnation.us/" target="_blank" rel="noreferrer">JSNation</a>. Meet Alex remotely to catch the news about Rolldown and Oxc.</li>
<li><strong>Nov 28:</strong> <a href="https://reactadvanced.com/" target="_blank" rel="noreferrer">React Advanced London</a>. Wondering what our tooling has to offer as a React developer? Time to find out in Alex's remote talk!</li>
<li>Missed SquiggleConf this year? Check out <a href="https://youtu.be/vSXLDvvIpYE?t=7315" target="_blank" rel="noreferrer">Alex's talk about Rolldown</a>.</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From the Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From the Community”">&#8203;</a></h2>
<ul>
<li>Evan appeared on the <a href="https://www.youtube.com/watch?v=quEc5ZI3_Ys" target="_blank" rel="noreferrer">SyntaxFM podcast</a> to discuss modern JavaScript tooling.</li>
<li>And that's not all! The VoidZero CEO also gave an interview to The New Stack about <a href="https://thenewstack.io/how-vite-became-the-backbone-of-modern-frontend-frameworks/" target="_blank" rel="noreferrer">how Vite became the backbone of modern frontend frameworks</a>.</li>
<li>Alexander Lichter joined PodRocket for an episode to discuss the latest developments at VoidZero and <a href="https://www.youtube.com/watch?v=wr3-X6xKxoc" target="_blank" rel="noreferrer">explains why Rolldown is not just a rustified Rollup</a>.</li>
<li>Nuno Maduro from Laravel took the time and did both: He <a href="https://www.youtube.com/watch?v=FS0Ds0nIC8E" target="_blank" rel="noreferrer">interviewed Evan</a> and <a href="https://www.youtube.com/watch?v=hV8G_gfuwnI&amp;t=2938s" target="_blank" rel="noreferrer">tried Oxlint live on stream</a>. Don't miss the fun!</li>
<li>Alexander Lichter demonstrated how <a href="https://www.youtube.com/watch?v=KEdlbVZW3Ow" target="_blank" rel="noreferrer">Nuxt and <code>rolldown-vite</code> lead to significantly faster builds</a>. The same works for many other (meta) frameworks as well!</li>
<li>Framer announced their <a href="https://www.framer.com/updates/rolldown" target="_blank" rel="noreferrer">rollout of Rolldown</a> in their build pipeline for all users.</li>
<li>The Deno team did not only announce the beta of Fresh 2.0, but also that <a href="https://deno.com/blog/fresh-and-vite" target="_blank" rel="noreferrer">their framework now has a Vite plugin</a>.</li>
<li>Why using Vitest? According to Artem Zakharchenko, one of the key reasons is <a href="https://www.epicweb.dev/incredible-vitest-defaults" target="_blank" rel="noreferrer">Vitest's incredible set of defaults</a>.</li>
<li>Christophe Rosset shared comprehensive <a href="https://topheman.github.io/toolchain-notes/" target="_blank" rel="noreferrer">notes from his deep-dive into Rolldown and Oxc internals</a>, providing insights for everyone who wants to understand how the tools work under the hood.</li>
<li>The Qwik team <a href="https://github.com/QwikDev/qwik/pull/7935" target="_blank" rel="noreferrer">replaced Rollup with Rolldown for their browser playground</a>, achieving 4x faster performance compared to their previous setup.</li>
<li>Christoph Nakazawa <a href="https://youtu.be/rxPTEko8J7c?t=307" target="_blank" rel="noreferrer">gave a talk on &quot;Building Scalable Applications&quot;</a>, mentioning Vitest, Oxc, <code>tsdown</code>, and Rolldown.</li>
<li>The popular date library <code>date-fns</code> <a href="https://github.com/date-fns/date-fns/commit/1ed51e60cd481a59bc68d494ad6954886081e830" target="_blank" rel="noreferrer">switched to Oxlint</a>, with author Sasha Koss <a href="https://twitter.com/kossnocorp/status/1970304079198142700" target="_blank" rel="noreferrer">explaining the reasoning behind the switch</a>.</li>
<li>Cherry Studio, an open source desktop multi-LLM client, <a href="https://github.com/CherryHQ/cherry-studio/pull/10168" target="_blank" rel="noreferrer">adopted Oxlint</a> in their development workflow for fast linting.</li>
<li>Developer tools need to work well for Devs and for AI. Good news that some developers noticed that <a href="https://x.com/hylarucoder/status/1969767869262254219" target="_blank" rel="noreferrer">Oxlint works better for AI agents</a> than other tools.</li>
<li>Vite's official React Server Component plugin <a href="https://rsc.krasimirtsonev.com/#vite" target="_blank" rel="noreferrer">scores 100%</a> on Krasimir Tsonev's RSC features support test.</li>
<li>React Router provides a new Vite plugin to add <a href="https://remix.run/blog/rsc-framework-mode-preview" target="_blank" rel="noreferrer">RSC support for their framework mode</a>.</li>
</ul>
<TwitterEmbed url="https://x.com/refine_dev/status/1971574884561236121" /><TwitterEmbed url="https://x.com/ghoullier/status/1963869529693434082" /><TwitterEmbed url="https://x.com/mohebifar/status/1963739565048692902" />]]></content:encoded>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: August 2025 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-aug-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-aug-2025</guid>
            <pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>What’s new in ViteLand!</em> Every month, we recap the project updates for Vite, Vitest, Oxc, Rolldown and what’s happening in our community.</p>
<h2 id="oxlint-type-aware-linting-custom-js-plugins" tabindex="-1">Oxlint: Type-Aware Linting &amp; Custom JS Plugins <a class="header-anchor" href="#oxlint-type-aware-linting-custom-js-plugins" aria-label="Permalink to “Oxlint: Type-Aware Linting &amp; Custom JS Plugins”">&#8203;</a></h2>
<p>Oxlint is meant to be a full-fledged linting replacement that runs at native speed. In other words, it has to cover existing linting rules, plugins, and use cases. Otherwise, users will need both Oxlint and another linter. This month, Oxlint made 2 big progress updates towards being a comprehensive replacement:</p>
<ol>
<li>
<p><a href="https://voidzero.dev/posts/announcing-oxlint-type-aware-linting" target="_blank" rel="noreferrer">Type-aware linting released</a>. Type-aware linting has been a big feature gap for native linters because they require reading multiple files to infer type, which negates performance gains. However, Oxlint was able to maintain fast performance by building on TypeScript’s native Go port and <code>tsgolint</code>. The official preview of Oxlint’s type-aware linting supports 40 type-aware rules, including <code>no-floating-promises</code>.</p>
</li>
<li>
<p><a href="https://github.com/oxc-project/oxc/issues/9905#issuecomment-3208424180" target="_blank" rel="noreferrer">Custom JS plugins support roadmap</a>. Oxlint’s custom JS plugin support is a &quot;have my cake and eat it too&quot; solution that provides an ESLint-compatible API and fast performance. After months of researching and prototyping, the team has found a way to run existing ESLint plugins from NPM and offer an ESLint-compatible API for custom rules and plugins. In the future, almost all ESLint plugins will work with Oxlint without modification, while maintaining the strong performance characteristics that Oxlint is known for.</p>
</li>
</ol>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li><a href="https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc" target="_blank" rel="noreferrer">React Server Component support in Vite has landed</a> via <code>@vitejs/plugin-rsc</code>. The goal is to offer a unified solution for every vite-based React framework.</li>
<li><code>@vitejs/plugin-react</code> <a href="https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md#500-beta0-2025-07-28" target="_blank" rel="noreferrer">version 5 has been released</a>. It now integrates <code>@vitejs/plugin-react-oxc</code> directly when <code>rolldown-vite</code> is detected, so no different plugin is needed anymore.</li>
<li>Nobody wants their source code leaked or stolen. Due to a <em>dev server</em> vulnerability in various tools (including Vite), this was a real threat. <a href="https://green.sapphi.red/blog/addressing-source-code-leaks-across-the-ecosystem-a-retrospective" target="_blank" rel="noreferrer">Read Sapphi's retrospective blog post</a> and find out more of the process of responding it and fixing it in the whole JS ecosystem.</li>
<li>Plugin Hooks <a href="https://github.com/vite-pwa/vite-plugin-pwa/pull/877" target="_blank" rel="noreferrer">for <code>vite-plugin-pwa</code></a> (and other Vite plugins) are in place now, speeding them up when using <code>rolldown-vite</code>.</li>
</ul>
<TwitterEmbed url="https://x.com/sapphi_red/status/1960889542845849899" /><h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li>Vitest <a href="https://bsky.app/profile/erus.dev/post/3luzbsen2722x" target="_blank" rel="noreferrer">now supports visual regression testing</a> in the last v4 beta. Another feature that the browser mode unlocks.</li>
<li>Faster tests are always better! And the v4 beta <a href="https://bsky.app/profile/erus.dev/post/3lxfduh47vs2x" target="_blank" rel="noreferrer">improves that too by reducing Vitest's time to start by 25% on average</a>.</li>
<li>Vitest's experimental programmatic API <a href="https://github.com/vitest-dev/vitest/pull/8408" target="_blank" rel="noreferrer">can now parse test files</a> instead of running them to collect tests. This is especially useful for third-party providers and enables faster filtering in the future.</li>
</ul>
<h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li>Rolldown-Vite <a href="https://github.com/vitejs/rolldown-vite/pull/168" target="_blank" rel="noreferrer">enables native plugins out of the box</a>. After improving them behind a native flag, and resolving all ecosystem-ci issues, the first set is considered stable enough to be enabled by default, giving all builds a speed boost without the need for any configuration.</li>
<li>Dead Code Elimination and treeshaking is key for a small bundle. In the recent Rolldown versions, <a href="https://github.com/rolldown/rolldown/pull/5826" target="_blank" rel="noreferrer">multiple</a> <a href="https://github.com/rolldown/rolldown/pull/5829" target="_blank" rel="noreferrer">improvements</a> have been made to keep your bundle size even lower.
<ul>
<li>Including the <code>inlineConst</code> feature, which inlines imported constant values during bundling (instead of referencing them). It reduces bundle size and improves runtime performance due to fewer variable lookups. This optimization will be applied by default from <code>version 1.0.0-beta.35</code> on.</li>
</ul>
</li>
<li>Rolldown now has a <a href="https://rolldown.rs/reference/config-options#tsconfig" target="_blank" rel="noreferrer">top-level <code>tsconfig</code> option</a>. You can point it to your project's tsconfig path, allowing the resolver to respect aliases from <code>compilerOptions.paths</code> and setting defaults for transform settings. This supersedes the previously introduced <code>resolve.tsconfigFilename</code> option.</li>
<li>Our first case study is out: <a href="https://voidzero.dev/posts/case-study-plaid-rolldown" target="_blank" rel="noreferrer">Read how PLAID Inc. moved to Rolldown and decreased their build times by 97%</a></li>
</ul>
<h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>Not only the Rolldown team worked on ensuring smaller bundles. Oxc's minifier now <a href="https://github.com/oxc-project/oxc/pull/13026" target="_blank" rel="noreferrer">runs dead code elimination multiple times</a>, similar to Rollup. This can reduce the bundle size even further, while only adding minimal overhead.</li>
<li>If you are using React and <code>styled-components</code>, your builds can become even faster as Oxc now <a href="https://oxc.rs/docs/guide/usage/transformer.html#styled-components" target="_blank" rel="noreferrer">supports most of its features as native transform</a>. It can be easily enabled in Rolldown too <a href="https://github.com/rolldown/rolldown/blob/main/examples/styled-components-native/README.md" target="_blank" rel="noreferrer">as this example shows</a>.</li>
<li>Working on the performance of <code>tsgolint</code> can benefit everyone! Team member Cameron sent <a href="https://github.com/microsoft/typescript-go/pulls?q=is%3Apr+author%3Acamc314" target="_blank" rel="noreferrer">multiple PRs</a> to the <code>typescript-go</code> repository to improve its performance in various cases, helping the whole ecosystem.</li>
</ul>
<TwitterEmbed url="https://x.com/Cameron_C2/status/1956051057752064192" /><h2 id="upcoming-events" tabindex="-1">Upcoming Events <a class="header-anchor" href="#upcoming-events" aria-label="Permalink to “Upcoming Events”">&#8203;</a></h2>
<p>Stay tuned for these exciting events where VoidZero team members will be sharing insights and giving talks:</p>
<ul>
<li><strong>Sep 10:</strong> <a href="https://www.meetup.com/vuejs-paris/events/310596794/" target="_blank" rel="noreferrer">Vue Paris</a>. Alex presents on Oxc and Rolldown at the community meetup.</li>
<li><strong>Sep 18–19:</strong> <a href="https://2025.squiggleconf.com/" target="_blank" rel="noreferrer">SquiggleConf 2025</a>. VoidZero is sponsoring, and Alex speaks about Rolldown. <br> <a href="https://x.com/voidzerodev/status/1961510795285860663" target="_blank" rel="noreferrer">Win a ticket until Sep 5th</a> by trying out Oxlint!</li>
<li><strong>Sep 23:</strong> <a href="https://pragvue.com/" target="_blank" rel="noreferrer">PragVue</a>. Alex gives the keynote and talks about modern tooling.</li>
<li><strong>Oct 2:</strong> <a href="https://lp.jetbrains.com/javascript-day-2025/" target="_blank" rel="noreferrer">JetBrains JavaScript Day</a>. Want to know more about faster builds with fewer headaches? Then join Alex's talk.</li>
<li><strong>Oct 9–10:</strong> <a href="https://viteconf.amsterdam/" target="_blank" rel="noreferrer">ViteConf 2025</a>. The first in-person ViteConf with talks from many of the VoidZero team!</li>
<li><strong>Oct 14–16:</strong> <a href="https://events.linuxfoundation.org/jsconf-north-america/program/schedule/" target="_blank" rel="noreferrer">JSConf North America</a>. Evan shares insights on overcoming challenges in building faster JavaScript tooling.</li>
<li><strong>Oct 25:</strong> <a href="https://vuefes.jp/2025/en/timetable" target="_blank" rel="noreferrer">VueFes Japan</a>. Evan gives the event's keynote, Hiroshi prepared a deep dive into Vitest, and Yuji shares his OSS journey with Oxc.</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From the Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From the Community”">&#8203;</a></h2>
<ul>
<li>Evan You <a href="https://art19.com/shows/the-stack-overflow-podcast/episodes/efabc0e6-8ee8-418b-935c-4d6abca7ca46" target="_blank" rel="noreferrer">joined the Stack Overflow podcast for an episode</a> to talk about VoidZero's mission and beyond that</li>
<li>Storybook <a href="https://storybook.js.org/blog/component-test-with-storybook-and-vitest/" target="_blank" rel="noreferrer">partners with Vitest</a> to improve their component testing workflow.</li>
<li>Syntax covered <code>rolldown-vite</code> in their latest <a href="https://youtu.be/-lMTt6JHZdE?si=lsYiFDGKRnsxedkx" target="_blank" rel="noreferrer">Web Dev News episode</a>.</li>
<li>PLAID Inc. created a <a href="https://tech.plaid.co.jp/perf-server-build" target="_blank" rel="noreferrer">technical deep dive article</a> about their migration from Rollup to Rolldown. Definitely worth a read, and worth migrating!</li>
<li>Filip Sobol <a href="https://bsky.app/profile/filipsobol.bsky.social/post/3lxaxo2hlmk2a" target="_blank" rel="noreferrer">benchmarked all major bundlers</a> and compared the results to their versions 10 months ago. For Rolldown with <code>oxc-minify</code>, the bundle size improved by 18%, cutting down 463 KiB.</li>
<li><code>tsup</code> is <a href="https://x.com/TheAlexLichter/status/1956248974203007334" target="_blank" rel="noreferrer">not actively maintained anymore</a>. Luckily you can switch to <code>tsdown</code> easily <a href="https://tsdown.dev/guide/migrate-from-tsup" target="_blank" rel="noreferrer">with a simple command</a>.</li>
<li><a href="https://github.com/ryoppippi/ccusage" target="_blank" rel="noreferrer">ccusage</a> creator ryoppippi <a href="https://ryoppippi.com/blog/2025-08-12-my-js-cli-stack-2025-en" target="_blank" rel="noreferrer">shares his final JavaScript stack for building CLIs in 2025</a>, including <a href="https://tsdown.dev/" target="_blank" rel="noreferrer"><code>tsdown</code></a> and Rolldown.</li>
<li>Tim Benniks started to <a href="https://gist.github.com/timbenniks/28f0eee903eb81eb741e651bd2a8f7bc" target="_blank" rel="noreferrer">work on AI instructions that help migrating your TypeScript library over to the Vite toolchain</a></li>
<li>Building tools on top of Oxc is becoming more common: Meet <a href="https://devup-ui.com/" target="_blank" rel="noreferrer">Devup UI</a>, a zero runtime CSS-in-JS library</li>
<li>Vite is the shared infrastructure of the web. In the last recap, Vite surpassing webpack's download numbers was mentioned. <a href="https://www.youtube.com/watch?v=w61mLV5nZK0" target="_blank" rel="noreferrer">Theo Browne made a video about it</a>, shares his history with Webpack and Vite and explains &quot;why Vite has won&quot;.</li>
<li>More and more meta frameworks support <code>rolldown-vite</code> out of the box: After <a href="https://github.com/sveltejs/kit/pull/13747" target="_blank" rel="noreferrer">SvelteKit</a>, Nuxt also joined the ranks with <a href="https://github.com/nuxt/nuxt/pull/31812" target="_blank" rel="noreferrer">their PR</a>.</li>
<li>Another <a href="https://github.com/vitejs/vite-ecosystem-ci/actions/runs/17286284758/job/49064054763" target="_blank" rel="noreferrer">Ecosystem CI turns green</a>! Qwik's test are no passing in <code>rolldown-vite</code>'s ecosystem CI, meaning it is fully compatible with the rolldown-powered Vite version.</li>
<li>Do you remember that GitLab achieved 2.6x faster builds by using <code>rolldown-vite</code>? Now, with all native plugins enabled, <a href="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/180509#note_2678001031" target="_blank" rel="noreferrer">their build time got reduced by 7x</a>, from 2.5 minutes of Vite to 22s with <code>rolldown-vite</code>. That is also 43x faster than their existing Webpack build.</li>
<li>After running their own implementation for a while, the React-based framework <a href="https://waku.gg/blog/migration-to-vite-plugin-rsc" target="_blank" rel="noreferrer">Waku migrated over to Vite's official React Server Components plugin</a> and the Environment API.</li>
</ul>
<ul>
<li>Curious about building your own Vite plugin? Alem Tuziak <a href="https://www.youtube.com/watch?v=lgtfACgQYwU" target="_blank" rel="noreferrer">made a video about how he implemented the TanStack Devtools Vite plugin</a> and explained his process.</li>
</ul>
<TwitterEmbed url="https://x.com/wunderacle/status/1957043714687377447" /><TwitterEmbed url="https://x.com/ushiro_noko/status/1955864117459476601" /><TwitterEmbed url="https://x.com/timbenniks/status/1956657760059150739" /><TwitterEmbed url="https://x.com/n8kel/status/1956449278194528567" /><TwitterEmbed url="https://x.com/Carwack/status/1952460971898732623" />]]></content:encoded>
            <author>Alexander Lichter</author>
            <author>Michael Dong</author>
        </item>
        <item>
            <title><![CDATA[How PLAID Cut Build Times by 97% Migrating From Rollup To Rolldown]]></title>
            <link>https://voidzero.dev/posts/case-study-plaid-rolldown</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/case-study-plaid-rolldown</guid>
            <pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<div  class="warning custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!">For more details on the PLAID developer experience team’s Rolldown implementation, see the <a href="https://tech.plaid.co.jp/perf-server-build">blog post on PLAID's website</a></p>
</div>
<p><strong>TL;DR:</strong></p>
<ul>
<li>PLAID’s server-side bundling <strong>dropped 97%</strong> during benchmarking after switching from <code>Rollup + Terser</code> to <code>Rolldown + Oxc-minify</code></li>
<li>Rollup’s single-threaded JS architecture was limiting performance and improvement attempts like caching were ineffective</li>
<li>Rolldown’s Rust architecture directly addressed Rollup’s constraints by enabling parallel processing and accelerating bundler operation</li>
<li>Average production wait times decreased from 5-20 seconds to 200ms</li>
</ul>
]]></description>
            <content:encoded><![CDATA[<div  class="warning custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!">For more details on the PLAID developer experience team’s Rolldown implementation, see the <a href="https://tech.plaid.co.jp/perf-server-build">blog post on PLAID's website</a></p>
</div>
<p><strong>TL;DR:</strong></p>
<ul>
<li>PLAID’s server-side bundling <strong>dropped 97%</strong> during benchmarking after switching from <code>Rollup + Terser</code> to <code>Rolldown + Oxc-minify</code></li>
<li>Rollup’s single-threaded JS architecture was limiting performance and improvement attempts like caching were ineffective</li>
<li>Rolldown’s Rust architecture directly addressed Rollup’s constraints by enabling parallel processing and accelerating bundler operation</li>
<li>Average production wait times decreased from 5-20 seconds to 200ms</li>
</ul>
<hr>
<p><a href="https://plaid.co.jp/en/" target="_blank" rel="noreferrer">PLAID, Inc</a>. is a Japan-based company that developed KARTE, a customer experience (CX) platform. It enables businesses to create web campaigns, personalize communications, and improve overall customer experience.</p>
<p>KARTE features a no-code editor called “<strong>Flex Editor</strong>”, which lets the campaign manager customize pop-up campaigns on their website without coding. Pop-up changes are stored in the database and deployed to the campaign manager’s website. The latest pop-up version is loaded when a user visits the website.</p>
<figure style="margin-top: 4rem;">
  <img src="/images/kartes-flex-editor.png" alt="Karte’s Flex Editor" />
  <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
    Karte’s Flex Editor
  </figcaption>
</figure>
<h2 id="the-challenge-slow-server-side-bundling" tabindex="-1">The challenge: Slow server-side bundling <a class="header-anchor" href="#the-challenge-slow-server-side-bundling" aria-label="Permalink to “The challenge: Slow server-side bundling”">&#8203;</a></h2>
<p>The Flex Editor’s biggest issue was performance. The same Rollup-powered compiler bundles the pop-up code in two separate cases:</p>
<ol>
<li>When the campaign manager made changes in the Flex Editor</li>
<li>When the campaign manager deployed changes to their website</li>
</ol>
<p>The PLAID developer experience team made client-side bundling optimizations to the Rollup-powered compiler for a snappy Flex Editor preview experience. However, the same optimizations could not be used for the pop-up’s server-side bundling because of different requirements. For example, Flex Editor client-side bundling had minification disabled because the code was already on the client.</p>
<p>The Rollup-powered compiler could take 5 - 20 seconds to server-side bundle before deploying the pop-up code. In other words, the campaign manager might be <strong>watching a deploying spinner for up to 20 seconds</strong> while their changes deploy! A big difference from <a href="https://web.dev/articles/defining-core-web-vitals-thresholds#inp" target="_blank" rel="noreferrer">Core Web Vitals</a> recommended &lt;200ms interaction delays.</p>
<h2 id="the-solution-rolldown-s-rust-architecture" tabindex="-1">The solution: Rolldown’s Rust architecture <a class="header-anchor" href="#the-solution-rolldown-s-rust-architecture" aria-label="Permalink to “The solution: Rolldown’s Rust architecture”">&#8203;</a></h2>
<p>The PLAID developer experience team first tried caching to improve Rollup’s performance. Rollup’s <code>moduleParsed</code> hook was used to cache the AST each time a module was fully parsed. However, response times remained 5 - 20 seconds even with caching. It turns out campaign managers were frequently clicking save or using the <code>Ctrl+S</code> shortcut, which starts the server-side bundling process and bypasses the cached AST.</p>
<p>Another solution was needed. <strong>Rollup’s single-threaded JavaScript architecture was the performance bottleneck.</strong> The bundler was not designed with parallel bundling in mind. CPU-intensive operations, like minification, further degraded performance.</p>
<p>The PLAID developer experience team started exploring alternatives to Rollup for server-side bundling. Rolldown emerged as a possible solution because it specifically addressed Rollup’s performance challenges. Rolldown’s Rust architecture enables parallel processing and accelerates bundler operations like parsing JavaScript/TypeScript and removing dead code.</p>
<div  class="info custom-block"><p class="custom-block-title"> </p>
<p class="-mt-6!">I verified Rolldown’s bundling behavior in my OSS projects, confirming proper operation and faster bundling than Rollup</p>
<p><cite><a href="https://github.com/kazupon" target="_blank" rel="noreferrer">Kazupon</a> - PLAID</cite></p>
</div>
<p>For most projects, migrating from Rollup to Rolldown is a straightforward, drop-in replacement. Rolldown maintains API compatibility with the major existing Rollup plugins for easy migration. However, KARTE uses the same Rollup-powered compiler for both the client and server. They wanted to keep Rollup for the client-side bundling and continue to use a single source, avoiding code complexity and higher maintenance load.</p>
<p>The team accomplished this with a plugin that replaces <code>import { rollup } from 'rollup'</code> with <code>import { rolldown as rollup } from 'rolldown'</code> based on the environment. The custom switching logic eliminated the need for Rolldown-specific code in the compiler and worked because of Rolldown’s compatibility with Rollup.</p>
<h2 id="the-results-97-faster-build-times" tabindex="-1">The results: 97% faster build times <a class="header-anchor" href="#the-results-97-faster-build-times" aria-label="Permalink to “The results: 97% faster build times”">&#8203;</a></h2>
<p>After switching from Rollup to Rolldown, the build times improved dramatically. Switching from <code>Rollup + Terser</code> to <code>Rolldown + Oxc-minify</code> dropped the average build time from 1150ms to 40ms, or a <strong>97% decrease</strong>, during benchmarking.</p>
<p>However, the size of the bundle increased when using <code>Rolldown + Oxc-minify</code>. The team had to consider trade-offs. Their primary goal was to improve user experience. Even though the bundle would be slightly larger, the improved speed and reduced infrastructure costs drove the decision to adopt Rolldown.</p>
<p>The results were consistent in production. The previous 5 to 20 second waiting time dropped to less than 200ms, which complies with Core Web Vitals recommended 200ms interaction delays.</p>
<h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to “Next steps”">&#8203;</a></h2>
<p>Rolldown is in beta, and the PLAID developer experience team continues to monitor its progress and make updates. Improvements to <code>Rolldown + Oxc-minify</code> have already been made, which reduced bundle sizes.</p>
<p>In addition to using Rolldown in their compiler, the PLAID developer experience team replaced Vite with Rolldown-Vite in the Flex Editor project. Frontend build time got 16x faster!</p>
]]></content:encoded>
            <author>Michael Dong</author>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Announcing Oxlint Type-Aware Linting]]></title>
            <link>https://voidzero.dev/posts/announcing-oxlint-type-aware-linting</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-oxlint-type-aware-linting</guid>
            <pubDate>Fri, 22 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxlint's type-aware linting, see the <a href="https://oxc.rs/blog/2025-08-17-oxlint-type-aware.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxlint with type-aware linting is now available and supports 40 long-awaited rules including <code>no-floating-promises</code>. Oxlint uses <code>tsgolint</code>, which <a href="https://github.com/auvred" target="_blank" rel="noreferrer">@auvred</a> initially prototyped as <code>typescript-eslint/tsgolint</code> and generously offered to continue its development under the Oxc organization.</p>
]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>For more technical details, implementations, and considerations for Oxlint's type-aware linting, see the <a href="https://oxc.rs/blog/2025-08-17-oxlint-type-aware.html" target="_blank" rel="noreferrer">blog post on the Oxc website</a>.</p>
</blockquote>
<p><strong>TL;DR:</strong> Oxlint with type-aware linting is now available and supports 40 long-awaited rules including <code>no-floating-promises</code>. Oxlint uses <code>tsgolint</code>, which <a href="https://github.com/auvred" target="_blank" rel="noreferrer">@auvred</a> initially prototyped as <code>typescript-eslint/tsgolint</code> and generously offered to continue its development under the Oxc organization.</p>
<hr>
<p>The VoidZero team is excited to announce that <code>oxlint</code> has taken a big step towards being a full-fledged Rust-based linting replacement with type-aware linting. This release unlocks 40 long-awaited rules including <code>no-floating-promises</code>.</p>
<h2 id="unlocking-type-aware-linting" tabindex="-1">Unlocking type-aware linting <a class="header-anchor" href="#unlocking-type-aware-linting" aria-label="Permalink to “Unlocking type-aware linting”">&#8203;</a></h2>
<p>Type-aware linting has been one of the biggest feature gaps for native linters like <code>oxlint</code>. Traditional lint rules only review one file at a time, which is fast and parallelizable. However, type-aware lint rules call TypeScript’s types API to infer types, which may require reviewing every file. As a result, type-aware lint rules are more capable than traditional lint rules, but slower.</p>
<p><code>oxlint</code>’s first approach to solving type-aware linting’s slow performance was implementing its own type-checker. <a href="https://gist.github.com/Boshen/d189de0fe0720a30c5182cb666e3e9a5" target="_blank" rel="noreferrer">After</a> <a href="https://github.com/oxc-project/oxc/pull/413" target="_blank" rel="noreferrer">multiple</a> <a href="https://github.com/dudykr/stc" target="_blank" rel="noreferrer">attempts</a>, this approach was abandoned because maintaining a type-checker on par with a fast-moving target like TypeScript is not feasible.</p>
<p>Other approaches, like TypeScript <a href="https://github.com/oxc-project/oxc/discussions/2855" target="_blank" rel="noreferrer">inter-process communication</a>, were also considered and abandoned. The key to unlocking type-aware lint rules turned out to be TypeScripts native Go port and <code>tsgolint</code>.</p>
<h2 id="building-on-tsgolint" tabindex="-1">Building on tsgolint <a class="header-anchor" href="#building-on-tsgolint" aria-label="Permalink to “Building on tsgolint”">&#8203;</a></h2>
<p>The <code>tsgolint</code> project is an experimental type-aware linter written in Go and initially prototyped by <a href="https://github.com/auvred" target="_blank" rel="noreferrer">@auvred</a> as <a href="https://github.com/typescript-eslint/tsgolint" target="_blank" rel="noreferrer">typescript-eslint/tsgolint</a>. However, the <code>typescript-eslint</code> team decided not to allocate development resources to this prototype, as they plan to continue their work on <code>typescript-eslint</code> for typed linting with ESLint.</p>
<p>The VoidZero team contacted <a href="https://github.com/auvred" target="_blank" rel="noreferrer">@auvred</a> for a forked, scoped-down version adapted for <code>oxlint</code>. In a true “standing on the shoulder of giants” moment, <a href="https://github.com/auvred" target="_blank" rel="noreferrer">@auvred</a> generously offered to continue its development under <a href="https://github.com/oxc-project/tsgolint" target="_blank" rel="noreferrer">oxc-project/tsgolint</a>.</p>
<h2 id="performance" tabindex="-1">Performance <a class="header-anchor" href="#performance" aria-label="Permalink to “Performance”">&#8203;</a></h2>
<p>Initial <code>oxlint</code> with type-aware linting tests show repositories that previously took 1 minute to run with <code>typescript-eslint</code> now finish in &lt;10 seconds.</p>
<p>Using projects from <a href="https://github.com/oxc-project/oxlint-ecosystem-ci" target="_blank" rel="noreferrer">oxlint-ecosystem-ci</a>:</p>
<table tabindex="0">
<thead>
<tr>
<th>Project</th>
<th>Files</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<tr>
<td>napi-rs</td>
<td>144</td>
<td>1.0s</td>
</tr>
<tr>
<td>preact</td>
<td>245</td>
<td>2.7s</td>
</tr>
<tr>
<td>rolldown</td>
<td>314</td>
<td>1.5s</td>
</tr>
<tr>
<td>bluesky</td>
<td>1152</td>
<td>7.0s</td>
</tr>
</tbody>
</table>
<h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to “Next steps”">&#8203;</a></h2>
<p>The VoidZero team will continue to develop and improve upon <code>tsgolint</code>. For v1.0 release, we will:</p>
<ul>
<li>Address performance issue for large monorepos</li>
<li>Add the ability to configure individual rules</li>
<li>Further validate correctness of each individual rules</li>
<li>Add IDE support</li>
<li>Ensure overall stability</li>
</ul>
<h2 id="acknowledgements" tabindex="-1">Acknowledgements <a class="header-anchor" href="#acknowledgements" aria-label="Permalink to “Acknowledgements”">&#8203;</a></h2>
<p>The VoidZero team would like to extend our gratitude to:</p>
<ul>
<li>The TypeScript team for creating <code>typescript-go</code>.</li>
<li>The <code>typescript-eslint</code> team for their heartwarming support.</li>
<li><a href="https://github.com/auvred" target="_blank" rel="noreferrer">@auvred</a> for creating <code>tsgolint</code>.</li>
<li><a href="https://github.com/camchenry" target="_blank" rel="noreferrer">@camchenry</a> for the <code>oxlint</code> + <code>tsgolint</code> integration.</li>
<li><a href="https://github.com/camc314" target="_blank" rel="noreferrer">@camc314</a> for work on performance issues.</li>
</ul>
<h2 id="join-the-community" tabindex="-1">Join the community <a class="header-anchor" href="#join-the-community" aria-label="Permalink to “Join the community”">&#8203;</a></h2>
<p>The VoidZero team would love to hear your feedback on <code>oxlint</code> and type-aware linting, and are excited to see how it helps improve your development workflow.</p>
<p>Connect with us:</p>
<ul>
<li><strong>Discord</strong>: Join our <a href="https://discord.gg/9uXCAwqQZW" target="_blank" rel="noreferrer">community server</a> for real-time discussions</li>
<li><strong>GitHub</strong>: Share feedback on <a href="https://github.com/oxc-project/oxc/discussions" target="_blank" rel="noreferrer">GitHub Discussions</a></li>
<li><strong>Issues</strong>: Report <code>oxlint</code> bugs to <a href="https://github.com/oxc-project/oxc/issues" target="_blank" rel="noreferrer">oxc</a> and type-aware linting bugs to <a href="https://github.com/oxc-project/tsgolint/issues" target="_blank" rel="noreferrer">tsgolint</a>.</li>
</ul>
]]></content:encoded>
            <author>Boshen Chen</author>
            <author>Michael Dong</author>
        </item>
        <item>
            <title><![CDATA[What’s New in ViteLand: July 2025 Recap]]></title>
            <link>https://voidzero.dev/posts/whats-new-jul-2025</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/whats-new-jul-2025</guid>
            <pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>Welcome to another edition of <em>What’s new in ViteLand!</em> Every month, we recap the project updates for Vite, Vitest, Oxc, Rolldown and what’s happening in our community.</p>
<figure style="margin-top: 4rem;">
  <img src="/images/vue-china-vite-plus.jpg" alt="Vite+ at Vue China" />
  <figcaption style="margin-top: 0.5rem; text-align: center; font-size: 14px;">
    Evan You talking about the big picture and hinting Vite+ at VueConf China
  </figcaption>
</figure>
<h2 id="what-s-vite" tabindex="-1">What’s Vite+? <a class="header-anchor" href="#what-s-vite" aria-label="Permalink to “What’s Vite+?”">&#8203;</a></h2>
<p>The Vite Ecosystem will gather in Amsterdam on October 9-10 for the <a href="https://viteconf.amsterdam/?utm_source=voidzero&amp;utm_content=updates-july" target="_blank" rel="noreferrer">first-ever in-person ViteConf</a>. We had 3 incredible ViteConf online editions, and we can’t wait to meet in real life.</p>
<p>It’s also where we’ll be dropping all the details about Vite+. Be the first to discover what it is and how it can improve your team’s DX.</p>
<p>There’s a <a href="https://x.com/ViteConf/status/1945466908750332307" target="_blank" rel="noreferrer">packed lineup of speakers</a>, including Eric Simons, CEO of Bolt.new/StackBlitz, and Mathias Biilmann, CEO of Netlify. We’ll be discussing the future of web development through topics like next-generation tooling, agent experience, and more.</p>
<p>Not to mention the world premiere of CultRepo’s Vite Documentary. The never-before-told backstory of Vite. Featuring the Vite Team and authors of Svelte, Solid, Astro, and more. If you want a sneak peek, <a href="https://www.youtube.com/watch?v=46fe5AFc0tY" target="_blank" rel="noreferrer">check out the trailer</a> that just got released.</p>
<p>Stay tuned.</p>
<h2 id="project-updates" tabindex="-1">Project Updates <a class="header-anchor" href="#project-updates" aria-label="Permalink to “Project Updates”">&#8203;</a></h2>
<h3 id="vite" tabindex="-1">Vite <a class="header-anchor" href="#vite" aria-label="Permalink to “Vite”">&#8203;</a></h3>
<ul>
<li><a href="https://vite.dev/blog/announcing-vite7" target="_blank" rel="noreferrer">Vite 7 is out</a> with continued Environment API developments, including the new <code>buildApp</code> hook to let plugins coordinate the building of environments. Vite also bumps up their required Node version, as Node.js 18 has reached EOL. This also means that Vite is now shipped as ESM-only package. So, no excuse not to do the same for your own libraries!</li>
<li>Are you on the <a href="https://chat.vite.dev/" target="_blank" rel="noreferrer">Vite Land Discord</a> already? If not, you should join now and get your <a href="https://x.com/youyuxi/status/1946479491985129736" target="_blank" rel="noreferrer">official Vite Discord server tag</a> and mingle with like-minded devs.</li>
<li>For the first time in history, Vite's weekly downloads surpassed the one's of Webpack. Who would've expected that 5 years ago when Vite started as a side project?</li>
</ul>
<TwitterEmbed url="https://x.com/youyuxi/status/1950234261573038444" /><h3 id="rolldown" tabindex="-1">Rolldown <a class="header-anchor" href="#rolldown" aria-label="Permalink to “Rolldown”">&#8203;</a></h3>
<ul>
<li><a href="https://vite.dev/guide/rolldown.html#why-vite-is-migrating-to-rolldown" target="_blank" rel="noreferrer">Rolldown-Vite supports tsconfig path resolution out of the box</a>. Use the path resolutions defined in your tsconfig by setting <code>resolve.tsconfigPaths</code>. No extra plugin needed anymore!</li>
<li>Using Yarn Plug-and-Play? Then you'll be happy to hear that <a href="https://github.com/rolldown/rolldown/pull/5147" target="_blank" rel="noreferrer">Rolldown supports it out of the box now</a>! No need to use <code>nodeLinker: node-modules</code> anymore.</li>
<li><code>vite-plugin-node-polyfills</code> <a href="https://x.com/youyuxi/status/1942142701354602767" target="_blank" rel="noreferrer">got an update</a> which ensures that it will use Rolldown's built-in features if it runs via <code>rolldown-vite</code>, yielding better performance while not compromising on compatibility.</li>
<li>Rolldown now allows you to <a href="https://github.com/rolldown/rolldown/pull/5188" target="_blank" rel="noreferrer">transform your top level variables to <code>var</code></a>. Sounds like legacy code? Not really. This can lead to better performance if you have a lot of top-level variables that are not used until later in the code. The downside: It doesn't work well with circular references, which is why it is opt-in.</li>
<li>Can't get enough of the speed improvements? Thanks to some <a href="https://github.com/rolldown/rolldown/pull/5319" target="_blank" rel="noreferrer">in-depth JavaScript engine optimization trickery</a>, Rolldown's startup time decreased by 2.1x. This leads to a faster Time to Interactive, better cold-starts for serverless and also benefits your dev server startup speed.</li>
</ul>
<h3 id="oxc" tabindex="-1">Oxc <a class="header-anchor" href="#oxc" aria-label="Permalink to “Oxc”">&#8203;</a></h3>
<ul>
<li>Type-aware linting comes to Oxlint! The result of collaboration between the Oxc team and <a href="https://github.com/auvred" target="_blank" rel="noreferrer">@auvred</a> from the <code>typescript-eslint</code> team. Type-aware rules, such as <code>no-floating-promise</code> can be fully covered and integrated like other Oxlint rules for a great DX. The upcoming first version will include two rules to start with. The following next version will then include all type-aware rules from <code>typescript-eslint</code>. The best news: No slowdown was experienced when it was tested within large repositories such as the VS Code repo.</li>
<li><a href="https://www.linkedin.com/feed/update/urn:li:activity:7352247568610783232/" target="_blank" rel="noreferrer">JS custom rules</a>, with an API that aims to be ESLint compatible. We invested heavily into the underlying implementation to make it fast without the typical data-passing drawback of JS-in-native plugins. The first prototype looks promising, but more testing is needed before we can release it.</li>
<li>Multiple <a href="https://x.com/Cameron_C2/status/1947624775561711789" target="_blank" rel="noreferrer">minor versions of Oxlint</a> were released. These include newly ported rules, additional auto-fixers, dozens of bug fixes and the ground work for custom JS plugins as mentioned above.</li>
</ul>
<h3 id="vitest" tabindex="-1">Vitest <a class="header-anchor" href="#vitest" aria-label="Permalink to “Vitest”">&#8203;</a></h3>
<ul>
<li>Visual Regression Testing is now available in the <a href="https://github.com/vitest-dev/vitest/releases/tag/v4.0.0-beta.4" target="_blank" rel="noreferrer">latest Vitest beta</a>! This means you can now write tests that compare screenshots of your components, ensuring that visual changes are intentional and not accidental without any extra tools! This wouldn't be possible without Vitest's <a href="https://main.vitest.dev/guide/browser/" target="_blank" rel="noreferrer">browser mode</a>.</li>
<li>Talking about <code>@vitest/browser</code>: The experimental feature reached the milestone of 1 million weekly NPM downloads, while simplifying developer setups around the world. Time to make it stable? Soon™</li>
</ul>
<h2 id="from-the-community" tabindex="-1">From the Community <a class="header-anchor" href="#from-the-community" aria-label="Permalink to “From the Community”">&#8203;</a></h2>
<ul>
<li>We’re excited to officially welcome Brooklyn, <a href="https://github.com/Brooooooklyn" target="_blank" rel="noreferrer">the creator of napi-rs</a>, onboard the VoidZero team. Big things to come. Did we mention Vite+?</li>
<li>Speaking of which, <a href="https://napi.rs/blog/announce-v3" target="_blank" rel="noreferrer">NAPI-RS releases v3</a> with a safer API design and new cross-compilation features. A major improvement for the underlying bridge between Rust and JavaScript.</li>
<li><a href="https://x.com/kenneth_skovhus/status/1940100484276035864" target="_blank" rel="noreferrer">Linear has been migrating to rolldown-vite over the last few months</a> with production builds taking only 13 seconds to bundle &gt;10K modules.</li>
<li>The Linear team followed up a few weeks later saying their <a href="https://x.com/kenneth_skovhus/status/1950487356634550640" target="_blank" rel="noreferrer">production build times further decreased to 7 seconds</a> thanks to Oxc supporting styled components.</li>
<li>The Endform team wrote about <a href="https://endform.dev/blog/js-is-being-rewritten-in-rust" target="_blank" rel="noreferrer">JavaScript tools are being rewritten in Rust</a>. Like how Endform uses Oxc for dependency analysis in their CLI.</li>
<li>Jökull Sólberg compares the <a href="https://www.solberg.is/fast-type-aware-linting" target="_blank" rel="noreferrer">differing approaches for type-aware lint rules</a> between Biome and Oxlint.</li>
<li>Node.js started using <a href="https://github.com/nodejs/doc-kit/pull/285" target="_blank" rel="noreferrer">Rolldown to generate API docs</a>. In their own words, “I mean, it’s blazingly fast, we just couldn’t not use it 😃”.</li>
<li><a href="https://github.com/outline/outline/pull/9523" target="_blank" rel="noreferrer">Outline switched from vite to rolldown-vite</a> and build times got 22.3x faster. One of the <a href="https://github.com/vitejs/rolldown-vite-perf-wins" target="_blank" rel="noreferrer">largest build performance improvements</a> we’ve seen so far.</li>
<li>Posthog migrated from ESLint to Oxlint and the <a href="https://github.com/PostHog/posthog/pull/33714" target="_blank" rel="noreferrer">PR title says it all</a>. While the linting is now 33x faster linting, type-aware linting was not available back then in Oxlint. Without the overhead, the gains are still 5-7x.</li>
<li><a href="https://x.com/OskarLebuda/status/1942988001262346391" target="_blank" rel="noreferrer">Vercube switched from ESLint to Oxlint</a> for 10x linting speed boost, but this is without type-aware linting as well. Luckily, it comes to Oxlint soon.</li>
<li>Run-async replaces <a href="https://github.com/SBoudrias/run-async/commit/f9a3f02777215bf6e913728e0ce57de31a18f997" target="_blank" rel="noreferrer">JSHint with Oxlint</a> after 11 years. Just skipping over ESLint entirely is something you don’t see every day.</li>
<li>The Angular team is <a href="https://github.com/angular/angular-cli/pull/30765" target="_blank" rel="noreferrer">switching to Rolldown</a> for their experimental chunk optimization feature, which allows better control of the emitted JavaScript files than their <code>esbuild</code>-based setup. Maybe it is just a matter of time that this will be replaced by Rolldown too?</li>
<li><a href="https://x.com/posva/status/1946248625132020087" target="_blank" rel="noreferrer">Vue Router will use tsdown</a> as build tool for its next version. This unlocks fast builds and shorter CI times!</li>
<li><a href="https://github.com/AmanVarshney01/create-better-t-stack/pull/427" target="_blank" rel="noreferrer">Better T Stack adds Oxlint</a> as an option! Now you can choose fast linting when scaffolding your next project with it.</li>
</ul>
<TwitterEmbed url="https://x.com/ahmedelgabri/status/1935637454981054865" />]]></content:encoded>
            <author>Michael Dong</author>
            <author>Alexander Lichter</author>
        </item>
        <item>
            <title><![CDATA[Announcing Oxlint 1.0]]></title>
            <link>https://voidzero.dev/posts/announcing-oxlint-1-stable</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-oxlint-1-stable</guid>
            <pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>TL;DR: The first stable version Oxlint has been released! With a <a href="#benchmark">50~100x</a> performance improvement over ESLint, support for over 500 ESLint rules, and <a href="#real-world-impact">usage in major companies</a> like Shopify, Airbnb, and Mercedes-Benz, you should give it a try. <a href="#quick-start">Get started now</a>.</p>
]]></description>
            <content:encoded><![CDATA[<p>TL;DR: The first stable version Oxlint has been released! With a <a href="#benchmark">50~100x</a> performance improvement over ESLint, support for over 500 ESLint rules, and <a href="#real-world-impact">usage in major companies</a> like Shopify, Airbnb, and Mercedes-Benz, you should give it a try. <a href="#quick-start">Get started now</a>.</p>
<hr>
<p>Oxlint is a Rust-powered linter for JavaScript and TypeScript is designed to be fast and simple to adopt. Since its first announcement back in December 2023, Oxlint has undergone significant improvements and is now shipping its first stable version, 1.0.
In addition to the stable release, we also want to announce that Oxlint has a dedicated full-time maintainer, <a href="https://github.com/camc314" target="_blank" rel="noreferrer">Cameron</a>, and a growing core team working on maintaining and improving the linter.</p>
<h2 id="real-world-impact" tabindex="-1">Real-World Impact <a class="header-anchor" href="#real-world-impact" aria-label="Permalink to “Real-World Impact”">&#8203;</a></h2>
<p>We are extremely proud of the performance of Oxlint and its impact on real, large-scale codebases, which has led to reduced CI costs.</p>
<p>We are thankful for our <a href="https://github.com/oxc-project/oxc/network/dependents" target="_blank" rel="noreferrer">5,200 early adopters</a> and for companies and projects such as:</p>
<ul>
<li><strong>Shopify</strong>, where the front-end platform team uses Oxlint in the Shopify admin console.</li>
<li><strong>Airbnb</strong>, where they use multi-file analysis <a href="https://oxc.rs/docs/guide/usage/linter/rules/oxc/no-barrel-file.html" target="_blank" rel="noreferrer">oxc/no-barrel-file</a> and <a href="https://oxc.rs/docs/guide/usage/linter/rules/import/no-cycle.html" target="_blank" rel="noreferrer">import/no-cycle</a> on their 126,000+ files, which completes in 7s on CI. ESLint's implementation of these rules times out.</li>
<li><a href="https://www.mercedes-benz.io/blog/2025-05-16-how-can-modern-tooling-save-mercedes-benz-io-engineering-time" target="_blank" rel="noreferrer"><strong>Mercedes-Benz</strong></a>, where they observed a 71% decrease in lint time when swapping ESLint to Oxlint, with some project seeing up to a 97% speedup.</li>
<li>Large Open Source projects, from runtimes like <a href="https://github.com/oven-sh/bun/blob/main/oxlint.json" target="_blank" rel="noreferrer">Bun</a> to frameworks like <a href="https://github.com/preactjs/preact/blob/main/oxlint.json" target="_blank" rel="noreferrer">Preact</a>.</li>
</ul>
<p>On the largest repository we found, Oxlint reported:</p>
<div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>Finished in 22.5s on 264925 files with 101 rules using 10 threads.</span></span></code></pre>
</div><p>Based on real-world cases posted on <a href="https://x.com/boshen_c/status/1928264877115597053" target="_blank" rel="noreferrer">X</a> and <a href="https://bsky.app/profile/boshen.github.io/post/3lqe47xi47c2e" target="_blank" rel="noreferrer">Bluesky</a>,
Oxlint runs at approximately 10,000 files per second, depending on the total number of threads used.</p>
<h2 id="quick-start" tabindex="-1">Quick Start <a class="header-anchor" href="#quick-start" aria-label="Permalink to “Quick Start”">&#8203;</a></h2>
<p>Oxlint is perfect for developers who want to start linting their code without spending hours configuring tools. With zero setup required, you can start catching issues immediately:</p>
<p><strong>Run it, no config required.</strong></p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-54" id="tab-55" checked><label data-title="npm" for="tab-55">npm</label><input type="radio" name="group-54" id="tab-56" ><label data-title="pnpm" for="tab-56">pnpm</label><input type="radio" name="group-54" id="tab-57" ><label data-title="yarn" for="tab-57">yarn</label><input type="radio" name="group-54" id="tab-58" ><label data-title="bun" for="tab-58">bun</label><input type="radio" name="group-54" id="tab-59" ><label data-title="deno" for="tab-59">deno</label></div><div class="blocks">
<div class="language-sh active"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> oxlint@latest</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">pnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dlx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> oxlint@latest</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">yarn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dlx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> oxlint@latest</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">bunx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> oxlint@latest</span></span></code></pre>
</div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;user-select:none;-webkit-user-select:none">$ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">deno</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> npm:oxlint@latest</span></span></code></pre>
</div></div></div>
<p>While no setup or configuration is needed, Oxlint is configurable via an <code>.oxlintrc.json</code> file, which is useful for larger projects or projects that require more customization.
This configuration format is based on ESLint v8’s flat config, making migration easy and familiar.
Each source file is linted with the nearest applicable configuration, and you can use overrides to target specific glob patterns.
You can also extend shared configs to keep teams consistent.</p>
<p>For projects already using ESLint, <a href="https://github.com/oxc-project/oxlint-migrate" target="_blank" rel="noreferrer">oxlint-migrate</a> can be used to migrate an existing ESLint flat-config file to Oxlint.
Additionally, <a href="https://github.com/oxc-project/eslint-plugin-oxlint" target="_blank" rel="noreferrer">eslint-plugin-oxlint</a> can disable overlapping ESLint rules while both linters are used together.
It is recommended to run <code>oxlint &amp;&amp; eslint</code> to benefit from Oxlint's faster feedback cycle.</p>
<p>For more detailed instructions on how to use Oxlint and integrate it with your project or editor, check out the <a href="https://oxc.rs/docs/guide/usage/linter" target="_blank" rel="noreferrer">installation guide</a>.</p>
<h2 id="versioning" tabindex="-1">Versioning <a class="header-anchor" href="#versioning" aria-label="Permalink to “Versioning”">&#8203;</a></h2>
<p>Unlike libraries that ship runtime code, a linter only changes the diagnostics it returns. Oxlint adheres to semantic versioning:</p>
<ul>
<li>Patch releases: Bug fixes only.</li>
<li>Minor releases: Expand rule coverage and diagnostics, without requiring configuration changes.</li>
<li>Major releases: CLI or configuration changes, that may require migration.
Note that minor releases can still break your CI if newly added rules uncover previously hidden issues. Learn more in our <a href="https://oxc.rs/docs/guide/usage/linter/versioning" target="_blank" rel="noreferrer">Versioning guide</a>.</li>
</ul>
<h2 id="highlights" tabindex="-1">Highlights <a class="header-anchor" href="#highlights" aria-label="Permalink to “Highlights”">&#8203;</a></h2>
<h3 id="comprehensive-rule-coverage" tabindex="-1">Comprehensive Rule Coverage <a class="header-anchor" href="#comprehensive-rule-coverage" aria-label="Permalink to “Comprehensive Rule Coverage”">&#8203;</a></h3>
<p>Oxlint includes over 500 rules from various sources:</p>
<ul>
<li>Complete ESLint rule set, including TypeScript-specific rules from <code>typescript-eslint</code> (excluding type checked rules).</li>
<li>Popular plugin rules from <code>eslint-plugin-unicorn</code>, <code>eslint-plugin-jsdoc</code>, <code>eslint-plugin-react</code>, <code>eslint-plugin-react-hooks</code>, <code>eslint-plugin-jest</code>, and <code>eslint-plugin-import</code></li>
<li>Unique Oxlint rules like <a href="https://oxc.rs/docs/guide/usage/linter/rules/oxc/bad-comparison-sequence" target="_blank" rel="noreferrer">bad comparison sequence</a>, <a href="https://oxc.rs/docs/guide/usage/linter/rules/oxc/const-comparisons" target="_blank" rel="noreferrer">const comparisons</a>, and <a href="https://oxc.rs/docs/guide/usage/linter/rules/oxc/only-used-in-recursion" target="_blank" rel="noreferrer">only used in recursion</a></li>
</ul>
<h3 id="flexible-configuration" tabindex="-1">Flexible Configuration <a class="header-anchor" href="#flexible-configuration" aria-label="Permalink to “Flexible Configuration”">&#8203;</a></h3>
<p>Configure Oxlint through <code>.oxlintrc.json</code> files with support for:</p>
<ul>
<li>Nested configurations that apply to specific directories</li>
<li>Override patterns for targeting specific file types or locations</li>
<li>Shared configuration extending for team consistency</li>
</ul>
<h3 id="editor-integration" tabindex="-1">Editor Integration <a class="header-anchor" href="#editor-integration" aria-label="Permalink to “Editor Integration”">&#8203;</a></h3>
<p>First-class editor support with extensions for:</p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=oxc.oxc-vscode" target="_blank" rel="noreferrer">VS Code</a></li>
<li><a href="https://plugins.jetbrains.com/plugin/27061-oxc" target="_blank" rel="noreferrer">IntelliJ IDEA and WebStorm</a></li>
<li><a href="https://zed.dev/extensions?query=oxc" target="_blank" rel="noreferrer">Zed Editor</a></li>
<li>Language server protocol support for other editors</li>
</ul>
<h3 id="helpful-diagnostics" tabindex="-1">Helpful Diagnostics <a class="header-anchor" href="#helpful-diagnostics" aria-label="Permalink to “Helpful Diagnostics”">&#8203;</a></h3>
<p>Oxlint is built to deliver clear, actionable error messages - not just describing the issue, but visualizing it and suggesting how to fix it.</p>
<p><img src="https://github.com/oxc-project/oxc/assets/1430279/094a3b24-0433-42ae-aad2-48a7dec2b985" alt="CLI Demo">
<em>Oxlint running in the terminal with detailed error reporting</em></p>
<h2 id="benchmark" tabindex="-1">Benchmark <a class="header-anchor" href="#benchmark" aria-label="Permalink to “Benchmark”">&#8203;</a></h2>
<p>Our <a href="https://github.com/oxc-project/bench-javascript-linter" target="_blank" rel="noreferrer">benchmark</a> reveals that Oxlint is around 50~100 times faster than ESLint with the same setup.</p>
<table tabindex="0">
<thead>
<tr>
<th>Tool</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<tr>
<td>oxlint (multi thread)</td>
<td>615.3 ms</td>
</tr>
<tr>
<td>oxlint (single thread)</td>
<td>1.840 s</td>
</tr>
<tr>
<td>eslint</td>
<td>33.481 s</td>
</tr>
</tbody>
</table>
<h2 id="roadmap" tabindex="-1">Roadmap <a class="header-anchor" href="#roadmap" aria-label="Permalink to “Roadmap”">&#8203;</a></h2>
<p>Oxlint 1.0 is just the beginning! While it is stable, we still have important features and improvements planned for future releases:</p>
<p><strong>Custom Rules</strong> – JavaScript plugin support is coming soon, enabling teams to write custom rules that integrate seamlessly with Oxlint's architecture.</p>
<p><strong>Performance Optimizations</strong> – Continued improvements to parsing and analysis speed.</p>
<p><strong>Fine-grained (per-glob) configuration</strong> - ESLint v9 configuration</p>
<h2 id="acknowledgements" tabindex="-1">Acknowledgements <a class="header-anchor" href="#acknowledgements" aria-label="Permalink to “Acknowledgements”">&#8203;</a></h2>
<p>Oxlint 1.0 represents the collective effort of <a href="https://github.com/oxc-project/oxc/graphs/contributors" target="_blank" rel="noreferrer">over 200 contributors</a> who have shaped this project. We're grateful for every bug report, feature request, and code contribution.</p>
<p>Special recognition goes to:</p>
<ul>
<li><a href="https://github.com/branchseer" target="_blank" rel="noreferrer">@branchseer</a> for implementing the multi-file analysis runtime.</li>
<li><a href="https://github.com/camc314" target="_blank" rel="noreferrer">@camc314</a>, <a href="https://github.com/mysteryven" target="_blank" rel="noreferrer">@mysteryven</a>, and <a href="https://github.com/shulaoda" target="_blank" rel="noreferrer">@shulaoda</a> for implementing many sophisticated lint rules, testing, and constantly improving everything.</li>
<li><a href="https://github.com/camchenry" target="_blank" rel="noreferrer">@camchenry</a> for implementing nested configuration support.</li>
<li><a href="https://github.com/DonIsaac" target="_blank" rel="noreferrer">@DonIsaac</a> for improving configuration, documentation and website, and for representing Oxc at <a href="https://2024.squiggleconf.com" target="_blank" rel="noreferrer">SquiggleConf 2024</a>.</li>
<li><a href="https://github.com/leaysgur" target="_blank" rel="noreferrer">@leaysgur</a> for the RegExp parser and JSDoc plugin.</li>
<li><a href="https://github.com/Sysix" target="_blank" rel="noreferrer">@Sysix</a> for maintaining <code>eslint-plugin-oxlint</code> and significant contributions to the language server and VSCode extension.</li>
<li><a href="https://github.com/u9g" target="_blank" rel="noreferrer">@u9g</a> and <a href="https://github.com/rzvxa" target="_blank" rel="noreferrer">@rzvxa</a> for implementing control flow graph analysis.</li>
</ul>
<h2 id="join-the-community" tabindex="-1">Join the Community <a class="header-anchor" href="#join-the-community" aria-label="Permalink to “Join the Community”">&#8203;</a></h2>
<p>We'd love to hear your feedback on Oxlint and are excited to see how it helps improve your development workflow. Connect with us:</p>
<ul>
<li><strong>Discord</strong>: Join our <a href="https://discord.gg/9uXCAwqQZW" target="_blank" rel="noreferrer">community server</a> for real-time discussions</li>
<li><strong>GitHub</strong>: Share feedback on <a href="https://github.com/oxc-project/oxc/discussions" target="_blank" rel="noreferrer">GitHub Discussions</a></li>
<li><strong>Issues</strong>: Report bugs or request features on our <a href="https://github.com/oxc-project/oxc/issues" target="_blank" rel="noreferrer">issue tracker</a></li>
</ul>
<p>Your feedback drives Oxlint's evolution.</p>
<h2 id="give-it-a-try" tabindex="-1">Give It a Try <a class="header-anchor" href="#give-it-a-try" aria-label="Permalink to “Give It a Try”">&#8203;</a></h2>
<p>To get started, follow the <a href="https://oxc.rs/docs/guide/usage/linter" target="_blank" rel="noreferrer">installation guide</a>, or learn more about the <a href="https://oxc.rs/docs/guide/introduction" target="_blank" rel="noreferrer">Oxc project</a>.</p>
]]></content:encoded>
            <author>Boshen Chen</author>
            <author>Cameron Clark</author>
        </item>
        <item>
            <title><![CDATA[Announcing Rolldown-Vite]]></title>
            <link>https://voidzero.dev/posts/announcing-rolldown-vite</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-rolldown-vite</guid>
            <pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>TL;DR: Try out the Rolldown-powered Vite today by using the <code>rolldown-vite</code> package instead of the default <code>vite</code> package. It is a drop-in replacement, as Rolldown will become the default bundler for Vite in the future. Switching should reduce your build time, especially for larger projects. <a href="https://forms.gle/WQgjyzYJpwurpxWKA" target="_blank" rel="noreferrer">Reach out</a> to discover production use cases!</p>
]]></description>
            <content:encoded><![CDATA[<p>TL;DR: Try out the Rolldown-powered Vite today by using the <code>rolldown-vite</code> package instead of the default <code>vite</code> package. It is a drop-in replacement, as Rolldown will become the default bundler for Vite in the future. Switching should reduce your build time, especially for larger projects. <a href="https://forms.gle/WQgjyzYJpwurpxWKA" target="_blank" rel="noreferrer">Reach out</a> to discover production use cases!</p>
<hr>
<p>Over the last year, we've been working on <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>, a Rust-based next-generation bundler, as part of a broader effort to modernize Vite's core. Alongside Rolldown, we've developed <a href="https://oxc.rs/" target="_blank" rel="noreferrer">Oxc</a>, a collection of high-performance JavaScript tools, that includes a parser, transformer, resolver, and minifier, as well as a linter and soon also a formatter. It acts as foundational layer for Rolldown, providing the necessary building blocks for efficient JavaScript and TypeScript processing.</p>
<p>Today, we're excited to announce that the Rolldown-powered Vite version has reached initial feature parity with today's Vite. This means you can try it as a drop-in replacement and experience the benefits right away as part of a technical preview.</p>
<p>Thanks to early adopters, we were able to test <code>rolldown-vite</code> with a range of projects, from basic setups to large-scale enterprise apps. The results have been impressive, with production build time reductions from 3x to 16x, and memory usage during the build process cut by up to 100x. Take a look at the <a href="#real-world-impact">real-world impact section</a> for more details.</p>
<p>We encourage you to try out <code>rolldown-vite</code> and share your feedback to contribute to the future development of Vite's bundling infrastructure.</p>
<h2 id="using-rolldown-vite" tabindex="-1">Using <code>rolldown-vite</code> <a class="header-anchor" href="#using-rolldown-vite" aria-label="Permalink to “Using rolldown-vite”">&#8203;</a></h2>
<p>Getting started with <code>rolldown-vite</code> is straightforward. If you have an existing Vite project, you can replace the <code>vite</code> package with <code>rolldown-vite</code> by using an alias in your <code>package.json</code>:</p>
<div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "dependencies"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npm:rolldown-vite@latest"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p>If you use VitePress, or a meta-framework that lists Vite as a peer dependency, you can use overrides to replace the <code>vite</code> package with <code>rolldown-vite</code> in your project:</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-26" id="tab-27" checked><label data-title="npm" for="tab-27">npm</label><input type="radio" name="group-26" id="tab-28" ><label data-title="pnpm" for="tab-28">pnpm</label><input type="radio" name="group-26" id="tab-29" ><label data-title="yarn" for="tab-29">yarn</label><input type="radio" name="group-26" id="tab-30" ><label data-title="bun" for="tab-30">bun</label></div><div class="blocks">
<div class="language-json active"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "overrides"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npm:rolldown-vite@latest"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "pnpm"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "overrides"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npm:rolldown-vite@latest"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "resolutions"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npm:rolldown-vite@latest"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "overrides"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "vite"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"npm:rolldown-vite@latest"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div></div></div>
<p>That's it! Now you can continue using Vite as you normally would, but with the added performance benefits of Rolldown. It's likely that you will see some warning messages about not-yet-supported options or deprecated APIs - we will continue to smooth those out across the ecosystem.</p>
<p><code>rolldown-vite</code> is currently distributed as a separate package to allow for rapid iteration and to keep feedback and issues separate from the main <code>vite</code> package. This separation helps ensure stability for existing users while the Rolldown integration matures. Once <code>rolldown-vite</code> is stable, its changes will be merged into Vite and the separate package will be deprecated.</p>
<p>It also follows Vite's major and minor version numbers to maintain compatibility, but its patch versions are independent and may introduce breaking changes as development continues. For the latest updates and details, refer to the <a href="https://github.com/vitejs/rolldown-vite/blob/rolldown-vite/packages/vite/CHANGELOG.md" target="_blank" rel="noreferrer"><code>rolldown-vite</code> changelog</a>.</p>
<hr>
<h2 id="ensuring-compatibility" tabindex="-1">Ensuring Compatibility <a class="header-anchor" href="#ensuring-compatibility" aria-label="Permalink to “Ensuring Compatibility”">&#8203;</a></h2>
<p>Compatibility is a top priority for <code>rolldown-vite</code>. To ensure a smooth experience, we created a forked version of <a href="https://github.com/vitejs/vite-ecosystem-ci/blob/rolldown-vite/README-temp.md" target="_blank" rel="noreferrer">Vite ecosystem CI</a> and ran it against <code>rolldown-vite</code>. We have got the tests passing for most frameworks and plugins, but do note some frameworks or advanced use cases may still have compatibility gaps. We also recommend checking the <a href="https://main.vite.dev/guide/rolldown#compatibility" target="_blank" rel="noreferrer">Rolldown migration guide</a> for the latest compatibility notes, known issues, and migration tips. If you run into problems, please report them so we can improve support across the ecosystem.</p>
<h3 id="esbuild-as-optional-dependency" tabindex="-1"><code>esbuild</code> as optional dependency <a class="header-anchor" href="#esbuild-as-optional-dependency" aria-label="Permalink to “esbuild as optional dependency”">&#8203;</a></h3>
<p>In the current stable version of Vite, <code>esbuild</code> is a core dependency used for tasks like transforming and minifying production builds, as well as powering parts of the development server. Many Vite plugins also rely on <code>esbuild</code> through utility functions provided by Vite, such as file transformations.</p>
<p>With <code>rolldown-vite</code>, <code>esbuild</code> is no longer required. Instead, all internal transformations and minification are handled by Oxc, leading to improved performance using a single foundational layer. This means you don't need to install <code>esbuild</code> as a dependency unless you're using a Vite plugin that explicitly requires it and doesn't yet support Oxc transforms.</p>
<p>We are actively collaborating with plugin and framework authors to ensure that Vite plugins automatically leverage Oxc transforms when using <code>rolldown-vite</code>, resulting in faster builds.</p>
<h3 id="plugin-authors" tabindex="-1">Plugin Authors <a class="header-anchor" href="#plugin-authors" aria-label="Permalink to “Plugin Authors”">&#8203;</a></h3>
<p>If you are a plugin author, no matter if it is a Vite or Rollup plugin, you can start testing your plugins with <code>rolldown-vite</code> right away. A lot of plugins should work out of the box, but some might need tweaking, either for compatibility or performance reasons. Consult our <a href="https://vite.dev/guide/rolldown#plugin-framework-authors-guide" target="_blank" rel="noreferrer">plugin author guide</a> for more details.</p>
<hr>
<h2 id="real-world-impact" tabindex="-1">Real-World Impact <a class="header-anchor" href="#real-world-impact" aria-label="Permalink to “Real-World Impact”">&#8203;</a></h2>
<p><code>rolldown-vite</code> is still in development, but early adopters, ranging from side projects to large-scale enterprise apps, are already seeing remarkable results.</p>
<p>Some highlights:</p>
<ul>
<li><em>GitLab</em> reduced build time from 2.5 minutes to just 40 seconds and cut their memory usage by 100x.</li>
<li><em>Excalidraw</em>'s build dropped from 22.9 seconds to 1.4 seconds (<strong>16x faster</strong>).</li>
<li><em>PLAID Inc.</em> saw one frontend's build time fall from 1 minute 20 seconds to 5 seconds (<strong>16x faster</strong>).</li>
<li><em>Appwrite</em> builds went from over 12 minutes to just 3 minutes, with memory usage being slashed by 4x.</li>
<li><em>Particl</em> achieved a nearly <strong>10x speedup</strong> compared to Vite (and almost <strong>29x compared to Next.js</strong>), with builds dropping from over a minute to just 6 seconds.</li>
</ul>
<p>These results show not only much faster builds, but in some cases, orders of magnitude less memory usage. For more details or to share your own results, visit the <a href="https://github.com/vitejs/rolldown-vite-perf-wins" target="_blank" rel="noreferrer"><code>vitejs/rolldown-vite-perf-wins</code></a> repository.</p>
<p>Oh and fun fact - this blog post you are reading right now is built with VitePress running on top of Rolldown-Vite, and the production build takes only 1.8s on Netlify.</p>
<hr>
<h2 id="what-comes-next" tabindex="-1">What Comes Next? <a class="header-anchor" href="#what-comes-next" aria-label="Permalink to “What Comes Next?”">&#8203;</a></h2>
<p>Vite is generally known for its unbundled native ESM dev server, which is responsible for the fast startup time and almost instant feedback. Nevertheless, we’ve seen limitations of this approach for projects at unconventional scale, especially in Enterprise setups.
To address these, we are working on a <strong>full-bundle mode</strong> for the dev server. With Rolldown’s performance, this mode aims to improve dev server startup times, especially for large projects, while maintaining or even enhancing startup speed for small and medium projects.</p>
<p>Alongside this, we plan to &quot;rustify&quot; more of Vite’s internals to reduce communication overhead and unlock even greater performance gains.</p>
<h3 id="roadmap-for-rolldown-in-vite" tabindex="-1">Roadmap for Rolldown in Vite <a class="header-anchor" href="#roadmap-for-rolldown-in-vite" aria-label="Permalink to “Roadmap for Rolldown in Vite”">&#8203;</a></h3>
<p>We've planned three phases for the transition to Rolldown, each designed to ensure a smooth migration while gathering valuable feedback from the community:</p>
<ol>
<li><strong>Phase One (Current)</strong>: <code>rolldown-vite</code> is available as a separate package for early adopters. This allows us to gather feedback and make improvements based on real-world usage.</li>
<li><strong>Phase Two</strong>: All changes from <code>rolldown-vite</code> will be merged into the main Vite codebase when considered stable. They will also come with an opt-in full-bundle mode for development. <code>rolldown-vite</code> will be deprecated at this point.</li>
<li><strong>Phase Three</strong>: The full-bundle mode will become the default for Vite.</li>
</ol>
<p>At the current time of writing, we expect each phase to last several months. Keep in mind that the exact duration will be determined by various factors, most importantly feedback from the community and real world usage, as well as stability and compatibility.</p>
<hr>
<h2 id="give-it-a-try" tabindex="-1">Give It a Try <a class="header-anchor" href="#give-it-a-try" aria-label="Permalink to “Give It a Try”">&#8203;</a></h2>
<p>We encourage you to try <code>rolldown-vite</code> in your projects today! Your feedback will help shape the future of Vite's bundling infrastructure.
In case you encounter any issues, such as missing or broken features, unclear error messages or performance degradations, please make sure to report these in the <a href="https://github.com/vitejs/rolldown-vite" target="_blank" rel="noreferrer"><code>rolldown-vite</code> repository</a> (not the main Vite repo). If you want to pose questions or discuss in real time, make sure to join the <a href="https://chat.rolldown.rs/" target="_blank" rel="noreferrer">Rolldown Discord</a>.</p>
]]></content:encoded>
            <author>Evan You</author>
        </item>
        <item>
            <title><![CDATA[VoidZero and NuxtLabs join forces on Vite Devtools]]></title>
            <link>https://voidzero.dev/posts/voidzero-nuxtlabs-vite-devtools</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/voidzero-nuxtlabs-vite-devtools</guid>
            <pubDate>Thu, 03 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>TL;DR: Through our partnership with NuxtLabs, Anthony Fu will work on creating Vite DevTools, a tool that will offer deeper and more insightful debugging and analysis for all projects and frameworks built on top of Vite.</p>
]]></description>
            <content:encoded><![CDATA[<p>TL;DR: Through our partnership with NuxtLabs, Anthony Fu will work on creating Vite DevTools, a tool that will offer deeper and more insightful debugging and analysis for all projects and frameworks built on top of Vite.</p>
<hr>
<p>At VoidZero, we place a strong emphasis on developer experience. While Vite and Rolldown already deliver outstanding performance and modern features, we believe that transparency in the bundling process is just as essential. By making this process easy to inspect and understand, we aim to empower developers with the knowledge and tools they need to optimize their applications and enhance the overall end-user experience.</p>
<p>To achieve that, VoidZero is partnering with <a href="https://nuxtlabs.com/" target="_blank" rel="noreferrer">NuxtLabs</a> to build Vite DevTools - a powerful debugging and analysis toolkit aimed at improving both developer workflows and application performance. Designed for universal compatibility across all frameworks built on Vite, Vite DevTools will deliver deeper visibility into the build process, helping developers produce leaner, more efficient frontend bundles that result in faster, more seamless experiences for end users.</p>
<p>As part of this collaboration, <a href="https://github.com/antfu" target="_blank" rel="noreferrer">Anthony Fu</a> — who previously created <a href="https://github.com/nuxt/devtools" target="_blank" rel="noreferrer">Nuxt DevTools</a> and <a href="https://www.npmx.dev/package/vite-plugin-inspect" target="_blank" rel="noreferrer"><code>vite-plugin-inspect</code></a> - will be working part-time on Vite DevTools. <code>vite-plugin-inspect</code> is a powerful tool that allows developers to inspect the internal workings of Vite, providing insights into how their applications are being built and optimized. Anthony's extensive experience in the Vite ecosystem, including his work on multiple devtools, will be instrumental in advancing this project.</p>
<p>Vite DevTools aims to deliver a rich set of features that provide actionable insights. Initial capabilities under consideration include:</p>
<ul>
<li>Plugin pipeline inspection (adapted from <a href="https://github.com/antfu-collective/vite-plugin-inspect" target="_blank" rel="noreferrer"><code>vite-plugin-inspect</code></a>)</li>
<li>Bundle analysis, leveraging Rolldown's metadata
<ul>
<li>Tree-shaking visualization</li>
<li>Barrel files detection</li>
<li>CJS/ESM adoption visualization</li>
</ul>
</li>
<li>Visualization of Vite environment configurations</li>
<li>Actionable suggestions to improve bundle size and front-end performance</li>
<li>Time-based bundle reporting</li>
<li>Availability during both development and build phases via a command-line flag or interface</li>
</ul>
<p>We invite the community to follow the progress and contribute ideas via <a href="https://github.com/vitejs/vite/discussions/19773" target="_blank" rel="noreferrer">this discussion</a>.</p>
<p>We’re thrilled to collaborate with NuxtLabs and Anthony to push the boundaries of what modern tooling can offer, and we look forward to making Vite DevTools an indispensable part of every developer's workflow.</p>
]]></content:encoded>
            <author>Evan You</author>
        </item>
        <item>
            <title><![CDATA[VoidZero joins the Open Source Pledge]]></title>
            <link>https://voidzero.dev/posts/oss-pledge</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/oss-pledge</guid>
            <pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[<p>TL;DR: VoidZero has joined the <a href="https://opensourcepledge.com/" target="_blank" rel="noreferrer">Open Source Pledge</a> and is donating $3,000 per developer at VoidZero per year to external open source projects.</p>
]]></description>
            <content:encoded><![CDATA[<p>TL;DR: VoidZero has joined the <a href="https://opensourcepledge.com/" target="_blank" rel="noreferrer">Open Source Pledge</a> and is donating $3,000 per developer at VoidZero per year to external open source projects.</p>
<hr>
<p>Open source is at the heart of VoidZero. The company is founded on the open source projects we created and maintain, and our team members all have been prolific open source contributors and maintainers.</p>
<p>Outside of VoidZero, I have also maintained independent projects that are sustainable largely thanks to donations. From that experience a few things became clear to me:</p>
<ul>
<li>For most OSS projects, donations capture a disproportionally small fraction of the value they create.</li>
<li>Donations from individual users do not scale.</li>
<li>There are cultural and bureaucratic barriers that are preventing more companies from donating to OSS.</li>
</ul>
<p>This is why I am excited to see companies like <a href="https://blog.sentry.io/we-just-gave-500-000-dollars-to-open-source-maintainers/" target="_blank" rel="noreferrer">Sentry</a> and the <a href="https://opensourcepledge.com/members/" target="_blank" rel="noreferrer">others</a> who have already joined the pledge actively working to change the norm.</p>
<p>Today, we are happy to announce that VoidZero is joining this effort too.</p>
<h2 id="who-are-we-sponsoring" tabindex="-1">Who Are We Sponsoring? <a class="header-anchor" href="#who-are-we-sponsoring" aria-label="Permalink to “Who Are We Sponsoring?”">&#8203;</a></h2>
<p>VoidZero is already sponsoring many contributors to our projects, e.g. Vite and Oxc. For the OSS pledge, however, donations are only eligible when made to projects that are not controlled by VoidZero. We are starting with the dependencies that our projects directly rely on, and individual developers that we believe are producing meaningful impact for the entire JavaScript ecosystem. As we scale as a company in the future, we will increase our donations accordingly to cover a wider range of projects and foundations.</p>
<p>We are donating a total of $31,488 per year, which is $3,148 per developer given our current team size. Here is a detailed breakdown of who we are funding:</p>
<table tabindex="0">
<thead>
<tr>
<th>Project(s)</th>
<th>Developer</th>
<th>Monthly Recurring Amount</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://napi.rs/" target="_blank" rel="noreferrer">NAPI-RS</a></td>
<td><a href="https://github.com/brooooooklyn" target="_blank" rel="noreferrer">LongYinan (@Brooooooklyn)</a></td>
<td>$1000</td>
</tr>
<tr>
<td><a href="https://antfu.me/projects" target="_blank" rel="noreferrer">Multiple</a></td>
<td><a href="https://github.com/antfu" target="_blank" rel="noreferrer">Anthony Fu (@antfu)</a>*</td>
<td>$512</td>
</tr>
<tr>
<td><a href="https://unjs.io/" target="_blank" rel="noreferrer">UnJS</a></td>
<td><a href="https://github.com/pi0" target="_blank" rel="noreferrer">Pooya Parsa (pi0)</a></td>
<td>$256</td>
</tr>
<tr>
<td><a href="https://lightningcss.dev/" target="_blank" rel="noreferrer">Lightning CSS</a></td>
<td><a href="https://github.com/devongovett" target="_blank" rel="noreferrer">Devon Govett (@devongovett)</a></td>
<td>$256</td>
</tr>
<tr>
<td><a href="https://rollupjs.org/" target="_blank" rel="noreferrer">Rollup</a></td>
<td><a href="https://opencollective.com/rollup" target="_blank" rel="noreferrer">**</a></td>
<td>$300</td>
</tr>
<tr>
<td><a href="https://opencollective.com/pnpm" target="_blank" rel="noreferrer">pnpm</a></td>
<td><a href="https://opencollective.com/pnpm" target="_blank" rel="noreferrer">**</a></td>
<td>$150</td>
</tr>
<tr>
<td><a href="https://opencollective.com/postcss" target="_blank" rel="noreferrer">PostCSS</a></td>
<td><a href="https://opencollective.com/postcss" target="_blank" rel="noreferrer">**</a></td>
<td>$150</td>
</tr>
</tbody>
</table>
<blockquote>
<p>*Anthony contributes to Vite and Vitest, which are projects related to VoidZero's ecosystem, but also maintains many other projects. We are sponsoring Anthony for $1024/month and counting half of that towards the pledge.</p>
<p>**Donations made to projects' respective Open Collective accounts instead of individuals.​</p>
</blockquote>
<hr>
<p>This is just the beginning of our long-term commitment to open source. We look forward to improving the process, growing the budget, and supporting more projects in the future. We also hope that this will inspire more companies to <a href="https://opensourcepledge.com/join/" target="_blank" rel="noreferrer">join the pledge</a>. Let's collectively change how businesses interact with open source for the better.</p>
]]></content:encoded>
            <author>Evan You</author>
        </item>
        <item>
            <title><![CDATA[Announcing VoidZero - Next Generation Toolchain for JavaScript]]></title>
            <link>https://voidzero.dev/posts/announcing-voidzero-inc</link>
            <guid isPermaLink="false">https://voidzero.dev/posts/announcing-voidzero-inc</guid>
            <pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[<p><strong>TL;DR:</strong> I have founded VoidZero Inc., a company dedicated to building an open-source, high-performance, and unified development toolchain for the JavaScript ecosystem. We have raised $4.6 million in seed funding, led by <a href="https://www.accel.com/" target="_blank" rel="noreferrer">Accel</a>.</p>
]]></description>
            <content:encoded><![CDATA[<p><strong>TL;DR:</strong> I have founded VoidZero Inc., a company dedicated to building an open-source, high-performance, and unified development toolchain for the JavaScript ecosystem. We have raised $4.6 million in seed funding, led by <a href="https://www.accel.com/" target="_blank" rel="noreferrer">Accel</a>.</p>
<hr>
<p>Fifteen years ago, when I started building apps with JavaScript, it was mostly a browser-based scripting language. Today, it has evolved into the most widely used language in the world, powering everything from web and mobile apps to game development and even IoT.</p>
<p>Over the years, many excellent tools have emerged to address the increasing scale and complexity of JavaScript applications. However, the ecosystem has always been fragmented: every application relies on a myriad of third-party dependencies, and configuring them to work well together remains one of the most daunting tasks in the development cycle.</p>
<p>As the author of <a href="https://vuejs.org/" target="_blank" rel="noreferrer">one of the most widely used frontend frameworks</a>, I’ve spent significant effort researching every layer of the JavaScript tooling stack, assembling hundreds of dependencies, and designing complex abstractions on top of them. The goal was always to give end users a cohesive, out-of-the-box development experience. These efforts eventually led to the creation of <a href="https://vitejs.dev/" target="_blank" rel="noreferrer">Vite</a> in 2020.</p>
<p>Fast forward four years, Vite is now one of the most popular build tools for web development, with over 15 million downloads per week and a vast ecosystem. In addition to being the go-to choice for single-page applications built with <a href="https://react.dev/" target="_blank" rel="noreferrer">React</a> and <a href="https://vuejs.org/" target="_blank" rel="noreferrer">Vue</a>, Vite is also powering meta frameworks like <a href="https://remix.run/" target="_blank" rel="noreferrer">Remix</a>, <a href="https://nuxt.com/" target="_blank" rel="noreferrer">Nuxt</a>, <a href="https://astro.build/" target="_blank" rel="noreferrer">Astro</a>, <a href="https://kit.svelte.dev/" target="_blank" rel="noreferrer">SvelteKit</a>, <a href="https://start.solidjs.com/" target="_blank" rel="noreferrer">SolidStart</a>, <a href="https://qwik.dev/" target="_blank" rel="noreferrer">Qwik</a>, <a href="https://redwoodjs.com/" target="_blank" rel="noreferrer">Redwood</a>, and more. It has clearly established itself as the shared infrastructure layer for the next generation of web frameworks.</p>
<p><img src="./vite-downloads.jpg" alt="vite download graph"></p>
<p class="image-caption">Vite weekly NPM downloads since 2020</p>
<p>The trust the community has placed in Vite made me reflect deeply on its future. While Vite has greatly improved the high-level developer experience, internally, it still relies on various dependencies, with abstractions and workarounds to smooth over inconsistencies. Performance-wise, it remains bottlenecked by duplicated parsing and serialization costs across different tools, and it can't fully leverage native tooling like <a href="https://esbuild.github.io/" target="_blank" rel="noreferrer">esbuild</a> due to feature constraints and limited customizability.</p>
<p>We started to design a new bundler, <a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>, tailored for Vite's needs. But as I ventured deeper into the layers beneath the bundler, I came to the realization that the challenges Vite is facing is a reflection of the JavaScript ecosystem at large: fragmentation, incompatibilities, and inefficiency. To fundamentally change this, a unified toolchain is needed.</p>
<p>Imagine a toolchain that is:</p>
<ul>
<li><strong>Unified</strong>: using the same AST, resolver, and module interop for all tasks (parsing, transforming, linting, formatting, bundling, minification, testing), eliminating inconsistencies and reducing redundant parsing costs.</li>
<li><strong>High Performance</strong>: written in a compile-to-native language, designed from the ground up for speed, with maximum parallelization and low-overhead JS plugin support. The performance budget unlocks more ambitious features that improve not only developer experience, but end user experience as well.</li>
<li><strong>Composable</strong>: each component of the toolchain is independently consumable, offering building blocks for advanced customization.</li>
<li><strong>Runtime Agnostic</strong>: not tied to any specific JavaScript runtime—delivering the same developer experience across all environments.</li>
</ul>
<p>Such a toolchain will not only enhance Vite but also drive significant improvements throughout the JavaScript ecosystem. This is an ambitious vision, and achieving it requires a full-time, dedicated team—something that wasn’t possible under the independent sustainability model of my past projects. This is why VoidZero was founded.</p>
<p>I'm excited to announce that we've raised $4.6 million in seed funding to pursue this vision. Our seed round was led by <a href="https://www.accel.com/" target="_blank" rel="noreferrer">Accel</a>, with participation from <a href="https://www.amplifypartners.com/" target="_blank" rel="noreferrer">Amplify Partners</a>, <a href="https://prestonwernerventures.com/" target="_blank" rel="noreferrer">Preston-Werner Ventures</a>, <a href="https://www.bgzsg.com/" target="_blank" rel="noreferrer">BGZ</a>, Eric Simons (StackBlitz), Paul Copplestone (Supabase), David Cramer (Sentry), Matt Biilmann &amp; Christian Bach (Netlify), Dafeng Guo (Strikingly), Sebastien Chopin (NuxtLabs), Johannes Schickling (Prisma), and Zeno Rocha (Resend).</p>
<h2 id="the-progress-so-far" tabindex="-1">The progress so far <a class="header-anchor" href="#the-progress-so-far" aria-label="Permalink to “The progress so far”">&#8203;</a></h2>
<p>Over the past year, we’ve built a team with deep expertise in JavaScript tooling, including creators and core contributors to widely adopted open-source projects like <a href="https://vitejs.dev/" target="_blank" rel="noreferrer">Vite</a>, <a href="https://vitest.dev/" target="_blank" rel="noreferrer">Vitest</a>, <a href="https://oxc.rs/" target="_blank" rel="noreferrer">Oxc</a>, and former core contributors to <a href="https://rspack.dev/" target="_blank" rel="noreferrer">Rspack</a>.</p>
<p>We’ve been hard at work developing the foundational elements of our envisioned toolchain. In addition to ongoing improvements to Vite, we’ve also delivered:</p>
<ul>
<li>The fastest and most spec-compliant JavaScript parser (<a href="https://oxc.rs/docs/guide/usage/parser.html" target="_blank" rel="noreferrer">oxc-parser</a>), 3x faster than SWC - <a href="https://github.com/oxc-project/bench-javascript-parser-written-in-rust" target="_blank" rel="noreferrer">benchmark</a></li>
<li>The fastest Node.js-compatible resolver (<a href="https://oxc.rs/docs/guide/usage/resolver.html" target="_blank" rel="noreferrer">oxc-resolver</a>), 28x faster than <code>enhanced-resolve</code> - <a href="https://github.com/oxc-project/bench-resolver" target="_blank" rel="noreferrer">benchmark</a></li>
<li>The fastest TypeScript / JSX transformer (<a href="https://oxc.rs/docs/guide/usage/transformer.html" target="_blank" rel="noreferrer">oxc-transform</a>), 4x faster than SWC - <a href="https://github.com/oxc-project/bench-transformer" target="_blank" rel="noreferrer">benchmark</a></li>
<li>The fastest linter (<a href="https://oxc.rs/docs/guide/usage/linter.html" target="_blank" rel="noreferrer">oxlint</a>), 50–100x faster than ESLint - <a href="https://github.com/oxc-project/bench-javascript-linter" target="_blank" rel="noreferrer">benchmark</a></li>
<li>The most feature-complete test runner for web applications (<a href="https://vitest.dev/" target="_blank" rel="noreferrer">Vitest</a>)</li>
<li>The fastest bundler (<a href="https://rolldown.rs/" target="_blank" rel="noreferrer">Rolldown</a>), built on top of Oxc. Faster than esbuild and all other Rust bundlers - <a href="https://github.com/rolldown/performance-compare-ext" target="_blank" rel="noreferrer">benchmark</a> (currently in alpha)</li>
</ul>
<p>While it’s still early days, our open-source projects are already being used by some of the world’s leading engineering teams, including those at OpenAI (ChatGPT web client), Google, Apple, Microsoft, Visa, Shopify, Cloudflare, Atlassian, Reddit, HuggingFace, Linear, and many more.</p>
<h2 id="what-s-next" tabindex="-1">What's next <a class="header-anchor" href="#what-s-next" aria-label="Permalink to “What's next”">&#8203;</a></h2>
<p>Our primary goal for the coming months is to stabilize Rolldown and make it the unified bundler for Vite in both development and production. We have already made great progress and are aiming for an alpha release of Rolldown powered Vite later this year.</p>
<p>In 2025, we will continue to complete the other planned features of Oxc (minification, formatting) and gradually migrate the entire Vite ecosystem to be powered by Rolldown and Oxc. We will work closely with ecosystem partners and stakeholders to ensure a smooth transition for end users.</p>
<p>Everything we’ve open-sourced will remain open source. On top of our open-source projects, we will offer an end-to-end JavaScript tooling solution specifically designed to meet the scale and security requirements of enterprise environments.</p>
<h2 id="get-in-touch" tabindex="-1">Get in touch! <a class="header-anchor" href="#get-in-touch" aria-label="Permalink to “Get in touch!”">&#8203;</a></h2>
<p><a href="https://x.com/voidzerodev" target="_blank" rel="noreferrer">Follow us on X</a> to stay updated on our progress. If you have requirements for these tools at scale, <a href="https://forms.gle/WQgjyzYJpwurpxWKA" target="_blank" rel="noreferrer">get in touch</a>! If you're interested in contributing to or building on top of our projects, join us on our Discord servers (<a href="https://discord.com/invite/aYVNktYeEB" target="_blank" rel="noreferrer">Vite</a>, <a href="https://discord.com/invite/2zYZNngd7y" target="_blank" rel="noreferrer">Vitest</a>, <a href="https://discord.com/invite/9uXCAwqQZW" target="_blank" rel="noreferrer">Oxc</a>, <a href="https://discord.com/invite/vsZxvsfgC5" target="_blank" rel="noreferrer">Rolldown</a>). Finally, don't forget to tune in to <a href="https://viteconf.org/" target="_blank" rel="noreferrer">ViteConf</a> this week, where we'll share more details about our progress and future plans.</p>
<hr>
<h2 id="faqs" tabindex="-1">FAQs <a class="header-anchor" href="#faqs" aria-label="Permalink to “FAQs”">&#8203;</a></h2>
<ul>
<li>
<p><strong>What is the relationship between these open source projects and VoidZero?</strong></p>
<p>Vite and Vitest's team-based governance remain the same as before. Both core teams include members employed by multiple different organizations (VoidZero, <a href="https://stackblitz.com/" target="_blank" rel="noreferrer">StackBlitz</a>, <a href="https://nuxtlabs.com/" target="_blank" rel="noreferrer">NuxtLabs</a>, <a href="https://astro.build/" target="_blank" rel="noreferrer">Astro</a>). VoidZero Inc. employs / sponsors multiple core contributors to both Vite and Vitest.</p>
<p>VoidZero Inc. holds the copyrights, funds the development, and controls the direction of both Oxc and Rolldown.</p>
</li>
<li>
<p><strong>What about Vue?</strong></p>
<p>VoidZero as a business is entirely separate from Vue. Vue will continue as an independent project but will receive first-class support from the new tooling developed by VoidZero.</p>
</li>
<li>
<p><strong>Why Oxc instead of SWC?</strong></p>
<p>Many of our team members have made non-trivial contributions to SWC in the past. Beyond raw performance benefits, Oxc has some fundamental design differences from SWC that make it a better foundation for the end-to-end toolchain we are building. We will share more technical insights on this topic in future blog posts. <a href="https://forms.gle/WQgjyzYJpwurpxWKA" target="_blank" rel="noreferrer">Stay tuned</a>!</p>
</li>
<li>
<p><strong>Why Rolldown instead of esbuild / Rollup?</strong></p>
<p>We need a bundler that is extremely fast, well-suited for application bundling, and fully compatible with Vite's plugin ecosystem. This is <a href="https://rolldown.rs/about#why-we-are-building-rolldown" target="_blank" rel="noreferrer">discussed in detail in the Rolldown documentation</a>. Building Rolldown on top of Oxc also unlocks the ability to perform more AST-related tasks in parallel during the bundling phase, e.g. emitting and bundling dts with <code>isolatedDeclarations: true</code>.</p>
</li>
<li>
<p><strong>Why will this be different from previous attempts to create a unified JS toolchain?</strong></p>
<p>The biggest challenge of a unified toolchain is the zero-to-one problem: it needs to gain critical mass for exponential adoption to justify continued development, but it is hard to cross the chasm before it actually fulfills the vision. VoidZero does <em>not</em> have this problem, because Vite is already the fastest growing toolchain in the JavaScript ecosystem.</p>
</li>
</ul>
]]></content:encoded>
            <author>Evan You</author>
        </item>
    </channel>
</rss>