
How to keep canonical assets in a React Native monorepo
9 min readWritten by: Jonathan Reis on
A practical asset-library pattern for React Native apps, static sites, store exports, and shared audio without losing the editable original.
Development journal
Published notes filed under this topic.
RSS feed
Written by: Jonathan Reis on
A practical asset-library pattern for React Native apps, static sites, store exports, and shared audio without losing the editable original.
Written by: Jonathan Reis on
Use one editable icon source, an opaque iOS raster, and a transparent Android adaptive foreground so launcher masks do not crop your artwork.

Written by: Jonathan Reis on
A practical event model for distinguishing a completed row, column, or block from the ninth correct placement of one digit, then routing both through sound and haptic feedback.

Written by: Jonathan Reis on
A practical strategy for launching Sudoku, Nonogram, Hashi, and other logic puzzles as independent products before connecting them in a shared collection.

Written by: Jonathan Reis on
Step by step how I ran the first iOS build of an Expo app (Sudoku) that already built on Android, in a pnpm monorepo: prebuild, pod install, xcodebuild Release, simulator. Includes the three traps that block the build (babel, Hermes prebuilt, Firebase mock) and how to fix each one in versioned source files.

Written by: Jonathan Reis on
An Expo POC hosts Godot in a native Android View, fixes the RN↔GDScript bridge, and replaces thousands of nodes with batched drawing; on iOS, the diagnosis shows why a build and bootstrap do not prove Simulator rendering.

Written by: Jonathan Reis on
Why the declarative Skia renderer with 81 React components per cell struggled on low-end devices, and how reimplementing the board with Skia.PictureRecorder + <Picture> removes the reconciler from the render hot path.

Written by: Jonathan Reis on
How we used Loki user-agent logs, iPhone model usage data, and mobile screen-resolution stats to choose practical aspect-ratio targets for a React Native game layout.

Written by: Jonathan Reis on
A solo developer walks through a Nielsen-based heuristic evaluation of a published React Native game, prioritizes the findings, and measures the score change after fixing them. Practical process for indie devs without a UX team.

Written by: Jonathan Reis on
After nine Play uploads on versionName 0.1.0, lint overwriting production config, and ambiguous build script names, we documented SemVer rules, dev/prd commands, and why lint must not regenerate config.

Written by: Jonathan Reis on
Validate Firebase Analytics in a production React Native APK by combining local debug logs with the realtime response behind GA4 DebugView, even when its device counter says zero.

Written by: Jonathan Reis on
A practical release checklist for AdMob UMP in an Expo/React Native Android app, covering GDPR messages, US state privacy messages, app store linking, and the SDK gate before ads can request.

Written by: Jonathan Reis on
A win-screen celebration overlay fell behind the result cards and dropped too fast. The cause was React Native's sibling paint order, not a missing z-index. Here is why zIndex alone is not enough on Android and how we fixed both bugs.

Written by: Jonathan Reis on
Our Sudoku blocked pencil marks that conflicted with the row, column, or box. It felt like a safety check. It was actually a free solver that told players which numbers were still possible. Here is the fix and the principle behind it.

Written by: Jonathan Reis on
We wanted physical-keyboard input in a React Native game on Android. The classic hidden TextInput trick failed under Fabric because showSoftInputOnFocus is ignored. adb proved it, and a config plugin fixed it for good.

Written by: Jonathan Reis on
A border on an overflow-hidden container silently shifted our Skia board and un-centered every digit. Here is how screenshots, not eyeballs, found the real cause in a React Native game.

Written by: Jonathan Reis on
A developer shortcut hidden behind __DEV__ disappeared exactly when we needed it in a release build. Here is why that happens in React Native and how we moved the gate to runtime config.

Written by: Jonathan Reis on
How we gave a template-looking Sudoku a bold art direction by changing the theme tokens first, sharing them with our website, and staying inside a low-end performance budget.

Written by: Jonathan Reis on
How Daily Sudoku added a persisted vibration toggle, reused gameplay feedback events, and kept Web bundling safe while using expo-haptics on native.

Written by: Jonathan Reis on
How we reduced the gap between Web and app in an Expo/React Native game by replacing synthetic tones with bundled WAV assets and configurable audio logs.

Written by: Jonathan Reis on
A field note on testing a React Native Skia canvas board with Playwright, replacing DOM-only selectors with a narrow test bridge, and keeping persistence deterministic.

Written by: Jonathan Reis on
How one React Native sound setting ended up owning gameplay effects, Android tap feedback, and a double-toggle bug in a nested Switch.

Written by: Jonathan Reis on
How we measured React Native response time from tap handler to state update and paint when frame stats did not explain what players felt.

Written by: Jonathan Reis on
How we tested a Skia Sudoku board behind config without deleting the React Native renderer, accessibility layer, or rollback path.

Written by: Jonathan Reis on
A practical field note on fixing a missing native splash after an Expo SDK upgrade by moving from the legacy splash block to the expo-splash-screen plugin.

Written by: Jonathan Reis on
How to build a local Expo/React Native AAB for Google Play and still validate signing, Firebase, Sentry, AdMob, RevenueCat, and Play delivery like a real release.

Written by: Jonathan Reis on
A release bug where Google Play installed a new Android versionCode while the React Native JavaScript bundle still reported the old Sentry release.