Wtf is Remix 3?

Issue #433.October 17, 2025.2 Minute read.
Bytes

Today’s issue: Lit follows React, your boss’s greatest AI fears, and the millennial urge to rewatch Brink.

Welcome to #433.


Eyeballs logo

The Main Thing

Principal Skinner from Simpsons meme

Remix Jam TLDR

Wtf is Remix 3?

Turns out, it’s a lot like Remix 2 – except instead of declarative React components and hooks, you now get manual event dispatching, this.update(), and no React at all.

Ok, so it’s actually nothing like Remix 2. Which begs the question, why call it Remix at all?

Hard to say. Maybe Shopify wanted to keep the goodwill of the brand they bought three years ago, or maybe the Remix team was inspired by the Angular.js ➡️ Angular 2 rebranding masterclass from 2016? I’ll leave that up to OSS marketing experts, because the next question is a lot more interesting…

Why did they get divorced from React? The answer, according to Ryan and Michael, is that React itself has drifted away from its original promise of simplicity by embracing compilers, RSC, and transitions that Remix never fully believed in. (It’s not me, it’s you.)

It looks like a React framework from an alternate timeline that forked off before React started introducing hooks in 2018.

Here’s what else Remix 3 includes:

  • State without React — You hold variables in closures and manually call this.update() to re-render.

  • Events over props — Instead of passing callbacks, you dispatch native CustomEvent/EventTarget signals.

  • Frames instead of RSC — Server-rendered HTML “islands” with their own URLs that can reload independently, like iframes reimagined as a rendering primitive.

It’s bold and opinionated, and Michael and Ryan even pitched it as more “LLM-friendly” — because a framework without hidden magic is supposedly easier for AI to generate. Whether that’s actually meaningful, or just something meant to appease Tobi and the rest of the AI maxxers at Shopify is up for debate

Bottom Line: If it works out, Remix 3 could become the purest “web-native” framework that powers the next decade of web dev. And if it doesn’t, the good news is that Remix 4 will probably look completely different.


CodeRabbit logo

Our Friends
(With Benefits)

Painting of Saint Francis holding some doves

Tfw you can use AI to catch all the AI slop code

Cut code review time & bugs in half

AI is generating more code than ever – which is great, until it starts shipping a bunch of slop to production.

Thankfully, CodeRabbit’s AI code review platform is purpose-built to speed up your code reviews and catch AI codegen errors.

It integrates seamlessly into git workflows and your existing toolchain, so it can deliver codebase-aware reviews and support all programming languages.

And developers love it – it’s the #1 most installed AI app on GitHub and GitLab (used in over 2 million repos), and it’s used by OSS projects like Vue, Nuxt, and 70k others.

Try it out for free – they’ve got over 30+ tools to help you catch bugs wherever they’re hiding in your codebase.


Spot the Bug logo

Spot the Bug

Sponsored by Zed

They finally just launched on Windows (!!) and it’s a real native app (not Electron). Download it now and see if everyone’s favorite editor lives up to the hype.

const getCapitalizedInitials = (name) =>
  name
    .trim()
    .split(" ")
    .forEach((name) => name.charAt(0))
    .join("")
    .toUpperCase()

Cool Bits logo

Cool Bits

  1. Lit announced that it’s joining the OpenJS Foundation, two weeks after React established the React Foundation. Sounds about right.

  2. VERT is an open-source file converter that supports 250+ formats and runs fully local for everything but video. And suddenly, I have the urge to rewatch Brink.

  3. Only idiots write manual tests – modern engineering teams like Notion, Dropbox and Wiz use Meticulous to maintain e2e UI tests that cover every edge case of your web app. [sponsored]

  4. Boyd Kane has figured out why your boss isn’t worried about AI, even though he’s a late-stage techno-capitalist being used as a vassal of the state to keep you down.

  5. Jake Archibald wrote about the present and potential future of progressive image rendering.

  6. Tuple is a native remote pair programming app for discerning developers. If you’re sensitive to miscommunication or tools messing with your flow, Tuple is the tool for you. Shared control by default, intuitive annotations, and no persistent UI elements that block the IDE. [sponsored]

  7. Harness is a lightweight framework that lets you execute Jest-like tests in a React Native runtime, directly on a device or emulator.

  8. The Cloudflare Sandbox SDK lets you run secure, sandboxed environments on Cloudflare so your AI agents can execute code, run services and manage files in isolation without the risk of bricking your whole application.

  9. Sentry is hosting a free workshop on Best Practices for Monitoring your Frontend. Sergiy Dybskiy will dive deep into distributed tracing, optimizing site performance with Web Vitals, and lots more in this hands-on session. [sponsored]

  10. ESBuild has implemented Evan Wallace’s TC39 Stage 2.7 Import Bytes proposal, allowing you to import raw bytes as a readonly Uint8Array. You can use it right now in Deno and Webpack.

  11. Astro released View Transitions Level 1 with support in all major browsers.

  12. Zero 0.23 adds synced aka custom queries and React Native support, enabling custom server code on the read path. Now I need to go listen to that whole Yeah Yeah Yeah’s album with the broken egg on the cover and remeber what it’s like to be 18.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Zed

We’re treating forEach as if it returned an array, when it actually returns undefined. Instead, we want to use map, which works similar to forEach, but also creates and returns a new array.

const getCapitalizedInitials = (name) =>
  name
    .trim()
    .split(" ")
    .map((name) => name.charAt(0))
    .join("")
    .toUpperCase()