<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><script src="https://www.rss.style/js/atom-style.js" xmlns="http://www.w3.org/1999/xhtml"/><title>Tower of Kubes</title><link rel="self" type="application/atom+xml" hreflang="en" href="https://www.towerofkubes.com/series/next-generation-developer-tooling/feed.xml"/><link rel="alternate" type="application/atom+xml" hreflang="he" href="https://www.towerofkubes.com/he/series/next-generation-developer-tooling/feed.xml"/><link rel="alternate" type="application/atom+xml" hreflang="x-default" href="https://www.towerofkubes.com/he/series/next-generation-developer-tooling/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/series/next-generation-developer-tooling/"/><link rel="alternate" type="application/rss+xml" hreflang="en" href="https://www.towerofkubes.com/series/next-generation-developer-tooling/index.xml"/><id>/</id><updated>2026-06-09T00:00:00Z</updated><author><name>Ro'i Bandel</name></author><generator>Hugo 0.157.0</generator><entry><title>Tech Companies Are Acquiring My Favorite Tools</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/tech-companies-are-acquiring-my-favorite-tools/"/><id>https://www.towerofkubes.com/articles/tech-companies-are-acquiring-my-favorite-tools/</id><updated>2026-06-09T00:00:00Z</updated><summary type="html">In ‘Next Generation Tooling for Developers’ I wondered how these venture-backed companies would make money. Since then most of them have been acquired: Anthropic bought Bun, Cloudflare bought Astro and VoidZero, and OpenAI bought Astral.</summary><content type="html"><![CDATA[<img src="https://www.towerofkubes.com/articles/tech-companies-are-acquiring-my-favorite-tools/featured_hu_1abc4d12e685df15.jpg" /><p>When I wrote <a href="/articles/next-generation-tooling-for-developers/" >Next Generation Tooling for Developers</a> last year, I added a <a href="/articles/next-generation-tooling-for-developers/#business-model" >section about the business models</a> of the companies behind these tools. Astral and VoidZero were both venture-backed, and I wondered how they would eventually make money, given that the tools themselves are free and open source. My guess was that they would keep the tools free and sell paid services on top, like Astral’s <a href="https://astral.sh/pyx"  target="_blank" rel="noreferrer">pyx</a> and VoidZero’s <a href="https://viteplus.dev/"  target="_blank" rel="noreferrer">Vite+</a>. I was right to wonder about the business models, though things took a different direction than I had anticipated.</p>
<p>Since then, these companies have been acquired:</p>
<ul>
<li>In December 2025, <a href="https://bun.com/blog/bun-joins-anthropic"  target="_blank" rel="noreferrer">Anthropic acquired Oven</a>, the company behind Bun.</li>
<li>In January 2026, <a href="https://astro.build/blog/joining-cloudflare/"  target="_blank" rel="noreferrer">Cloudflare acquired the Astro team</a>.</li>
<li>In March 2026, <a href="https://openai.com/index/openai-to-acquire-astral/"  target="_blank" rel="noreferrer">OpenAI acquired Astral</a> (uv, Ruff, ty).</li>
<li>In June 2026, <a href="https://blog.cloudflare.com/voidzero-joins-cloudflare/"  target="_blank" rel="noreferrer">Cloudflare acquired VoidZero</a> (Vite, Vitest, Rolldown, Oxc).</li>
</ul>
<p>So the business model, at least for now, turned out to be a simpler one than I expected: get acquired by a bigger company.</p>

<h2 class="relative group">The new owners are not all the same
    <div id="the-new-owners-are-not-all-the-same" class="anchor"></div>
    
</h2>
<p>Cloudflare has been the most hands-off of the three. With Astro, as far as I can tell, they haven’t changed much beyond improving compatibility with Cloudflare’s own platform, and they have been clear that Astro stays MIT-licensed and works with every deployment target, not just theirs. They also set up an <a href="https://www.cloudflare.com/press/press-releases/2026/cloudflare-acquires-astro-to-accelerate-the-future-of-high-performance-web-development/"  target="_blank" rel="noreferrer">Astro Ecosystem Fund</a>, and committed a million dollars to an independent Vite fund when they bought VoidZero. So far this looks like a company that mostly wants the tools to keep doing what they were already doing.</p>
<p>OpenAI bought Astral in March 2026, and so far it has been quiet. uv and Ruff still work the way they did. The main concrete change I’ve seen is that OpenAI’s Codex now uses uv instead of pip, which according to OpenAI saves a lot of compute time. Simon Willison wrote <a href="https://simonwillison.net/2026/mar/19/openai-acquiring-astral/"  target="_blank" rel="noreferrer">a good piece</a> about the acquisition if you want more detail.</p>
<p>Bun is the one that has actually changed.</p>

<h2 class="relative group">Anthropic and Bun
    <div id="anthropic-and-bun" class="anchor"></div>
    
