Bytes

Today’s issue: Getting my favorite fantasy novel spoiled by the Node.js team, banning useEffect, and the benefits of being “disliked but unavoidable.”

Welcome to #471.


Eyeballs logo

The Main Thing

Guillermo staring longingly with a side eye into the camera

Watching another gladiator enter the deployment arena

Vite+ enters the Matrix

It turns out that there are only two business models for VC-backed OSS tools: 1) build a custom deployment platform, or 2) get acquired by Anthropic.

The Vite/VoidZero team just committed to door #1 last week when they launched Void – a “Vite-native deployment platform” that lets you turn any Vite app into a “truly full-stack” application. It’s built on Cloudflare Workers and gives you a database, KV storage, object storage, AI inference, and other goodies.

But the best part is that this means they’re setting Vite+ free.

Vite’s unified toolchain is now fully open-source and MIT licensed, instead of the feature-gated model they were originally considering as a monetization strategy. And that’s great news for the rest of us, because the Vite+ alpha looks very promising:

  • Full toolchain in a single binaryvp bundles Vite, Vitest, Oxlint, Oxfmt, Rolldown, and tsdown into one unified dev environment, so you don’t have to juggle separate config files for each tool.

  • vp covers the full local dev lifecyclevp env manages your Node version, vp install picks the right package manager, vp check runs lint + format + type-check in one shot, and vp build produces an optimized production bundle.

  • Vite Task is a nice bonus – The built-in task runner auto-fingerprints inputs for caching, so repeated tasks are skipped if nothing changed (like a built-in version of Turborepo).

  • Agent-friendly migration – Their vp migrate command includes a copy-paste prompt for your coding agent to handle the migration for you.

Bottom Line: A lot of projects have tried and failed to build the “one unified JS toolchain to rule them all” over the years, but Vite+ is actually doing it.

And if they become a major critical dependency for enough projects, even if their Void deployment platform doesn’t work out, some other big tech/AI company will probably just acquire them ala Bun. So they’re basically building themselves a get-out-jail-free card. Big brain Evan strikes again.


clerk-logo

Our Friends
(With Benefits)

Ronnie Coleman carrying Jay Cutler on his back

When there was one set of footsteps, Clerk was carrying me

@clerk/expo 3.1 ships with native components

That means you can now drop prebuilt, platform-native auth screens into any Expo app without writing any Swift or Kotlin.

It gives you:

  • Native UI components<AuthView />, <UserButton />, and <UserProfileView /> render via SwiftUI on iOS and Jetpack Compose on Android. And they all use hook-based state management, not callbacks.

  • Native Google sign-in – ASAuthorization on iOS, Credential Manager on Android. No OAuth redirect, no browser pop-up, no explaining to your users why auth looks weird.

  • Core-3 Signal APIssetActive() is gone, and auth state is fully reactive with the new Signal API.

Check out @clerk/expo 3.1 – and see how simple it is to get started.


Pop Quiz logo

Pop Quiz

Sponsored by SurveyJS

Form builders shouldn’t own your data. With SurveyJS UI libraries you can build dynamic JSON-driven forms inside your app and keep full control of your data.

What gets logged?

const array = new Array(3).fill([])
array[0].push("bytes")
console.log(array)

s/o to Jonny for this one.


Cool Bits logo

Cool Bits

  1. Next.js 16.2 comes with new agent capabilities, perf upgrades, and “over 200 Turbopack improvements.” Improvement #179 was actually just hot swapping it for Vite.

  2. Kyle Galbraith wrote about how the bottleneck has shifted from writing code to integrating it, and how teams with faster builds and real-time feedback loops are lapping everyone else right now. [sponsored]

  3. Ryan Hunt wants to know, Why is WebAssembly a second-class language on the web?

  4. Matteo Collina wrote about how AI-assisted coding split software engineering in three. And I swear he better not give out any more spoilers for The Strength of the Few.

  5. Oz lets you run hundreds of agents in parallel on your own cloud infrastructure, not just on a laptop. It’s basically Vercel for background agents. [sponsored]

  6. How we migrated 130k lines of code from React to Svelte in two weeks breaks down one team’s daring vision to have their coding agent go where many other coding agents have recently gone before.

  7. Jon Kuperman wrote about the history of Source Maps.

  8. You can now monitor your MCP server with Sentry by wrapping it in a single function call that gives you full visibility into everything going on under the hood. [sponsored]

  9. Josh Wilson wrote about why his team rolled their own RSC framework. Turns out they wanted to start beefing on Twitter with Cloudflare and Vercel to get clout. I respect the hustle.

  10. Alvin Sng wrote a good article about why his team at Factory banned React’s useEffect. Their poor HR department.

  11. Nuxt 4.4 ships with custom useFetch / useAsyncData factories, Vue Router v5, and smarter payload handling.

  12. Ryan Carniato wrote about the two React design choices developers don’t like, but can’t avoid. Speaking from personal experience, there are a lot of social benefits that come with being “disliked but unavoidable.”


Pop Quiz logo

Pop Quiz: Answer

Sponsored by SurveyJS

What gets logged?

const array = new Array(3).fill([])
array[0].push("bytes")
console.log(array) // [ ["bytes"], ["bytes"], ["bytes"] ]

When you call .fill([]), what you’re really doing is “filling up” the array with three references to the same array. You can kind of think of it like this.

const reference = []
const array = new Array(3).fill(reference)

Where now, array has three elements and they’re all referencing the same reference array. Therefore, if you add an item to any of the three elements, since they all point to the same array, it’s as if you’re adding an item to all of them.

To get the same functionality without the referential weirdness, you can use Array.from.

const array = Array.from({ length: 3 }, () => []);
array[0].push("bytes");  // [ ["bytes"], [], [] ]
Bytes
Want us to say nice things
about your company?

Built with ❤️ by Fireship

50 W Broadway Ste 333 PMB 51647 Salt Lake City, Utah 84101

Unsubscribe