Zero-code software
for your electronic nose.
Flash firmware, record labeled sensor traces, compare sessions across days, and train a classifier — all with button clicks, and all scored honestly. Osmograph is the desktop app that turns a metal-oxide array into an instrument you can trust.
Small download.
Native install. Nothing to spare.
Osmograph is a Tauri app on a Rust core. No bundled browser, no Electron runtime to drag along — just a small native installer that's on your machine and running in seconds.
a tiny download for what it is — most desktop apps ship several times that size.
native Tauri + Rust core. Nothing heavy bundled, nothing extra to install.
download it and it's running — no bloat layers, no waiting.
download sizes — Windows .exe ≈4 MB · macOS .dmg ≈6 MB · Linux .deb /.rpm ≈7 MB. That's the size of the download, not the space the app uses once installed.
The installer isn’t code-signed yet, so Windows may show a blue “Windows protected your PC” dialog on first run. That’s SmartScreen flagging an unsigned download — it doesn’t mean the build is unsafe. To install:
- Click More info in the dialog.
- Click Run anyway.
- Install, then launch Osmograph as normal.
We plan to sign the installer with a paid code-signing certificate to remove this step — a free/self-signed certificate wouldn’t clear SmartScreen, so we’re not putting one in front of you as if it would.
One loop, from sensor to classifier
Osmograph follows the honest e-nose workflow: record reliably, compare fairly, then train a model whose accuracy you can actually trust.
Built for the Smell Monitor.
Osmograph is the companion app for the Smell Monitor. Flash firmware over Bluetooth, stream live sensor data, and train anomaly classifiers — all from one interface.
Record it once.
Reuse it forever.
Guided phase recordings label each sample as it's captured — baseline, exposure, recovery — and quality is validated live against per-channel R₀. Sessions land in a searchable library with a fingerprint you can rename, analyze, export, or replay offline.
Same smell, different day.
Still the same shape.
Sessions are normalized to their own per-channel R₀ (baseline when present, else the first samples) and aligned on relative time — so responses stay comparable across devices and days. Pick any channel subset, by name, not position.
Channel selection is label-based — you pick channels by name, so a 3-sensor rig and a 16-sensor rig compare without reconfiguring anything.
The accuracy you see is the accuracy you get.
Teach the e-nose to tell one smell from another. Record each substance several times, assign a label, set a window and quality filter, then train. Every model is scored out-of-sample with leave-one-recording-out cross-validation — so the number Osmograph reports isn't inflated by testing on the data it learned from.
More than one nose?
Manage them all.
Scan the network, add devices, and watch the whole fleet from one window. Each device streams with its own channel count and identity.
Sensors drift. Sessions pile up.
Osmograph handles it.
Enter each sensor's R₀ and power-law constants (a, b) so raw resistance becomes a defensible ppm estimate and a fair quality score. Values apply live to the trace, features, and analysis. Stored locally.
Describe your rig — ADC bits, load resistor, supply, divider wiring. Export a sensor_profile.json so the device travels between OpenSmell tools.
Set distinct warning, critical, and emergency patterns (including SOS), with volume and frequency control and a live pattern preview.
New MOX sensors need 24 hours to stabilise. The countdown runs in real time and survives app restarts — no lost progress.
Drop .py scripts or .head models into the plugins folder — they run on the live sensor stream.
Export labeled CSV, run automated quality checks into a Data Hub review queue, and pull or push anonymised sessions via the OpenSmell Hugging Face dataset.
Streaming modes
Same sensor, three ways off the board. The one-click firmware runs USB Serial and WiFi at once — no modes to select.
USB Serial
Data over the USB cable, always on.
- OSM-prefixed CSV at 115200 baud, every 500 ms
- Default path for recording sessions
- The OSM prefix keeps bootloader chatter out of your traces
WiFi AP
Stream over the air once it is flashed.
- ESP32 broadcasts its own network — no router needed
- TCP server on port 8080, mDNS advertises _osmograph._tcp
- Power from a battery bank and unplug the laptop
BLE
Untethered, lower power, 10 Hz streaming.
- Flashing the BLE variant + Osmograph's BLE reader
- Same CSV payload pushed over BLE notify
- Best for long, battery-powered sessions
The one-click binary is compiled for the classic ESP32. ESP32-S3, C3, Uno, and Pico share the same CSV stream contract but need their own toolchain — compare boards in the e-nose builder.
Build on the SDK
Osmograph is built on a modular Python backend. Extract the framework features (28 per channel, plus cross-channel selectivity and global features) for your own pipelines withpip install opensmell. The 6-channel reference rig yields187features; the count scales with your channel count.
from opensmell import extract_features features, names = extract_features("recording.csv") print(features.shape) # (N_windows, 187) on 6 channels
Before you build — can a MOX sensor even smell it?
Osmograph sits on the OpenSmell SDK. Before you spend on a rig, the SDK's MOX feasibility chain takes a compound (SMILES in, verdict out) and walks it through the physics from molecule to signal. The chain ends in one verdict: pass or fail.
A smellability verdict is a feasibility range, not a calibrated concentration — it tells you whether to buy the parts, not how strong the smell is.
Get the e-nose software that doesn't pretend.
Download it, connect a board, and record your first labeled session in minutes — or start with the science and the build guide first.
