Timer or button
Deep sleep ends after 5–3600 s, set per device over MQTT.
Open-source pantry scales · ESP32-S3 · MIT
Salt, flour, rice, coffee. W8Y weighs what's left in every container and puts it on the shopping list the moment it runs low — without you opening a single cupboard.
Your own hardware · your own broker · nothing sent to a cloud
All-purpose flour ESP32-1A2B3C4D5E6F
The problem
You find out you're out of flour with your hands in the dough.
A cupboard is a black box. You can see that a jar is lowish — you can't see whether that's two more loaves or none. So you guess, and guessing goes one of two ways: you buy a fourth bag of rice you didn't need, or you're standing in the kitchen mid-recipe with an empty jar.
Apps don't fix this, because they need you to remember to tell them. That's the same job you were already failing at, plus typing.
A small scale sits under each jar and reports grams, not vibes. You set the level you'd want to reorder at, once. From then on the server watches every reading and opens a shopping-list entry the moment a jar drops below it — and closes it again when you refill.
Nothing else about your kitchen changes. You don't scan anything, log anything, or open an app to keep it fed.
Why bother
Every container reports an actual number, every twenty seconds, whether or not anyone is looking at it.
Set a reorder level once. Jars add themselves when they drop below it and take themselves off when you fill them back up.
Your broker, your server, your database file. There's no W8Y account, because there's no W8Y service.
How it works
A small battery-powered board with a load cell under it. It spends almost all of its life asleep, which is why it lasts.
XIAO ESP32-S3 + HX711
deep sleep between readings
New scales show up in the dashboard on their own. You give it a label and the level you'd want to reorder at, and that's the last configuration it needs.
device auto-appears, unclaimed
POST /api/devices to claim it
It weighs, reports and goes back to sleep. You only hear from it when something is actually running low.
wakes every 20 s (5–3600 s)
one retained MQTT message, then sleep
The dashboard
Build one
There is nothing to order from us, because there is no us. Firmware, server and dashboard all live in one repository under MIT — clone it, flash a board, and bring the stack up with Docker Compose.
| 1× | Seeed XIAO ESP32-S3 | € 8 |
| 1× | HX711 breakout | € 3 |
| 1× | Load cell, 5 kg | € 6 |
| 1× | LiPo cell, 500 mAh | € 7 |
| 1× | Push button + wire | € 1 |
| 1× | Printed platform | € 2 |
| Per jar | ≈ € 27 |
# firmware — credentials stay in secrets.h $ cp apps/embedded/secrets.h.example \ apps/embedded/secrets.h $ pio run -t upload # broker + server + dashboard $ docker compose up -d # the scale appears here, unclaimed $ open http://localhost:3000
Deep sleep ends after 5–3600 s, set per device over MQTT.
Tare and calibration factor live in NVS, so they survive a reboot.
JSON to w8y/devices/<id>/weight, then straight back to sleep.
Every reading is kept. The dashboard polls REST — no sockets to babysit.
The server opens a shopping-list entry, and resolves it when the jar is refilled.
| Microcontroller | Seeed XIAO ESP32-S3 |
| Sensor | HX711 + strain gauge |
| Protocol | MQTT / JSON (V4), retained |
| Broker | Mosquitto · 1883 · 8883 TLS |
| Server | Node · Express · SQLite |
| Dashboard | Vue 3 · Pinia · polling |
| Updates | OTA over a button wake |
| License | MIT |
Start here
One jar is enough to know whether you want ten. The repository has the firmware, the wiring, the server and the dashboard.
Get the code →