You Should Not Use Relay for Everything
Relay's normalized store is powerful, but it is not free. Not all data benefits from it.
A lounge where you find thoughts on software development, productivity, and life.
Relay's normalized store is powerful, but it is not free. Not all data benefits from it.
We wanted to move an expensive GraphQL store write off the JS thread. A background worklet looked like the answer. But the cost to serialize the data into the worklet made it a no-go. Here is the experiment.
I built one React Native markets app with six data layers — Relay, TanStack Query, RTK Query, Zustand, Jotai, and hand-rolled vanilla — and measured the JS-thread CPU each one burns on a low-end Samsung. The full-fledged server-state libraries buy you real features, but on every cache write (including every live-price tick) you pay for them. Here's the bill.
I benchmarked Animated (native driver), Reanimated 4, and react-native-ease across four animation types on Android — measuring UI + JS frame drops, per-thread CPU, and memory. The winner depends on whether a gesture is involved — plus what Worklets Bundle Mode does to Reanimated's memory.
Verifying whether Expo Router's file-based routing actually solves the eager-aggregator problem — require.context getters, getComponent thunks, and a probe proving route discovery loads zero screens.
We turned on inlineRequires on a large production app and the startup profile barely moved. The reason: eager aggregators — modules that require dozens of others at init time, which the transform structurally cannot defer.
What inlineRequires actually does to your bundle — before/after Metro output, why Expo keeps it off by default, why default imports defeat it on stock RN, and what rnx-kit's tree shaking really changes.
A Hermes CPU profile showed our Android app spending 2.8 seconds on module resolution alone. That one finding kicked off a full investigation into inlined requires, eager aggregators, and how Expo Router handles this by default.
A little to trick to allow you to get access to the latest React Native DevTools
A workaround for the Android UI freeze issue during OTA updates in React Native 0.79.5 when running with the old architecture.
Quick tip on how to enable React Native Core's FLog logs without building from source
An exploration of changes in error boundary behavior in React 19.
Using git merge --no-commit --no-ff to stage selective changes across branches
Quick notes on the future of React Native with its new arch
In this post I share a story ofhow we found a blocking JS thread call within Systrace caused by jail-monkey
This covers how you can get Trace calls from both the native and the JS thread
How to migrate a React Native's Native Module to Turbo Module on Android
Learn how to use Perfetto to capture and analyze app start performance in React Native Android apps, including a script to automate the process.
Hear me out, it's iOS simulator's fault!
Ramblings on the craft and its state given LLMs
LLMs need a way to synthesize information. Bigger context does not yield better results.
Quick tip on how to set React Native Core's feature flag without building from source
Learn about XSS vulnerabilities when interpolating styled-components in React
Using predefined error constants introduces misleading stack traces, which can complicate debugging and error tracking.
A guide on how to listen to uncaught/unhandled errors in React Native
Can Virtual DOM and Vanilla JS handle 40 updates per second from SSE?
A review of a common mistake with Reanimated.
A guide on how to implement Metro's Http Cache in React Native
The cost of large list of objects in GraphQL and possible ways to optimize them.
GraphQL's fragments always fetch irregardless if the consuming component renders or not causing over-fetching
Quick notes on my thoughts on studying Rust.
Can ChatGPT write an entire book about Rust assisted by a developer without Rust expertise?
Explore how to enable exhaustive checks in TypeScript switch cases, enhancing code safety and reducing unhandled errors
mise - A version manager for multiple languages like ASDF, has great developer experience and is not yet an industry standard.
I'm writing a book and course about the tooling one can use to idenfity performance bottlenecks on React Native.
Throughout the years I found that being successful as a remote worker requires special attention to certain details and in this post I want to highlight them for you.
Summary and notes of Andrej Karpathy's The State of GPT keynote at Microsoft Build
Simple implementation of a Visible component that enables you to toggle the visibility of any component.
Have you heard of "The Missing Semester" course provided by a team of instructors at MIT? They promise to go over a set of tools which can help you become a more proficient software engineer.
Today I learned how to easily override an imported module with Metro
Today I learned why the :443 postfix on https domains are used
What if we placed React's Suspense retry logic at the same level as its error boundaries?
Today I learned how to filter files when doing git diff
Today I learned git rebase --onto
Let's take a look at caching FlatList's renderItem when it needs to pass down an ID to the on press of the list's item.
React Native Weekly - The End
React Native Weekly - W10 2022
React Native Weekly Special - Weeks 7, 8, and 9 2022
React Native Weekly - W6 2022
Today I learned why Fzf.vim's preview window was not syntax highlighting.