Build an AI review skill and test its missed issues and false positives
Turn a save-flow review into a focused skill, evaluate fresh defective and valid cases, and preserve the distinction between expected answers and observed results.
Blog
Field notes on React Native, shipping to the App Store & Google Play, and building apps that hold up in production.
Turn a save-flow review into a focused skill, evaluate fresh defective and valid cases, and preserve the distinction between expected answers and observed results.
Use a controlled pending request to expose duplicate saves, verify recovery, and separate helper tests from native integration evidence.
Inspect admission before await, per-owner lifetime, failure release and the separation between request control and UI feedback.
Turn repeated Save requests into acceptance cases and provide the verified project context an AI assistant needs.
Trace HLS playback across inline, mini-player and fullscreen surfaces, then give the stream one playback owner.
Trace a native exception before React mounts, preserve secure random bytes, and persist the fix with patch-package.
A source-recorded intro animation crash reveals a runtime boundary that TypeScript and React error boundaries do not protect.
Separate a one-time POST bootstrap from the browsing WebView, preserve the reading page on renewal, and bound failed session recovery.
Choose update delivery from installed native capabilities and the gate from the minimum supported version.
Persist offline writes, reuse an idempotency key and interpret the server outcome before removing queued intent. A documented 409 correction and the remaining retry, auth and storage boundaries.
Share a pending token refresh across Axios, a chat stream and a live connection. Replace rotating credentials, retry once, and distinguish throttling from an ambiguous refresh failure.
Trace native collection before JavaScript, inspect the built plist, and verify Crashlytics with deliberate test events. A source-backed production investigation with clear evidence limits.
Who I am, what I've shipped, and why this blog exists.
Why a year range reads 2026-2008, why an Arabic keyboard leaves OTP boxes blank, and why a delivery date comes out Hijri. Three defaults, and the code that replaces each one.
Why translation is a runtime change while layout direction is a native flag, why you must flush storage before rebooting, how to use logical properties, and how to mirror navigation icons.
Why connected is not reachable, why reachable is not your API being up, how to write a safe NetInfo banner, and how to seed TanStack queries from disk using initialData.
Why cold starts deliver incoming URLs twice through getInitialURL and the url event listener, how to implement a consume-once guard, and how to queue intents until navigation is ready.
Why bare redux-persist migrations drop auth state on every boot, how to delete deprecated keys safely, and how to build a user state reset registry for clean sign-outs.
Why rapid stepper taps create out-of-order network race conditions, how to implement dual-state pending tracking, and how to collapse multiple taps into a single confirmed save in React Native.
How to handle all four permission states in React Native, guide blocked users to Settings, support Android 13 READ_MEDIA_IMAGES, and configure Axios multipart boundaries cleanly.
Why Axios defaults to waiting indefinitely, how to scope per-request timeouts to best-effort lookups, and how to build fallback states so network delays never freeze your checkout.
How to structure form state with Formik and Yup, display field-level validation errors, retain typed inputs across API failures, and prevent duplicate submissions with shared button guards and idempotency keys.
Why Android 15 edge-to-edge enforcement ignores adjustResize, how one native values-v35 resource rescues your forms, and how to migrate to inset-aware layouts before Android 16.
Understand UIKit presentation conflicts in React Native, why setTimeout fails, and how to queue modal presentation safely with useSyncExternalStore.
Separate invalid indices from measurement failures, find the target by stable ID, and bound scroll recovery without opening the wrong photo.
A FlatList item can contain a whole section. Control initial work, diagnose repeated row renders, and apply memoization where it helps.
Coordinate FlatList pagination, deduplicate rows, retry the same page, and prevent late load-more responses from corrupting refresh.
Keep the input responsive, distinguish empty results from errors, retry the right query, and reuse a correctly scoped cache. This lesson closes the Search module.
A fast submit can use a suggestion for the previous word. Match its query to the submitted term before following its redirect.
Build a search box that waits for a pause in typing. A beginner guide to useDebounce, timer cleanup, and keeping the input responsive.
Permanent draft fixture. It verifies right-to-left post rendering with LTR-isolated code blocks. Never published; kept as a visual regression canary.