Samuel Susla
samuelsusla@meta.com
90d · built 2026-05-28
90-day totals
- Commits
- 25
- Grow
- 6.7
- Maintenance
- 4.6
- Fixes
- 0.5
- Total ETV
- 11.8
30-day trajectory
Last 30 days vs. the 30 days before. Up arrows on Growth and ETV mean improvement; up arrow on Fixes share means more time on fixes (worse).
Daily performance
Daily ETV, stacked by Growth, Maintenance and Fixes.
Work-mix over time
Share of Growth / Maintenance / Fixes over a rolling 7-day window. Reads as 'where is effort flowing right now'.
Bug flow over time
Monthly bug flow attributed to this developer. The left bar (red) is bug impact this dev authored that was addressed in the given month — combining bugs others fixed for them and bugs they fixed themselves. The right bar is fixes they personally shipped that month, split between self-fixes (overlap with the red bar) and fixes done for someone else. X-axis is fix-time, not introduction-time — the Navigara API attributes bugs backward to the author at the moment the fix lands.
- Self-fix share
- 20%
- Bugs you introduced
- 2.9
- Bugs you fixed
- 2.4
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
| Repo | Commits | ETV |
|---|---|---|
| react-native | 25 | 11.8 |
Most impactful commits
Top 20 by ETV in the 90-day window.
- 1.9ETVDowngrade offscreen Fabric image requests to prefetch (#56976) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56976 changelog: [internal] Use Fabric layout data to classify image shadow nodes as visible or offscreen on Apple platforms. Offscreen image requests now use `ImageRequestPriority::Prefetch`, which is bridged to the existing `RCTImageLoaderPriorityPrefetch` API, while visible images stay at `Immediate`. The new React Native feature flag defaults to `false` until app-specific gating wires it up. Reviewed By: javache Differential Revision: D106074485 fbshipit-source-id: 80ece75cf0d639be1fdbfdd5f19b838b7b64aba6github.com-facebook-react-native · 5fbcc6bf · 2026-05-27
- 1.4ETVClear RuntimeScheduler queues on error (#56892) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56892 changelog: [internal] Add `enableRuntimeSchedulerQueueClearingOnError` and use it in `RuntimeScheduler_Modern` to clear pending tasks, pending rendering updates, and pending surface IDs before forwarding task or microtask errors to `onTaskError`. Update `SchedulerDelegateInvalidationTest` so `enableSchedulerDelegateInvalidation` can be disabled while the new queue-clearing flag is enabled, proving that stale rendering updates and queued follow-up tasks are dropped after an error. Reviewed By: christophpurrer Differential Revision: D105696366 fbshipit-source-id: 24aa04a8084fb1534bb85785558b503bb8cf619cgithub.com-facebook-react-native · 9cbddbd4 · 2026-05-20
- 1.2ETVAdd fixYogaFlexBasisFitContentInMainAxis flag to avoid unnecessary re-measurement (#55897) Summary: X-link: https://github.com/facebook/yoga/pull/1909 Pull Request resolved: https://github.com/facebook/react-native/pull/55897 changelog: [internal] this change is gated. ## Problem When Yoga computes flex basis for container children, the legacy behavior applies a `FitContent` constraint in the **main axis**, bounding the child's measurement by the parent's available space. This creates a dependency between the child's flex basis and the parent's content-determined size, causing **unnecessary re-measurement and cascading ownership clones** when siblings change size. ### The re-measurement cascade (before fix) ``` ScrollView (overflow: scroll) +-------------------------------+ | Content Container (auto h) | | +---------------------------+ | | | Item A h=200 | | <-- Item A height changes | +---------------------------+ | | | Item B h=300 | | | +---------------------------+ | | | Item C h=150 | | | +---------------------------+ | +-------------------------------+ | v Content container height changes (200+300+150 = 650) | v FitContent(650) re-measures ALL items <-- PROBLEM | because their flex basis was FitContent(old_height) v Cascading clones of the entire subtree ``` With the legacy `FitContent` in the main axis, each item's flex basis is `min(content, parent_height)`. When Item A changes height, the content container's height changes, which invalidates the FitContent constraint for ALL items, triggering a full re-measurement cascade. ### After fix (MaxContent in main axis) ``` ScrollView (overflow: scroll) +-------------------------------+ | Content Container (auto h) | | +---------------------------+ | | | Item A h=200 -> 250 | | <-- Item A height changes | +---------------------------+ | | | Item B h=300 | | <-- NOT re-measured (basis unchanged) | +---------------------------+ | | | Item C h=150 | | <-- NOT re-measured (basis unchanged) | +---------------------------+ | +-------------------------------+ | v Content container height changes (250+300+150 = 700) | v Only Item A is re-measured. B and C keep their MaxContent flex basis (independent of parent height). ``` With `MaxContent`, each item's flex basis is its intrinsic content size, independent of the parent. Changing one item doesn't invalidate siblings. ## Solution This diff adds a `FlexBasisFitContentInMainAxis` errata bit gated by the `fixYogaFlexBasisFitContentInMainAxis` feature flag. When the fix is active, flex basis measurement uses `MaxContent` (unbounded) instead of `FitContent` for container children in the main axis. ### Three check points in `computeFlexBasisForChild` ``` computeFlexBasisForChild(parent, child) | |-- Check 1: Accept positive flex basis when mainAxisSize is NaN | (fixes flexBasis:200 items in ScrollView getting height 0) | |-- Check 2: FitContent vs MaxContent constraint | +--------------------------------------------------+ | | Parent type | Legacy (errata) | Fix | | |--------------------+-----------------+-----------| | | Auto height | FitContent | MaxContent| <-- key change | | Definite height | FitContent | FitContent| <-- preserved | | Scroll container | MaxContent | MaxContent| <-- unchanged | | Text child (any) | FitContent | FitContent| <-- preserved | +--------------------------------------------------+ | |-- Check 3: ownerHeightForChildren fallback (preserves percentage resolution when availableInnerHeight is NaN) ``` ### Why definite-height parents keep FitContent Yoga's default `flexShrink` is 0 (unlike CSS's default of 1). Without FitContent, a child measured at MaxContent would get a flex basis equal to its full content height and never shrink to fit: ``` View (height: 760) View (height: 760) +-------------------+ +-------------------+ | Wrapper (auto h) | | Wrapper (auto h) | | +-----------+ | | +-----------+-----|----+ | | ScrollView| | | | ScrollView| | | | | content: | | | | content: | | | | | 1800px | | | | 1800px | | | | +-----------+ | | | | | | | h=760 (bounded) | | +-----------+ | | +-------------------+ +---|---------+-----|----+ FitContent: wrapper=760 | h=1800 (overflows!) ScrollView can scroll MaxContent: wrapper=1800 flexShrink=0, no shrinking ScrollView frame=1800=content scrollable range = 0! ``` For **definite-height** parents, FitContent is safe (the parent's size is fixed, so no re-measurement cascade). For **auto-height** parents, MaxContent is used to avoid the cascade. ### Percentage resolution preservation (Check 3) When MaxContent is used, `availableInnerHeight` becomes NaN. This would break percentage-height grandchildren. Check 3 derives a definite `ownerHeightForChildren` from the parent-provided `ownerHeight`: ``` View (height: 844) +---------------------------+ | Wrapper (auto h) | availableInnerHeight = NaN (MaxContent) | ownerHeight = 844 | ownerHeightForChildren = 844 (from Check 3) | +-----+ +-----------+ | | |h:500| |h:'50%' | | 50% resolves against 844, not NaN | | | |= 422 | | | +-----+ +-----------+ | +---------------------------+ ``` Children of scroll containers skip this fallback (scroll content is intentionally unbounded). Reviewed By: javache Differential Revision: D94658492 fbshipit-source-id: 1587151670803ace0eae2ee91883fe4be72bfa27github.com-facebook-react-native · 77231f43 · 2026-03-04
- 1.2ETVMove View.js prop transformations to C++ prop parsing (#55853) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55853 Changelog: [Internal] `View.js` previously transformed `aria-*` props to `accessibility*` equivalents, `id` to `nativeID`, and `tabIndex` to `focusable` in JavaScript before passing to the native component. This diff moves all those transformations to the C++ prop parsing layer (`AccessibilityProps::setProp`, `Props::setProp`, and `HostPlatformViewProps::setProp`), making the JS wrapper thinner and faster. ## Benchmark Results (View vs ViewNativeComponent) | Component | Before (median ns) | After (median ns) | Change | | View | 666,750 | 546,917 | **-18%** | This change is gated for safe rollout. Reviewed By: javache, NickGerleman Differential Revision: D94219577 fbshipit-source-id: 6dee071a2a8caea533dbedd21a2294aec38307f2github.com-facebook-react-native · 7f7dbe75 · 2026-03-04
- 1.2ETVPre-allocate mutation vectors in Differentiator to reduce reallocation overhead (#55819) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55819 Changelog: [Internal] speed up differentiator | Test | Before (ms) | After (ms) | Improvement | |-------------------------------|-------------|------------|-------------| | 100 uncollapsable views | 3.0 | 2.7 | +10% | | 1000 uncollapsable views | 91.1 | 50.5 | +45% | | 100 views w/ many props | 9.8 | 9.2 | +6% | | 1000 views w/ many props | 147.4 | 116.7 | +21% | | 1500 views w/ many props | 143.1 | 136.7 | +5% | Reviewed By: mdvacca Differential Revision: D94096006 fbshipit-source-id: 024072e12fc7ba7969ce0ca6969ba8895f38ea15github.com-facebook-react-native · a1062a86 · 2026-03-03
- 1.0ETVRe-land: fixYogaFlexBasisFitContentInMainAxis (#56064) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56064 X-link: https://github.com/facebook/yoga/pull/1917 Re-land of D94658492 with fixes, which was reverted in D95669495. ## Context D94658492 added the `fixYogaFlexBasisFitContentInMainAxis` flag to avoid unnecessary re-measurement cascades in Yoga. When Yoga computes flex basis for container children, the legacy behavior applies a `FitContent` constraint in the main axis, bounding the child's measurement by the parent's available space. This creates a dependency between the child's flex basis and the parent's content-determined size — when one sibling changes size, all siblings get re-measured and their shadow nodes get cloned unnecessarily. The fix switches from `FitContent` to `MaxContent` for non-measure container children under auto-height parents, making each child's flex basis independent of the parent's size. ## What went wrong D94658492 modeled the fix as a `YogaErrata` bit (`FLEX_BASIS_FIT_CONTENT_IN_MAIN_AXIS`). Errata flags are bitmasks, and apps that opt into `ALL` or `CLASSIC` errata (like IGVR and Airwave) inadvertently picked up the new behavior without explicitly enabling the feature flag, causing breakages. ## What changed in this re-land This diff models the fix as a `YogaExperimentalFeature` (`FIX_FLEX_BASIS_FIT_CONTENT`) instead of a `YogaErrata` bit. Experimental features are individually opt-in, so existing apps won't accidentally pick up the change. This diff only wires up the RN feature flag infrastructure (flag defaults to `false`). The iOS MobileConfig override and the Yoga layout logic will be landed in follow-up diffs. changelog: [internal] Reviewed By: javache, NickGerleman Differential Revision: D95852922 fbshipit-source-id: e2b1aa7a5d8f340011123679f721c62396b5caa5github.com-facebook-react-native · ebb2feed · 2026-03-12
- 0.9ETVRemove native View prop transformation flag (#56699) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56699 Remove the `enableNativeViewPropTransformations` React Native feature flag and the native prop parsing code paths it controlled. Keep `View.js` performing the existing JS-side `aria-*`, `id`, and `tabIndex` prop transformations unconditionally. Changelog: [General][Removed] - Remove the experimental native View prop transformation feature flag. Reviewed By: javache Differential Revision: D104024823 fbshipit-source-id: 78b4d2d19fe3661a1b68c2456c7bc8605289ef04github.com-facebook-react-native · 2c2cd9ef · 2026-05-11
- 0.7ETVReplace TinyMap with std::unordered_map in Differentiator (#55680) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55680 changelog: [internal] Replace TinyMap<Tag, X> with std::unordered_map<Tag, X>. There is no detectable regression in performance and code is simpler, let's remove TinyMap. ``` ┌────────────────────────────┬──────────────────┬───────────────────────────────────┬───────────────┐ │ Benchmark │ TinyMap (before) │ unordered_map + ctor size (after) │ Change │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ 100 uncollapsable views │ 1,499,917 ns │ 1,343,333 ns │ -10.4% │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ 1000 uncollapsable views │ 52,148,021 ns │ 44,131,792 ns │ -15.4% │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ 100 views large props │ 5,131,292 ns │ 4,529,937 ns │ -11.7% │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ 1000 views large props │ 82,706,813 ns │ 84,334,167 ns │ +2.0% (noise) │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ 1500 views large props │ 61,470,542 ns │ 62,976,646 ns │ +2.5% (noise) │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ deep (depth=5, breadth=4) │ 32,672,583 ns │ 30,700,542 ns │ -6.0% │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ deep (depth=7, breadth=3) │ 78,523,542 ns │ 74,121,729 ns │ -5.6% │ ├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤ │ deep (depth=10, breadth=2) │ 48,328,562 ns │ 45,702,188 ns │ -5.4% │ └────────────────────────────┴──────────────────┴───────────────────────────────────┴───────────────┘ ``` Reviewed By: NickGerleman Differential Revision: D90346356 fbshipit-source-id: 90a26da056202d75bc74fec0ed00439a8dbf16cbgithub.com-facebook-react-native · e131561e · 2026-03-02
- 0.5ETVExpand Fantom integration tests for FlatList coverage (#55930) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55930 Expand FlatList Fantom tests to improve FlatList.js code coverage from 44% to 62% line coverage. Changelog: [Internal] Reviewed By: zeyap Differential Revision: D94361042 fbshipit-source-id: 4923886eb7adfa5e5513e1e0a58c6b6f6ff72a2agithub.com-facebook-react-native · 4423e857 · 2026-03-05
- 0.4ETVShip useUnorderedMapInDifferentiator (#56918) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56918 changelog: [internal] the experiment was neutral, let's ship it to simplify code Reviewed By: javache Differential Revision: D105943424 fbshipit-source-id: 3ff2ed1dbcb85f640305c4fcb2485db0a8a312fcgithub.com-facebook-react-native · 58012fb4 · 2026-05-22
- 0.4ETVBack out "Add fixYogaFlexBasisFitContentInMainAxis flag to avoid unnecessary re-measurement" (#55989) Summary: changelog: [internal] Pull Request resolved: https://github.com/facebook/react-native/pull/55989 X-link: https://github.com/facebook/yoga/pull/1912 Original commit changeset: 158715167080 Original Phabricator Diff: D94658492 Reviewed By: NickGerleman Differential Revision: D95669495 fbshipit-source-id: a11d59c14521749986271815da535fab7e4a144bgithub.com-facebook-react-native · c0b10573 · 2026-03-07
- 0.2ETVHoist regex patterns to module-level in StyleSheet processors (#56022) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56022 Changelog: [Internal] Hoist inline regex patterns to module-level constants in processFilter.js, processBackgroundImage.js, and processTransformOrigin.js to avoid repeated regex compilation on each function call. Fantom benchmark results (p50 latency, optimized build). | Benchmark | Before | After | Improvement | |---|---|---|---| | 100 views with filter strings | 4.427ms | 3.556ms | 24.48% faster | | 500 views with filter strings | 22.523ms | 17.861ms | 26.10% faster | | 100 views with boxShadow strings | 5.835ms | 5.729ms | 1.85% faster | | 500 views with boxShadow strings | 29.914ms | 28.846ms | 3.70% faster | | 100 views with transformOrigin strings | 2.521ms | 2.512ms | 0.36% faster | | 500 views with transformOrigin strings | 12.706ms | 12.421ms | 2.30% faster | Reviewed By: javache Differential Revision: D95853070 fbshipit-source-id: 788a656fcc626fe0da73fa689298114e53f3b031github.com-facebook-react-native · c35f3e66 · 2026-03-10
- 0.1ETVAdd getDefinedEventHandlers API (#55861) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55861 Add `Fantom.getDefinedEventHandlers(element)` which returns the names of event handlers registered on a component. It Reads committed memoizedProps from the React fiber, so it works for any component type — including component-specific events like ScrollView's onScroll. The alternative we considered was reading the ViewEvents bitmap from `BaseViewProps` in the ShadowNode (C++). That approach only covers View-specific touch/pointer events and onLayout; it misses component-specific events dispatched imperatively (e.g. ScrollView's onScroll), requiring a separate codepath per component type. Changelog: [Internal] Reviewed By: javache Differential Revision: D94936370 fbshipit-source-id: f48b6e37a9e7cf252f396db69e1a43ecca82db96github.com-facebook-react-native · 9ebb3259 · 2026-03-04
- 0.1ETVOptimize processBoxShadow with pre-compiled regex patterns (#55825) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55825 changelog: [internal] Hoist regex patterns to module-level constants to avoid recompiling them on every function call. This optimization targets a hotspot identified via JS sampling profiler. Benchmark results show 6-7% improvement in "views with large props and styles" tests: - render 100 views with large props/styles: 9.48ms → 8.89ms (-6.2%) - render 1500 views with large props/styles: 137.2ms → 127.5ms (-7.0%) Reviewed By: javache, NickGerleman Differential Revision: D92153667 fbshipit-source-id: d4cd98d34e968b2cea5a491ede4ed727273708cdgithub.com-facebook-react-native · b5c815c1 · 2026-03-02
- 0.1ETVfix a regression introduced by fixYogaFlexBasisFitContentInMainAxis feature flag (#56839) Summary: X-link: https://github.com/facebook/yoga/pull/1962 Pull Request resolved: https://github.com/facebook/react-native/pull/56839 changelog: [internal] Limit the FixFlexBasisFitContent height optimization to non-measure container children inside scroll subtrees. This keeps Marketplace Home wrappers outside the ScrollView viewport-bounded while preserving the scroll remeasurement optimization. This regression was discovered during a recent QE where I tried to run enable this optimisation. Reviewed By: christophpurrer Differential Revision: D105167981 fbshipit-source-id: bc988005507ebc1fc1688a8dc77c233e12ac2834github.com-facebook-react-native · 8dfd5483 · 2026-05-19
- 0.1ETVmigrate SectionList from jest to Fantom (#55834) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55834 Migrate SectionList tests from Jest to Fantom. Changelog: [Internal] Reviewed By: huntie Differential Revision: D94887790 fbshipit-source-id: 476161ed73784e450c1ef222e1700612970d1af5github.com-facebook-react-native · de82d61f · 2026-03-12
- 0.1ETVFix Fantom getRenderedOutput not reflecting removed props (#55891) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55891 `RenderOutput::renderView` merged old cached props with new debug props via `mergeDynamicProps`. Since `getDebugProps()` omits default-valued props, removed props were never cleared from the cache. Also, `renderedViews_.insert()` never overwrote existing entries. Changelog: [Internal] Reviewed By: javache Differential Revision: D95055704 fbshipit-source-id: 6cdcbde0473a1d03785f49a9eac79be18395a0bfgithub.com-facebook-react-native · 21e6aa3a · 2026-03-03
- 0.0ETVAdd reset tests for View prop transformations (#55893) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55893 add tests to validate that aria-* props are set back to default correctly when set to undefined Changelog: [Internal] Reviewed By: javache Differential Revision: D95061571 fbshipit-source-id: c035132638fe7223ef544fb422c1a12f57c5fdb6github.com-facebook-react-native · a3a8991d · 2026-03-04
- 0.0ETVAdd tests for aria- props (#55851) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55851 Changelog: [Internal] just missing tests Reviewed By: javache Differential Revision: D94904120 fbshipit-source-id: fb73fc92e0ea30b3e37a1fd5725d3bec1b89fb1fgithub.com-facebook-react-native · 1cd0387d · 2026-03-02
- 0.0ETVAdd image request priority debug overlay (#56970) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56970 changelog: [internal] Add an opt-in `RCT_IMAGE_REQUEST_PRIORITY_DEBUG_OVERLAY` label for Fabric image component views so local debugging can show whether an image request is using immediate priority or the offscreen prefetch path. Reviewed By: christophpurrer Differential Revision: D106363533 fbshipit-source-id: ae68c9a5849dc6507f7611e02c217b674f899bd6github.com-facebook-react-native · d4ae8816 · 2026-05-27