Catalog ›Companies & SMBs ›Operations
Stockroom — stock and inventory
The inventory that fits in a file: stock levels, minimum thresholds and warehouse value, with low-stock alerts always in sight.
📦 Items⚠️ Low stock💶 Value
data space «stockroom-en» — the suite’s glue: on your device, multi-user with one invite (link or QR), end-to-end encrypted.
What it records
- Item
- Category...
- Current stock
- Minimum stock
- Unit price (€)
Composed of 3 micro apps
One job each, over the same data: every micro app reads and writes the shared data space “stockroom-en” (with your consent, asked on first open). Everything stays on your device — and with a single invite the whole suite goes multi-user, end-to-end encrypted.
How it works
This is a Reactive app: a plain text document that your browser turns into a working app — forms, live data, tables, statistics and even charts, with nothing to install or configure.
- Use it right away. Hit “Use this app”: it opens right in your browser, ready to go, with data saved only on your device.
- Your data stays yours. Everything is stored locally on your device, kept separate for each app: no account, no server, nothing to set up.
- Make it your own. The text below is the entire app: copy it, tweak fields, views and words, and your changes become interactive instantly.
- Share it as a file. An app is a simple file: save it, export it or share it with a link; and with encrypted collaboration several people edit the same data in real time.
The app’s source
# 📦 Stockroom
The inventory that fits in a file: stock levels, minimum thresholds and warehouse value, with low-stock alerts always in sight.
:::::page{title="Items" icon="📦"}
## Item catalog
Register every item with its stock level, minimum threshold and unit price. The
pencil in the table edits stock and prices; columns sort on click and the CSV
buttons import/export the inventory.
::::form{path="items" id="fart"}
::input{form="fart" field="name" placeholder="Item" required="true"}
:::select{form="fart" field="category" placeholder="Category..."}
- Finished goods
- Raw materials
- Consumables
- Spare parts
:::
::input{form="fart" field="stock" type="number" placeholder="Current stock" required="true"}
::input{form="fart" field="minimum" type="number" placeholder="Minimum stock"}
::input{form="fart" field="price" type="number" placeholder="Unit price (€)"}
::add-form{form="fart" path="items" label="Add item"}
::::
:::table{path="items" headers="Item,Category,Stock,Minimum,Price,Value" deletable="true" editform="fart"}
**{name}** | {category} | {stock} | {minimum} | € {price} | € {stock*price}
:::
:::::
:::::page{title="Low stock" icon="⚠️"}
## Items to reorder
The check runs by itself on every change: items whose stock is at or below
the minimum threshold show up here.
:::python{data="items"}
```
rows = data.get("items", [])
if not rows:
print("No items in the warehouse.")
else:
low = [r for r in rows
if float(r.get("stock", 0) or 0) <= float(r.get("minimum", 0) or 0)
and (r.get("minimum") or "") != ""]
if not low:
print("✅ All good: no items below minimum stock.")
else:
print(f"⚠️ {len(low)} items to reorder:\n")
for r in low:
print(f" • {r.get('name','?')} — stock {r.get('stock')}, minimum {r.get('minimum')}")
```
:::
:::::
:::::page{title="Value" icon="💶"}
## What the warehouse is worth
:::grid{cols="2"}
**Items in catalog**
:count[nart]{path="items"}
---
**Total value (€)**
:sum[vtot]{path="items" field="stock*price"}
:::
## By category
:::group-by{path="items" field="category" as="table" headers="Item,Stock,Value"}
{name} | {stock} | € {stock*price}
:::
:::::