</h2>
<p>Anthropic bought Oven earliest, back in December 2025. Claude Code now ships as a Bun executable, so Anthropic has a clear reason to invest in it.</p>
<p>The official line is that not much changes. Bun stays MIT-licensed, the same team keeps working on it, and the roadmap is roughly the same. What changed is how the code gets written. According to <a href="https://redmonk.com/sogrady/2026/06/04/bun-two-lessons/"  target="_blank" rel="noreferrer">RedMonk</a>, most commits to Bun are now made by bots rather than people, and contributions from outside developers have dropped off. Jarred Sumner, Bun’s creator, said his team hasn’t been typing code themselves for many months.</p>
<p>The clearest example was when the team used Claude to <a href="https://www.theregister.com/devops/2026/05/14/anthropics-bun-rust-rewrite-merged-at-speed-of-ai/"  target="_blank" rel="noreferrer">rewrite around 960,000 lines of Bun from Zig to Rust in six days</a>. It passed almost all of the tests, but the result included over 13,000 <code>unsafe</code> calls, and plenty of people were not impressed. There were also <a href="https://www.theregister.com/2026/04/21/anthropics_bun_1113_released_with_memory_fixes/"  target="_blank" rel="noreferrer">memory leaks</a> bad enough that some Claude Code sessions were using more than 14GB of memory.</p>
<p>There is also an interesting backstory to why the rewrite happened at all. Zig, the language Bun was originally written in, has a <a href="https://simonwillison.net/2026/Apr/30/zig-anti-ai/"  target="_blank" rel="noreferrer">strict no-AI policy</a>. Andrew Kelley, Zig’s creator, has banned AI-assisted contributions entirely, calling them “invariably garbage” and arguing they just flood a small review team with low-quality patches. Since the Bun team now writes most of their code with Claude, this put them in an awkward spot. They ended up running a <a href="https://www.theregister.com/devops/2026/05/14/anthropics-bun-rust-rewrite-merged-at-speed-of-ai/"  target="_blank" rel="noreferrer">fork of Zig</a> instead, though Zig’s maintainers said those changes wouldn’t have been welcome upstream anyway, AI aside. Rather than maintain that fork forever, the team rewrote Bun in Rust, and that rewrite has now been merged into Bun’s main branch.</p>
<p>My theory is that this had more to do with Zig than with Rust. The usual argument for Rust is safety, but the AI-generated rewrite has thousands of <code>unsafe</code> calls in it, so they aren’t really writing safe Rust anyway. To me it looks less like a careful technical decision and more like a culture clash. Anthropic now builds Bun almost entirely with AI, and Zig’s leadership thinks that whole approach is a mistake. It’s hard to keep building on a language whose maintainers consider your way of working garbage. Rust doesn’t come with that conflict, so I suspect that, more than anything about the language itself, is why they switched.</p>
<p>So the changes are real, even if they are more about how Bun is built than where it is going. I’m honestly not sure how I feel about it. On one hand it’s an interesting look at what AI-driven development at this scale actually looks like. On the other hand, I’m not sure I’d want to depend on a runtime while it’s in the middle of being rewritten by an AI.</p>

<h2 class="relative group">What happened to Vite+
    <div id="what-happened-to-vite" class="anchor"></div>
    
</h2>
<p>When VoidZero first <a href="https://voidzero.dev/posts/announcing-vite-plus"  target="_blank" rel="noreferrer">announced Vite+</a>, the plan was a mixed license: free for individuals, open source projects, and small businesses, with paid tiers for startups and enterprises. That matched what I had assumed, a paid layer sitting on top of the free tools.</p>
<p>However, VoidZero changed their mind even before the Cloudflare acquisition. They decided the mixed license didn’t feel right and <a href="https://voidzero.dev/posts/announcing-vite-plus-alpha"  target="_blank" rel="noreferrer">open-sourced Vite+ under the MIT License in March 2026</a>. Around the same time, Evan You announced <a href="https://void.cloud/"  target="_blank" rel="noreferrer">Void</a>, a Vite-native deployment platform, as the thing they would actually charge for. So the paid-service idea didn’t disappear, it just moved from the tooling to a hosted platform around it. Then Cloudflare bought the whole company anyway.</p>

<h2 class="relative group">My Opinion
    <div id="my-opinion" class="anchor"></div>
    
</h2>
<p>All this comes at a time when I have already invested the time into learning most of these tools and integrating them into my development workflows. In recent months, I have been using <a href="/articles/uv-is-incredible/" >uv</a>, Ruff, <a href="/articles/pre-commit-hooks/#guide-husky--lint-staged--oxc-workflow" >oxlint and oxfmt</a>, and Astro in many projects, both personal projects and production projects for clients. The fact that the tools got acquired by large tech companies should hopefully give them the stability to continue being developed, while staying faithful to what made these projects loved in the first place.</p>
<p>These tools are still open source, which I also pointed out in the original article. If one of the new owners ever does something the community really dislikes, the tools can be forked, and that has happened plenty of times before with other projects. But a fork only gets you the code, not the people. A lot of what made these tools good was that small, focused teams were putting a lot of energy into them. An acquisition can keep funding that work, or it can quietly point it somewhere else, and the license doesn’t tell you which. The Bun rewrite is a good example: forking 960,000 lines of AI-generated Rust with 13,000 <code>unsafe</code> calls is not much of a safety net.</p>
<p>So the business-model question I asked last year finally has an answer. It wasn’t pyx or Vite+, it was getting acquired. Given that these were venture-backed companies from the start, that was probably always where this was going.</p>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@andretaissin?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Andre Taissin</a> on <a href="https://unsplash.com/photos/pink-pig-coin-bank-on-brown-wooden-table-5OUMf1Mr5pU?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="tools" label="Tools" scheme="https://www.towerofkubes.com/tags/tools/"/><category term="programming" label="Programming" scheme="https://www.towerofkubes.com/tags/programming/"/><category term="typescript" label="Typescript" scheme="https://www.towerofkubes.com/tags/typescript/"/><category term="javascript" label="Javascript" scheme="https://www.towerofkubes.com/tags/javascript/"/><category term="python" label="Python" scheme="https://www.towerofkubes.com/tags/python/"/><category term="astral" label="Astral" scheme="https://www.towerofkubes.com/tags/astral/"/><category term="uv" label="Uv" scheme="https://www.towerofkubes.com/tags/uv/"/><category term="bun" label="Bun" scheme="https://www.towerofkubes.com/tags/bun/"/><category term="astro" label="Astro" scheme="https://www.towerofkubes.com/tags/astro/"/><category term="backman-feed" label="Backman-Feed" scheme="https://www.towerofkubes.com/tags/backman-feed/"/><published>2026-06-09T00:00:00Z</published></entry><entry><title>Oxc Workflow</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/oxc-workflow/"/><id>https://www.towerofkubes.com/articles/oxc-workflow/</id><updated>2025-11-10T00:00:00Z</updated><summary type="html">How to setup new Node.js projects, with linting and formatting using Oxc.</summary><content type="html"><![CDATA[<img src="https://www.towerofkubes.com/articles/oxc-workflow/featured_hu_db44d08d4c7b384d.jpg" /><p>Here’s how I like to setup new Node.js projects, with linting and formatting using Oxc.</p>

