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.

▶ Use this app

shopping listgroceriesfamilyhouseholdshared

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.

  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
# 🛒 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.