Logo Lanfrica

ramzziii/Learn-Tunisian

Domain:

natural language processing

Record type:

softwaretools
Creator:
ram
Host:
# 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`** — …