<h2 class="relative group">Oxc
    <div id="oxc" class="anchor"></div>
    
</h2>
<p>I wrote about Oxc (The JavaScript Oxidation Compiler) in <a href="/articles/next-generation-tooling-for-developers/" >Next Generation Tooling for Developers</a>. When I first wrote this article, Oxc already included a linter (<a href="https://www.npmjs.com/package/oxlint"  target="_blank" rel="noreferrer"><code>oxlint</code></a>, which can replace ESLint), but the formatter was not available yet. Since then, VoidZero has continued the development of Oxc, not only launching Vite+ but also launching a formatter (<a href="https://www.npmjs.com/package/oxfmt"  target="_blank" rel="noreferrer"><code>oxfmt</code></a>, which can replace Prettier). With the combination of <a href="https://www.npmjs.com/package/oxlint"  target="_blank" rel="noreferrer"><code>oxlint</code></a> and <a href="https://www.npmjs.com/package/oxfmt"  target="_blank" rel="noreferrer"><code>oxfmt</code></a>, I now have a modern-alternative to ESLint + Prettier. Note that this might not work as a replacement in all existing projects that rely on specific configurations of ESLint and/or Prettier. However, for new Node.js projects, I will strive to go with the Oxc stack.</p>

<h3 class="relative group">Why Oxc instead of ESLint + Prettier?
    <div id="why-oxc-instead-of-eslint--prettier" class="anchor"></div>
    
</h3>
<p>The two main reasons I prefer Oxc is speed and ease of configuration; as I have explained in <a href="/articles/next-generation-tooling-for-developers/" >Next Generation Tooling for Developers</a>, the Rust-based tools are noticeably faster. In addition, they have a more modern design with more intutive configuration. In particular, ESLint has become a nightmare to configure after the breaking changes in ESLint v9.</p>

<h2 class="relative group">Guide
    <div id="guide" class="anchor"></div>
    
</h2>

<h3 class="relative group">One-time run
    <div id="one-time-run" class="anchor"></div>
    
</h3>
<p>These tools can be run in a project without being installed or added to <code>package.json</code> using npx commands:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">npx oxlint@latest</span></span></code></pre></div></div>
<hr>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">npx oxfmt@latest</span></span></code></pre></div></div>

<h3 class="relative group">Install Oxc tools in NPM project
    <div id="install-oxc-tools-in-npm-project" class="anchor"></div>
    
</h3>
<p>For consistent usage in an npm project, Oxc packages can be added as <a href="https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file"  target="_blank" rel="noreferrer"><code>devDependencies</code></a>.</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">npm install --save-dev oxlint@latest oxlint-tsgolint@latest oxfmt@latest</span></span></code></pre></div></div>

<h3 class="relative group">Initialize configuration for oxlint
    <div id="initialize-configuration-for-oxlint" class="anchor"></div>
    
</h3>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>Configuration files for Oxlint are written in JSON, with support for comments (JSONC). Oxlint will automatically search for files named <code>.oxlintrc.json</code> and automatically use those. But you can name the file anything when you are using the <code>--config</code> CLI option.</p>
      </div>
    </div><ul>
<li><a href="https://oxc.rs/docs/guide/usage/linter/config.html"  target="_blank" rel="noreferrer">Configuring Oxlint | The JavaScript Oxidation Compiler</a></li>
</ul>
<p>Use the <a href="https://oxc.rs/docs/guide/usage/linter/cli.html#basic-configuration"  target="_blank" rel="noreferrer"><code>--init</code></a> option to initialize a <code>.oxlintrc.json</code> file:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1">## If installed</span>
</span></span><span class="line"><span class="cl">./node_modules/.bin/oxlint --init</span></span></code></pre></div></div>
<hr>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1">## If not installed</span>
</span></span><span class="line"><span class="cl">npx oxlint@latest --init</span></span></code></pre></div></div>

<h3 class="relative group">Initialize configuration for oxfmt
    <div id="initialize-configuration-for-oxfmt" class="anchor"></div>
    
</h3>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>By default, <code>oxfmt</code> automatically tries to find the nearest <code>.oxfmtrc.json</code> or <code>.oxfmtrc.jsonc</code> file from current working directory. If not found, default configuration is used.</p>
<p>Also you can specify your config file by <code>-c yourconfig.jsonc</code> flag.</p>
<p>Almost all format options are compatible with Prettier’s <a href="https://prettier.io/docs/options"  target="_blank" rel="noreferrer">options</a>. So you may finish your setup by just renaming <code>.prettierrc.json</code> to <code>.oxfmtrc.jsonc</code>.</p>
      </div>
    </div><ul>
