JUUL WEB

Device companion — Web Bluetooth clone

Not connectedChecking Bluetooth…GitHub ↗
21+ only. This is an independent web companion clone for owners of Bluetooth JUUL devices. It runs entirely in your browser over Web Bluetooth — no account, no cloud sync. Use Chrome or Edge on desktop/Android. iPhone Safari does not expose Web Bluetooth.

My device

Connect your JUUL2 to see live battery and pod usage, lock it, ring it, and track new puffs. Shake the device until its lights pulse blue, then connect.

No device pairedUnlocked
Connect over Bluetooth or explore the interface in demo mode.
Web Bluetooth needs a user tap + HTTPS (this Tailscale page qualifies). If your device does not appear, wake it by shaking / tapping and try “Browse all BLE”.
Battery—
Double-tap the device to check its light gauge.
Pod usage—
Pod: —
JUUL2 credential

Import your saved JUUL2 key capture once to enable ring and live readings.

The file stays on this device. Your browser stores the verified key locally; it is never uploaded. Close the official JUUL app while using this page.

How to extract your credential JSON

Use the official JUUL web app with your own account and paired JUUL2 in desktop Chrome or Edge. If you already saved juulKeyCapture.json, import that file above.

  1. Open the official web app. Sign in normally. Disconnect this companion from Bluetooth, and leave the device disconnected in the official app until the capture helper is installed.
  2. Open the official app’s developer console. Press Ctrl+Shift+J on Windows/Linux or ⌘+Option+J on Mac. Copy the helper below, review it, then run it in that console. It should say “JUUL capture installed”. Run it in the official app’s tab.
  3. Connect and ring once in the official app. Wake your JUUL, connect it there, and use its Find/ring control. The console should say “JUUL ring credential captured”. The helper observes local encryption; it sends no Bluetooth commands and uploads nothing.
  4. Save the JSON. In the same console run juulKeyCapture.save(). This downloads juulKeyCapture.json. To check progress without displaying your key, run juulKeyCapture.samples.length.
  5. Return here and import it. Close the official app’s tab, tap Import credential JSON, select the downloaded file, then tap Connect JUUL. Your current device uses the prefilled Key ID 9d87ca9f; another device may need its own matching Key ID.

This is an independently written capture helper. The code below runs only when you paste it into the official app.


          

If nothing is captured: disconnect and reconnect in the official app with the helper installed, then ring again. The helper must see the key being imported; it cannot recover a key imported before installation. Reloading the official page removes the helper, so install it again before connecting. If your browser blocks console pasting, review the code and follow its displayed developer-console prompt; you can also use the downloaded file in DevTools → Sources → Snippets.

Keep the JSON private: it contains the device encryption key. Store it outside a served website folder and do not share it as a diagnostic log. A BLE event log or telemetry export is not a credential file. Run juulKeyCapture.restore() to remove the helper, or close the official app’s tab.

Connection settings

Controls

Ring and lock use authenticated JUUL2 commands. Battery and pod readings refresh while connected. A ring is confirmed when the device accepts the request.

Hit count statistics

New puff timestamps reported by your connected JUUL2 add hits to these charts. Manual hits and demo mode are also available. Detailed device history is shown separately in All device telemetry below.

Today
0
hits
Last 7 days
0
hits
Total (this browser)
0
—
Daily average
0
hits / day
This pod (tracked)
0
— left (est.)
Last hit
—
—
Peak day (7d)
0
—
Current streak
0
days with ≥1 hit

Last 7 days

Live counting starts after the first pod reading and ignores repeated notifications. It counts observed changes, so puffs missed while the page is disconnected or suspended are not included. Pod usage is the device’s reported percentage; manual/demo remaining-hit estimates use ~200 hits per pod. Stats stay in this browser.

Recent hits

TimeSourceRunning total
No hits yet.

GATT explorer

After connecting, every discovered service and characteristic is listed here. Read / notify / write are wired to the real Web Bluetooth handles so you can identify battery, pod, and control channels on your specific unit.

No GATT profile yet — connect a device to enumerate it. If it stays empty after connecting, disconnect and choose the device again to refresh service permissions.

Console

Raw BLE events, reads, writes, and hit detections. Useful when pairing a new unit.

Ready. Tap “Connect JUUL” to start.

Pod & device details

Device name—
Device ID—
Serial number—
Last device puff—
Firmware—
Model—
Manufacturer—
Pod recipe / demo flavour—
Pod authenticity—

All device telemetry

Connect with your credential to read telemetry. Missing fields appear as “Not reported”.

Device, battery & settings

ReadingValue

Pod & status flags

ReadingValue

Session & firmware image

Detailed puff records

Device history has not been read yet.

Valid puff records
—
separate from manual / live hit counts
Average duration
—
seconds per recorded event
Total puff time
—
seconds in retained records
Longest duration
—
seconds
Device timeDurationCoil powerLoaded batteryTPM outputStop reason / samples
No detailed puff records received.

Duration is reported in milliseconds; power and loaded battery samples use mW and mV. TPM output uses µg (total particulate matter). Summaries include stop reasons 0, 2, 4 and 5, which the official app counts as puffs; the table also shows other heater events. Sample charts use sample order; the sample interval is not established. History does not change your existing hit charts.

All device log events

No events received.

Device time / indexLog / module / levelDecoded record
Raw telemetry snapshots
No authenticated readings yet.

Readings and up to 1,000 log events are saved in this browser for each credential. Older events may have expired on the device. Firmware-dependent values appear only when reported; unconfirmed units and state codes are shown raw. Export contains readings and logs, without your encryption key.

How pairing works

1. Wake the device
Shake it until the lights pulse blue. Keep it within a few feet of this computer/phone.
2. Import & connect
Import your saved credential JSON once, then tap Connect JUUL and choose your device.
3. Ring & track
Ring your device, see live battery and pod usage, and track new puffs while connected.

Trouble? Bluetooth off, another app holding the connection, or an unsupported browser are the usual causes. Close the phone app, toggle Bluetooth, and retry. This page never sends your data anywhere — stats stay in this browser.