CatalogCompanies & 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.

▶ Open the suite (3 micro apps)

or open it as a single app

warehouseinventorystocksuppliesitemsvalue

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.

  1. Use it right away. Hit “Use this app”: it opens right in your browser, ready to go, with data saved only on your device.
  2. Your data stays yours. Everything is stored locally on your device, kept separate for each app: no account, no server, nothing to set up.
  3. Make it your own. The text below is the entire app: copy it, tweak fields, views and words, and your changes become interactive instantly.
  4. 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}
:::
:::::