skip to content
Andrei Calazans

Posts

  • The KMP-on-iOS Scaling Problem That Rust UniFFI Fixes

    Kotlin Multiplatform makes you write a hand-maintained bridge layer on iOS — one file per domain that wraps, streams, and re-maps every Kotlin type into Swift. This is the anti-corruption layer, what it costs, and why a Rust + UniFFI core deletes it as a standing module.
  • What Does Shared Business Logic in Rust Look Like on iOS & Android?

    Put the whole domain — session, repositories, use cases, networking — in Rust, and let SwiftUI and Compose sit on top. The bridge is auto-generated and gitignored. This walks through the idea, the generated bindings, what you lose in Swift and Kotlin at the call site, and whether it scales to hundreds of feature modules.
  • How Does KMP with SwiftUI Scale on iOS?

    On iOS, Kotlin Multiplatform ships your whole shared layer as one linked framework. So does a change to any shared module rebuild everything? I measured it — cold and cached, low-dependency and high-dependency modules, and as the shared layer grows. Real numbers, and the levers that move them.
  • 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.
  • React Native Navigation Benchmarks: What's the Expo Tax?

    A bare RN app vs a blank Expo app — the fixed cost of adopting Expo is ~36 ms and ~13 MB RAM. Then what each extra Expo module adds, and why the Hermes profiler over-attributes 100–240 ms to @expo.
  • React Native Navigation Benchmarks: What Does Navigating to a Screen Cost?

    Press → paint measured across four libraries on a trivial screen and a heavy 24-row list. JS call stacks reveal each library's architecture — and why 'first frame' means very different things when the destination actually has work to do.
  • React Native Navigation Benchmarks: Deep Diving Where Time Is Spent

    Why Expo Router costs 3× cold start and RAM, what React Navigation adds on top of rn-navigation, the Hermes hot-function breakdown for each library, and a controlled experiment isolating Reanimated.