hexvero

io.github.maximilianfeixPublished by GitHub account maximilianfeixv0.12.0Updated Nov 1, 2026

Electron release diff for security review: what changed in IPC, contextBridge, windows and hosts.

VerifiedSTDIODesktop onlyDeveloper ToolsSecurity & Monitoring

Overview

AI-generated overview

Statically inspects local software builds, mainly Electron apps, so an assistant can diff two releases and see what changed in IPC, preload bridges, windows…

What you can do
  • Open, list and close local files or directories as analysis targets, with size, hash and detected format
  • Run the built-in analyzer for a target's format and page through named collections such as symbols, imports, sections, IPC channels, windows, endpoints and findings
  • Extract tagged strings and read bounded hex windows of the target
  • Export the full analysis as JSON, or recover bundled modules and source-map originals into a new directory
  • Compare one collection between two builds, map generated positions back through a source map, and apply a release policy to two builds
  • Detect optional external engines and run bounded operations such as disassembly, decompilation, xrefs and call graphs
When to use it
Useful when reviewing what an Electron or other packaged release changed between two builds, or when auditing a single build for risky patterns, without running the software. Also fits CI-style release gates and investigations where findings must cite file and line and state what could not be established.
Requirements
Runs locally over stdio via npx and needs Node.js 22.12 or newer. No authentication, environment variables or headers are declared. Targets must be given as absolute paths; inputs are an app.asar, a macOS .app, a Windows or Linux install directory or a release zip, with installers needing unpacking first. Optional external engines (radare2/rizin, Ghidra) are detected if installed.
Before you install
Export and recover write files wherever the hexvero process may write, so paths should be chosen deliberately. Findings describe what the code contains, not runtime behaviour or exploitability, and a passing check is not a security verdict. Parsing a hostile file still processes attacker-controlled bytes. Through a cloud-hosted agent, requested results go to that agent's model provider. Use only on software you may examine.

Installation

In SourceWeft

  1. Open hexvero in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[hexvero logo: an amber H on charcoal]

hexvero

Know what changed inside your Electron release.

Diff two builds of an Electron app and see the IPC channels, preload bridge, window settings and network hosts that changed, with file and line on both sides.

[CI] [npm] [Node] [License]

Website · Try it · CI · AI agents · Comparison · Limits · Docs

English · Deutsch · Español · Français · Português (Brasil) · Русский · 中文 · 日本語 · 한국어


[30 seconds of real output: npx hexvero demo lists what changed between two builds of an example Electron app, including a new preload member with its preload and handler lines and an IPC channel reported as unknown; hexvero check fails the release policy with exit 3; then the local web UI opens the new member and the changed window with the source lines of both builds]

30 seconds of real output: a terminal recording and a browser recording, joined with a fade · mp4 · terminal: release-review-terminal.tape, UI: record-release-review.mjs

Try it in 10 seconds

bash
npx hexvero demo

Needs Node.js 22.12 or newer. It copies two builds of a small example app (NotesDesk 1.4.0 and 1.5.0) into ./hexvero-demo and shows what changed. Excerpt, … marks cuts:

text
What changed between notesdesk-1.4.0.asar and notesdesk-1.5.0.asar  Two builds of a small example Electron app, read statically. Nothing was executed.
  interfaces (2)    + preload.js::notesdesk::checkUpdate  @ b: preload.js:9, handler main.js:30 · link direct    - preload.js::notesdesk::openInShell  @ a: preload.js:9, handler main.js:30 · link direct  …  ipcChannels (2)    + update:check  @ b: receiver main.js:30, sender preload.js:9    ? shell:open  @ a: receiver main.js:30, sender preload.js:9        the other side has values there that could not be resolved  windows (1)    ~ main.js::win  @ b: main.js:8        nodeIntegration: true → false, nodeIntegrationInEffect: "on" → "off", sandbox: false → true  …  endpoints (1)    + main.js::fetch::https://updates.notesdesk.example/latest.json  @ b: main.js:30 · literal

? means hexvero could not tell, so shell:open is reported as unknown, not as removed. Then turn it into a gate:

text
$ npx hexvero check hexvero-demo/notesdesk-1.4.0.asar hexvero-demo/notesdesk-1.5.0.asar --policy hexvero-demo/policy.jsonhexvero check fail: the policy is violated  ✗ new-interface-member  notesdesk.checkUpdate  new · fail  ✗ new-external-host  updates.notesdesk.example  new · fail  …$ echo $?3

npx hexvero ui --demo --open shows the same comparison in a local web UI with the source lines of both builds side by side. The full tour: walkthrough.

Why

  • A release review asks what the update changed: which channels a page can now reach, which preload members appeared, which window got more permissive, which servers the code now calls.
  • A diff of the shipped bundle does not answer that. It is minified JavaScript inside an app.asar; running the app to find out is not always allowed, and a checklist scanner looks at one build, not the change.
  • hexvero answers it from the files: each change with the file and line it was read from in both builds, what it could not establish, and a policy that fails CI on a new member, host or more permissive window. Nothing is executed.

