Open Source · Offline First · Apache 2.0

Know your air.
Keep it yours.

AirTo monitors air quality entirely on your local WiFi network. No cloud. No subscription. No data leaving your home — unless you choose to share it with the world.

BY PRADEEP S H in 𝕏
eCO₂
682ppm
Humidity
57%
eTVOC
138ppb
Temp
24.2°C
28
AQI INDEX
Good
0
Metrics monitored
0
Second update rate
0
Days local storage
$0
Monthly cost
100%
Open source
Why AirTo

Designed for
your privacy.

Everything runs on your ESP32. Your data never touches the internet — unless you decide to contribute to the global community map.

📡
Offline first
Works entirely on your local WiFi. Access data from any browser at airto.local — no app install, no account, no internet needed.
🔋
Rechargeable
Built-in 400mAh LiPo with XIAO's onboard charging circuit. Move it room to room. Charges via USB-C.
🌡️
Dual sensors
ENS161 for AQI, eCO₂ and TVOC. BME680 for temperature, humidity, pressure and gas resistance. Cross-validated readings.
💡
LED diffuser
RGB LED bleeds through a 0.6mm white PETG wall printed on a Bambu A1 Mini. Color shifts as air quality changes.
📱
Multi-device
Every AirTo gets a unique mDNS address. The app discovers all devices automatically. No IP addresses to manage.
🌍
Community map
Opt-in sharing. Hourly averages contributed anonymously to a free global air quality dataset visible to anyone worldwide.
Sensors

Five readings.
One glance.

ENS161 + BME680 on a single I²C bus. All signal processing on-chip. Readings every 5 seconds, stored locally for months.

🌿
AQI
Air Quality Index · 0–500 · relative to 24h baseline
28
index
💨
eCO₂
VOC-derived equivalent · 400–65,000 ppm
682
ppm
🧪
eTVOC
Total volatile organics · 0–65,000 ppb
138
ppb
🌡️
Temperature
Compensated for ESP32 self-heating
24.2
°C
💧
Humidity
Relative humidity · 0–100%RH
57
%RH
📊
Pressure
Barometric pressure · hPa
1013
hPa
Hardware StackXIAO ESP32-S3
XIAO ESP32-S3
WiFi · BLE · MCU · 8MB Flash
LIVE
ENS161
MOX Gas Sensor · I²C 0x52
I²C
BME680
Env. Sensor · I²C 0x76
I²C
WS2812B
RGB LED · 0.6mm PETG diffuser
GPIO
LiPo 603035
400mAh · 3.7V · JST 1.25mm
BAT
USB-C
Power · Firmware flash
PORT
LED Language

One color.
All the context.

No app needed. The LED bleeds through a 0.6mm PETG diffuser printed on a Bambu A1 Mini and morphs as conditions change.

Good
AQI 0 – 10
Clean, fresh air. No action needed.
Moderate
AQI 10 – 50
Acceptable. Sensitive groups may notice.
Poor
AQI 50 – 100
Consider opening a window soon.
Bad
AQI 100+
Ventilate now. Air quality is poor.
Community

Opt in.
Build the map.

Toggle one switch and your hourly averages join a free, open air quality dataset — anonymously, at city-level precision. Every reading visible on a live world map anyone can access.

Hourly averaged AQI, eCO₂, TVOC, temperature, humidity
City-level location only — rounded to 0.1° before sending
Anonymous SHA256 device ID — mathematically irreversible
Never your exact address or MAC address
Never an account, email, or any personal detail
Sharing settings
Active
Community sharing
Hourly averages, anonymous
Location precision
City area · ~10km only
WiFi geolocation
ESP32 scans → Mozilla API
Sync interval
Every 1 hour · 24 posts/day
Battery

Untethered.
All day.

400mAh LiPo with XIAO's built-in BMS. Deep sleep between readings extends battery life dramatically. Auto-switches modes when USB-C is connected.

BATTERY72%
~6h 20m remaining
Active mode
WiFi on · reading every 5s
~6–7h
Deep sleep
Wake every 60s only
~30h
Charging
USB-C · 50mA onboard BMS
~8h full
Latest · v1.0.0 · June 2026
Firmware

Flash from
your browser.

Plug in via USB-C and click once. No Python, no terminal, no drivers on Mac and Linux.

AirTo Flasher · v1.0.0
Scanning USB devices...
Found: XIAO ESP32-S3
Downloading airto-v1.0.0.bin
▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░ 62%
Flash complete. Booting AirTo...
airto.local is ready

