Snapchat is coming for React Native

Issue #440.November 12, 2025.2 Minute read.
Bytes

Today’s issue: Ancient Mayan predictions about WebAssembly, billions of GitHub dad jokes, and still waiting for big tech to stop hating.

Welcome to #440.


Eyeballs logo

The Main Thing

DJ Khaled snapchat saying, they jealous it sad

Snapchat when they release v1 of their cross-platform framework before React Native

Snapchat is coming for React Native

At least that’s what it felt like last week when they open-sourced Valdi, a cross-platform UI framework that’s promising the best of both worlds: “true native performance” across platforms and a smooth developer experience that’s built for speed.

It’s still in beta for now, but Valdi has apparently been used in Snap’s large production apps for the last 8 years – so you know it’s been intensely battle-tested from processing all those unsolicited nudes and rainbow-vomit selfie filters.

But what makes it different from React Native and other cross-platform frameworks? The biggest thing is that it lets you write declarative TypeScript components, which compile into platform-native views that are managed by its C++ layout engine – with no web views, no JS bridge, and no React-style runtime. It also generates type-safe bindings between your TypeScript code and the native platforms, so you get automatic code generation and native API access without needing a bunch of glue code.

Here are a few other key features that double down on this approach even more:

  • Smarter rendering – It uses automatic view recycling, viewport-aware rendering, and an optimized layout engine to minimize redraws and keep scrolling silky-smooth.

  • Web-style DX – It comes with instant hot reload, full VS Code debugging, and TSX components with full type-safety, so that building native apps feels faster and more like building web apps.

  • Flexible adoption – You can embed Valdi into existing UIKit or Android view hierarchies and mix in Swift, Kotlin, or C++ modules when you want.

Bottom Line: Did we just stumble into a golden age of cross-platform UI frameworks? TikTok open-sourced Lynx a few months ago, Meta’s React Native just rolled out its new bridge-less architecture, and now Snapchat has blessed us with Valdi.

If this keeps up, we may need a new unifying law of cross-platform physics: the higher the rate of Brain Rot Per Scroll, the more robust the open-source output of the engineering team.


QA Wolf logo

Our Friends
(With Benefits)

A dog tying a tie

Putting on a brave face before those EOY performance reviews

Beat your EOY deadlines, without losing your sanity

December ship panic is real, but QA Wolf can help your team hit all its goals before the end of the year.

They’ll get you fully automated test coverage for your entire application, so you can cut your QA cycles to under 15 minutes and ship faster.

Here’s how:

  • They build and maintain hundreds of automated Playwright tests for your app
  • You get unlimited parallel test runs on their infrastructure, so you get results fast
  • Zero flakes, because every failed test gets reviewed by their human QA engineers

Get a personalized demo for your team to see how they save their average customer 9 hours/week per engineer.


Spot the Bug logo

Spot the Bug

Sponsored by Zed

They just launched Agent Extensions, which lets you test drive coding agents from Augment Code, Opencode, and more from right inside Zed’s next-gen editor.

class User {
  async constructor(userId) {
    const user = await getUser(userId)
    this.id = user.id;
    this.name = user.name;
    this.email = user.email;
  }
  ...
}

Cool Bits logo

Cool Bits

  1. Andrew Sampson wrote about embedding TypeScript using the Hako JavaScript engine, which compiles down to WebAssembly. All of the ancient Mayan calendars I’ve been studying point to 2026 being the year of the Wasm, so this is a good early omen.

  2. Uniwind is the fastest Tailwind bindings for React Native, built by the creators of Unistyles. And the cross-platform golden age continues.

  3. Meta Horizon Start Developer Competition is on – with $1.5M in prizes for the best apps. Need ideas? Here’s some inspo to get you started. [sponsored]

  4. Matt Zeunert explained how to throttle specific requests in Chrome DevTools. I’m not sure why, but “throttling” something sounds like it should be illegal.

  5. Storybook 10 comes with only one breaking change but it’s a good one: it’s ESM-only now.

  6. CodeRabbit’s OSS Program gives open-source projects free access to all their Pro-tier code review features. Used by projects like Bun, Vue, Nix, and 100k+ others to ship better code. [sponsored]

  7. Cassidy Williams analyzed nearly a billion GitHub commits to assess the state of the developer workflow in 2025. That’s only half as many dad jokes as she analyzes for each issue of her newsletter, but it’s still a lot.

  8. The Svelte team wrote a quick roundup of what’s new in Svelte these days.

  9. Apryse’s Template Data Extraction SDK lets you automate all your ACORD extraction to cut processing time, eliminate errors, and scale high-volume workflows. [sponsored]

  10. Why is Zig so Cool? I would argue that it’s because it starts with a Z and rhymes with “cig”, but Nilo Stolte wrote a more technical analysis.

  11. jyn wrote about the terminal of the future, and how it’s sadly not just a terminal that plays Phil of the Future on repeat while doing all your work for you.

  12. David Bushell is campaigning to keep XSLT alive, since Google just announced plans to deprecate it by 2027 (after already trying to kill it back in 2013). If you’re unfamiliar, XSLT was created in 1999 for “transforming XML documents into other XML documents” – so it makes sense that David’s site feels like a late ’90s fan page for Sum 41. So am I still waiting, for big tech to stop hating.


Spot the Bug logo

Spot the Bug: Solution

Sponsored by Zed

JavaScript doesn’t allow class constructors to be async. We have to do any async actions outside of a constructor. Static class methods can help with this.

class User {
  static async init(userId) {
    const user = await getUser(userId);
    return new User(user);
  }
  constructor(user) {
    this.id = user.id;
    this.name = user.name;
    this.email = user.email;
  }
}

const me = await User.init(1)