Mobile-first PWA for South African spaza shop owners — barcode scanning, stock management, WhatsApp summaries
# Movestock
A mobile-first PWA for South African spaza shop and small-retail owners. Open the app on
an Android phone → scan a barcode → product is added to the sale → stock auto-deducts →
see an in-app daily summary each evening. Built for owners with no technical background on
mid-range phones with flaky data.
> **New to this codebase?** Read ARCHITECTURE.md first — it explains how
> the app is wired (auth, data flow, folder layout, compliance subsystem). CLAUDE.md
> is the working reference (schema, conventions, workflow rules); ARCHIVE.md is the
> phase-by-phase build history.
---
## Features
- **Barcode scanning** — phone camera via `@zxing/browser`, no hardware scanner needed
- **Sale flow** — scan → cart → complete; stock auto-deducted (FEFO batch consumption)
- **Stock management** — stock take, manual adjustments, low-stock + expiry alerts, stock-loss report
- **Teller management** — owner creates teller accounts (6-digit PIN); tellers are locked to the sale screen
- **In-app daily summary** — today's revenue, sales count, and low-stock warnings on the dashboard
- **Offline support** — sales queued to IndexedDB when offline; synced on reconnect
- **Compliance module** — guided journey for SA spaza regulation (permits, CoA, CIPC, SARS) + R500M Spaza Shop Support Fund readiness
- **Subscriptions** — PayFast (recurring card) or manual EFT (admin reconciles bank statements)
- **PWA** — installable on Android; cache-first App Shell opens instantly
---
## Tech Stack
| Layer | Choice |
|---|---|
| Framework | Next.js 16, App Router, TypeScript strict |
| Styling | Tailwind CSS |
| Database + Auth | Supabase (PostgreSQL, Row-Level Security, Supabase Auth) |
| Payments | PayFast (cards) + manual EFT reconciliation |
| Deployment | Vercel + Vercel Cron |
| Validation | Zod |
| Barcode | `@zxing/browser` |
| Offline | IndexedDB via `idb` |
| Timezone | `date-fns-tz` (`Africa/Johannesburg`) |
| Testing | Vitest (~790 unit tests) |
See `package.json` for exact …