Spaces:
Sleeping
Sleeping
Arjunvir Singh commited on
Commit Β·
d92c5b9
1
Parent(s): 6938d2a
fix: restore full README after HF Space init merge
Browse files
README.md
CHANGED
|
@@ -1,10 +1,55 @@
|
|
| 1 |
---
|
| 2 |
-
title: Grocery Prices
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: docker
|
|
|
|
| 7 |
pinned: false
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Canadian Grocery Prices
|
| 3 |
+
emoji: π
|
| 4 |
+
colorFrom: yellow
|
| 5 |
+
colorTo: red
|
| 6 |
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
pinned: false
|
| 9 |
+
short_description: Live Canadian grocery prices from 8 ingestion sources
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# grocery-price-dashboard
|
| 13 |
+
|
| 14 |
+
Read-only public dashboard for the [grocery-price-rag](https://github.com/Arjun10g/grocery-price-rag) Canadian grocery price ingestion pipeline.
|
| 15 |
+
|
| 16 |
+
Live data: 165k+ price observations across StatCan provincial averages, Loblaws + Sobeys retailer APIs, Schema.org markup on long-tail grocers, and crowdsourced Open Food Facts. Refreshed every two weeks via Cloud Run + Cloud Scheduler.
|
| 17 |
+
|
| 18 |
+
## Stack
|
| 19 |
+
|
| 20 |
+
- **Next.js 16** (App Router) + TypeScript + Tailwind 4
|
| 21 |
+
- **Supabase JS** with anon key β RLS gates read access (see [migration 20260505011514](https://github.com/Arjun10g/grocery-price-rag/blob/main/supabase/migrations/20260505011514_anon_read_policies.sql))
|
| 22 |
+
- **Recharts** for price-history charts
|
| 23 |
+
- Deployed via Docker on Hugging Face Spaces
|
| 24 |
+
|
| 25 |
+
## Pages
|
| 26 |
+
|
| 27 |
+
| Route | What it does |
|
| 28 |
+
|---|---|
|
| 29 |
+
| `/` | Search + recent observations feed + table-count overview |
|
| 30 |
+
| `/search?q=...` | Product name + brand search (ILIKE; pg_trgm hybrid is future work) |
|
| 31 |
+
| `/products/[id]` | Price history chart, latest by retailer, all observations |
|
| 32 |
+
| `/sources` | Source confidence + recent pipeline runs (succeeded/failed/dlq) |
|
| 33 |
+
| `/stores` | 1,931 grocery stores grouped by province (from osm_overpass) |
|
| 34 |
+
|
| 35 |
+
## Local dev
|
| 36 |
+
|
| 37 |
+
```bash
|
| 38 |
+
cp .env.example .env.local
|
| 39 |
+
# Fill in NEXT_PUBLIC_SUPABASE_URL + NEXT_PUBLIC_SUPABASE_ANON_KEY
|
| 40 |
+
# (anon key is intentionally public β RLS gates what's readable)
|
| 41 |
+
|
| 42 |
+
npm install
|
| 43 |
+
npm run dev # http://localhost:3000
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
## What this dashboard is NOT
|
| 47 |
+
|
| 48 |
+
- Not a search engine (no semantic / embedding queries β those columns exist in the ingestion DB but the dashboard sticks to ILIKE)
|
| 49 |
+
- Not a notification service (no auth, no saved searches)
|
| 50 |
+
- Not a price-prediction tool (every row is a sighting, not a forecast)
|
| 51 |
+
- Not real-time (re-validates server-side at most once per minute via `revalidate`)
|
| 52 |
+
|
| 53 |
+
## License
|
| 54 |
+
|
| 55 |
+
MIT.
|