Open-source pantry scales · ESP32-S3 · MIT

Never run out of the boring stuff again.

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

REORDER 400 g FLOUR
Left in the jar 340 g
Added to your list

The problem

You find out you're out of flour with your hands in the dough.

Why it keeps happening

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.

What W8Y changes

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

Grams, not guesses

Every container reports an actual number, every twenty seconds, whether or not anyone is looking at it.

The list writes itself

Set a reorder level once. Jars add themselves when they drop below it and take themselves off when you fill them back up.

Stays in your house

Your broker, your server, your database file. There's no W8Y account, because there's no W8Y service.

How it works

STEP ONE

Put a scale under the jar

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

STEP TWO

Name it once

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

STEP THREE

Forget about 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

Everything you have, low ones first.

Snapshot of a running pantry — not a live feed
All-purpose flourLOW
340 g 17%
Black pepperLOW
82 g 16%
Penne pastaLOW
150 g 10%
Kosher saltFULL
1,840 g 92%
Basmati riceFULL
2,140 g 86%
Granulated sugarFULL
1,620 g 81%
Ground cinnamonFULL
156 g 78%
Olive oilFULL
720 g 72%

Build one

Two boards, a load cell, and an afternoon.

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.

Parts, per scale

Seeed XIAO ESP32-S3€ 8
HX711 breakout€ 3
Load cell, 5 kg€ 6
LiPo cell, 500 mAh€ 7
Push button + wire€ 1
Printed platform€ 2
Per jar≈ € 27

Getting it running

# 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
01 / WAKE

Timer or button

Deep sleep ends after 5–3600 s, set per device over MQTT.

02 / WEIGH

HX711 + load cell

Tare and calibration factor live in NVS, so they survive a reboot.

03 / PUBLISH

One retained message

JSON to w8y/devices/<id>/weight, then straight back to sleep.

04 / STORE

SQLite, append-only

Every reading is kept. The dashboard polls REST — no sockets to babysit.

05 / EVALUATE

Below threshold?

The server opens a shopping-list entry, and resolves it when the jar is refilled.

What you're building

MicrocontrollerSeeed XIAO ESP32-S3
SensorHX711 + strain gauge
ProtocolMQTT / JSON (V4), retained
BrokerMosquitto · 1883 · 8883 TLS
ServerNode · Express · SQLite
DashboardVue 3 · Pinia · polling
UpdatesOTA over a button wake
LicenseMIT

Working today

  • Scale → broker → server → dashboard, end to end
  • Devices appear on their own, you name them
  • Per-device thresholds, evaluated server-side
  • Shopping list opens and resolves by itself
  • Tare, calibrate and re-interval remotely

Not built yet

  • The agent that turns the list into a delivery
  • Published container images to pull from
  • TLS on the REST API
  • More than one prototype, on one desk

Start here

Put one under the flour and see.

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 →
ESP32-S3 + HX711 MQTT / JSON Node + SQLite Vue 3 dashboard Docker Compose MIT