react-brain
Browse decisions
React & language foundations 3App architecture 10UI 13Platform & native 9Build, test, observe, secure 6AI in React apps 3stack composerdecision recordscensusstaleness bencharchitecturechangelogmethodologyroadmap

Calibration scorecard

Every recommend.default in the corpus is a dated, falsifiable prediction with a check-by horizon (shorter for fast-moving, low-confidence domains). Adversarial challenges and live npm signals resolve them: held = 1.0 · weakened = 0.5 · overturned = 0.0, scored per confidence tier. This is the page that keeps the word “confidence” honest — an assertion becomes a measurement.

Score by confidence tier

tierpredictionsresolvedheldweakenedoverturnedscore
high11642083%
medium19624067%
low14202050% (early — n=2)

Reading the numbers: 0 of 14 graded predictions have been overturned — every “weakened” verdict means the default survived an adversarial challenge but gained a real caveat, and it's deliberately scored harshly at 0.5. A modest score in the low tier is calibration working: low confidence predicts churn — the tiers earning their ordering (high above low) is the claim this page tests. Tiers marked early have too few grades to read as a trend.

Resolved predictions

react-core weakenedhigh asserted 2026-06-25 · resolved 2026-06-25

“Stay on React 19.2 and turn on React Compiler 1.0 for new code — let it handle memoization; keep existing useMemo/useCallback as escape hatches (don't strip them — removing can change the compiler's o…”

↳ don't strip useMemo when enabling Compiler; re-verify 19.2

state heldhigh asserted 2026-06-17 · resolved 2026-06-25

“Split the problem: TanStack Query for server state + Zustand for client/UI state. This is the common, low-regret 2026 pairing.”

↳ nothing overtook Zustand; local-first builds ON Query

data heldhigh asserted 2026-06-17 · resolved 2026-06-25

“TanStack Query for REST/server-state caching — the default for client-side data fetching.”

↳ TanStack Query still #1; RSC complements; Zero 1.0

nav heldmedium asserted 2026-06-25 · resolved 2026-08-18

“React Native → Expo Router if you're on Expo, else React Navigation. Web → use the meta-framework's router (see RB-E-META-FRAMEWORKS), or TanStack Router for a type-safe SPA.”

↳ re-challenge: RR 44.2M/wk vs TanStack 19.7M (2.2x) but RR 8.3.0 typegen still executes app/routes.ts (framework-mode), so the type-safe-SPA axis is unchanged

meta-frameworks weakenedmedium asserted 2026-06-25 · resolved 2026-07-09

“Web: Next.js is the safe default; choose TanStack Start when you want a less-opinionated, Vite-native RSC stack. RN/universal: Expo Router.”

↳ Next default holds (Start still RC, RSC experimental; 60x dl spike = Lovable CI); default line oversells Start as RSC stack + no-backport patch policy missing

styling weakenedmedium asserted 2026-06-25 · resolved 2026-07-09

“Web: Tailwind (pair with shadcn/ui — RB-E-COMPONENT-LIBS). React Native: NativeWind if you want Tailwind, else StyleSheet/Unistyles. Prefer zero-runtime/compiler approaches on both.”

↳ challenge: s-c v7 prerelease active but still runtime (advice holds); NativeWind TW4 skew caveat; dead react-native-tailwind pkg row fixed

animation weakenedmedium asserted 2026-06-25 · resolved 2026-08-18

“React Native → Reanimated 4 + Gesture Handler 3 for real UI-thread animation & gestures (core Animated only for trivial cases). Web (React DOM) → Motion (framer-motion's successor) for declarative lay…”

↳ challenge: default (Reanimated 4 + GH3 / Motion on web) untouched, but the 'simple fade/slide -> Moti' clause contradicted its own caveat — Moti dormant (npm 2025-01-29, no commits since 2025-03-11, still deps framer-motion ^6.5.1)

lists heldhigh asserted 2026-06-25 · resolved 2026-08-18

“RN: FlashList for large lists, FlatList otherwise, ScrollView only for <20 static items. Web: react-virtual / react-window.”

↳ challenge: web co-defaults both current (react-window 2.3.0, TanStack Virtual 3.14.9); the TRAILING flag was a label/default-text mismatch, now named as its label reads

charts weakenedlow asserted 2026-06-25 · resolved 2026-08-18

“RN: Victory Native (XL) for standard charts; react-native-skia when you need custom/realtime rendering. Web: Recharts (batteries-included) or visx (low-level D3).”

↳ challenge: RN default HELD (victory-native 382k/wk vs gifted-charts 148k/wk; Skia vs SVG substrate) — but web victory is dormant (npm 2025-01-14), label now says so

native weakenedhigh asserted 2026-06-25 · resolved 2026-06-25

“Target the New Architecture (mandatory ≥ RN 0.82). Reach for Expo Modules for most native needs; use Nitro Modules for performance-critical custom native.”

↳ Nitro pre-1.0 (pin); Turbo Modules stay in-core stable; bridge removed 0.85

media weakenedlow asserted 2026-06-25 · resolved 2026-07-09

“Camera → VisionCamera (frame processors) or expo-camera (managed); video calling → LiveKit (open-source) or a hosted SDK (Daily/Agora/Stream); real-time filters → process VisionCamera frames + GPU-com…”

↳ challenge: v5 pin ahead of reality — 85% installs on frozen v4, open iOS26/race crashes; ship-now camera caveat added

storage weakenedmedium asserted 2026-06-25 · resolved 2026-08-18

“Small key-value → react-native-mmkv (fast, synchronous). Relational/large → op-sqlite or expo-sqlite. Secrets/tokens → Keychain / secure-store, never AsyncStorage.”

↳ challenge: secrets advice was an undifferentiated pair — expo-secure-store (57.0.1, ships with SDK) vs react-native-keychain (10.0.0, no release since 2025-03-23, 180 open issues); split by runtime

build heldhigh asserted 2026-06-25 · resolved 2026-06-25

“Web: Vite 8 (Rolldown). React Native: Metro (+ Hermes V1, precompiled iOS binaries). Monorepo: pnpm workspaces + Turborepo. Expo for managed velocity.”

↳ Vite 8 stable + Rolldown GA; napi pullback hits compiler path only

networking heldmedium asserted 2026-07-09 · resolved 2026-08-18

“Use fetch — on Expo SDK 56+ you are already on expo/fetch globally. The bigger win in most apps is the CACHE layer above it (TanStack Query, RB-E-DATA), not the client. Reach for react-native-nitro-fe…”

↳ challenge: axios at 101.7M/wk vs nitro-fetch 91k does not beat a fetch-FIRST default — the entry never recommends nitro-fetch unconditionally, and the axios when-clause already says keep it

Ledger: append-only tools/predictions.jsonl — 44 predictions to date. Unresolved ones aren't shown as wins; the score only counts what has actually been re-examined.