A browser companion for Bluetooth multimeters — UNI-T, OWON, Aneng, BSIDE/ZOYI, Voltcraft & AICARE — with a live, full-screen readout, charting, statistics, recording, and CSV/PNG export. It runs entirely in your browser over Web Bluetooth — no install, no account, no data leaves your machine — and installs as an offline PWA.
▶︎ Open the app · Try the demo (no meter needed)
- Live readout — a big, glanceable hero value with function, AC/DC, and range badges.
- Charting — a rolling live chart (uPlot) with Fit-all / 1m / 5m / 30m windows and a pick of five line colors; range changes (kΩ↔MΩ) stay continuous because values are normalized to SI.
- Statistics — current, min, max, average, peak-to-peak, std-dev, sample count, duration.
- Recording — capture sessions to IndexedDB; they survive a reload. Pause / resume / stop.
- Export — download any session as CSV, or the chart as a PNG.
- Hold, Pin & Copy — freeze the readout, pin a value to read hands-free while the stream runs, or copy the current reading to the clipboard.
- Full function coverage — V / A / Ω, continuity, diode, capacitance, frequency, duty %, temperature, and NCV.
- Multiple meters at once — connect several meters and watch them side by side on one bench view (e.g. a V and an A meter for live power).
- PWA — installable, works offline, light/dark theme that also drives the system UI bars.
- Keyboard-driven & accessible — full shortcut set and a screen-reader announce key.
Multiple meters on one bench — connect several at once (here a V and an A meter) with a live P = V × I derived channel, all on one synchronized chart:
Light theme too — toggle with one tap (or the t key); line color is a preset as well
(violet and sky shown here):
Web Bluetooth is required, which means a Chromium-based browser in a secure context
(HTTPS or localhost):
| Platform | Works | Notes |
|---|---|---|
| Chrome / Edge / Brave / Opera (desktop) | ✅ | Linux, macOS, Windows, ChromeOS |
| Chrome (Android) | ✅ | Connect the meter directly from the phone |
| Firefox / Safari | ❌ | No Web Bluetooth |
| iOS / iPadOS | ❌ | No Web Bluetooth (works only via a WebBLE browser like Bluefy) |
Power on the meter, then click Connect and choose it in the browser's device chooser.
This is a pnpm workspace: the app lives in apps/web and the reusable logic
is split into packages under packages/ (see Packages).
pnpm install
pnpm dev # Vite dev server for apps/web (also on the LAN for phone testing)
pnpm build # build every package + the app
pnpm test # all unit tests (vitest)
pnpm typecheck # tsc across the workspace
pnpm lint # eslint across the workspaceNo meter handy? Append
?demoto the URL (e.g.localhost:5173/multimeter/?demo) to drive the whole UI from a synthetic measurement stream — handy for development and the screenshots above. Demo mode needs no Bluetooth, so it runs in any browser (Firefox and Safari included).
| Key | Action | Key | Action |
|---|---|---|---|
c |
Connect / disconnect | e |
Export CSV |
b |
Toggle backlight | i |
Export chart PNG |
h |
Hold / release | v |
Switch Live / Recordings |
Space |
Pin current reading | s |
Announce reading (a11y) |
r |
Start / stop recording | t |
Toggle light / dark |
p |
Pause / resume recording | ? |
Show this help |
Each meter speaks a simple BLE protocol: the app subscribes to a notify characteristic, runs the
meter's handshake, and decodes each measurement frame into a reading (function, value, unit, flags).
Decode logic is pure and unit-tested against captured frames. Decode + framing sit behind a Driver
interface in the protocol package, so meters from several vendors are supported and new ones can be
added without touching the transport, recording, or UI.
The app ships drivers for a range of UNI-T and generic Bluetooth multimeters across several vendors — UNI-T, Aneng / BSIDE / ZOYI, Owon, Voltcraft, and AICARE. See the hardware support list for every model and its verification state, and docs/protocols/ for a per-driver protocol spec.
The app is a thin shell over framework-agnostic packages, so you can build your own BLE-multimeter UI (in React or Vue) or a headless Node tool on top:
| Package | What it is |
|---|---|
@ble-multimeter/protocol |
Pure, I/O-free core: the Reading model + unit tables, the per-vendor decoders/framing, stats/decimate/CSV, and the device-Driver interface + registry. Zero deps; Node-safe. |
@ble-multimeter/web-bluetooth |
Web Bluetooth Transport + the framework-agnostic MeterSession engine (connect · handshake · keep-alive · reconnect · demo). |
@ble-multimeter/recorder |
Bluetooth-independent RecorderSession · SessionsStore · PinRecorder engines + the IndexedDB session store. |
@ble-multimeter/react |
React hooks: useMeter · useRecorder · useSessions · usePinSession. |
@ble-multimeter/vue |
The same four as Vue composables. |
apps/web consumes @ble-multimeter/react, so the app dogfoods the binding it ships.
The packages are structured to be publishable (per-package build → ESM + types) but aren't on
npm yet.
React 19 · Vue 3 · TypeScript · Vite · Tailwind CSS · uPlot · vite-plugin-pwa · Web Bluetooth · IndexedDB · pnpm workspace.









