Catch every JVM exception — with the variables that caused it.
jvmScout attaches to the JVM itself as a native JVMTI agent and observes exceptions at the source — capturing the full stack trace, live local-variable values at every frame, the cause chain, and decompiled source. No SDK, no code changes, no recompile.
140 var cust = lookup(order.id); 141 var total = order.total(); 142 return total.amount(); // total is null → NPE
A stack trace tells you where. Never why.
Most error monitors need you to wire an SDK into your app, and even then you only see what you remembered to log. By the time a NullPointerException reaches your logs, the local variables that explain it are long gone — and reproducing it in a long-lived production service is its own project.
An agent that reads the JVM directly.
jvmScout loads into the JVM through the standard JVMTI interface — the same one HotSpot's own tools use — and captures each exception at the moment it's thrown, complete with the live values of every local variable on the stack. It streams them out-of-process to a collector and a live dashboard.
From the throw site to a triaged, alerting dashboard.
Capture happens natively in the JVM; everything else is a multi-tenant collector and a live React dashboard.
A reliability console for your JVM fleet.
Environment-scoped reliability score and error-volume trends, a dense events triage table, and per-project alert rules — on top of the three-pane debugger in every exception.
# Events triage
# Alert rules
Representative UI built from the live dashboard's real layout and design tokens. See the repo for current screenshots.
One native agent, a collector, and a dashboard.
The JVM hands the agent a JVMTI environment at startup. The agent captures exceptions and streams them out-of-process — your application never blocks on the network.
HTTP / TLS
+ live data
Running in three steps.
Pull the collector image, attach the agent to a JVM, open the dashboard.
Run the collector + dashboard
One image ships the FastAPI collector and the built dashboard.
Attach the agent to a JVM
Per-OS library; settings inline or via a config file.
Open the dashboard
Errors stream in live over WebSocket as they're thrown.
$ Production install — point JVMSCOUT_HOME at a settings file
Keeping the agent string to just "load the library" avoids leaking api_key into ps listings. Precedence: defaults → jvmscout.yaml → JVMSCOUT_* env → inline -agentpath overrides.
Tunable, with sane defaults.
The same key names work inline on -agentpath, in jvmscout.yaml, or as JVMSCOUT_* env vars.
| Key | Default | Purpose |
|---|
A selection — see the full configuration reference for every key, including collector env vars.
How local-variable capture works.
Two paths recover the live values on the stack at the moment of the throw — whichever your class files support.
Compiled with -g
The agent reads locals directly from the JVMTI Local Variable Table — real names, signatures, and values. This is Maven's default, so most apps get it for free.
Without debug info
Enable bci=true. The java.lang.classfile transformer injects shadow-capture calls so the agent recovers local values by slot. The dashboard marks these with a ● badge.
Built to run on shared, production infrastructure.
Crash data is sensitive. jvmScout isolates tenants, redacts in two places, and ships with security headers on by default.
For the moments logs aren't enough.
Built in the open. Contributions welcome.
MIT licensed across the agent (C++17), collector (Python/FastAPI), and dashboard (React 19).
See the variable that threw — in your own JVM.
Pull the collector image, attach the agent, and throw a test exception. MIT licensed — free to use, modify, and distribute.