<li><a href="https://oxc.rs/docs/guide/usage/formatter.html#configuration-file"  target="_blank" rel="noreferrer">Formatter | The JavaScript Oxidation Compiler</a></li>
</ul>
<p>Use the <a href="https://oxc.rs/docs/guide/usage/formatter/cli.html#mode-options"  target="_blank" rel="noreferrer"><code>--init</code></a> option to initialize a <code>.oxfmtrc.json</code> file:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1">## If installed</span>
</span></span><span class="line"><span class="cl">./node_modules/.bin/oxfmt --init</span></span></code></pre></div></div>
<hr>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1">## If not installed</span>
</span></span><span class="line"><span class="cl">npx oxfmt@latest --init</span></span></code></pre></div></div>
<hr>

    <details class="admonition note">
      <summary class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/></svg>
        <span>A previous version of this article, suggested to use prettier-init (before oxfmt had the <code>--init</code> option).</span>
      </summary>
      <div class="admonition-content">
        <p>The <a href="https://github.com/gabrielperales/prettier-init"  target="_blank" rel="noreferrer">prettier-init</a> tool can be used to help bootstrap configuration:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">npx prettier-init@latest
</span></span><span class="line"><span class="cl">mv <span class="s2">".prettierrc.json"</span> <span class="s2">".oxfmtrc.json"</span></span></span></code></pre></div></div>
      </div>
    </details>
<h3 class="relative group"><code>scripts</code> block in <code>package.json</code>
    <div id="scripts-block-in-packagejson" class="anchor"></div>
    
</h3>
<p>For easy and consistent usage across the project, add to the <code>scripts</code> block in <code>package.json</code>:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl">  <span class="s2">"scripts"</span><span class="err">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">"lint"</span><span class="p">:</span> <span class="s2">"oxlint --type-aware --type-check ."</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">"lint:fix"</span><span class="p">:</span> <span class="s2">"oxlint --type-aware --type-check . --fix"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">"lint:fix-all"</span><span class="p">:</span> <span class="s2">"oxlint --type-aware --type-check . --fix --fix-suggestions --fix-dangerously"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">"format"</span><span class="p">:</span> <span class="s2">"oxfmt ."</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">"format:check"</span><span class="p">:</span> <span class="s2">"oxfmt . --check"</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span><span class="err">,</span></span></span></code></pre></div></div>

<h3 class="relative group">Commit and push all changed and added files
    <div id="commit-and-push-all-changed-and-added-files" class="anchor"></div>
    
</h3>
<p>Commit and push all relevant files that were changed or added:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">git add <span class="s2">".oxfmtrc.json"</span> <span class="s2">".oxlintrc.json"</span> <span class="s2">"package.json"</span> <span class="s2">"package-lock.json"</span>
</span></span><span class="line"><span class="cl">git commit -s
</span></span><span class="line"><span class="cl">git push</span></span></code></pre></div></div>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@6heinz3r?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Gabriel Heinzer</a> on <a href="https://unsplash.com/?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="node" label="Node" scheme="https://www.towerofkubes.com/tags/node/"/><category term="javascript" label="Javascript" scheme="https://www.towerofkubes.com/tags/javascript/"/><category term="typescript" label="Typescript" scheme="https://www.towerofkubes.com/tags/typescript/"/><category term="tools" label="Tools" scheme="https://www.towerofkubes.com/tags/tools/"/><category term="snippets" label="Snippets" scheme="https://www.towerofkubes.com/tags/snippets/"/><published>2025-11-10T00:00:00Z</published></entry><entry><title>Next Generation Tooling for Developers</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/next-generation-tooling-for-developers/"/><id>https://www.towerofkubes.com/articles/next-generation-tooling-for-developers/</id><updated>2025-10-12T00:00:00Z</updated><summary type="html">In recent months I have been learning about Astral, and have started using uv and ruff. This led me to try to find similar tools for other languages.</summary><content type="html"><![CDATA[<img src="https://www.towerofkubes.com/articles/next-generation-tooling-for-developers/featured_hu_d117e0e878468a63.jpg" /><p>In recent months I have been learning about <a href="https://astral.sh/"  target="_blank" rel="noreferrer">Astral: High-performance Python tooling</a>. I first learned about Astral’s tools from this article: <a href="https://www.cesarsotovalero.net/blog/i-am-switching-to-python-and-actually-liking-it.html"  target="_blank" rel="noreferrer">I’m Switching to Python and Actually Liking It</a> and have started using uv and ruff. This led me to try to find similar tools for other languages.</p>

<h2 class="relative group">What makes a tool “next generation”?
    <div id="what-makes-a-tool-next-generation" class="anchor"></div>
    
</h2>

    <div class="admonition note">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/></svg>
        <span>Note</span>
      </div>
      <div class="admonition-content">
        <p>I am not focusing on AI tools in this article. I have other articles on this subject (such as <a href="/articles/agentic-cli-tools-comparison/" >Agentic CLI Tools Comparison</a>).</p>
      </div>
    </div><p>The projects below have a few things in common. The projects are led by companies which have similar missions to develop modern tooling for developers. All of the tools below are open-source under the <a href="https://opensource.org/license/mit"  target="_blank" rel="noreferrer">MIT License</a>.</p>
<p>Most of the tools are written in modern compiled languages such as Rust or Go. Many of the tools boast significant performance improvements compared to previous tools, as well as a more modern design with better <a href="https://en.wikipedia.org/wiki/Developer_Experience"  target="_blank" rel="noreferrer">Developer Experience</a> (DX or DevEx).</p>
<p>As a result, these tools tend to feel both <em>faster</em> and <em>easier</em> to use than the tools that they aim to replace.</p>

