Decompile React Native Hermes bytecode bundles to JavaScript pseudocode and HASM.
Drop the bundle — it has no extension, and that is fine.
The Hermes header is verified, then the bytecode is decompiled and disassembled.
Read the JavaScript pseudocode and the HASM listing in your browser.
Hermes is the JavaScript engine Meta built for React Native. Its defining choice is that it does not parse JavaScript on the device at all: the bundle is compiled ahead of time into Hermes bytecode during the app build, and the phone loads that. Startup is dramatically faster and memory use is lower, which is why Hermes has been the default engine for new React Native apps since 0.70.
The side effect is that the app's JavaScript stops being readable. For years, pulling assets/index.android.bundle out of an APK gave you minified but perfectly legible JavaScript. With Hermes the same path gives you a binary file, and the usual tooling has nothing to say about it.
Hermes bytecode files begin with a fixed eight-byte magic number, C6 1F BC 03 C1 03 19 1F, followed by a bytecode version. This is checked automatically here, which matters because the file is very often called index.android.bundle with no extension at all — there is nothing in the name for an extension-based tool to work with.
If the file turns out to be plain JavaScript rather than Hermes bytecode, it is passed straight through as text so you can read it as-is.
if, for and while where the instruction pattern allows it.Hermes compiles from JavaScript that the Metro bundler has already minified. By the time the bytecode is produced, meaningful identifiers are long gone — a React component named UserProfileScreen in the source may well be e by the time Hermes sees it. No decompiler can bring those back; they were destroyed a build step earlier.
What survives is structure and data: which functions call which, what the control flow does, and every string and number literal. For working out what an app talks to, how it stores credentials, or which SDKs it embeds, that is generally sufficient.
The other limit is version drift. Hermes bytecode revisions land with React Native releases, and a bundle from a very recent version may use instructions the decompiler does not model yet. In that case the disassembly still succeeds and you get the HASM listing.
You do not need to unzip anything by hand. Upload the APK, open resources/assets/ in the file browser, and open index.android.bundle directly — it is decompiled in place. Some apps split the bundle or store it under a different name; anything in assets/ with the Hermes magic bytes is recognised.
iOS apps store the equivalent file inside the .ipa as main.jsbundle. Extract it and upload it the same way.
The JavaScript payload of a React Native app, stored in the APK under assets/. On older apps it is minified JavaScript you can read directly; on Hermes apps it is compiled bytecode, which is why a text editor shows binary garbage.
Hermes files start with the bytes C6 1F BC 03 C1 03 19 1F. The header is checked automatically here, so a bundle with no extension is still routed correctly.
Partly. You get JavaScript-like pseudocode, a complete HASM disassembly and the string table. The original source is not recoverable, because Hermes compiles from already-minified JavaScript.
Upload the APK here, then open resources/assets/index.android.bundle from the file browser. It is decompiled in place.
Yes. The Hermes format is the same on both platforms — extract main.jsbundle from the .ipa and upload it.