RSSAmplifier

Blog

Andrei Calazans

A lounge where you find thoughts on software development, productivity, and life.

andrei-calazans.comRSS feed ↗137 posts

Latest posts

You Should Not Use Relay for Everything

Relay's normalized store is powerful, but it is not free. Not all data benefits from it.

Why We Did Not Move MMKV Writes to a Worklet: The Serialization Cost

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.

What Does a GraphQL / Server-State Client Cost You Per Request?

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.

Which React Native Animation Library Should You Use for Performance?

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.

Exploring Inlined Requires: Does Expo Router Give You Screen-Level Lazy Loading?

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.

Exploring Inlined Requires: When Flipping the Flag Does Nothing

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.

Exploring Inlined Requires: How They Really Work

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.

Exploring Inlined Requires to Improve Cold Start

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.

Did You Know You Can Use Latest React Native DevTools Without Upgrading?

A little to trick to allow you to get access to the latest React Native DevTools

UI Freeze Workaround for React Native Expo OTA Updates

A workaround for the Android UI freeze issue during OTA updates in React Native 0.79.5 when running with the old architecture.

How to enable React Native Core's FLog logging on Android

Quick tip on how to enable React Native Core's FLog logs without building from source

React 19 Error Boundary Behaves Differently

An exploration of changes in error boundary behavior in React 19.

git merge andrei/cmr-v6 --no-commit --no-ff saves the day

Using git merge --no-commit --no-ff to stage selective changes across branches

The Future Of React Native

Quick notes on the future of React Native with its new arch

Finding a blocking JS thread call from a Systrace

In this post I share a story ofhow we found a blocking JS thread call within Systrace caused by jail-monkey

Bridging Trace API on Android

This covers how you can get Trace calls from both the native and the JS thread

Migrating a React Native's Native Module to Turbo Module on Android

How to migrate a React Native's Native Module to Turbo Module on Android

Perfetto To Analyze App Start Performance in React Native Android Apps

Learn how to use Perfetto to capture and analyze app start performance in React Native Android apps, including a script to automate the process.

iOS Simulators Are Why React Native Apps Are Slow

Hear me out, it's iOS simulator's fault!

A career in software development

Ramblings on the craft and its state given LLMs

LLMs Need a Working Memory

LLMs need a way to synthesize information. Bigger context does not yield better results.

How to set React Native Core's feature flags on Android

Quick tip on how to set React Native Core's feature flag without building from source

The XSS dangers in interpolating styled-components

Learn about XSS vulnerabilities when interpolating styled-components in React

Why Predefining Errors as Constants is Problematic

Using predefined error constants introduces misleading stack traces, which can complicate debugging and error tracking.

How to listen to uncaught/unhandled errors in React Native

A guide on how to listen to uncaught/unhandled errors in React Native

Can HTML Render 40 Updates Per Second

Can Virtual DOM and Vanilla JS handle 40 updates per second from SSE?

Reanimated Can Block Your JS Thread

A review of a common mistake with Reanimated.

How To Implement Metro's Http Cache

A guide on how to implement Metro's Http Cache in React Native

Hidden Cost of Large List of Objects in GraphQL

The cost of large list of objects in GraphQL and possible ways to optimize them.

The Problem With Relay Fragments And Conditional Rendering

GraphQL's fragments always fetch irregardless if the consuming component renders or not causing over-fetching

What do I think of studying Rust?

Quick notes on my thoughts on studying Rust.

An experimment: Rust basics by ChatGPT

Can ChatGPT write an entire book about Rust assisted by a developer without Rust expertise?

Enhancing Safety in TypeScript: Exhaustive Checks for Switch Cases

Explore how to enable exhaustive checks in TypeScript switch cases, enhancing code safety and reducing unhandled errors

You should be using mise

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/Course On React Native Performance Tooling

I'm writing a book and course about the tooling one can use to idenfity performance bottlenecks on React Native.

How to Succeed Working Remotely

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.

The State Of GPT by Andrej

Summary and notes of Andrej Karpathy's The State of GPT keynote at Microsoft Build

How do you toggle a component's visibility without losing its UI space?

Simple implementation of a Visible component that enables you to toggle the visibility of any component.

Why you should do “The Missing Semester” by MIT

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.

How to override a Node.js module with React Native's Metro config

Today I learned how to easily override an imported module with Metro

Why :443 is postfixed in https request domains?

Today I learned why the :443 postfix on https domains are used

A Retriable Suspense Wrapper

What if we placed React's Suspense retry logic at the same level as its error boundaries?

Git diff file filtering

Today I learned how to filter files when doing git diff

How do you change the base of a branch in Git?

Today I learned git rebase --onto

How do you cache FlatList.renderItem? Is the below FlatList.renderItem properly cached?

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 - The End

React Native Weekly - W10 2022

React Native Weekly - W10 2022

React Native Weekly Special - Weeks 7, 8, and 9 2022

React Native Weekly Special - Weeks 7, 8, and 9 2022

React Native Weekly - W6 2022

React Native Weekly - W6 2022

Why won't Fzf.vim's preview window syntax highlight

Today I learned why Fzf.vim's preview window was not syntax highlighting.