# Learn Tunisian
A Duolingo-style app for learning Tunisian Arabic, built for one account to hold
multiple learner profiles (adult + kids) sharing one content library, with a
kid track (listen/tap only) and an adult/teen track (+ reading, typing,
speaking practice).
## Stack
- Expo (React Native) + Expo Router, TypeScript
- Supabase: Postgres, Auth (email/password), Storage (audio/images)
- expo-audio for playback and recording
- expo-notifications for the one daily reminder
- expo-file-system for offline audio caching
## 1. Set up Supabase
1. Create a project at supabase.com (free tier is fine).
2. In the SQL editor, run these migrations **in order**:
1. `0001_init.sql` — every table, RLS policy, and the two storage buckets (`audio`, `images`).
2. `0002_profile_dob_country.sql` — replaces `profiles.age` with `date_of_birth`, adds `country`.
3. `0003_word_variants.sql` — replaces the flat `words` table with `word_groups` + `word_variants` (see "Word variants" below).
3. Then run `supabase/seed.sql` — loads the current content set into `word_groups`/`word_variants` (see "Word variants").
4. In Project Settings → API, copy the **Project URL** (not the REST/`/rest/v1/` URL — just the bare project URL) and **anon public key**.
## 2. Configure environment variables
```bash
cp .env.example .env
```
Fill in `EXPO_PUBLIC_SUPABASE_URL` and `EXPO_PUBLIC_SUPABASE_ANON_KEY` from step 1.4.
These are safe to ship in the client bundle — access control is enforced by
the Row Level Security policies in the migration, not by keeping the anon key
secret.
## 3. Install and run
```bash
npm install
npm start
```
Then press `i` for iOS simulator or `a` for Android emulator (requires Xcode /
Android Studio respectively), or scan the QR code with Expo Go on a physical
device.
## Word variants
A concept (e.g. "let's go") can have more than one way of saying it —
synonyms, or masculine/feminine speaker-gender forms — handled by one
mechanism instead of two:
- **`word_groups`** — …