Offline-first daily cashbook for single-shop traders in Ghana — cash & mobile money in/out, close-of-day reconciliation, WhatsApp daily summary. TypeScript PWA + Prisma/PostgreSQL.
# Daybook
A daily cashbook for single-shop traders in Ghana. Records cash and mobile money
coming in and going out, and at closing time tells the owner whether the money in
the drawer and the MoMo balance match what was sold.
**Status: built through Step 8 on a dev machine; not yet deployed.** All
packages typecheck, unit tests pass, and the offline loop, sync, close-of-day,
WhatsApp summary, export and delete flows are implemented. Deployment to the
VM (nginx + PM2 + TLS) and the physical-phone field checks remain.
---
## Read these first
| File | What it is |
|---|---|
| `CLAUDE.md` | The contract. Hard rules, stack, doc index, working style. |
| `docs/01_PRD.md` | What we're building, for whom, and what is out of scope. |
| `docs/02_TRD.md` | How it's built. Stack, standards, budgets, security. |
| `docs/03_UI_UX.md` | Tokens, screens, states, copy rules. |
| `docs/03_wireframes.svg` | Layout reference for the four core screens. |
| `docs/04_APP_FLOW.md` | Routes, auth, the entry loop, close of day, sync, errors. |
| `docs/05_BACKEND_SCHEMA.md` | Prisma models, IndexedDB stores, the `/sync` contract. |
| `docs/06_IMPLEMENTATION_PLAN.md` | Nine build steps with acceptance criteria. |
| `KICKOFF.md` | The exact prompts to give Claude Code, in order. |
| `FIELD_SETUP.md` | The in-person install script and validation plan. |
| `DECISIONS.md` | Running log. Append, never rewrite. |
| `ORIGIN_BRIEF.md` | **Superseded.** History only. Do not implement from it. |
Precedence when documents disagree: `CLAUDE.md`, then `docs/01_PRD.md`, then the
rest of `docs/`. `ORIGIN_BRIEF.md` is never authoritative.
---
## Prerequisites
- Node 20 LTS
- pnpm 9
- PostgreSQL 16, running locally
- A browser with devtools (Chrome, for the service worker and throttling tools)
- For field testing: one low-end Android phone
---
## Setup
```bash
git clone daybook && cd daybook
pnpm install
cp .env.example .env
openssl rand -base64 48 # paste into JWT_SECRET
sudo -u postg …