<h2 class="relative group">Toolsets
    <div id="toolsets" class="anchor"></div>
    
</h2>

<h3 class="relative group">Python
    <div id="python" class="anchor"></div>
    
</h3>

<h4 class="relative group"><a href="https://astral.sh/"  target="_blank" rel="noreferrer">Astral: High-performance Python tooling</a>
    <div id="astral-high-performance-python-tooling" class="anchor"></div>
    
</h4>

<h5 class="relative group">Astrals’s Mission
    <div id="astralss-mission" class="anchor"></div>
    
</h5>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p><strong>Astral’s Mission</strong></p>
<p><strong>We build</strong> high-performance developer tools for the <strong>Python</strong> ecosystem.</p>
<p>Our mission is to make the <strong>Python</strong> ecosystem more productive.</p>
<p>By building tools that enable developers to <strong>ship great software, faster.</strong></p>
<p>Tools that change <strong>how we work.</strong></p>
      </div>
    </div><ul>
<li><a href="https://astral.sh/about"  target="_blank" rel="noreferrer">About | Astral</a></li>
</ul>

<h5 class="relative group">Astral’s Projects
    <div id="astrals-projects" class="anchor"></div>
    
</h5>
<ul>
<li><strong>uv (<a href="https://docs.astral.sh/uv/"  target="_blank" rel="noreferrer">Docs</a> | <a href="https://github.com/astral-sh/ruff"  target="_blank" rel="noreferrer">GitHub</a>):</strong> An extremely fast Python package and project manager, written in Rust.</li>
<li><strong>ruff (<a href="https://docs.astral.sh/ruff/"  target="_blank" rel="noreferrer">Docs</a> | <a href="https://github.com/astral-sh/ruff"  target="_blank" rel="noreferrer">GitHub</a>):</strong> An extremely fast Python linter and code formatter, written in Rust.</li>
<li><strong>ty (<a href="https://docs.astral.sh/ty/"  target="_blank" rel="noreferrer">Docs</a> | <a href="https://github.com/astral-sh/ty"  target="_blank" rel="noreferrer">GitHub</a>):</strong> An extremely fast Python type checker and language server, written in Rust.</li>
<li><strong>python-build-standalone (<a href="https://gregoryszorc.com/docs/python-build-standalone/main/"  target="_blank" rel="noreferrer">Docs</a> | <a href="https://github.com/astral-sh/python-build-standalone"  target="_blank" rel="noreferrer">GitHub</a>):</strong> This project produces standalone, highly-redistributable builds of Python. Used in uv.</li>
</ul>

    <div class="admonition note">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/></svg>
        <span>Note</span>
      </div>
      <div class="admonition-content">
        <p><a href="https://rye.astral.sh/"  target="_blank" rel="noreferrer">Rye</a> is another tool that was maintained by Astral, however it is no longer developed and uv is considered “the <a href="https://lucumr.pocoo.org/2024/8/21/harvest-season/"  target="_blank" rel="noreferrer">successor project</a> from the same maintainers”.</p>
      </div>
    </div>
<h3 class="relative group">JavaScript/TypeScript
    <div id="javascripttypescript" class="anchor"></div>
    
</h3>

<h4 class="relative group"><a href="https://voidzero.dev/"  target="_blank" rel="noreferrer">VoidZero | Next Generation Tooling for the Web</a>
    <div id="voidzero--next-generation-tooling-for-the-web" class="anchor"></div>
    
</h4>

<h5 class="relative group">VoidZero’s Mission
    <div id="voidzeros-mission" class="anchor"></div>
    
</h5>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p><strong>The Mission</strong></p>
<p>We are building a unified high-performance toolchain for JavaScript: including parser, transformer, resolver, linter, formatter, minifier, bundler, test runner, and meta framework support. Our mission is to make the next generation of JavaScript developers more productive than ever before.</p>
      </div>
    </div><ul>
<li><a href="https://voidzero.dev/"  target="_blank" rel="noreferrer">VoidZero | Next Generation Tooling for the Web</a></li>
</ul>

<h5 class="relative group">VoidZero’s Projects
    <div id="voidzeros-projects" class="anchor"></div>
    
