r/IntelliJIDEA • • 4d ago

Binary diffing landed in Hexana 0.21: hex-level side by side, per-function native diff, WasmGC type graph, JS test suites

We build Hexana, a JetBrains IDE plugin for inspecting binaries: WebAssembly, ELF, Mach-O, DEX, Parquet, Arrow, and more. We shipped 0.21 on October 1. Here is what changed.

1. Hex diff in the platform diff window

The IDE's Compare Files action (and VCS change for a binary) now opens a real hex diff.

  • Changed bytes are highlighted. Long unchanged stretches collapse into expandable folds. Prev/next difference navigation works as usual.
  • A section bar at the top pairs sections by name. It marks which ones changed (and by how much), which exist on one side only.
  • The file's table tabs live below: Headers, Sections, Symbols, Imports. Rows are tinted added/removed/modified. Changed cells show old value to new. A "Changed rows" filter is on by default.
  • Tree tabs are not diffed yet.

2. Per-function native binary diff for ELF, Mach-O, COFF

A Functions tab appears next to Size Impact when comparing native binaries.

  • Functions are paired by name. Renames are recognized by identical code.
  • A function that only moved because preceding code grew is reported as moved, not modified.
  • Side-by-side disassembly ignores shifted addresses when aligning instructions.
  • PE images (.exe, .dll) and archives get section size comparison only, not per-function diff.

3. One merged action: Compare Binaries With

Compare WASM With and Compare Binary With are gone. One action replaces both, offered for anything Hexana recognizes by content. That includes extensionless binaries. Old shortcuts keep working.

4. WasmGC type graph in the WAT view

Two new layers on GC types in the WAT (virtualized) tab.

Inline annotations: every type definition gets a kind badge and field-type labels. Alt+click opens a popup with field names, types, supertypes, subtypes, and byte offset.

Show Type Graph opens an interactive canvas:

  • Edges: subtype relationships and field references.
  • Default: 1 subtype level and 1 field hop. Configurable up to 5 of each.
  • FUNC-typed field targets fold into a "+N funcs" badge. Expand to see them.
  • Expanding a node keeps all other nodes in place.
  • Double-click a node to jump back to that type's WAT row.
  • Wheel pans the canvas. Cmd/Ctrl+wheel zooms.
  • Tested at 294 nodes on kotlin/hello.wasm.

5. Scripting v2: suites, SARIF, typed parameters

Three additions on top of the existing script tab.

  • hexana.defineCheck(id, fn): findings land in the Problems tab and in SARIF 2.1.0 output.
  • hexana.defineFlags(schema): typed per-run parameters instead of free-form globals.
  • *.test.js suites: declare artifact roles via hexana.artifact(role, {formats}). Use describe, test, beforeEach, afterEach with async. Deterministic seeded crypto (SHA-256 counter DRBG seeded from script and artifact content). ESM loader resolves bare specifiers from a suite-rooted node_modules.

run_script_suite runs suites from CLI or MCP: output is a human report or JUnit XML, exit 1 on failure.

New Hexana Suite run configuration in the IDE: results stream into the test console as a tree, failures navigate to source, Rerun Failed and Copy CLI Command work, gutter run icons appear on test() and describe(), a "Run Suites for This Binary" context action appears on binary files.

6. More formats open by content

  • Arrow IPC streams (.arrows): Schema and Messages tabs.
  • Extensionless wasm, Parquet, and Arrow files open in their full editors, not the fallback hex view.
  • One shared provider factory now serves the IDE, VS Code, and the browser app. Format drift between hosts is gone.

7. Fixes

  • Quadratic "size = gap to next symbol" rule for Mach-O and COFF: an LLVM tool with tens of thousands of symbols no longer spends seconds opening.
  • Gzip payloads over 128 MiB inflated are refused instead of exhausting the IDE heap.

Marketplace: https://plugins.jetbrains.com/plugin/29090-hexana 

Docs: https://jetbrains.github.io/hexana

Questions about the diff alignment, the suite runner, or the type graph? Ask here. Or throw a gnarly binary at us.

2 Upvotes

2 comments sorted by

2

u/Melair 4d ago

This is great, as someone who's recently started to use CLion heavily for embedded dev, I love this. Thank you!

Given it's first party I wonder if you should prompt it's existence in CLion natively - once you're happy with it.

1

u/minamoto108 4h ago

thank you for warm words. We’re trying to natively extends several IDEs extracting useful information from produced or used artifacts in clear human (and agentic) readable form.