# Sika Warri
Un service d'enregistrement de la monnaie gardée chez le commerçant, pour le
commerce de détail informel en Côte d'Ivoire.
> Sika Warri est un service d'enregistrement. Sika Warri ne détient, ne reçoit
> et ne transfère aucun fonds. La monnaie enregistrée reste physiquement chez le
> commerçant et constitue une dette commerciale de ce commerçant envers son
> client. Elle est utilisable uniquement auprès de ce même commerçant. Le client
> peut à tout moment demander le remboursement en espèces auprès du commerçant
> concerné.
That paragraph is not marketing copy. It is the legal position, it is enforced
structurally in the database rather than in the interface, and it must appear
verbatim in `/conditions` and in vendor onboarding.
---
## What is built
| Layer | State |
|---|---|
| Data layer — 14 migrations, RLS, ledger RPC | Built, 183 tests green in CI |
| Edge Functions — register, login, change-pin, initiate-debit, confirm-debit | Built and deployed; verified end to end against the live project |
| Vendor PWA | Not started |
| Customer PWA | Not started |
| Keepalive workflow | **Not built** |
| Backup workflow | **Not built** |
---
## Local setup
Requires Node 24+. Docker is **not** required for anything in this repository.
```bash
npm install
npm run smoke # applies all migrations to an embedded Postgres (PGlite)
npm run portability # asserts no Supabase dependency in the data layer
npx tsc --noEmit # typecheck
```
`npm test` needs a real Postgres 15+ and reads `DATABASE_URL`. There is no
default: a missing variable fails loudly rather than silently targeting
something unintended. CI provides one as a service container — see
`.github/workflows/ci.yml`. Without a local Postgres, `npm run smoke` is the
fast substitute (real Postgres parser, single connection, no RLS).
### Migrations
```bash
npx supabase login --token
npx supabase link --project-ref
npx supabase db push --linked
```
`scripts/migrate.mjs` applies the sam …