</h5>
<ul>
<li><strong>Vite (<a href="https://vite.dev"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/vitejs/vite"  target="_blank" rel="noreferrer">GitHub</a>):</strong> The build tool for the web.</li>
<li><strong>Vitest (<a href="https://vitest.dev/"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/vitest-dev/vitest"  target="_blank" rel="noreferrer">GitHub</a>):</strong> Next generation testing framework powered by Vite.</li>
<li><strong>Rolldown (<a href="https://rolldown.rs/"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/rolldown/rolldown"  target="_blank" rel="noreferrer">GitHub</a>):</strong> Fast Rust bundler for JavaScript/TypeScript with Rollup-compatible API.</li>
<li><strong>The JavaScript Oxidation Compiler (Oxc) (<a href="https://oxc.rs/"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/oxc-project"  target="_blank" rel="noreferrer">GitHub</a>):</strong> A collection of JavaScript tools written in Rust.</li>
</ul>

<h4 class="relative group"><a href="https://webinfra.org/"  target="_blank" rel="noreferrer">ByteDance Web Infra Team</a>
    <div id="bytedance-web-infra-team" class="anchor"></div>
    
</h4>

<h5 class="relative group">Web Infra’s Mission
    <div id="web-infras-mission" class="anchor"></div>
    
</h5>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p><strong>Web Infra</strong></p>
<p>We are from ByteDance, our goal is to build an open technical ecosystem to promote the development of frontend technology.</p>
      </div>
    </div><ul>
<li><a href="https://github.com/web-infra-dev"  target="_blank" rel="noreferrer">Web Infra · GitHub</a></li>
</ul>

<h5 class="relative group">Web Infras’s Projects
    <div id="web-infrass-projects" class="anchor"></div>
    
</h5>
<ul>
<li><strong>Rspack (<a href="https://rspack.rs"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/rspack"  target="_blank" rel="noreferrer">GitHub</a>):</strong> Fast Rust-based web bundler with webpack-compatible API.</li>
<li><strong>Rsbuild (<a href="https://rsbuild.rs"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/rsbuild"  target="_blank" rel="noreferrer">GitHub</a>):</strong> Zero-config build tool powered by Rspack.</li>
<li><strong>Rspress (<a href="https://rspress.rs"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/rspress"  target="_blank" rel="noreferrer">GitHub</a>):</strong> A fast Rsbuild-based static site generator.</li>
<li><strong>Rsdoctor (<a href="https://rsdoctor.rs"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/rsdoctor"  target="_blank" rel="noreferrer">GitHub</a>):</strong> A one-stop build analyzer for Rspack and webpack.</li>
<li><strong>Rslib (<a href="https://rslib.rs"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/rslib"  target="_blank" rel="noreferrer">GitHub</a>):</strong> Create JavaScript libraries in a simple and intuitive way.</li>
<li><strong>Rstest (<a href="https://rstest.rs"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/rstest"  target="_blank" rel="noreferrer">GitHub</a>):</strong> The testing framework powered by Rspack.</li>
<li><strong>Rslint (<a href="https://rslint.rs"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/rslint"  target="_blank" rel="noreferrer">GitHub</a>):</strong> High-performance JavaScript and TypeScript linter written in Go.</li>
<li><strong>Midscene.js (<a href="https://midscenejs.com"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/midscene"  target="_blank" rel="noreferrer">GitHub</a>):</strong> AI Operator for Web, Android, Automation & Testing.</li>
<li><strong>Modern.js (<a href="https://modernjs.dev"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/modern.js"  target="_blank" rel="noreferrer">GitHub</a>):</strong> Progressive web framework based on React and Rsbuild.</li>
<li><strong>Garfish (<a href="https://www.garfishjs.org"  target="_blank" rel="noreferrer">Website</a> | <a href="https://github.com/web-infra-dev/garfish"  target="_blank" rel="noreferrer">GitHub</a>):</strong> Powerful micro front-end framework.</li>
</ul>

<h2 class="relative group">Business Model
    <div id="business-model" class="anchor"></div>
    
</h2>
<p>All of the tools mentioned above are primarily developed and maintained by companies. This raises the question, if the tools are FOSS (Free and Open Source), what are their business models?</p>
<p>ByteDance of course owns TikTok. They make enough money already and can afford contributing to open-source if they so chose. My theory is that ByteDance likely wants to continue contributing to open-source to put them in the same positive light as Western tech companies (for example Meta, who developed many open-source projects including React, Docusaurus and <a href="https://www.llama.com/"  target="_blank" rel="noreferrer">Llama</a>).</p>
<p>On the other hand, Astral and VoidZero are both venture-backed. While they can afford to lose money for a period while gaining users, eventually they will want to find a way to extract value. In the past, when the founders of the companies were asked about this, they gave somewhat vague statements.</p>
<p>However, more recently, Astral introduced <a href="https://astral.sh/pyx"  target="_blank" rel="noreferrer">pyx</a> (a Python-native package registry):</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>Beyond the product itself, <a href="https://astral.sh/pyx"  target="_blank" rel="noreferrer">pyx</a> is also an instantiation of our strategy: <strong>our tools (uv, Ruff, ty, etc.) remain free, open source, and permissively licensed — forever.</strong> Nothing changes there. Instead, we’ll offer paid, hosted services like <a href="https://astral.sh/pyx"  target="_blank" rel="noreferrer">pyx</a> that represent the “natural next thing you need” when you’re already using our tools: the Astral platform.</p>
      </div>
    </div><ul>
<li><a href="https://astral.sh/blog/introducing-pyx"  target="_blank" rel="noreferrer">pyx: a Python-native package registry, now in Beta</a></li>
</ul>
<p>It is likely that VoidZero will go for a similar strategy in the future, by introducing paid services that go alongside the free tools.</p>
<p>The tools themselves are still FOSS, and all are licensed under the permissive <a href="https://opensource.org/license/mit"  target="_blank" rel="noreferrer">MIT License</a>. These companies know that if they ever attempt to change the license or terms for these tools, the community will immediately fork the projects (as has happened <em>many</em> times in the past with <em>other</em> open-source projects).</p>

    <div class="admonition note">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/></svg>
        <span>Note</span>
      </div>
      <div class="admonition-content">
        <p><strong>UPDATE:</strong> A lot has changed since I first wrote this article. Both Astral and VoidZero have gotten acquired by tech companies. I wrote about this in a follow-up article: <a href="/articles/tech-companies-are-acquiring-my-favorite-tools/" >Tech Companies Are Acquiring My Favorite Tools</a>.</p>
      </div>
    </div>
<h2 class="relative group">My Experience
    <div id="my-experience" class="anchor"></div>
    
</h2>
<ul>
<li>
<p>I have listed a lot of tools from these companies, of course I have not tried all of the tools mentioned above.</p>
</li>
<li>
<p>I have been using Astral’s projects, uv and Ruff, and had good experience with both, and I want to try ty as well. As I’m getting more into TypeScript development with React, Docusaurus and Cloud Development Kit (CDK), I have been trying out some of the TypeScript tools as well.</p>
</li>
<li>
<p>In the case of Docusaurus, I tried <a href="https://docusaurus.io/blog/releases/3.6#docusaurus-faster"  target="_blank" rel="noreferrer">Docusaurus Faster</a> which uses Rspack (by Web Infra), as well as SWC and Lightning CSS. This makes it almost as fast as Rspress (another project by Web Infra). The difference in build times is immediately noticeable compared to building Docusaurus with Webpack.</p>
</li>
<li>
<p>The speed difference is also felt in uv; compared to pip, uv downloads the same packages noticeably faster. I have further explained my love for uv in <a href="/articles/uv-is-incredible/" >uv is incredible</a>.</p>
</li>
<li>
<p>Ruff works well as both a Linter and Formatter. Ty does the same for type checking in Python.</p>
</li>
<li>
<p>Besides the speed, I have also noticed these tools tend to be <em>easier</em> to use than the older, less modern tools that the aim to replace. The focus on <a href="https://en.wikipedia.org/wiki/Developer_Experience"  target="_blank" rel="noreferrer">Developer Experience</a> (DX or DevEx) is apparent.</p>
</li>
<li>
<p>Recently, I have been trying out TypeScript Linters and Formatters and wrote about the Rust Alternatives. Oxc looks promising, it currently has a <a href="https://oxc.rs/docs/guide/usage/linter.html"  target="_blank" rel="noreferrer">Linter</a>, while the Prettier-compatible <a href="https://oxc.rs/docs/contribute/formatter"  target="_blank" rel="noreferrer">Formatter</a> is still under development. Once the <a href="https://oxc.rs/docs/contribute/formatter"  target="_blank" rel="noreferrer">Formatter</a> is ready, I will try using Oxc (instead of ESLint + Prettier), at least for projects that don’t require specific ESLint plugins that aren’t yet <a href="https://github.com/oxc-project/oxc/issues/481"  target="_blank" rel="noreferrer">supported by Oxc</a>.</p>
</li>
</ul>

    <div class="admonition note">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/></svg>
        <span>Note</span>
      </div>
      <div class="admonition-content">
        <p><strong>UPDATE:</strong> <a href="https://oxc.rs/docs/guide/usage/formatter"  target="_blank" rel="noreferrer">oxfmt</a> is now available and I have been using it in my projects alongside <a href="https://oxc.rs/docs/guide/usage/linter.html"  target="_blank" rel="noreferrer">oxlint</a>.</p>
      </div>
    </div><ul>
<li>I wrote more about using Oxc in <a href="/articles/oxc-workflow/" >Oxc Workflow</a>.</li>
</ul>

<h3 class="relative group">Vite
    <div id="vite" class="anchor"></div>
    
</h3>
<ul>
<li>
<p>Out of all the projects I listed here, Vite is probably the most widely used. It’s popular enough to have gotten its own documentary: <a href="https://youtu.be/bmWQqAKLgT4"  target="_blank" rel="noreferrer">Vite: The Documentary - YouTube</a></p>
</li>
<li>
<p>I have been using Vite for React apps, notably <a href="https://github.com/CALMe25"  target="_blank" rel="noreferrer">CALMe</a>. Ever since <a href="https://github.com/facebook/create-react-app"  target="_blank" rel="noreferrer">create-react-app</a> has been deprecated, I have been consistently seeing Vite as one of the top recommendations, including in the <a href="https://react.dev/"  target="_blank" rel="noreferrer">React Documentation</a>: <a href="https://react.dev/learn/creating-a-react-app#start-from-scratch"  target="_blank" rel="noreferrer">Creating a React App</a> and <a href="https://react.dev/learn/build-a-react-app-from-scratch"  target="_blank" rel="noreferrer">Build a React app from Scratch</a>.</p>
</li>
<li>
<p>Vite is being integrated with Rolldown: <a href="https://vite.dev/guide/rolldown"  target="_blank" rel="noreferrer">Rolldown Integration | Vite</a></p>
</li>
</ul>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@tonchik?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Anton Savinov</a> on <a href="https://unsplash.com/?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="tools" label="Tools" scheme="https://www.towerofkubes.com/tags/tools/"/><category term="programming" label="Programming" scheme="https://www.towerofkubes.com/tags/programming/"/><category term="typescript" label="Typescript" scheme="https://www.towerofkubes.com/tags/typescript/"/><category term="javascript" label="Javascript" scheme="https://www.towerofkubes.com/tags/javascript/"/><category term="python" label="Python" scheme="https://www.towerofkubes.com/tags/python/"/><category term="astral" label="Astral" scheme="https://www.towerofkubes.com/tags/astral/"/><category term="uv" label="Uv" scheme="https://www.towerofkubes.com/tags/uv/"/><published>2025-10-12T00:00:00Z</published></entry><entry><title>uv is incredible</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/uv-is-incredible/"/><id>https://www.towerofkubes.com/articles/uv-is-incredible/</id><updated>2025-09-30T00:00:00Z</updated><summary type="html">I have recently learned about uv and the uv workflow. Since then, I’ve been using uv a lot more, both for personal projects and at work!</summary><content type="html"><![CDATA[<img src="https://www.towerofkubes.com/articles/uv-is-incredible/featured_hu_83c3c3a8be5d5104.jpg" /><p>I have recently learned about uv and the uv workflow. Since then, I’ve been using uv a lot more, both for personal projects and at work!</p>

<h2 class="relative group">uv is the best
    <div id="uv-is-the-best" class="anchor"></div>
    
</h2>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p><em>My conclusion is: if your situation allows it, always try</em> <code>uv</code> <em>first. Then fall back on something else if that doesn’t work out.</em></p>
      </div>
    </div><ul>
<li><a href="https://www.bitecode.dev/p/a-year-of-uv-pros-cons-and-should"  target="_blank" rel="noreferrer">A year of uv: pros, cons, and should you migrate</a></li>
</ul>
<p>While reading more about uv, I found these two articles:</p>
<ol>
<li><a href="https://hynek.me/articles/docker-uv/"  target="_blank" rel="noreferrer">Production-ready Python Docker Containers with uv</a> (Hynek Schlawack)</li>
<li><a href="https://www.bitecode.dev/p/a-year-of-uv-pros-cons-and-should"  target="_blank" rel="noreferrer">A year of uv: pros, cons, and should you migrate</a> (Bite code! | Substack)</li>
</ol>
<p>What’s interesting, is that these both of these articles each link to older articles where they each extensively compared tools for Python dependency management.</p>
<ol>
<li><a href="https://hynek.me/articles/python-app-deps-2018/"  target="_blank" rel="noreferrer">Python Application Dependency Management</a> (Hynek Schlawack)</li>
<li><a href="https://www.bitecode.dev/p/why-not-tell-people-to-simply-use"  target="_blank" rel="noreferrer">Why not tell people to “simply” use pyenv, poetry, pipx or anaconda</a> (Bite code! | Substack)</li>
</ol>
<p>The articles reach similar conclusions, in that the existing tools can be useful but have limitations. However, both articles have been updated to have disclaimers at the top:</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>This article is really old.</p>
<p>If you want to see how I manage my dependencies since 2024, the short answer is <a href="https://docs.astral.sh/uv/"  target="_blank" rel="noreferrer"><em>uv</em></a>, and the long answers are:</p>
<ul>
<li><a href="https://hynek.me/articles/docker-uv/"  target="_blank" rel="noreferrer"><em>Production-ready Python Docker Containers with uv</em></a></li>
<li>and <a href="https://hynek.me/articles/python-virtualenv-redux/"  target="_blank" rel="noreferrer"><em>Python Project-Local Virtualenv Management Redux</em></a></li>
</ul>
<p>Spoiler: Everything got pretty good.</p>
      </div>
    </div><ul>
<li><a href="https://hynek.me/articles/python-app-deps-2018/"  target="_blank" rel="noreferrer">Python Application Dependency Management</a> (Hynek Schlawack)</li>
</ul>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p><em>THIS ARTICLE HAS BEEN WRITTEN BEFORE <a href="https://docs.astral.sh/uv/"  target="_blank" rel="noreferrer">UV</a> EXISTED. UV SOLVES MOST OF THOSE PROBLEMS. YOU CAN TELL PEOPLE TO “SIMPLY” USE UV.</em></p>
      </div>
    </div><ul>
<li><a href="https://www.bitecode.dev/p/why-not-tell-people-to-simply-use"  target="_blank" rel="noreferrer">Why not tell people to “simply” use pyenv, poetry, pipx or anaconda</a> (Bite code! | Substack)</li>
</ul>
<p>As far as I am aware, the authors were not inspired by each other. They both tried to solve the problems of Python dependency management, found the previous tools lacking, and now love uv.</p>

<h2 class="relative group">My Opinion
    <div id="my-opinion" class="anchor"></div>
    
</h2>
<p>I have personally <em>not</em> compared every single Python dependency management tool, but do give weight to the opinion of those who have. In the past, I have heard about tools like virtualenv, pyenev, poetry and others, and decided to simply stick with pip and venv. However, after hearing increasingly good things about uv, I decided to try it myself. I have now used it for several projects, both work and personal projects. My conclusion: it’s good.</p>
<p>I don’t know if I will be using uv for every project. As good as uv is, I am still sometimes hesitant to add a new build dependency. I also had some concerns about the venture-backed nature of uv (which I addressed in when writing about the Business Model in <a href="/articles/next-generation-tooling-for-developers/" >Next Generation Tooling for Developers</a>).</p>
<p>At the same time, uv works really well and is even fun to use, so I’ll probably trend towards using it more often than not. The fact that the tool is open source and strives to conform to Python PEP standards also makes me feel comfortable using it. For example, uv works with <a href="https://pip.pypa.io/en/latest/reference/build-system/pyproject-toml/"  target="_blank" rel="noreferrer"><code>pyproject.toml</code></a>. In theory, I could replace uv with another tool in the future but still use the same file. I looked at what it takes to use <code>pyproject.toml</code> on its own and found this article: <a href="https://til.simonwillison.net/python/pyproject"  target="_blank" rel="noreferrer">Python packages with pyproject.toml and nothing else | Simon Willison’s TILs</a>. This shows me that it’s possible to work this way without using a tool like uv, however using uv makes things much easier!</p>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@pointblanq?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Point Blanq</a> on <a href="https://unsplash.com/?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="python" label="Python" scheme="https://www.towerofkubes.com/tags/python/"/><category term="tools" label="Tools" scheme="https://www.towerofkubes.com/tags/tools/"/><category term="programming" label="Programming" scheme="https://www.towerofkubes.com/tags/programming/"/><category term="astral" label="Astral" scheme="https://www.towerofkubes.com/tags/astral/"/><category term="uv" label="Uv" scheme="https://www.towerofkubes.com/tags/uv/"/><published>2025-09-30T00:00:00Z</published></entry></feed>