Learn to read, write, and type the ADLaM script of the Fulani people. Games, courses, books, and culture — in Fulfulde (ADLaM & Latin), English, French, and Arabic.
Alkule is Fulfulde for "the letters of the alphabet."
npm install
npm run dev
# open http://localhost:3000Requires Node 18.17+ (Node 20 LTS recommended).
| Area | Path | Status |
|---|---|---|
| Landing page (hero = the 28 letters) | app/page.tsx |
✅ working |
| Alphabet explorer + per-letter detail pages | app/alphabet · app/alphabet/[slug] |
✅ working |
| Module lessons (vowels, consonants, numerals, accents-tones, writing-system) | app/learn/lessons · components/LessonShell.tsx |
✅ working |
| Typing practice (score/accuracy/WPM, physical + on-screen keyboard) | app/learn/typing · components/TypingPractice.tsx |
✅ working |
| ADLaM writer keyboard | app/learn/keyboard · components/AdlamKeyboard.tsx |
✅ working |
| Flashcards (flip study: letters + words) | app/learn/flashcards · components/Flashcards.tsx |
✅ working |
| Tiered exam (recognize / scramble / spell) + keyboard typing | app/learn/exam · components/ExamSession.tsx · components/AdlamKeys.tsx |
✅ working |
| SRS review session | app/learn/review · components/ReviewSession.tsx |
✅ working |
| Culture (story + proverbs) | app/culture |
✅ working |
| Local profile + progress dashboard | app/login · app/dashboard · components/Dashboard.tsx |
✅ working |
| Library | app/library |
🔲 stub |
| Header / Footer / Language switcher | components/ |
✅ working |
| 5-locale i18n with RTL flip | lib/i18n.ts |
✅ working |
| ADLaM data model (Unicode-derived) + keyboard layout | data/adlam.ts · data/keyboardLayout.ts |
✅ working |
| Spaced-repetition scheduler (SM-2-lite) + mastery store | lib/srs.ts · lib/masteryStore.ts |
✅ working (localStorage) |
State is client-side (localStorage) via lib/masteryStore.ts, lib/typingStore.ts,
lib/examStore.ts, and lib/profile.ts — the seam for a future backend.
- RTL-first. Switching the UI to Fulfulde (ADLaM) or Arabic flips
document.dirtortl, and all layout uses logical properties/flow-relative Tailwind utilities (ms-,me-) so the whole shell mirrors for free. Never useml-/mr-in new components — usems-/me-. - Fonts are a product feature. ADLaM text renders with
Noto Sans Adlam
(loaded from Google Fonts in
app/layout.tsx). The.adlamCSS class forces the font + RTL isolation for any embedded ADLaM text. Production upgrade: switch tonext/font/googleto self-host the fonts at build time — no runtime Google request, which matters on low-bandwidth connections. - Letters are generated from Unicode code points, not hardcoded glyph
strings — one source of truth in
data/adlam.ts(U+1E900–U+1E95F). - SRS is a first-class primitive.
lib/srs.tsis deliberately tiny; when a backend lands, persistMasteryRecord[]per user and the review queue, streaks, and mastery rings from the wireframe all fall out of it. - i18n is client-side and minimal on purpose. When SEO-per-locale
matters, migrate to
next-intlwith/{locale}/routing; the dictionary shape inlib/i18n.tsports directly.
- Romanizations in
data/adlam.tsare approximate teaching aids. - Fulfulde UI strings in
lib/i18n.ts(both scripts) are provisional drafts — review across Pulaar / Pular / Fulfulde varieties before launch.
Done: letter detail pages, module lessons, typing practice, writer keyboard, flashcards, tiered exam, SRS review, culture pages, local profile + dashboard.
Next:
- Auth + persistence — move mastery/typing/exam/profile server-side
(Supabase [auth+Postgres] or Postgres + Prisma + Auth.js). Seam is
lib/profile.ts+ the stores. - Vetted content — replace provisional words/proverbs/romanizations with native-speaker-reviewed material; add real example-word assets/images.
- Audio + stroke order — record native-speaker letter audio; add stroke-order/tracing SVGs on lesson pages.
- Course player — modules, lessons, certificates, instructor grading.
- Handwriting canvas — trace letters on touch devices.
- PWA / offline — cache the shell + current unit for low-bandwidth learners.
Person-named branches keep work separate (e.g. abubakar/..., Kienda/...);
commit authorship is recorded per commit. Typecheck before pushing:
git clone https://github.com/Dialloni/ALKULE.git
git checkout -b <you>/<feature>
npx tsc --noEmit # must passDo not run npm run build while npm run dev is running — it clobbers
.next. See CLAUDE.md for conventions (RTL, Noto Sans Adlam) and the full
directory map.
Tabalde · Akweeyo · Endangered Alphabets (ADLaM) — linked in the site footer as the wider ecosystem this project serves.