Stop, Drop and Rolldown

Issue #457.January 26, 2026.2 Minute read.
Bytes

Today’s issue: Tanking my React social credit score, peak CSS athleticism, and what Electron taught me about elective cosmetic surgery.

Welcome to #457.


Eyeballs logo

The Main Thing

A guy smoking a cigarette with a guy dressed up like a cigarette sneaking up on him

OSS maintainers trying to resist the urge to rewrite everything in Rust

Stop, Drop and Rolldown

The Vite team has been teasing their blazing-fast bundler for the past 12 months, and on Tuesday we finally got to see it up close with the Rolldown 1.0 RC.

If you’re not fully plugged into the Vite hivemind, you might be asking, “Wait, did they really build a whole new bundler from scratch just so they could write it in Rust?”

And the answer is, kind of.

Building Rolldown in Rust does make it fast. But more importantly, Rolldown lets Vite unify the best parts of its two existing bundlers without needing to maintain separate transformation pipelines, plugin systems, and a growing pile of glue code to keep everything in sync.

Rolldown aims to combine the native speed of esbuild with the ecosystem compatibility of Rollup. It also comes with some other notable upgrades:

  • Built-in transforms for TypeScript, JSX, and syntax lowering powered by the Oxc compiler

  • Native CJS/ESM interop with no @rollup/plugin-commonjs required

  • Granular code splitting with Webpack-like chunking control via output.codeSplitting

  • Rollup-compatible plugin API so that existing Rollup plugins work out of the box

Bottom Line: For lots of open source projects, rewriting their internals in Rust is like invading Russia: they’re seduced by the glory but ultimately doomed to freeze to death.

Vite succeeded because they have the rare combination of solid leadership, real money to pay full-time engineers, and a compelling problem to solve.


CodeRabbit logo

Our Friends
(With Benefits)

Thomas Tank Engine cringing

When the code smell is extra potent

CodeRabbit actually checks if your PR solves the issue

You know what’s fun? Closing a Jira ticket. You know what’s less fun? Getting pinged two days later because your PR didn’t actually fix the thing it claimed to fix.

That’s why we love CodeRabbit’s issue validation feature. It reads your linked GitHub, Linear, or Jira issues, extracts the actual requirements, and drops a / / table right in your PR telling you whether your code actually addresses each objective.

Check out this blog post to see how to set it up for free.


Spot the Bug logo

Spot the Bug

Sponsored by Clerk

This in-depth guide shows you how to add API Key support to your SaaS app in just a few minutes.

function decodeBinaryCommands(binaryStrings) {
  const commands = [];

  for (let binStr of binaryStrings) {
    const command = parseInt(binStr, 10);

    switch (command) {
      case 1:
        commands.push("Start");
        break;
      case 2:
        commands.push("Stop");
        break;
      case 3:
        commands.push("Pause");
        break;
      case 4:
        commands.push("Resume");
        break;
      default:
        commands.push("Unknown");
        break;
    }
  }

  return commands;
}

const binaryCommands = ["0001", "0010", "0100", "0011", "1100"];
const decodedCommands = decodeBinaryCommands(binaryCommands);
console.log(decodedCommands);

Cool Bits logo

Cool Bits

  1. Ryan Carniato wrote a deep dive on JavaScript frameworks heading into 2026 that will surely affect his social credit score under the React hegemony.

  2. March MadCSS is exactly what it sounds like: 16 developers at the peak of their physical fitness, battling for glory in the stylesheets before their carpal tunnel flares up.

  3. AppSignal gives you full-stack monitoring for errors, metrics, and logs that’s easy to use and powerful by design. Try it out. [sponsored]

  4. Lea Verou wrote a manifesto about how web dependencies are broken that goes beyond npm’s security issues.

  5. Lix is a universal version control system that can diff any file format, so your AI agent can’t gaslight you about what it changed.

  6. Auth0 makes it easy to build AI agents more securely, so they can access your tools, workflows, and users’ data with fine-grained control and enterprise-grade auth. [sponsored]

  7. atlas9 wrote about the challenges of soft delete and how to subtly shift blame to your coworkers.

  8. Matt Smith wrote a post begging everyone to stop turning everything into arrays.

  9. Ian Macartney wrote this deep dive on Authorization in practice for the Convex blog. With any luck, you’ll finally learn how it’s different from authentication. [sponsored]

  10. Paul Herbert shared some strong feelings about “the incredible overcomplexity” of the shadcn radio button. Tell us how you really feel Paul.

  11. LogTape is an unobtrusive logging library with zero dependencies, built-in-data redaction and support on all major runtimes.

  12. Electron 40 just came out, and it wants to remind you that no one can even tell you’re in a “midlife crisis” if you get enough Botox.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Clerk

If we run this code, we get an output of ['Start', 'Unknown', 'Unknown', 'Unknown', 'Unknown']. This is because the parseInt function has the wrong radix. In this case, we want to use a radix of 2 to convert the binary string to a decimal number.

function decodeBinaryCommands(binaryStrings) {
  const commands = [];

  for (let binStr of binaryStrings) {
    const command = parseInt(binStr, 2);

    switch (command) {
      case 1:
        commands.push("Start");
        break;
      case 2:
        commands.push("Stop");
        break;
      case 3:
        commands.push("Pause");
        break;
      case 4:
        commands.push("Resume");
        break;
      default:
        commands.push("Unknown");
        break;
    }
  }

  return commands;
}

const binaryCommands = ["0001", "0010", "0100", "0011", "1100"];
const decodedCommands = decodeBinaryCommands(binaryCommands);
console.log(decodedCommands);