Skip to main content
The V8 probe reads live application state from any Chrome tab or Electron app by connecting to the process’s Chrome DevTools Protocol (CDP) endpoint — the same protocol used by browser devtools. Once connected, it injects the ASO (Axon Semantic Oracle) JavaScript snippet directly into the running V8 heap and returns a fully-labeled SubstrateState in as little as 5 milliseconds. No browser extension, no user gesture, and no application-side code change is required.

How CDP Connection Works

When axon-daemon detects a new process, the V8 probe checks for an accessible CDP endpoint by scanning:
  1. Command-line arguments — looking for --remote-debugging-port=NNNN
  2. Process name patternschrome.exe, msedge.exe, electron.exe, code.exe, slack.exe, and others
  3. Open port scan — checking port 9222 and common Electron debug ports
When a matching process is found, it is classified as a V8 process and handed to the V8 probe pipeline. Electron apps each expose their own debug port, which NSP detects automatically from the process command line — no manual configuration needed for Electron.

Enabling CDP on Chrome

Chrome does not expose a CDP endpoint by default. Launch it with the --remote-debugging-port flag to enable the V8 probe:
Close all existing Chrome windows before launching with --remote-debugging-port. Chrome reuses a single browser process — if a session is already running without the flag, the new flag will have no effect until all Chrome windows are closed and the process fully exits.
If you need to monitor multiple Chrome profiles or ports simultaneously, declare additional ports in axon.toml:

Two-Tier Extraction

The V8 probe uses two extraction methods in order of preference. The fast-path handles the vast majority of polls; the heap snapshot fallback fires only when the fast-path is unavailable.
1

Tier 1 — ASO Fast-Path (5–50ms)

NSP injects a JavaScript snippet (__axon_aso_snapshot) into the live tab using CDP Runtime.evaluate. This script locates the application’s data layer directly in the V8 heap and returns it as a serializable JSON object. The probe polls for the result up to 40 times within a 600ms window.
The ASO result includes confidence scores of 0.95–0.99 for known applications.
2

Tier 2 — Heap Snapshot Fallback (~47s)

When the ASO script returns null — typically on first contact with a new app or after a major navigation — the probe takes a full V8 heap snapshot via CDP HeapProfiler.takeHeapSnapshot.
After the cold probe succeeds, the ASO script is installed permanently in the tab. Every subsequent poll uses Tier 1 at full speed.
The heap snapshot fallback runs only once per app (or after a full-page navigation). After the first cold probe, all polls use the 5–50ms ASO fast-path. You will see probe_tier: "heap_snapshot" in probe_metadata only during initial attachment.

Supported Applications

The V8 probe covers all Chrome tabs and Electron applications. The following apps have validated entries in the app signature database:
Accuracy for all V8-covered applications is >99% once the ASO fast-path is installed. This includes Electron apps that ship obfuscated JavaScript — the heap snapshot fallback recovers semantic labels through LLM enrichment during the cold probe.

SubstrateState and probe_metadata

Every V8 state capture includes a probe_metadata block that reports which extraction tier was used and the latency breakdown:
The probe_tier field takes one of two values:

Action Execution

V8 actions are executed by injecting a typed JavaScript call into the running tab via CDP:
CDP built-in actions such as click, type, and navigate are dispatched using the Input and Page CDP domains directly — no JavaScript injection is required for those.

Python SDK Example

Navigation events clear the injected ASO script from the tab context. On the next poll cycle, the probe detects a null ASO result and re-injects the script. The following poll returns a fresh fast-path result. You may see one cycle with slightly elevated latency (~600ms) immediately after navigation.
Yes. Each tab is treated as an independent substrate with its own app_id. NSP maintains a separate probe anchor and poll loop per tab. Electron apps with multiple windows are handled the same way.
Yes. Headless Chrome launched with --remote-debugging-port exposes the same CDP endpoint. Pass --headless=new along with --remote-debugging-port=9222 for full compatibility.