Hermes Decompiler Online

Decompile React Native Hermes bytecode bundles to JavaScript pseudocode and HASM.

.hbc .bundle index.android.bundle
Drop your Hermes bundle or .hbc file here
Choose file

⚠ Drag-and-drop upload could not load — an ad blocker is most likely blocking it. Please disable your ad blocker and reload the page to upload a file.

How It Works

1

Upload

Drop the bundle — it has no extension, and that is fine.

2

Decompile

The Hermes header is verified, then the bytecode is decompiled and disassembled.

3

Browse

Read the JavaScript pseudocode and the HASM listing in your browser.

What is Hermes?

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.

Identifying a Hermes Bundle

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.

What You Get

Limits Worth Knowing

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.

Getting the Bundle Out of an App

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.

Frequently Asked Questions

What is index.android.bundle?

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.

How do I know if a bundle is Hermes bytecode?

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.

Can Hermes bytecode be turned back into JavaScript?

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.

How do I get the bundle out of an APK?

Upload the APK here, then open resources/assets/index.android.bundle from the file browser. It is decompiled in place.

Does this work for iOS bundles?

Yes. The Hermes format is the same on both platforms — extract main.jsbundle from the .ipa and upload it.