More React-y than React Native

Issue #453.January 10, 2025.2 Minute read.
Bytes

Today’s issue: The source of my childhood night terrors, fixing Tailwind’s financial problems, and a radical transformation in bathroom break technology.

Welcome to #453.


Eyeballs logo

The Main Thing

Donkey + Shrek baby

How it feels using `useSyncExternalStore` to write my mobile app

More React-y than React Native

By far the most interesting revelation from the 10th annual JavaScript Rising Stars report was that for the first time ever, React Native and Expo didn’t top the list of mobile frameworks that received the most GitHub stars in 2025.

Instead, the top two spots were taken by Snapchat’s Valdi and ByteDance’s Lynx.

And Lynx has been in the news even more lately with their v3.5 release and their newly unveiled plan to bring Lynx to the desktop. Let’s take a closer look.

Quick review: Led by former React core team member Xuan Huang, Lynx calls itself the spiritual successor to projects like Flutter, React Native, and Cordova (it’ll always be PhoneGap to me). It shares the same “write once, render anywhere” ethos as these tools, but it somehow manages to maintain the expressivity of the web without compromising on performance.

This is possible thanks to two novel techniques:

  1. Main-thread scripting – Lynx is written in Rust and uses a dual-threading approach to improve performance. The “main” thread is dedicated to UI and user interactions and runs on their custom JavaScript engine called Primjs, while a background thread handles the rest of the app logic.

  2. Instant first frame rendering – Lynx synchronously renders the UI on the main thread at startup, kind of like SSR for mobile. This makes the app feel “instant.”

And their ReactLynx framework lets you build cross-platform Lynx apps using a deliberately idiomatic, dual-threaded version of React that supports functional components, Hooks, Context, and React libraries like TanStack Query and Zustand – all running at native speed.

Lynx 3.5 doubles down on this even more with experimental support for React Compiler and better CSS support, so that building cross-platform apps feels as close as possible to building for the web. And that’s a promising prospect.

Bottom Line: Against all odds, Lynx is working to become even more React-y than React Native. And it just might be crazy enough to work.


Macroscope logo

Our Friends
(With Benefits)

Aladdin with big eyes

Seeing bugs in my code when I specifically asked Claude to make no mistakes

Macroscope catches more bugs than any other AI code reviewer

It builds an AST-based representation of your entire codebase, allowing it to detect critical bugs that other AI reviewers miss.

The data backs it up. They published their internal code review benchmark, which showed that Macroscope has the highest detection rate of production bugs in open source repos.

Here’s what else it gives you:

  • “Fix it mode” – when you agree with a bug, Macroscope uses SOTA coding models to implement the fix for you, run your GitHub Actions and self-heal any errors

  • High signal-to-noise ratio – it doesn’t spam you with false positives

  • Automated, context-aware reviews – provides concise PR summaries, evaluates changes against linked tickets, and continuously learns to surface only the most relevant insights

Try out Macroscope for free – and get unlimited free access for non-commercial open source projects.


Spot the Bug logo

Spot the Bug

Sponsored by GitLab

RSVP for GitLab Transcend, an exclusive virtual event where engineering leaders will share real stories of how their teams are using agentic AI for software delivery.

function deepCopy(obj) {
  return JSON.parse(JSON.stringify(obj));
}

const user = {
  name: 'Tyler',
  age: 32,
  created: new Date(),
}

const copiedUser = deepCopy(user)

Cool Bits logo

Cool Bits

  1. David Fant demonstrated how to steal any React component without source code or access to the repo. It’s very cool, but I’m not letting him anywhere near my wife.

  2. Simon Willison wrote a review of the year 2025 in LLMs. TLDR: they got good.

  3. Get ahead of the agent wave. Use Tonkotsu’s desktop app to manage an entire team of coding agents from a doc. It’s disciplined, multi-agent engineering built for professionals. Pretty slick. [sponsored]

  4. Marvin Hagemeister wrote this in-depth article about signals vs query-based compilers.

  5. Suren Enfiajyan broke down how JavaScript’s for-of loops are faster than you think. Kind of like how all of Tailwind’s financial problems just got solved faster than you’d think.

  6. Kyle Tryon wrote about why console.log fails in production, and how to implement trace-connected logging with LogTape and Sentry to get greater context. [sponsored]

  7. Ryan Bergamini wants us all to stop doom-scrolling and start doom-coding with this DIY guide to coding on a smartphone. My bathroom breaks just changed forever.

  8. Andrew Nesbitt put together an exhaustive directory of package management tools, libraries, registries and standards.

  9. How to implement passkeys in Next.js is an in-depth guide from the Clerk team that shows you every step building the registration and auth flows with passkeys in a real Next.js application. [sponsored]

  10. Christoph Nakazawa wrote about how he uses LLMs to work on several concurrent projects.

  11. AWS just raised their GPU prices 15%, and I’m sure this is the only time they’ll ever do that so we’re probably all fine.

  12. TkDodo enlightened us all on the secret to building type-safe compound components. It’s like The Secret of NIMH, just without that big owl that gave me night terrors til I was 12.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by GitLab

A deep copy of an object is a copy whose properties do not share the same references as those of the source object from which the copy was made. One approach for deep copying in JavaScript is using JSON.stringify and JSON.parse.

This kind of works in our case, but it will convert created to a string. To prevent that, you can use window.structuredClone instead (assuming browser support).

function deepCopy(obj) {
  return window.structuredClone(obj)
}