Catalog ›Personal life ›Home
Shared Shopping List — free, no account needed
A simple shopping list: write down what needs buying, add a quantity if it helps, and mark each item "Bought" once you've picked it up. Since this is a Reactive document, turning on multi-user sync from the top menu lets more than one person in the household see and update the same list from their own phone — handy when grocery runs can fall to anyone at home.
What it records
- What do you need to buy
- Quantity (e.g. 2 liters, 1 pack)
- Status...
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
# 🛒 Shared Shopping List
A simple shopping list: write down what needs buying, add a quantity if it
helps, and mark each item "Bought" once you've picked it up. Since this is a
Reactive document, turning on multi-user sync from the top menu lets more
than one person in the household see and update the same list from their own
phone — handy when grocery runs can fall to anyone at home.
::::form{path="items" id="fsp"}
::input{form="fsp" field="name" placeholder="What do you need to buy" required="true"}
::input{form="fsp" field="quantity" placeholder="Quantity (e.g. 2 liters, 1 pack)"}
:::select{form="fsp" field="bought" placeholder="Status..." required="true"}
- Still needed
- Bought
:::
::add-form{form="fsp" path="items" label="Add item"}
::::
## List
:::list{path="items" editform="fsp" deletable="true"}
**{name}** {quantity} — {bought}
:::
## Still needed
:::filter{path="items" field="bought" equals="Still needed" as="list"}
{name} {quantity}
:::
:::python{data="items"}
```
rows = data["items"]
needed = sum(1 for r in rows if r.get("bought") == "Still needed")
total = len(rows)
print(f"Items still needed: {needed} out of {total}")
```
:::
To mark an item as bought, just tap the edit icon in the list and change its
status to "Bought": it disappears right away from the still-needed section.