Wonder Round Inc.
2025.04 ~ Present
Day 475 on the job1.
Introduced and operationalized a new OTA (over-the-air code delivery) infrastructure with
hot-updaterTo resolve the structure where urgent bug fixes and QA changes were delayed by the store review cycle, I newly introduced an OTA pipeline with
hot-updaterthat delivers JS bundles over the air without review. Designed and built the whole flow — bundle store integration, a system that manages iOS / Android anddev/beta/proper environment, and the deploy/rollback operations flow.- Problem
Initially all environments shared channels and settings, so a higher-environment bundle could overwrite a lower-environment native build, or a missed settings swap before deploy left the bundle and native mismatched. Wrong key settings repeatedly crashed social login.
SolutionIsolated deploy destinations by an
appVersion+ channel (dev/beta/production) combination, and automated injecting channel/environment settings at build time. Standardized theset-<env>→ deploy → restoredevprocedure to establish a partition so bundles always reach only the intended environment. - Problem
In certain situations the app fell into a force-update (
force update) infinite loop, making normal entry itself impossible — a critical failure.SolutionAdded rollback instrumentation that makes the boot-failure loop observable (current bundle id === minimum bundle id → confirmed boot failure), and secured a manual kill switch recoverable immediately via console/DB to establish a failure-response path.
2.
Introduced a staged-mount pattern to optimize entry performance on key screens
- Problem
On heavy screens that accumulate many
hooksand API calls (lists / map / detail), every widget mounts at the same time on entry, which makes the navigation animation stutter and delays the appearance of theskeleton.SolutionSplit the screen into entry point and body in two stages — show the
skeletonimmediately right after the navigation transition, and detect the end of the transition withsetImmediateso the body only mounts after the animation finishes. Shortened perceived entry lag from ~700–800ms to ~200–300ms. Pre-warmed data shown at the top of the screen with a separate
prefetchhook so that it is already cache-hit by the time the body mounts.Introduced a shared hook that handles scroll event handlers in a JS-thread non-blocking way, so other interactions are not delayed during scrolling.
3.
Built push notification and deep link entry flows
- Problem
When a push is tapped from a cold start, the navigation stack is not ready yet, so routing is sometimes dropped.
SolutionStored the
pending payloadin a globalstoreand consumed the queue once navigation isready, applying an async-queue pattern for routing. - Problem
When the deep link target is a webview screen and the app is launched from a cold start, the navigation stack ends up containing only that single webview, so pressing back terminates the app instead of returning to the previous in-app screens.
SolutionInstead of a plain
navigatecall, I composed thenavigation statedirectly toresetit into a structure whereBottomTabsis the base route and aStack(related underlay screen + webview) is stacked on top. This guarantees a natural back flow: webview → related screen →BottomTabs. Added a normalization layer for the notification list response to match the updated push-sending API schema on the backend.
Implemented a deep link handler that parses the push payload and branches across cold-start / background / foreground entry cases.
4.
Introduced and standardized an optimistic-update pattern with
TanStack QueryStandardized a
cancel → snapshot → cache update → rollbackflow for toggle-likemutations(bookmark / like) to establish immediate optimistic UI reflection and consistent rollback across the team. DirectsetQueryDatacache patching also removes unnecessaryinvalidateround-trips.
5.
Built a Claude Code–based development productivity infrastructure
With the prior RN app developer leaving and domain knowledge handover broken, I had to maintain the app and ship new features alone with limited RN experience. To cut the learning cost and keep domain context always accessible, I designed and built a Claude Code–based assist infrastructure myself.
Split project rules per domain (UI ecosystem / performance / animation / server state / navigation / global state / i18n / new feature flow), so only the rules relevant to the current task are loaded based on keywords.
Role-separated multi-agent pipeline — on top of the
planner → generator → evaluatorimplementation loop, composed a self-verification lane where a separatecriticagent objectively refutes and verifies the analysis, mitigating the bias of single-context self-verification.Turned repeated implementation patterns into skills — codified standardized tasks (adding an API / optimistic-update mutation / screen entry optimization / i18n application) into reusable commands, so I get consistent output without re-explaining conventions every time.
Routed models by task complexity (lightweight lookups → architecture/deep analysis), and tuned prompt caching and reasoning effort to optimize response latency and token cost.
