App for Kenyan Swahili
# Kabisa Swahili App
A learning app for **spoken Kenyan Swahili** — the everyday register actually used on the streets of Nairobi, Mombasa, Kisumu — taught with the textbook *Sanifu* equivalent always shown alongside.
V1 is for absolute beginners. Scope is deliberately narrow: only the m/wa and n/n noun classes, only present tense, simple vocabulary from a curated seed. *Skeleton first, then dress it up.*
---
## Stack
- **Vite 8** + **React 19** + **TypeScript 5.9** (strict)
- **react-router-dom 7**
- **Tailwind 3**
- **Vitest 4** + **@testing-library/react**
- **Supabase** — Postgres, Google OAuth, Row-Level Security
Front-end talks to Supabase directly via `@supabase/supabase-js`. No separate backend.
---
## Setup
```bash
# 1. Clone and install
npm install
# 2. Provision Supabase
# Follow db/README.md to create the project and apply the two SQL
# migrations (db/migrations/001_init.sql and 002_rls.sql).
# 3. Configure env
cp .env.example .env.local
# Fill in the four values from Supabase Settings → API.
# 4. Seed content
npm run db:seed
# Loads every content/modules/*.json into the live DB. Idempotent.
# 5. Run the dev server
npm run dev
```
Without `.env.local`, the prototype still runs against the local JSON glob — useful for offline work and CI. As soon as Supabase env vars are set, the API client takes over.
---
## Scripts
| Script | What it does |
| :---- | :---- |
| `npm run dev` | Vite dev server at `
localhost` |
| `npm run build` | `tsc -b && vite build` → `dist/` |
| `npm run preview` | Serve the built `dist/` locally |
| `npm test` | Vitest, single run |
| `npm run lint` | ESLint |
| `npm run db:seed` | Load `content/modules/*.json` into Supabase |
---
## Project structure
```
content/modules/ JSON authoring files (one module per file)
db/
migrations/ Postgres migrations (apply in order)
seed/ Node seed loader (content → Supabase)
docs/
schema.md Corpus contract …