What it reads

IPC and bridge mapwindow → contextBridge member → IPC channel → ipcMain handler, with how each link was read
Window settingswebPreferences per window, and whether nodeIntegration and sandbox are in effect
Runtime and fusesElectron, Chromium and Node versions, fuses and the ASAR integrity record, read from packaged binaries
Hosts and storagenetwork endpoints and localStorage/sessionStorage keys, literal or inferred
CI gate and SARIFhexvero check: exit 0 pass, 3 violated, 4 not decidable; baseline, suppressions, SARIF 2.1.0
MCP for agents16 tools with small paged answers, so a coding agent can run the same review
Local web UIthe comparison with both builds' source lines side by side, plus an offline HTML report

Inputs: an app.asar, a macOS .app, a Windows or Linux install directory, or the release .zip you publish. Installers (.dmg, setup .exe, AppImage) need unpacking first. Per-platform paths: docs/cli.md.

On your own app

bash
npx hexvero compare old/YourApp.app new/YourApp.app --report report.html   # one offline HTML pagenpx hexvero init old/YourApp.app                                            # starting policy, current hosts allowednpx hexvero check old/YourApp.app new/YourApp.app --policy .hexvero/policy.json

To accept what is there today, add --baseline .hexvero/baseline.json --update-baseline once; later runs fail only on new findings.

One build instead of two, with the single-build checks known from Electronegativity (CSP, shell.openExternal, permission handlers, window settings, certificate and command-line switches):

bash
npx hexvero audit YourApp.app --format sarif > audit.sarif   # exit 3 when a rule is violated

Use it in CI

Pinned to a version so a release cannot change your results unannounced:

yaml
jobs:  hexvero:    runs-on: ubuntu-latest    permissions:      contents: read    steps:      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7        with:          persist-credentials: false      - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7        with:          node-version: 24      # Build your app and fetch the previous release here, e.g. into previous/ and dist/.      - run: npx --yes [email protected] check previous/app.asar dist/app.asar --policy .hexvero/policy.json

Baseline, Markdown job summary and a least-privilege SARIF upload for code scanning: docs/ci.md.

For AI agents

In Claude Code, server and skill come as one plugin:

text
/plugin marketplace add maximilianfeix/hexvero/plugin install hexvero@hexvero

Elsewhere, npx hexvero setup --apply registers the MCP server with the coding agents it finds (dry run without --apply), or run npx -y [email protected] mcp over stdio. Text inside the target is treated as data, never as instructions. Clients, tools and what an agent receives: docs/mcp.md.

How it compares

hexveroElectronegativityREAdiff of two bundles
Built forwhat changed between two buildsknown risky patterns in one buildbroad reverse engineering, static and dynamicany text change
Compares two builds of one appyes, list by listno (one build; checks between Electron versions)yes (compare_application_versions)yes, minified bytes
Bridge member → IPC channel, blind holdout265 of 78not measured6 of 66no
Release policy with CI exit codesyes (0/3/4, SARIF)SARIF outputnot comparedno
CSP, shell.openExternal, permission handlersyes, hexvero audit (0.12)yesnot comparedno
Statusactive, MITarchived 2026-10-24, last release 2023activen/a

Electronegativity was archived on 2026-10-24. hexvero audit <build> runs part of its single-build checks with the same exit codes and SARIF as check; which checks are covered and which are not is listed in the migration page. REA does much that hexvero does not (dynamic analysis, devices, decompilers); use it for that. Sources, dates and every caveat: docs/comparison.md.

Accuracy and limits

On the newest blind set, written by someone without access to hexvero, it found 52 of 64 IPC channels with none false, and it misses and misreports rows in other lists (all numbers). On real releases it is checked against the source (GitHub Desktop 3.6.7 → 3.6.10, Electron Fiddle 0.38 → 0.39), misses included. It reads files and never runs them, so a finding is what the code contains, not what it does at run time or whether it is exploitable; a passing check is not a security verdict. Parsing a hostile file still processes attacker-controlled bytes, within size, depth and time limits. The full list: docs/accuracy.md.

Docs

Walkthrough · CLI · CI · MCP · Policy schema · Electron rules and sources · Accuracy · Benchmarks · Other formats (native binaries, APK, WebAssembly and more) · Changelog

FAQ: does it run or upload my files?

No. Targets are parsed as bytes; nothing is executed. The UI binds to 127.0.0.1 with a per-session token. There is no telemetry and no network call in the code base. Through a cloud-hosted agent, the results that agent requests go to its model provider like any other tool output. Use hexvero only on software you may examine (DISCLAIMER.md).

Contributing

bash
npm install && npm run check      # typecheck, lint, format, unit tests, shape rulesnpm run e2e                       # the user flows on real inputs

Rules in CONTRIBUTING.md; good first issue is sized for an afternoon. Found a wrong or missing fact? Open a bug report with hexvero doctor output and, if you can, the file.

