Shoppy — Smart Shared Shopping Lists

shopping cart in supermarket aisle

Overview

A full‑featured, serverless shopping list app built with React Native (Expo) and Firebase, with a companion Samsung Galaxy Watch app. Real‑time sync across all devices — no dedicated server required.

Features

Shopping Lists — Multiple named lists with tabs; items grouped by category.
Mark Items — Check off items in real time while shopping.
Copy from List — Copy selected items from any past list into the current or a new list.
Live Change Notifications — Orange banner + highlighted rows when someone adds/checks/updates an item.
Item Catalog / Quick Pick — All items (pantry + history + active) catalogued per category; suggested as pills.
Pantry Management — Track desired vs. current stock; auto‑calculate what to buy; auto‑fill the list.
Pantry Staleness Filter — Filter items not updated in 3d/7d/30d/3m; oldest first.
Pantry Update Display — Cards show last stock‑update and last‑purchased dates (grey→orange→red as it ages).
Stock History per Item — Collapsible log of every amount change; delete mistakes; rate recalculates instantly.
Expiry Date Tracking — List items can have an expiry; pantry tracks multi‑lot expiry (e.g., milk 10.05 + 14.05).
Expiry Capture at Purchase — Floating panel for 10 s on check‑off to capture expiry (pause or dismiss).
Purchase History — Full trip record: date, store, items, cost; edit price/amount/unit; edit store later.
Price Tracking — Prices per item per store; trends over time.
Frequency Analysis — Auto‑detect how often you buy each item.
Restock Reminder — Preselect items ≥ 75% of expected interval; deselect before adding.
Consumption Tracking — Timestamped amount changes; same‑day corrections overwrite; avg rate computed.
Household Sharing — 6‑character key; no account needed.
Real‑time Sync — All changes appear instantly on every device.
Push Notifications — Notify household when items are added.
GPS Store Detection — Auto‑detect store within 150 m.
Item Photos — Attach photos; stored in Firebase Storage.
Nutrition Info — Search Open Food Facts for macros, etc.
Export / Import — Full JSON via share sheet (includes expiry lots).
Statistics — Frequency, top items, price trends, spend by store.
Serverless — Only Firebase; no custom server.
Galaxy Watch App — View lists, check/uncheck, complete shopping; real‑time sync.

Key Flows

Household Sharing

• First user creates a household and gets a random 6‑character key (e.g. XB7K2Q).
• Others enter the key on the Join screen. Everyone shares one Firestore subtree; changes appear instantly.

Real‑time Notifications

• On first launch, the app requests notification permission and gets an Expo push token (saved in Firestore).
• When anyone adds an item, the app sends push via Expo to all other members — no custom server.
• In‑app: an orange banner appears and changed rows are highlighted until dismissed.

Shopping Trip

• See the active list; switch via tabs. GPS auto‑detects the store (within 150 m) or set manually.
• Add items with Quick Pick suggestions; check off as you shop — checked‑by name + time shown.
• For dairy/meat/spreads/refrigerated: a floating expiry panel appears for 10 s; tap to pause and enter a date or dismiss.
• Tap Complete Shopping to archive to History and create a fresh empty list.

Copy from List

• Tap the 📋 icon or “Copy from another list” on an empty list.
• Select a source, tick items to copy, then “Add to current” or “Create new list from selected”.

Expiry Tracking

• Set defaultExpiryDays per pantry item (e.g. milk = 14) or override per item.
• Adding to a list pre‑hints an expiry; leave blank to auto‑calculate from today.
• At purchase (check‑off), a floating panel prompts for the date; saving writes to the list item and creates an ExpiryLot on the pantry item.
• Expiry is shown on rows with colour coding (grey → orange → red); pantry shows all lots and highlights soon/expired.

Consumption Rate

• Every stock change appends a timestamped AmountLog (source: manual | purchase).
• Same‑day corrections overwrite instead of duplicating entries.
• calcConsumptionRate walks logs oldest→newest: decreases count as consumption; increases reset the segment (purchases).
• Result: totalConsumed / totalDays, formatted as /day, /week, /month, or 1 unit / N days.

Galaxy Watch

• Enter the 6‑char share key once; saved to DataStore.
• Watch connects directly to Firestore; active lists show instantly.
• Tap to check/uncheck; scroll bottom → Complete ✓ → pantry updates on the watch.
• Swipe right to go back to the list picker.

Pantry → List Auto-generation

• For each item where current < desired → needed = desired − current; add to active list if missing.
• Then check purchaseFrequencyDays: flag items at ≥ 75% elapsed (or never purchased).
• Restock Reminder sheet lists flagged items (pre‑selected) with days‑since‑purchase + overdue badge; tap to deselect; confirm to add.

Stock History Management

• Every currentAmount change writes an AmountLog (manual | purchase).
• Same‑day edits overwrite the earlier entry (correction).
• You can delete any log entry in the collapsible history; consumption rate recalculates immediately from remaining data.

Categories — Default Expiry Tracking

Dairy — ✅ on
Meat & Fish — ✅ on
Refrigerated — ✅ on
ממרחים (Spreads) — ✅ on
All others — off

Override per item in Pantry edit via “Track expiry on purchase”.

family with shopping cart

Serverless. Real‑time. Family‑friendly.

Share a 6‑character key with your household. All changes appear instantly on everyone’s phone and Galaxy Watch — no custom server needed.