Chrome 89+ · Edge 89+ · Windows · macOS · Linux

P
Pradeep S

Electronics maker and open source hardware creator with 178 published projects on Hackster.io. Building AirTo to make indoor air quality monitoring accessible, private, and open to everyone.

178
Projects
131
Followers
Apache 2.0
License
AirTo / Web Interface
Living Room · airto.local
Monitor
📊 Dashboard
📈 History
Device
💡 LED & Display
🌡️ Sensors
📡 Network
🔋 Power
Community
🌍 Data Sharing
📍 Location
System
⚡ Firmware
ℹ️ About
Dashboard
Live readings from Living Room · Updated 3 seconds ago
28
Good
Air quality is excellent. No action needed.
● LIVE
eCO₂
682ppm
Estimated from VOC
eTVOC
138ppb
Total volatile organics
Temperature
24.2°C
Offset corrected
Humidity
57%RH
Comfortable range
Pressure
1013hPa
Sea level reference
Gas Resistance
142
Clean air range
AQI over time
History
Stored locally on device · Last 7 days
Export data
Download CSV
All readings from the past 7 days
Download JSON
Raw JSON format for developers
Clear history
Permanently delete all stored readings
7-day AQI trend
avg 34 · min 18 · max 92
LED & Display
Control the WS2812B diffuser LED
Brightness
LED brightness
Adjust overall LED intensity
50%
Auto-dim at night
Reduce brightness 10pm – 7am
Auto-dim on battery
Cap at 15% when unplugged
LED on/off
Disable LED completely
Color thresholds
Good (green) below
AQI threshold for green LED
Sensors
Calibration and reading intervals
Intervals
Update frequency
How often sensors are read
Storage frequency
How often readings are saved to flash
Calibration
Temperature offset
Compensate for ESP32 self-heating (°C)
Sensor status
ENS161
I²C 0x52 · AQI, eCO₂, eTVOC
● Online
BME680
I²C 0x76 · Temp, Hum, Press, Gas
● Online
BME680 warm-up
Gas sensor calibration level
Level 3 / 3
Network
WiFi and local network settings
WiFi connection
Connected network
Currently joined
MyHomeWiFi
IP address
Local network address
192.168.1.45
Signal strength
WiFi RSSI
-52 dBm · Strong
Change WiFi
Connect to a different network
mDNS hostname
Device hostname
Access at this address in your browser
HTTP server
API enabled
Serve JSON on /api/current
Web UI enabled
Serve this dashboard page
Power
Battery and sleep settings
Battery status
Charge level
LiPo 603035 · 400mAh
72% · ~6h 20m
USB-C power
Charging status
Not charging
Sleep mode
Deep sleep enabled
Sleep between readings to save battery
Sleep duration
How long to sleep between readings
Wake on USB
Stay awake when USB-C is connected
Data Sharing
Contribute to the global open air quality network
Community sharing
Enable sharing
Contribute hourly averages anonymously
Sync interval
How often to upload averages
Last sync
Most recent successful upload
12 min ago
Total uploads
Since device was set up
847 readings
Privacy
Anonymous ID
SHA256 hash · cannot be reversed
7f3a9c2b...
Delete community data
Remove all your submissions from the server
Location
Used for community map placement only
Current location
City
Approximate location shared with community
Kuala Lumpur, MY
Coordinates
Rounded to ~10km precision
3.1°N · 101.7°E
Method
How location was determined
WiFi scan
Change location
Re-scan WiFi
Use nearby networks to detect location
Search city
Type your city name manually
Clear location
Remove location data. Disables community map.
Firmware
Update and manage device firmware
Current firmware
Version
Installed build
v1.0.0
Build date
When this firmware was compiled
June 13 2026
Latest available
Newest release on GitHub
v1.0.0 · Up to date
OTA update
Check for updates
Fetch latest release from GitHub
Danger zone
Factory reset
Erase all settings, history, and calibration
Restart device
Reboot the ESP32
About AirTo
Device information and system status
Device nameLiving Room
Device IDairto-a1b2c3
Firmwarev1.0.0
MicrocontrollerXIAO ESP32-S3
SensorsENS161 + BME680
Flash used1.2 MB / 4 MB
Uptime14h 32m
IP address192.168.1.45
mDNSairto-a1b2c3.local
MAC addressA1:B2:C3:D4:E5:F6
LicenseApache 2.0
Project byPradeep S
Saved