ob2
A scan tool and live dashboard for a 2013 Genesis Coupe 2.0T, talking to the car over a BLE ELM327 adapter. It reads and clears codes, shows freeze frames and readiness monitors, and streams live sensor data to a browser.
Past generic OBD, it decodes the manufacturer-specific Hyundai signals that off-the-shelf scanners will not show you: boost, oil temp, fuel trims, and misfire counters.
- TypeScript
- Node.js
- ISO-TP / CAN
- BLE (noble)
- WebSockets
- npm workspaces
- Vitest
Seven packages, hard boundaries between them. Private repo, happy to walk through it.
- Pure core
- The scheduler and the connection state machine are pure and clock-injected, and live in the core package rather than the daemon. They are the least observable parts of the system and BLE flakiness cannot be reproduced on demand, so ten minutes of simulated scheduling runs in a few milliseconds instead.
- Isolated native deps
- The Transport interface lives in core; the BLE, serial, TCP, and replay implementations live in a separate package. Nothing that needs a native build can leak into the test path, and nothing with a Node built-in can wander into the browser bundle.
- Emulator-first
- Everything was built against an ELM327 emulator that speaks the same raw byte protocol a real dongle does, and injects NO DATA, BUFFER FULL, and mid-session disconnects on demand. Error handling is most of the work with real adapters, so it gets exercised deliberately rather than discovered in a parking lot.









