Unofficial Web Bluetooth control app for compatible vaporizers (Volcano, Venty, Veazy, Crafty)
359
Control your vaporizer from the browser.
Live temperature, heater and pump, heat-up workflows, device settings and self-diagnosis over Web Bluetooth.
No app store, no account, no server: open the page, connect, done.
▶ Open the app • Why? • Features • Get started • Self-hosting • Documentation • Development
Deutsch: README_de.md
Important
**Unofficial, independent project.** Not affiliated with, endorsed, sponsored or authorized by Storz & Bickel GmbH. *VOLCANO*, *VENTY*, *VEAZY*, *CRAFTY* and *STORZ & BICKEL* are trademarks of their respective owner and are used here only to name the devices this app is compatible with. For the official app, firmware and support, go to the manufacturer. See [Legal notice](https://github.com/firsttris/reactive-volcano-app/blob/main/docs/legal.md).
Compatible vaporizers speak Bluetooth Low Energy, and modern browsers can talk to it directly through the Web Bluetooth API. This project turns that into a fast, polished control app that runs anywhere Chrome or Edge runs:
| Desktop · Volcano Hybrid | Portable · Venty / Veazy | Portable · Crafty / Crafty+ | |
|---|---|---|---|
| 🌡️ Live current and target temperature with heat-up progress | ✅ | ✅ | ✅ |
| 🔥 Heater on/off | ✅ | ✅ | ✅ |
| 💨 Air pump on/off | ✅ | ||
| 🚀 Boost and Superboost offsets, heater modes | ✅ | Boost | |
| 🔁 Workflows: multi-step heat / hold / pump, JSON import & export | ✅ | ||
| 🔋 Battery level and charging state | ✅ | ✅ | |
| 🔆 Brightness, vibration, °C / °F | ✅ | ✅ | ✅ |
| ⏱️ Auto-shutdown time | ✅ | ✅ | |
| 🔌 Eco charging (current optimization, voltage limit), permanent boost | ✅ | ||
| 📶 Permanent Bluetooth | Veazy | ✅ | |
| 💡 Charge indicator LED | ✅ | ||
| 📍 Find my device | Veazy | Crafty+ | |
| 🩺 Self-diagnosis with plain-language advice | ✅ | ✅ | ✅ |
| ℹ️ Serial number, firmware, runtime | ✅ | ✅ | ✅ |
| ♻️ Factory reset | ✅ | ✅ |
Crafty units with firmware older than 2.51 expose fewer values: target and current temperature, boost, brightness and battery work, the rest is hidden.
Across the app: light and dark mode (follows the system), English and German (follows the browser), installable PWA with offline start, the screen stays on while heating or running a workflow, clear error messages when the connection drops. Every screen is described in Usage.
![]() Connect: one tap, with help if nothing is found | ![]() Workflows: run, edit, import, export · docs → | ![]() Settings: device options, info and diagnosis |
![]() Portable settings: boost and eco charging | ![]() Crafty settings: shutdown, LED, Bluetooth | ![]() Light mode: follows your system |
| Platform | Works with | Notes |
|---|---|---|
| Android, Windows, macOS, ChromeOS | Chrome, Edge, Opera | Web Bluetooth is on by default |
| Linux | Chrome, Chromium | enable chrome://flags/#enable-web-bluetooth once, see Getting started |
| iOS, iPadOS | Bluefy | Safari has no Web Bluetooth |
| Firefox, Safari | ❌ | no Web Bluetooth support |
Device not found? Work through Troubleshooting: it starts with Chrome's
built-in chrome://bluetooth-internals page and tells you in three steps whether the adapter, the
browser or the device is the problem.
A ready-made image for linux/amd64 and linux/arm64 is on
Docker Hub:
docker run -d --name vaporizer-app -p 8080:80 --restart unless-stopped tristanteu/reactive-volcano-app:latest
services:
vaporizer-app:
image: tristanteu/reactive-volcano-app:latest
ports:
- "8080:80"
restart: unless-stopped
curl -o ~/.config/containers/systemd/volcano-app.container \
https://raw.githubusercontent.com/firsttris/reactive-volcano-app/main/volcano-app.container
systemctl --user daemon-reload && systemctl --user start volcano-app
Note
Browsers only allow Bluetooth on **secure origins**: `https://…` or `http://localhost`. To use your instance from another device, put it behind a reverse proxy with HTTPS. Examples for Caddy, nginx and Traefik, and how to serve the app under a sub-path, are in [Self-hosting](https://github.com/firsttris/reactive-volcano-app/blob/main/docs/self-hosting.md).
| Getting started | browsers, Linux flag, iOS, connecting, installing as an app, updates |
| Usage | every screen for each device: control, boost, settings, diagnosis, find my device |
| Workflows | how a workflow runs, editing, the JSON format for import and export |
| Self-hosting | Docker, Compose, Podman, HTTPS with Caddy / nginx / Traefik, sub-paths, static hosting |
| Troubleshooting & FAQ | device not found, connection drops, Linux, iOS, common questions |
| Privacy & security | what the app stores, what it sends (nothing), permissions, secure context |
| Architecture | layers, data flow, Bluetooth queue, stores, routing, PWA, design decisions |
| Bluetooth protocol | services, characteristics and encodings for each device family |
| Development | setup, scripts, project structure, conventions, translations, adding a device, debugging on Android |
| Testing | unit tests, the Bluetooth mock, end-to-end tests, screenshots, CI |
| Releases & deployment | GitHub Pages, versioning, Docker images, the release workflow |
| Legal notice | trademarks, no affiliation, no warranty, safety, license |
Requires Node.js 22 or newer.
git clone https://github.com/firsttris/reactive-volcano-app.git && cd reactive-volcano-app
npm install
npm run dev # http://localhost:5173
No device at hand? The end-to-end tests run the whole app against a simulated Web Bluetooth stack;
npm run test:e2e:ui lets you click through it.
Stack: SolidJS with @solidjs/router · Tailwind CSS 4 and solid-ui
(Kobalte) · Paraglide JS for English and German · p-queue to serialize every GATT operation ·
vite-plugin-pwa · Vitest, Playwright and Biome. Details in Development and
Architecture.
npm run typecheck && npm run lint && npm test && npm run test:e2e
Bug reports, ideas and pull requests are welcome, see CONTRIBUTING.md. Reports from real devices help most: please include the device, its firmware version (shown under Settings), your browser and operating system.
Content type
Image
Digest
sha256:d59e60403…
Size
25.5 MB
Last updated
4 days ago
docker pull tristanteu/reactive-volcano-app