A PWA for learning Quranic Arabic — from alphabet recognition to independent reading, with a local-first AI tutor, semantic verse discovery, and spaced repetition built in. Designed, built, and shipped by me. Solo.
NurQuran started as a deeply personal project: a tribute in loving memory of my late father. Every line of design, product thinking, and code came from me, driven by the desire to build something meaningful that lasts.
This project is the clearest expression of how I work when I have full ownership: I move fast, I iterate in public, I obsess over quality, and I don't compromise on the user experience — even when I'm the only one watching.
It also gave me a crash course in every modern constraint that product teams face at scale: performance on low-memory devices, offline reliability, i18n across 25 languages, local AI inference, semantic search without killing the main thread, push notifications on a free tier — all shipped, all production.
Tap any feature to see how it was built, what tradeoffs were made, and what it looks like in practice.
The reader is the heart of the app. It supports two layout modes: a flat ayah-by-ayah scroll and a Mushaf Pro view that mirrors the physical 604-page book layout with authentic glyphs.
Every technical decision prioritized reliability on mobile — native window scrolling, programmatic jump guards, word-by-word audio sync with both Quran.com timestamps and a custom heuristic fallback, and interactive glassmorphism tooltips that clamp to the visible viewport without causing horizontal scroll.
Tajweed coloring, 100+ reciters via Quran.com API, 25 selectable translations, interactive scholarly footnotes — all cached in IndexedDB for full offline reading.
A fully local AI tutor that runs 100% in the browser. No API calls. No data leaves the device. It uses Transformers.js v4 with a dedicated static Web Worker to keep inference off the main thread.
The default model is Gemma 4 2B Vision (desktop WebGPU) with Qwen 2.5 1.5B as the multilingual fallback. Gemma 4 supports full multimodal input — images, audio, and video — all preprocessed in the worker before inference.
The AI has semantic memory stored in IndexedDB. Archived chat summaries are embedded locally with multilingual-e5-small and injected as RAG context for relevant follow-up sessions. It also auto-grounds Quran queries by calling a local search tool before responding.
A semantic verse discovery engine built around a 30-emotion catalog. Users describe how they're feeling — “anxious about the future”, “grateful” — and the engine surfaces the most contextually relevant ayahs.
The search runs in three tiers all under 100ms: exact token lookup → binary prefix search with typo tolerance → substring fallback. It runs in parallel with the Quran.com API for proper nouns and Arabic phrases. Results are ranked using a curated semantic boosts system and qualitative match levels (Strong / Moderate / Weak).
The full dataset covers 6,236 ayahs with 20+ semantic fields each: divine message, practical takeaway, user intents, emotional triggers, and life situations. A 23-language native synonym dictionary handles colloquial queries like “أنا حزين” or “coeur brisé”.
A full spaced repetition system for learning the Arabic alphabet, letter combinations, vocabulary, and root word families. Cards are scheduled using Dexie IndexedDB and follow SM-2 spaced repetition logic.
The learning flow covers five phases: letter recognition → pronunciation (with real-time speech grading) → letter combinations (Noorani) → vocabulary (1,000 highest-frequency Quranic words) → root derivation (Sarf). Each phase gates progression behind mastery scores.
Daily flow onboards 3-5 new items based on performance, and the deck automatically top-ups after reviews clear so learners never stall waiting for the next day.
The app is built to function fully offline. The service worker handles shell caching, SPA navigation fallback, and proactive version checking against a live app-version.json — users get OTA updates without hard-refreshing.
Two separate service worker scopes prevent PWA conflicts with OneSignal: the main shell worker at root (/sw.js) and the push worker at /push/onesignal/. A versioned APP_VERSION string busts all worker and model caches predictably across deployments.
Large asset updates (130MB+ embedding files) use atomic OPFS swaps: download to .tmp → verify integrity → bulk-insert to IndexedDB → rename files. The user never ends up in a broken state from a dropped connection.
A high-fidelity sharing engine that turns any ayah into a beautiful social media card. Every card uses “Liquid Glass” glassmorphism with a procedural Islamic geometric pattern uniquely seeded by the Surah and Ayah number.
The pipeline handles two output streams in parallel: a pixel-perfect PNG export (using html-to-image at 1x to avoid iOS Safari OOM crashes) and a normalized plain-text stream for Web Share API and clipboard — stripping all HTML tags before sharing.
Scholarly footnotes render as professional circular badges in the exported image. A global FontWarmer pre-loads critical Quranic calligraphy fonts before any capture to guarantee consistent rendering.
NurQuran is my experiment in directed vibe coding— orchestrating multiple AI agents with intentionality, delegating tasks based on each model's actual strengths rather than using a single tool for everything.
NurQuran runs as a fully installable PWA. No app store required.