If hexvero showed you something you would have missed in a release, a ⭐ helps the next Electron team find it.

License

MIT

Source: README.md at commit 12626b3

Tools

16

hexvero_open

Open target

Register a local file or directory for analysis. Returns its id, size, hash and detected format. Ids are stable per content.

Parameterspathrequired

hexvero_list

List targets

List targets opened in this session.

Takes no parameters.

hexvero_close

Close target

Release a target and its retained analysis.

ParameterstargetIdrequired

hexvero_analyze

Analyze target

Run the built-in analyzer for the target's format (ELF/PE/Mach-O, Go, .NET, WASM, EVM, SQLite, plist, APK, ZIP, Electron ASAR, JavaScript apps, source maps, HAR). Returns a summary, findings with confidence, limitations, a compact overview and the collections available for paging. Large JavaScript apps are read in batches: when `complete` is false, `coverage` says how many files are unread and every list covers the scanned part only; call again with scan to read more.

ParametersscanbatchfreshdetailincludetargetIdrequired

hexvero_collection

Page a collection

Page through one named list from the analysis, e.g. symbols, imports, exports, sections, libraries, types, methods, pinvokes, selectors, instructions, tables, columns, requests, endpoints, permissions, components, modules, edges, ipcChannels, findings. Use hexvero_analyze to see which exist.

ParameterstextlimitoffsetmaxBytestargetIdrequiredcollectionrequired

hexvero_strings

Strings

Printable ASCII (and optional UTF-16LE) strings with offsets and tags (url, path, email, ip, format, secret-ish, base64-ish).

Parameterstagtextlimitutf16offsetmaxBytestargetIdrequiredminLength

hexvero_bytes

Read bytes

Read a bounded window (max 64 KiB) of the target as hex plus an ASCII gutter.

ParameterslengthrequiredoffsetrequiredtargetIdrequired

hexvero_export

Export analysis

Write the complete analysis as JSON to a file and return its path and size. Use this instead of paging when you need everything.

ParameterspathrequiredtargetIdrequiredoverwrite

hexvero_recover

Recover sources

Write recoverable sources into a new directory: the modules of a webpack/Rspack/browserify/esbuild bundle (one file each plus hexvero-bundle.json with requires/exports), or the original files embedded in a source map (sourcesContent). No engine needed; nothing is executed.

ParameterstargetIdrequiredoutputDirrequired

hexvero_unknowns

Unknowns ledger

Record a material question the investigation could not answer (with what was already checked), list open or resolved unknowns, or resolve one. Unknowns are exported with the analysis so reports never silently drop them.

ParametersidlimitactionrequiredoffsetstatuscheckedquestiontargetIdresolution

hexvero_compare

Compare collections

Diff one collection between two targets: added, removed, changed (with the fields that differ) and unchanged items, matched by key (auto-detected: name, channel, id, path, url, type+name … or pass key, a+b for composites). States completeness; unknown items are neither added nor removed. Each list pages on its own (list + offset). Without collection: counts per shared collection, to pick one.

ParameterskeylistlimitignoreoffsetstricttargetArequiredtargetBrequiredcollection

hexvero_check

Check release policy

Apply a release policy (inline JSON or file) to two builds, as `hexvero check`: status pass, fail or incomplete, and findings paged by offset. Reads a baseline, never writes one.

ParameterslimitformatoffsetpolicytargetArequiredtargetBrequiredpolicyPathbaselinePath

hexvero_sourcemap

Resolve source map position

Map a generated line/column of a source map target back to its original source, line, column and name.

ParameterslinerequiredcolumnrequiredtargetIdrequired

hexvero_providers

Providers

Detect optional external engines (radare2/rizin, Ghidra) and the operations each supports.

Takes no parameters.

hexvero_provider_run

Run provider operation

Run one engine operation on a target: functions, disassemble, decompile, strings, imports, xrefs (references to an address), callers, callees, callgraph or search (names + strings). Output is bounded and cached.

ParameterstextaddressproviderrequiredtargetIdrequiredoperationrequiredtimeoutMs

hexvero_call_graph

Call graph

Bounded call-graph neighborhood around a function (callers, callees or both, by depth and node count), or the shortest call path from root to goal. One engine run per target, cached; levels state what was cut.

ParametersgoalrootrequiredmaxDepthmaxNodesproviderrequiredtargetIdrequireddirectiontimeoutMs

Version history

11
  1. v0.12.0LatestOct 25, 2026
  2. v0.11.1Oct 18, 2026
  3. v0.10.1Oct 18, 2026
  4. v0.9.8Oct 18, 2026
  5. v0.9.6Oct 17, 2026
  6. v0.9.1Oct 17, 2026
  7. v0.9.0Oct 17, 2026
  8. v0.8.0Oct 16, 2026
  9. v0.7.5Oct 15, 2026
  10. v0.6.2Oct 15, 2026
  11. v0.4.0Oct 14, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts