Introducing Solito 5 and the Web-Native Mindset

Featuring
Łukasz Chludziński
Engineering Manager
@
Callstack
Fernando Rojo
Head of Mobile
@
Vercel
Kewin Wereszczyński
Software Engineer
@
Callstack
Szymon Chmal
Software Developer
@
Callstack

This week’s session brought Fernando Rojo, the creator of Solito and Head of Mobile at Vercel, to walk us through Solito 5 and the patterns behind building truly shared web and mobile experiences.

Introducing Solito 5

The conversation kicked off with the motivation behind Solito: giving teams a way to write React Native and Next.js apps that share screens, logic, and structure without compromising the strengths of either platform. Solito’s core ideas center on flexibility rather than forcing a single paradigm across platforms. Navigation remains native to each environment-React Navigation or Expo Router on mobile, and Next.js routing on the web, while the screens and business logic live in shared packages.

How Solito structures cross-platform projects

Fernando walked through the starter setup: a monorepo with apps/ for platform shells and packages/app for shared screens and logic. The key concept is simple but powerful: the “app shells” on each platform decide how navigation and routing work, while the screens themselves stay platform-agnostic. This avoids the pitfalls of trying to replicate mobile navigation on web, or forcing web layout patterns into React Native.

Instead, Solito provides a small set of primitives-like Link and typed routes, that adapt to both environments. When needed, platform-specific files (.native.tsx, .web.tsx) allow for fine-grained behavior without fragmenting the codebase.

Real-world constraints: Auth, styling, and navigation

Then, we explored real-world scenarios where the two platforms diverge. Take authentication as an example: mobile might use Apple or Google sign-in, and web might use cookies or server-managed sessions. Fernando explained how to approach these differences through shared interfaces and platform-specific implementations.

We also covered platform-aware navigation, gradual adoption paths, and how teams can migrate an existing Expo or React Native project into a Solito monorepo without a full rewrite. Solito pairs especially well with Expo Router since both ultimately target React Navigation under the hood.

The state of styling: React Native Web, Strict DOM, Uniwind, and more

A major update in Solito 5 is the removal of React Native Web from the core web rendering path. Instead, Solito now renders pure HTML + Next.js components, which opens the door to modern styling solutions like Tailwind, ShadCN, and design systems without React Native Web’s constraints. Fernando discussed upcoming tools like Uniwind, high-performance Tailwind for native, and React Strict DOM, which flips the classic approach by bringing web styling primitives to native instead of the other way around. Both offer a glimpse of how shared UI may evolve.

Building cross-platform apps without compromises

The session highlighted a key philosophy behind Solito: shared code should not come at the cost of platform quality. Solito exists not to merge web and native into a single abstraction, but to allow teams to build first-class experiences on each side while reusing as much logic and UI as possible.

Fernando emphasized that Solito shines in mature, multi-target apps where teams care about performance, fine-tuned navigation, and long-term maintainability. For newer developers, Solito’s flexibility may feel overwhelming at first, but its patterns closely follow how real production apps evolve over time.

What’s next for Solito and the ecosystem

Fernando teased ongoing work in the ecosystem, from Uniwind to Vercel’s mobile efforts-and encouraged developers to explore Vercel’s new v0 app, built heavily with React Native and native code. He also hinted at a deep-dive blog post about the app’s architecture, spanning AI, native modules, and cross-platform UI.

Insights

Learn more about Cross-Platform

cover

Feb 27Article

Sparkling: The Missing App Layer for Lynx.js?

A hands-on look at Sparkling for Lynx.js: CLI, native navigation, and the tooling layer that turns Lynx into a full mobile app framework.

cover

Feb 12Live Stream

Sparkling: A New Framework for Lynx

Join the Lynx team live as we explore Sparkling, its boundaries with Lynx, core features, and bootstrap a project from scratch.

cover

Dec 19Article

Visualizing the Dual-Thread Model of Lynx JS

A practical look at Lynx JS’s dual-thread runtime, using real examples to show how main and background threads behave under load.

cover

Dec 2Live Stream

Two Threads of Lynx.js Part 2

Learn how Lynx.js uses a dual-threaded model, how its APIs work, and what it means for performance in this live session with Lukasz Chludzinski and Kewin Wereszczynski.

cover

Nov 27Live Stream

Exploring Lynx.js and Its Two-Thread Runtime

A recap of our live session exploring how Lynx.js splits work across a main thread and a background thread.

cover

Nov 7Article

Exploring Lynx JS: From Quick Start to CLI Workflows

Learn how to set up Lynx JS, explore its ecosystem, and use the Community CLI to build native apps with a familiar JavaScript workflow.

cover

Sep 19Podcast

React Native at Scale With NFL

Discover how the NFL uses React Native, Expo, and a monorepo to ship apps across iOS, Android, web, and TV with one stack.

cover

Aug 5Article

How Node-API Works in React Native: A Deep Dive

A closer look at how Node-API works in React Native, covering addon loading, bundling, the host package, and new build tools like cmake-rn and ferric-cli.

cover

Feb 7Article

Bringing WebAssembly to React Native With Polygen

Discover Polygen, a toolkit that brings WebAssembly to React Native, compiling WASM to C for near-native performance with no runtime overhead.

cover

Dec 20Article

From Native to Multiplatform Development: Unpacking Kotlin and Compose

Discover how Kotlin Multiplatform, Jetpack Compose, and Compose Multiplatform compare to React Native. Learn their roles, relationships, and use cases.

cover

Aug 7Podcast

Open Mobile Hub: Non-GMS and Cross-Platform Possibilities

When you build applications, do you ever consider users who may not have access to Google Mobile Services? They may not be your target audience now, but it's good to be aware of what options you have in store for non-GMS devices — which is exactly what we're talking about in this episode!

cover

May 31Podcast

Stepping Into New Dimension With React Native VisionOS

Try immersing yourself in the React Universe with React Native visionOS! Listen about the latest changes in the framework & watch a 3D app demo.

cover

Mar 19Tutorial

The Hard Way vs. The React Native AI SDK Way: Stop Writing Custom Modules for Every Model

Learn how React Native AI uses a unified provider model to switch between cloud and on-device LLMs without rewriting application logic, enabling reliable AI experiences online and offline.

cover

Mar 12Tutorial

Build Smarter Apps: Tool Calling & AI Orchestration Explained

Learn how on-device models in React Native can call tools, interact with external APIs, and return structured outputs you can use directly in application logic.

cover

Mar 5Tutorial

MLC LLM + React Native: On-Device AI Without the Pain

Learn how to run third-party on-device LLMs in React Native using MLC LLM. Choose your models, run them efficiently across platforms, and keep a unified JavaScript API with React Native AI.

cover

Feb 24Tutorial

Intelligent Fallbacks with Apple Intelligence in React Native

Learn how to use Apple’s built-in Foundation Models in React Native apps, reduce memory usage, and enable fast, fully on-device AI with React Native AI Apple.

cover

Feb 10Tutorial

What Is the React Native AI SDK? A Complete Intro & Quickstart

Learn why on-device AI matters for React Native apps, how local LLMs behave offline, and what problems React Native AI is designed to solve from day one.

cover

Jan 29Tutorial

Implementing an Android TurboModule with Kotlin

Learn how to implement a React Native TurboModule on Android, from the TypeScript spec and Codegen to the Kotlin implementation and package registration.

cover

Jan 19Tutorial

Working with Different Threads in Swift TurboModules

Learn how JavaScript, native module, background, and main threads interact in React Native TurboModules, and how to use GCD queues to run async work safely in Swift.

cover

Jan 9Tutorial

How to Add Type-Safe Constants to Swift TurboModules

Learn how to expose typed, immutable constants from a Swift TurboModule using Codegen, and get full end-to-end type safety between native and JavaScript.

cover

Dec 30Tutorial

Adding Event Emitters to Your TurboModule in Swift

Learn how to emit native events from a Swift TurboModule and subscribe to them in JavaScript, including proper memory management and Codegen integration.

cover

Dec 22Tutorial

Writing Your First TurboModule in Swift

Learn how to build a fully working TurboModule in Swift, integrate it with Codegen, and bridge it through Objective‑C inside an Expo app.