Logo Lanfrica

t-bingham/swahili-app

Domain:

natural language processing

Record type:

software
Creator:
t-b
Host:
An app for learning Swahili # Swahili Learning App A progressive web app for learning Swahili, built with React and TypeScript. Uses spaced repetition (FSRS) and adaptive scaffolding to help you move from zero to conversational Swahili through structured units and open-ended practice sessions. Runs entirely in the browser — no server, no account required. User data is stored locally in the browser's IndexedDB. --- ## Features - **Structured units** — Curriculum organised into beginner, intermediate, and advanced units, each broken into lessons. Units unlock as prerequisites are completed. - **Lesson flow** — Grammar notes → word introduction → multiple-choice practice. A lesson only completes when you get every question right. - **Spaced repetition practice** — Open-ended sessions that draw cards by weight: shallower cards and cards approaching their review date are more likely to appear. End whenever you like. - **Adaptive exercises** — Flashcards (random Swahili↔English direction), multiple choice, type-answer, and fill-in-the-blank. Exercise type is chosen based on your per-skill mastery. - **Offline-first PWA** — Install from the browser; works with no internet connection after the first load. - **Multi-user** — Multiple profiles on the same device, each with their own isolated database. --- ## Tech Stack | Layer | Choice | |---|---| | UI | React 18 + TypeScript | | Routing | React Router 6 | | Styling | Tailwind CSS | | State | Zustand | | Database | sql.js (SQLite over WebAssembly) + IndexedDB | | SRS algorithm | FSRS | | Build | Vite 5 | | PWA | vite-plugin-pwa (Workbox) | | Hosting | Vercel | --- ## Project Structure ``` web/ ├── public/ │ ├── swahili_default.db # Template SQLite DB (cards, units, initial states) │ └── sql-wasm.wasm # SQLite WebAssembly binary ├── src/ │ ├── algorithms/ │ │ ├── fsrs.ts # FSRS spaced repetition scheduler │ │ ├── afm.ts # Adaptive scaffolding (exercise level + hints) │ │ └── errorClassifier.ts │ …