
Today’s issue: The Zig roller coaster, the JavaScript hivemind, and Shai Halud 3 coming to an npm package near you.
Welcome to #446.


The Vite team when they start charging $.01 per download
The Vite team released the first beta of Vite 8 on Wednesday, and it’s a pretty huge deal for one reason and one reason only: Rolldown.
This blazing fast, Rust-based bundler has taken the Vite team years to build and was an opt-in-only feature back in Vite 7. But now that it’s finally ready for primetime, we should probably ask – Why did they build it in the first place?
Well until now, Vite has uniquely relied on two bundlers: esbuild provided fast compilation during development, and Rollup handled the bundling, chunking, and optimizing of production builds.
This approach allowed Vite to outsource all the parsing and bundling work, so they could focus on the DX and orchestration that make Vite special. But it turns out that maintaining two separate bundling pipelines isn’t quite as fun as it sounds – and the team was forced to manage separate transformation pipelines, different plugin systems, and a growing amount of glue code to keep all the bundling behavior aligned.
So the Vite team finally decided to head over to West Coast Customs Evan You’s workshop to build their own custom dream bundler from scratch. It doesn’t come with TVs in the headrests, but it does have:
Blazingest speed – Rolldown is written in Rust (btw) and operates at native speed, making it just as fast as esbuild and 10–30× faster than Rollup.
Smooth compatibility – It supports the same plugin API as Rollup and Vite, and most Vite plugins work out of the box with Vite 8.
More features – It unlocks more advanced features for Vite like full bundle mode, more flexible chunk split control, module federation, and more.
Bottom Line: Arguably the biggest impact of this new bundler is that it gives Evan You & friends full control of an end-to-end JS toolchain that includes Vite as the build tool, Rolldown as the bundler, and Oxc as the compiler. This is a smart strategy for VoidZero (the VC-backed company they founded), but it should also allow them to provide a better, more cohesive experience across the entire stack for developers.


Me showing my team how to build backend components
This lets you package up Convex functions, schemas, and persistent state into a reusable module that you or other developers can drop right into your projects.
How is that different from writing a library? They operate more like mini Convex apps that let you share common backend capabilities like rate limiting, aggregates, and AI agents across projects.
With Convex Components, you can:
Watch this quick YouTube demo to learn how you can use a Vite + Convex to build your own backend components from scratch.

function differenceInMilliseconds(date1, date2) {
const { getTime: getTime1 } = new Date(date1);
const { getTime: getTime2 } = new Date(date2);
return getTime1() - getTime2();
}
differenceInMilliseconds('2021-01-01', '2021-01-02');

Zig migrated from GitHub to Codeberg for a mixture of political reasons (totally fair) and frustrations with “inexcusable bugs.” Codeberg rewarded their trust by promptly getting hit with a DDoS attack and going down for a while (not cool, Satya).
Right on cue, Sinclair Target shared some thoughts on Go vs. Rust vs. Zig.
Most AI projects fail during implementation – which is why Augment Code created this Guide to Closing the Enterprise AI Failure Rate Gap. It provides the specific infrastructure patterns, monitoring architectures, and deployment strategies that actually work at scale. [sponsored]
Critical security vulnerabilities are becoming super trendy these days, and the React Team just announced their own unauthenticated remote code execution vulnerability in RSC. You should upgrade your React projects asap – unless you were too lazy to upgrade to React 19 in the first place. Then you’re good.
nixtml is a static site generator written in nix.
Daniel Rosenwasser shared an update on TypeScript 7. It’s codenamed Project Corsa, but it should hopefully run a lot better than the Vauxhall Corsa I rented last time I went to London.
CarbonQA provides high-quality QA services for dev teams, so you’ll never have to waste time testing your own app again. Their US-based testers work in your tools, talk with your team on Slack, and let your devs spend their time building real features. [sponsored]
Zach Leatherman wrote some security suggestions for locking down your npm publishing workflows. So maybe you can help prevent Shai Halud 3: The Return of the Worm from infecting an npm package near you.
Bramus wrote about the most likely reason you still get surprised by anchor positioning.
JavaScript turned 30 years old and keeps complaining about its thinning hairline and how there aren’t any good indie bands anymore. To celebrate, enjoy this story we wrote on JavaScript’s 25th birthday – which also happened to be issue #25 of Bytes ☯️. Call me Will Byers, because I’ve been in sync with the JS hivemind for a long time.
function differenceInMilliseconds(date1, date2) {
const t1 = new Date(date1).getTime();
const t2 = new Date(date2).getTime();
return t1 - t2;
}
differenceInMilliseconds('2021-01-01', '2021-01-02');
In JavaScript, class methods are not direct properties of an instance, but rather belong to the class’s prototype. When you try to destructure a method, you’re attempting to extract it directly from the instance, which doesn’t work because getTime isn’t a direct property. On the other hand, new Date().getTime() works because JavaScript checks the prototype chain and finds getTime on the Date prototype.