Cursor Ai hachathon Ethiopia project
# SuqCheck
Evidence-backed retail price intelligence for Addis Ababa staples.
Shoppers look up prices and submit evidence (receipt, shelf tag, posted price list, or by hand). Brands and analysts read the same feed on a live dashboard. Every price comes from weighted evidence — nothing sets a price directly — and each estimate carries a confidence score with a human-readable breakdown.
API: suq-check-api.onrender.com · Dashboard: suq-check.vercel.app · Docs: `docs/00-onepager.md`
## Repo layout
| Path | Role |
| --- | --- |
| `backend/` | FastAPI + Neon Postgres, price engine, verification gate, Gemini OCR |
| `mobile/` | Expo consumer app (SDK 54) |
| `dashboard/` | Next.js brand / analyst dashboard |
| `contracts/` | Shared OpenAPI + response fixtures |
| `data/` | Seed CSVs (products, stores) |
| `docs/` | Strategy, unit economics, pitch |
`contracts/openapi.yaml` is the boundary between backend and frontends. Regenerate it from FastAPI after schema changes; do not edit it by hand.
## Quick start
### API
```bash
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -e '.[dev]'
cp .env.example .env # fill Neon + Gemini keys as needed
uvicorn app.main:app --reload
```
- Interactive docs:
127.0.0.1
- Health: `GET /healthz`
- `USE_FIXTURES=true` serves `contracts/fixtures/` without a database
- `USE_FIXTURES=false` serves the engine and Neon (run `alembic upgrade head` first)
Details: `backend/README.md`
### Mobile
```bash
cd mobile
npm install
npm start
```
Defaults to the deployed API. For a local backend, copy `.env.example` → `.env` and set `EXPO_PUBLIC_API_URL` to your machine's LAN IP (phones cannot reach `127.0.0.1`).
Details: `mobile/README.md`
### Dashboard
```bash
cd dashboard
npm install
cp .env.example .env.local
npm run generate:api
npm run dev
```
Open
localhost. Set `NEXT_PUBLIC_API_URL` to the API base URL (no trailing slash).
Details: `dashboard/README.md`
## Try it / demo
You do not …