github.com-facebook-hermes
all · 31 devs · built 2026-06-08
Repository snapshot
Monthly reports
Highlights
- Enhanced *Hermes Promise polyfill* rejection tracking to be spec-compliant by passing the rejected Promise instance as a third argument to `onUnhandled` and `onHandled` callbacks, enabling correct `PromiseRejectionEvent` population in downstream consumers ([commit/3d71c698]).
- Introduced new *JSI APIs* (`IEventLoopControl` and `ISetEventLoopControl`) to `hermes-interfaces.h`, providing the *Hermes VM* with the capability to manage its event loop and delegate asynchronous tasks, particularly crucial for *Hermes Workers* ([ae855414 · Chi Tsai]).
- Improved *CPU sampling timestamp accuracy* within the *Hermes VM's profiling subsystem* on *Apple platforms* by utilizing `clock_gettime_nsec_np(CLOCK_UPTIME_RAW)`, ensuring continuous, non-sleeping timelines for more reliable performance analysis ([f4ac05d3 · Ruslan Lesiutin]).
- Optimized *JSI layer performance* by refactoring the `dynamicFromValue` function to pre-allocate memory for `folly::dynamic` arrays when converting JSI Arrays, significantly reducing reallocations for larger data structures ([829dcd74 · generatedunixname1389709262956747]).
- Addressed a `-Wunreachable-code-return` build error in the vendored *LLVM fork* within `Host.cpp`, providing a critical fix to unblock *Origami Studio* alpha and beta builds on CI ([7f186d96 · Rob Wood]).
Observations
- All measured scores for May 2026, including total output, grow, maintenance, and waste, were 0. This represents a significant decrease across the board compared to the 2-month average.
- Total output for May 2026 was 0, a 67% decrease compared to the 2-month average of 1.
- Grow score was 0, a 63% decrease compared to the 2-month average of 0.
- Maintenance score was 0, a 77% decrease compared to the 2-month average of 0.
- Waste score was 0, a 96% decrease compared to the 2-month average of 0.
- Commit volume for May 2026 was 6, a 37% decrease compared to the 2-month average of 10 commits, consistent with the overall reduction in activity.
- The commit [7f186d96 · Rob Wood] addressed a build fix for a `-Wunreachable-code-return` error in the vendored *LLVM fork*, highlighting the ongoing need to manage compiler warnings and external dependency compatibility.
- The enhancement to *Promise polyfill* rejection tracking in [commit/3d71c698] included explicit updates to `test/hermes/promise.js`, indicating good practice for ensuring new features are adequately tested.
Performance over time
ETV stacked by Growth, Maintenance and Fixes — 90-day moving average, normalized to ETV / month.
Average performance per developer
ETV per active developer per month — 30-day moving average.
Active developers over time
Unique developers committing each day — 90-day moving average.
Knowledge concentration
How dependent is this repo on a small number of contributors? Higher top-1 share = higher key-person risk.
Chi Tsai owns 20.0 % of commits.
Top contributors
Most impactful commits
Top 20 by ETV in the all-time window.
- 3.0ETVReplace use of private serde and quote internals Summary: This crate is blocking a serde update. These APIs are not public and not stable over time. You are not supposed to use them. https://www.internalfb.com/code/fbsource/[45d32fb2e51fdc0f015a735a18b284c2aae7fc98]/xplat/hermes/unsupported/hermes/crates/hermes_estree_codegen/src/codegen.rs?lines=11%2C360%2C736%2C755%2C790 Reviewed By: diliop Differential Revision: D82673555 fbshipit-source-id: bf094b3f5ed122d4e86d184a02a900300c8c4c36David Tolnay · 96c99c98 · 2025-09-18
- 1.5ETVBackport multi-session debugger support Summary: Backport from static_h of D90862351 (a bugfix) and the multi-session debugger stack (D90585931 through D90862348). Local changes on top of the graft: - Add CDPAgentMultiDebuggerTest.cpp to srcs and CDPAgentTest.h to headers in BUCK - Add DebuggerDomainCoordinator.cpp to srcs and DebuggerDomainCoordinator.h to exported_headers in api.bzl Reviewed By: fbmal7 Differential Revision: D90864318 fbshipit-source-id: db510823dcfd79e1655e4071df5b8883a89d2a94Moti Zilberman · c8df3ed5 · 2026-02-12
- 0.7ETVAdd intermediate state for the Hermes Root API Summary: This diff adds the Hermes Root API interface, but keeps the static functions within HermesRuntime still. This is a necessary intermediate step for RN ([see failing tests here](https://github.com/facebook/react-native/actions/runs/14800547982/job/41558052598?pr=51082)), which depends on the version of Hermes that is on `main`, which does not have the Root API yet. Once this lands, we can land the next diff in the stack that migrates all the usages to `makeHermesRootAPI`, and remove all the static methods from `HermesRuntime`. Reviewed By: neildhar Differential Revision: D74594455 fbshipit-source-id: 7db62051082e3384b0f5215a2262cda58208db9fChi Tsai · 3abf653c · 2025-05-14
- 0.4ETVApply breakpoints when Debugger domain is re-enabled Summary: While working on Performance panel, I've noticed a native crash happening, if user has any breakpoints set. This happens because of the failed assertion here: https://www.internalfb.com/code/fbsource/[fc5f1ebf5b8d]/xplat/hermes/API/hermes/cdp/DebuggerDomainAgent.cpp?lines=196 When user starts recording a trace in Performance panel, Chrome DevTools will send `Debugger.disable` method. Once recording stops, it will send `Debugger.enable`. At this step the referenced assertion will fail. What changes with this diff: - We will clear `HermesBreakpoints` in `CDPBreakpoints` on `disable`, because they are already cleared in local debugger: https://www.internalfb.com/code/fbsource/[fc5f1ebf5b8d]/xplat/hermes/API/hermes/cdp/DebuggerDomainAgent.cpp?lines=233-236 This is covered by BreakpointsSurviveDomainReload test. - We will apply any persisted `CDPBreakpoints` to local Hermes Debugger again on `enable` method. This is covered by BreakpointsSurviveDomainReloadAndCorrectlyPauseVM test. Reviewed By: dannysu Differential Revision: D70251389 fbshipit-source-id: 2aad376c2d3b64819abd6bb397ac33781e108bffRuslan Lesiutin · 1268ba14 · 2025-03-06
- 0.4ETVSetup Hermes publishing to Maven for commitlies and releases on Android and iOS (#1752) Summary: Pull Request resolved: https://github.com/facebook/hermes/pull/1752 This setups publishing Android and iOS artifacts on commits and releases to be used by React Native. ## Motivation Reduce CI time by decreasing the number of Hermes builds currently running on the React Native repo by moving them to the Hermes repo with less traffic. Reviewed By: cortinico Differential Revision: D79163000 fbshipit-source-id: e80978a4f32e48c5c2c0ce5574e1956319693697Dawid Małecki · 0c3b6631 · 2025-08-12
- 0.4ETVAdd `TypedArray`, `UInt8Array` in JSI Summary: X-link: https://github.com/facebook/react-native/pull/56158 Add TypedArray and Uint8Array types to JSI with supporting APIs. New types: - `TypedArray`: Base class for all typed arrays - `Uint8Array`: Uint8Array type extending TypedArray New IRuntime APIs: - `getBuffer(TypedArray)`: Get underlying ArrayBuffer - `getByteOffset(TypedArray)`: Get byte offset property - `getByteLength(TypedArray)`: Get byte length property - `getLength(TypedArray)`: Get length property - `createUint8Array(size_t)`: Create Uint8Array with length - `createUint8Array(ArrayBuffer, offset, length)`: Create from ArrayBuffer - `isUint8Array(Object)`: Check if object is Uint8Array Changelog: [Internal] Reviewed By: lavenzg Differential Revision: D95245175 fbshipit-source-id: 33e7f5d9de42bfcc0b7a57c681fdd73711c2bb13Chi Tsai · 5f82b877 · 2026-04-15
- 0.4ETVFix JSI `isArray` method to match JS `Array.isArray` Summary: There is currently an assumption that JSI arrays are always `vm::JSArrays`, and thus JSI method `isArray` only return true if it is an `vm::JSArray` . However, the JSI spec states `isArray` should follow JS `Array.isArray`. This diff fixes this and treats `JSI::Array` as normal objects. Grafted 1b61dd500b2b3bdab4771663672c375d7ed1b7d6 (D67408956) - Grafted xplat/static_h to xplat/hermes Reviewed By: lavenzg Differential Revision: D82322325 fbshipit-source-id: 382eab6d67401281727b1bf27fdc7c0bbabc9fc4Chi Tsai · 7a3c2a3e · 2025-10-01
- 0.4ETVAlign HermesRuntime with SH and make non-static methods virtual Summary: Make these functions virtual so that it is simpler to have multiple different Hermes versions loaded in the same application. This should not add any overhead in most cases, since Hermes is typically a separate dynamic library, so invocations of these methods would take an indirection through the PLT. Also add methods that currently are implemented in SH, with throwing implementations. Reviewed By: tmikov Differential Revision: D69219627 fbshipit-source-id: 6eabd012d05ff1c529750781a5f560881e2fc700Neil Dhar · 91354c6a · 2025-02-14
- 0.3ETVRun hermesc builds in Hermes repo (#1729) Summary: Pull Request resolved: https://github.com/facebook/hermes/pull/1729 Moves building HermesC from React Native repo. ### Motivation Reduce CI time by decreasing the number of Hermes builds currently running on the React Native repo by moving them to the Hermes repo with less traffic. Reviewed By: cipolleschi Differential Revision: D77869024 fbshipit-source-id: 9b801d6659d9d3fea3bdb4157f8ef62a8fcaf79fJakub Piasecki · 4476ebdb · 2025-08-06
- 0.3ETVIntroduce format-agnostic API for JS Sampling (#1603) Summary: Pull Request resolved: https://github.com/facebook/hermes/pull/1603 This diff adds a new API on `HermesRuntime`, which will emit a `struct` with all necessary information about completed JavaScript Sampling Profile. This `struct` can later be used by other third parties, such as React Native. The reason for creating a data source, and not just providing a stream to which Hermes will emit serialized information is that on React Native side we own the format in which data should be serialized, together with the data from other potential sources, such as User Timings, Interactions, Network, etc. HermesRuntime will have 2 new API endpoints: - `dumpAsProfile`. A method on `HermesRuntime` instance, which returns `Profile` that contains all relevant information about the recorded sampled stack trace. - `dumpAsProfilesGlobal`. A static method, which returns vector of all recorded Profiles for all registered sampling profiler instances. The actual conversion to Trace Event Format will hapen on React Native side, Hermes will only emit data structure that is agnostic to format and operates only with JavaScript runtime-level entities and general stuff: call stack frame information, timestamps, information about OS process and thread where sampling occured. Reviewed By: dannysu Differential Revision: D67353585 fbshipit-source-id: 291a3daee4114e4fe3545bbcb94faa8ecc534443Ruslan Lesiutin · 37437be2 · 2025-02-04
- 0.3ETVRemove unused build scripts in hermes (#1814) Summary: Pull Request resolved: https://github.com/facebook/hermes/pull/1814 Removes old scripts used to build apple frameworks which became obsolete after D77869024. Reviewed By: cipolleschi Differential Revision: D85324112 fbshipit-source-id: 574794b77b8049e9a46e4e49c81c83fd1677e854Jakub Piasecki · 461a9269 · 2025-10-23
- 0.3ETVUse IHermes, use shared_ptr<jsi::Runtime> in Synth Traces in all other version of Hermes Summary: Cast into `IHermes` in Synth Traces when Hermes-specific runtime functionalities are used, instead of performing `dynamic_cast` While we are here, also updated all unique_ptr usages of `jsi::Runtime` to shared_ptr. Reviewed By: neildhar Differential Revision: D73525167 fbshipit-source-id: 8aab275bc4fa3fd1f5c34f162710296859af9096Chi Tsai · 3cc0974e · 2025-05-15
- 0.3ETVFix get_assigned_codepoints bug Summary: The very first range element in `Assigned` was incorrectly being generated as `(0,0)`. Fix this by initializing `cp_begin` to `None`. Reviewed By: neildhar Differential Revision: D68579548 fbshipit-source-id: ece91e7ca929f251adc485f3aec395b6566f52f0Michael Leon · d63b9d79 · 2025-01-24
- 0.3ETVAdd JSI APIs `setRuntimeData` and `getRuntimeData` Summary: X-link: https://github.com/facebook/react-native/pull/50197 Adds `setRuntimeData` and `getRuntimeData` JSI APIs. This provides a convenient way for users to store some custom data associated with an UUID. For the default implementation of this feature, store the runtime data in the global map that is shared between all VMs. This is done to keep JSI lightweight and stateless, instead of adding data members. Changelog: [Internal] Reviewed By: neildhar Differential Revision: D71579532 fbshipit-source-id: 553e28fbf80c93e268d475860197a00d2c5bacf7Chi Tsai · 34b807b9 · 2025-05-10
- 0.3ETVAdd createFromUtf16 JSI method Summary: X-link: https://github.com/facebook/react-native/pull/48211 Adding the default implementation for `createFromUtf16` method for JSI String and PropNameId. Changelog: [Internal] Reviewed By: tmikov Differential Revision: D67070206 fbshipit-source-id: 47297e6ae3028ee0e101628aab5bc076fcbbdebcChi Tsai · 00a84e7b · 2025-01-23
- 0.2ETVAdd deleteProperty support to Synth Traces Summary: Adds Synth Trace record and support for `deleteProperty` API so that it can be recorded and replayed. Grafted ea07908273fe5d3e7b5105c4d692dc9fdd7decef (D80375910) - Grafted xplat/static_h to xplat/hermes Reviewed By: lavenzg Differential Revision: D81332811 fbshipit-source-id: 4377a98ec74971efa8bbf659531dc14b7d7d086bChi Tsai · a3521fb0 · 2025-08-29
- 0.2ETVAdd Value override for has/get/setProperty Summary: X-link: https://github.com/facebook/react-native/pull/52910 For `get/has/setProperty`, we should also be able to take in a generic JS Value as the property key. This change adds the Value overload for these APIs. The default implementation will use `Reflect.get`, `Reflect.has`, and `Reflect.set`. Changelog: [Internal] Reviewed By: lavenzg Differential Revision: D79120823 fbshipit-source-id: 7e2e5ff1ca93397c549e7dd922797fe77aa97940Chi Tsai · 7f716de4 · 2025-08-29
- 0.2ETVAdd `IHermes` interface to all other versions of Hermes Summary: Add interface `IHermesRuntimeV0` to contain the Hermes-specific runtime functionalities. The interface `HermesRuntime` will inherit from both `jsi::Runtime` and `IHermesRuntimeV0` to provide functionalities from both. This allows usage of `HermesRuntime` to remain the same for now while we work on migrating these usages to query the appropriate interface incrementally. Reviewed By: tmikov Differential Revision: D71132856 fbshipit-source-id: 75bcf3e18c2e4c9c3134c654af72c1bc0f1c08caChi Tsai · 2bba5f04 · 2025-05-15
- 0.2ETVAdd createFromUtf16 support in Synth Traces Summary: Original Author: chitsai@meta.com Original Git: 8454740c321622579bb7a475ba56d8486ac56fc0 Original Reviewed By: dannysu Original Revision: D67070209 Add SynthTrace support for `createFromUtf16` APIs in Synth Traces, so we can record and replay them properly. Reviewed By: neildhar Differential Revision: D68599522 fbshipit-source-id: 1b472347ecaaf0f6bcbf8014a08d49a11a1282edChi Tsai · a08b71bb · 2025-01-24
- 0.2ETVJSError: never fail with invalid getter target" (#1621) Summary: Pull Request resolved: https://github.com/facebook/hermes/pull/1621 JS developers expect this to work and print "undefined": ```js function MyEror() { this.message = "MyError"; } MyError.prototype = Object.create(Error.prototype); try { throw new MyError(); } catch (e) { print(e.stack); } ``` We give it to them by preventing the getter from throwing errors. In V8 this is implemented differently by attaching the getter to the actual instance. Arguably, this makes sense, because property reads shouldn't throw. Add and update tests. - Grafted path static_h to hermes Reviewed By: avp Differential Revision: D69757360 fbshipit-source-id: 216e870e82c941a985020202dc14aa5948164da8Tzvetan Mikov · c615b115 · 2025-02-18