Sign inSign up

tristanteu/reactive-volcano-app

By tristanteu

•Updated about 5 hours ago

Unofficial Web Bluetooth control app for compatible vaporizers (Volcano, Venty, Veazy, Crafty)

Image
0

359

tristanteu/reactive-volcano-app repository overview

Reactive Vaporizer App: Web Bluetooth control with live temperature, workflows, device settings and self-diagnosis

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.

Build Release Docker Image Version Docker Pulls Platforms License: CC BY-NC 4.0
SolidJS TypeScript Vite Tailwind CSS PWA

▶ Open the app⁠ • Why?⁠ • Features⁠ • Get started⁠ • Self-hosting⁠ • Documentation⁠ • Development⁠

The control screens for a desktop vaporizer, a portable with boost modes and a portable with battery display

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).

⁠💡 Why?

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:

  • Nothing to install: a web page that becomes an app on your home screen if you want it to. Works on Android, Windows, macOS, ChromeOS and Linux, and on iOS through a Web Bluetooth browser.
  • Live: temperature and state arrive as Bluetooth notifications the moment the device sends them (portables with a single control channel are queried twice a second), and every change you make is written within a fraction of a second.
  • Workflows: automate a session on a desktop vaporizer: heat to 170 °C, hold, run the pump, step up to 175 °C, and so on. Build your own, share them as JSON.
  • Private by design: there is no backend. The app talks to your device and nothing else, keeps its data in your browser and has no tracking, analytics or accounts.
  • Open and self-hostable: one small nginx container for amd64 and arm64, or any static web server.

⁠✨ Features

Desktop · Volcano HybridPortable · Venty / VeazyPortable · 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 BluetoothVeazy✅
💡 Charge indicator LED✅
📍 Find my deviceVeazyCrafty+
🩺 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⁠.

⁠📸 Screenshots

Connect screen with the supported devices and help for devices that are not found
Connect: one tap, with help if nothing is found
Workflow list with four workflows and their temperature steps
Workflows: run, edit, import, export · docs →⁠
Settings for the desktop vaporizer: shutdown time, brightness, vibration, standby light, unit and device info
Settings: device options, info and diagnosis
Settings for the portable: LED brightness, vibration, boost options and eco charging
Portable settings: boost and eco charging
Settings for the Crafty: brightness, shutdown time, permanent Bluetooth, charge LED
Crafty settings: shutdown, LED, Bluetooth
The control screen in light mode
Light mode: follows your system

⁠🚀 Get started

  1. Open firsttris.github.io/reactive-volcano-app⁠ in Chrome, Edge or Opera.
  2. Switch on your device and make sure it is not connected to another phone or app.
  3. Tap Connect Device and pick it from the browser's Bluetooth dialog.
⁠🌐 Browser support
PlatformWorks withNotes
Android, Windows, macOS, ChromeOSChrome, Edge, OperaWeb Bluetooth is on by default
LinuxChrome, Chromiumenable chrome://flags/#enable-web-bluetooth once, see Getting started⁠
iOS, iPadOSBluefy⁠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.

⁠🐳 Self-hosting

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
Docker Compose
services:
  vaporizer-app:
    image: tristanteu/reactive-volcano-app:latest
    ports:
      - "8080:80"
    restart: unless-stopped
Podman Quadlet
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).

⁠📚 Documentation

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

⁠🛠️ Development

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

⁠🤝 Contributing

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.


CC BY-NC 4.0⁠ · © Tristan Teufel and contributors · Deutsche Version⁠
This is an independent, unofficial open-source project. It is not affiliated with, endorsed, sponsored or authorized by Storz & Bickel GmbH.
STORZ & BICKEL, VOLCANO, VOLCANO HYBRID, VENTY, VEAZY and CRAFTY are trademarks of Storz & Bickel GmbH, used only to describe compatibility.
Provided “as is”, without warranty. Use at your own risk. Legal notice⁠

Tag summary

Content type

Image

Digest

sha256:d59e60403…

Size

25.5 MB

Last updated

4 days ago

docker pull tristanteu/reactive-volcano-app