An offline-first Quran reader for desktop, built with Tauri 2, SvelteKit and Rust. No account, no telemetry, and no network request while you read — the Quran data ships inside the binary. Recitation and extra tafsir editions are fetched only when you ask for them.
Status: early. Reading, navigation, the Mushaf page view and tafsir (Arabic + English) work and are used daily. Audio has just landed and has not had a week of use yet. Search and translations are not built. See PLAN.md for what exists and what doesn't.
Two ways to read
- Mushaf page view — renders all 604 pages of the Madani Mushaf with the same line breaks and word placement as the printed original, using the official KFGQPC (Uthman Taha) glyph fonts
- Scrolling reader — continuous Surah reading, per-ayah bookmark, copy and tafsir actions, page/juz boundary markers
Tafsir
- Tafsīr al-Jalālayn is bundled in both the Arabic original and
English (tr. Feras Hamza) — a side panel that follows the verse you are
reading, in both views (
t), with a picker to switch between them - Editions are Shāfiʿī in fiqh and Ashʿarī in creed, and each is labelled with both. A commentary's school decides how it reads the legal verses and its creed decides how it reads the attribute verses; neither is visible in the text, so the reader is told rather than left to guess
Recitation
- Hear a verse from its verse card — a bar under the commentary, in the card and the side panel, with a seek track for the long verses. It plays that verse and stops. Reading is what this app is for; recitation is there for the moment a word does not sit right in your mouth, so it is not a player the page is built around
- Listen to a whole Surah from the Listen chip in the Surah banner. It opens a small panel with the verse playing, repeat, and an offline download for the whole Surah — and closing it puts everything away
- Repeat a verse a set number of times, with an optional pause between for saying it back
- Five reciters, all Ḥafṣ ʿan ʿĀṣim, each labelled with its riwāya
- Nothing ships in the installer and nothing is fetched until you ask. A verse is downloaded once, cached, and plays offline for good. Settings → Audio shows what it costs on disk and clears it, per reciter or entirely
Navigation
- Browse by Surah, Juz, Hizb or page
- Go-to overlay (
Ctrl/Cmd+G):255,2:255, orp255 - Keyboard-driven sidebar search (
/): type, arrow through the results,Enter - Deep links:
/surah/2?ayah=255,/juz/30,/hizb/59,/page/604 - Reopens where you left off — each Surah, Juz, Hizb and page keeps its own place, and launching goes back to whichever you were last reading
- A Recent tab listing your reading sittings, each with the verses it covered
Reading
- Focus mode — hides everything but the text
- Auto-scroll with a drag-to-adjust speed handle
- Independent app zoom and reader zoom, both persisted
- Reading-progress bar showing position in the Surah, with Juz/Hizb on hover
- Dark, light and sepia themes
Offline and small
- The Quran database is compiled into the binary — first launch works with no network, no import step, no download
- Mushaf page fonts load lazily behind an LRU, so opening Al-Baqara doesn't pull 48 font files up front
| Key | Action |
|---|---|
Ctrl/Cmd+K or Ctrl/Cmd+G |
Open the navigation palette |
/ or Ctrl/Cmd+F |
Focus the sidebar's filter (same lists, docked instead of floating) |
↑ / ↓, PgUp / PgDn (in either) |
Move the highlight through the list |
Tab / Shift+Tab (palette), Alt+← / → (either) |
Switch list: Surah → Juz → Hizb → Recent |
Enter (in either) |
Open what's highlighted, or the 2:255 / p255 you typed |
f |
Toggle focus mode |
m |
Switch between Mushaf and scrolling view |
n / p |
Next / previous surah, juz, hizb or page |
↓ / ↑ (or PgDn / PgUp) |
Next / previous Mushaf page |
Home / End |
Jump to the start / end of what's open |
Space |
Play or pause recitation in the verse card — auto-scroll when none is open |
a |
Start or stop auto-scroll |
t |
Toggle verse cards — then click a verse for its commentary and recitation |
Shift+↑ / Shift+↓ |
Auto-scroll faster / slower |
+ / - / 0 |
Reader zoom in / out / reset (normal and focus view keep separate levels) |
Ctrl/Cmd++ / - / 0 |
App zoom in / out / reset |
Esc |
Clear the filter, then close the palette or leave the box / focus mode |
Download the installer for your platform from the Releases page.
| Platform | Format |
|---|---|
| Linux | .deb, .rpm, .AppImage (glibc 2.35+) |
| Windows | .msi, .exe (NSIS) |
| macOS | .dmg (universal — Apple Silicon and Intel) |
Builds are not code-signed. macOS will show a Gatekeeper warning and Windows a SmartScreen warning until signing certificates are in place.
- Rust (stable)
- Node.js 22+ and pnpm
- Tauri's platform dependencies — see the Tauri prerequisites guide
On Debian/Ubuntu:
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev \
libgtk-3-dev libxdo-dev libssl-dev patchelfpnpm install
pnpm tauri devpnpm tauri build # installers for the current platform
pnpm tauri build --no-bundle # just compile, skip packagingpnpm format:check && pnpm lint && pnpm check # frontend
cargo fmt --all --manifest-path src-tauri/Cargo.toml -- --check
cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets -- -D warnings
cargo test --manifest-path src-tauri/Cargo.toml --libCI runs all of the above plus a compile on Linux, Windows and macOS. Commits
are linted by husky (lint-staged + conventional commits via commitlint).
The version lives in four files that must agree — package.json,
src-tauri/tauri.conf.json, src-tauri/Cargo.toml and src-tauri/Cargo.lock
— and the release workflow rechecks them against the tag before building:
./scripts/bump-version.sh patch --commit # or minor / major / an explicit X.Y.Z
git push origin master && git push origin vX.Y.ZThe tag push builds Linux, macOS and Windows bundles into a draft release.
Publishing that draft is what triggers the AUR workflow, which updates
packaging/aur/ with the new version and .deb checksum on its own.
Neither step is needed for normal development — the database and fonts are committed.
Quran database — fetches from Tanzil and alquran.cloud, validates
(114 Surahs, 6,236 Ayahs, all juz/hizb/pages), and writes
database/quran.db:
cd importer && cargo run --releaseSee importer/README.md for details.
Tafsir — no commentary ships with the app. Each edition is built into a
content pack, published as a release asset, and downloaded by the reader on
request. --emit-pack writes the file and prints the SHA-256 that goes into
PACKS in src-tauri/src/packs:
cd importer && cargo run --release -- --list-tafsir
cd importer && cargo run --release -- --emit-pack ar-tafsir-al-jalalayn # → packs/*.qpackThere is deliberately no way to write a tafsir into database/quran.db: that
file is embedded in the binary with include_bytes!, so anything in it is paid
for by every user of every platform whether they want the edition or not.
Publishing is the Publish tafsir packs workflow (manual, packs-v* tags).
It rebuilds every edition in PACKS and refuses to publish unless each one
hashes to exactly what the app expects — a pack that does not match is a
download every user's app will reject, and the only place that would show up is
on their machine. Adding an edition is therefore: --emit-pack locally, paste
the printed hash into PACKS, land that, then run the workflow.
Mushaf fonts — re-downloads the 47 QCF v4 font-group files (~36MB):
./scripts/vendor-mushaf-fonts-v4.shMushaf layout — rebuilds page_line / page_line_word in an existing
database/quran.db from the QCF v4 page data, leaving everything else alone.
The full import runs this as its last step; the flag is for re-running it on
its own:
# 604 requests, or point --mushaf-dir at a local copy:
# npm pack quran-qcf4 && tar xzf quran-qcf4-*.tgz
cd importer && cargo run --release -- --import-mushaf [--mushaf-dir ../package/pages]src/ SvelteKit frontend (components, stores, routes)
src-tauri/ Rust backend — SQLite access, Tauri commands
importer/ Standalone importer that builds quran.db
database/ schema.sql, migrations, and the built quran.db
static/fonts/ Vendored fonts (47 QCF v4 groups, Amiri)
scripts/ Font vendoring, icon generation, version bumping
docs/ Research and design notes
| Source | Provides | License |
|---|---|---|
| Tanzil Project | Uthmani and simple Arabic text | CC BY 3.0 |
| alquran.cloud | Per-ayah juz/hizb/page metadata | Open |
| spa5k/quran_data | Surah metadata | Open |
| MohamadHajjRabee/quran-qcf4 | Mushaf page line layout + glyph fonts | JSON: MIT · fonts: Restricted (KFGQPC) — see below |
| spa5k/tafsir_api | Tafsīr al-Jalālayn (Arabic + English) | Arabic: public domain · English: © Royal Aal al-Bayt Institute — see below |
| aliftype/amiri | Amiri (Arabic prose) | SIL OFL 1.1 |
The source code is MIT licensed.
The bundled fonts and Quran data are not covered by the MIT license — they are third-party works under their own terms. The QCF v4 Mushaf fonts in particular may be used, copied and distributed, but not sold or modified.
See THIRD-PARTY-NOTICES.md before forking, redistributing, or selling a build.