A mobile first Next.js web app for reciting, tracking, and studying the 99 Beautiful Names of Allah (Asma-ul-Husna), bilingual in English and Swahili. It works fully offline once loaded
# 99 Names of Allah tracker
A mobile-first Next.js web app for reciting, tracking, and studying the 99
Beautiful Names of Allah (Asma-ul-Husna), bilingual in English and Swahili.
It works fully offline once loaded — see Offline support
below.
## What the app does
- **Today** — shows only the names assigned to today's weekday. Each one is a
tap-to-count "tasbih bead": a gold ring fills in as you tap, with a soft
pulse animation on every tap, tracking your recitations against a target
you set. The count resets automatically the next day.
- **Plan** — pick any day of the week, search all 99 names, and assign a
recitation target to that day (33 / 99 / 100 / 300 / 1000, or a custom
number). Assignments repeat every week on that weekday.
- **Study** — browse and search all 99 names with Arabic script,
transliteration, translation, meaning, and a Play button for audio
recitation.
- **Language toggle** — switch the whole interface and every name's
translation between English (EN) and Swahili (SW) instantly, at any time.
- **Works online and offline** — once you've opened the app one time with a
connection, it keeps working with no internet at all: you can still see
your plan, tap through recitations, and study the names.
## Offline support
This app is installable and fully usable without an internet connection,
using only browser-native APIs — **no extra packages were installed** to make
this work:
- **IndexedDB** (`lib/idb.js`) stores your language choice, weekly
assignments, and recitation counts directly in the browser. This replaces
`localStorage` so data survives reliably and scales better as your history
grows. All reads/writes go through a small hand-written promise wrapper
around the native `indexedDB` API — nothing external.
- **A service worker** (`public/sw.js`), written by hand with the native
Service Worker + Cache Storage APIs, caches the app shell (Today, Plan,
Study, and the app's static assets) the first time you visit. On later
visits — even with no …