Cloudflare rebuilt Next.js on Vite

Issue #466.February 27, 2026.2 Minute read.
Bytes

Today’s issue: The Charles Dickens of systems engineering, setting React free, and fun new ways to pretend you’re helping your coding agent.

Welcome to #466.


Eyeballs logo

The Main Thing

Heated Rivalry guys with the Cloudflare and Vercel logos on their heads

You'll never guess what happens Next

Cloudflare rebuilt Next.js on Vite

The Winter Olympics might’ve just ended, but the Petty Olympics kicked off again on Tuesday when Cloudflare announced that they “rebuilt Next.js in one week” using $1,100 in tokens.

They call it vinext (“vee-next”) because it’s built on Vite, and because they apparently didn’t want to burn any more tokens generating a catchier name. And even though it’s still experimental, Cloudflare says that some customers are already running it in production, kind of.

Why did Cloudflare do this? Besides the years-long blood feud, they say it’s about solving Next’s well-known deployment problem that makes running a Next app on any non-Vercel serverless platform clunky and difficult.

(I’m pretty sure Vercel views this as a deployment solution, but beauty’s in the eye of the beholder shareholder.)

The root of that problem is Next’s bespoke Turbopack toolchain, which forces you to reshape the Next build output into something your target platform can actually run. That’s why adapters like OpenNext (which only cover build and deploy) are still limited.

So instead of adapting the Next.js output, Cloudflare decided to “reimplement the Next.js API surface directly on top of Vite”. A bold strategy, but suddenly viable for one engineering manager armed with an army of code agents and the Next.js test suite to use as a spec.

Let’s take a closer look at how vinext stacks up so far:

  • Features – It reimplements routing, SSR, RSC, server actions, middleware, caching, plus both the App Router and Pages Router. It passes ~94% of the 2,000+ tests covering the Next 16 API surface, but it is upfront about still missing some features like static pre-rendering at build time.

  • Performance – Cloudflare claims it can build production apps up to 4x faster and produce client bundles up to 57% smaller on their public benchmarks. But they did at least have the self awareness to describe these results as “directional, not definitive.”

  • Migration – vinext comes with an agent skill that promises to migrate your Next app for you. It handles compatibility checks, dependency installation, config generation, and dev server startup, and it flags anything that needs human attention.

Bottom Line: I always knew I had a valid strategic reason for never writing unit tests.


CodeRabbit logo

Our Friends
(With Benefits)

When your PM finally understands your PR without needing to schedule a meeting

Your PR descriptions are a lie and everyone knows it

“Updated stuff” is not a PR summary. Neither is pasting the Jira ticket title and calling it a day. But writing real summaries for every PR? That’s a collective lie we’ve all agreed to tell ourselves between standups.

That’s why CodeRabbit auto-generates custom PR summaries tailored to your team’s exact specs. Tell it “show API changes with endpoint details” or “list every package bump with version numbers” — and it does that on every PR, without anyone needing to think about it.

Drop your instructions in .coderabbit.yaml once at the org level, and every PR across every repo starts speaking the same language. Stakeholders get context. Reviewers get focus. Nobody has to write “Updated stuff” ever again.

Free for open source. Sign up today.


Spot the Bug logo

Spot the Bug

Sponsored by Meticulous

Meticulous generates and maintains an exhaustive suite of e2e UI tests that covers every edge case of your web app. See why CTOs at Notion, Dropbox and LaunchDarkly rely on them.

class Person {
  #name;

  constructor(name) {
    this.#name = name;
  }

  introduce() {
    console.log(`Hello, my name is ${this.#name}.`);
  }
}

class Student extends Person {
  #grade;

  constructor(name, grade) {
    super(name);
    this.#grade = grade;
  }

  introduce() {
    console.log(
      `Hello, my name is ${this.#name} and I am in grade ${this.#grade}.`
    );
  }
}

const student = new Student("John", 5);
student.introduce();

Cool Bits logo

Cool Bits

  1. Meta officially transferred control of React and all related projects into the React Foundation on Tuesday, freeing the company to refocus on its core mission of inducing mass AI psychosis in all your relatives over 50.

  2. TkDodo wrote about creating query abstractions.

  3. The Sentry team broke down how to wire up Next.js source maps so you can translate minified stack traces into real file names and line numbers. [sponsored]

  4. The VoidZero team just released the beta of Oxfmt, their Rust-powered, Prettier-compatible code formatter. I can’t decide if coding agents mean we’ll see more JavaScript tooling rewritten in Rust – or less, now that it’s not as big of a flex as it used to be.

  5. Expo SDK 55 just dropped with a revamped default template, Hermes v1 support and new CLI tooling inside the Expo MCP Server.

  6. Rohan S. Puranik wrote about how Jimi Hendrix was a systems engineer. Kind of like how Charles Dickens was basically a newsletter writer in his day, if you think about it.

  7. Speechmatics lets you build voice agents with speed you can trust. Its speech API delivers ~250ms latency, built real-time first, with support for 55+ languages. LiveKit, Pipecat, Vapi ready. 👉 Start with $200 free credits. [sponsored]

  8. endowment.dev is a new fund started by some prolific open-source creators (who also happen to be rich now) to create “truly sustainable funding for critical OSS.”

  9. Aurora Scharff wrote about building design components with action props using Async React.

  10. You can now feed your coding agents Angular Skills to give them modern defaults for writing Angular apps. Do all these agent skills actually do anything? Unclear. But they do make humans feel like we’re helping.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Meticulous

Private fields are not inherited by subclasses. The #name field is not accessible in the Student class, so the introduce method will throw an error. To fix this, you can add a getter method to the Person class that returns the value of the #name field.

class Person {
  #name;

  constructor(name) {
    this.#name = name;
  }

  introduce() {
    console.log(`Hello, my name is ${this.#name}.`);
  }

  _getName() {
    return this.#name;
  }
}

class Student extends Person {
  #grade;

  constructor(name, grade) {
    super(name);
    this.#grade = grade;
  }

  introduce() {
    console.log(
      `Hello, my name is ${this._getName()} and I am in grade ${this.#grade}.`
    );
  }
}

const student = new Student("John", 5);
student.introduce();