In developmentSince 2026
Android
Product, architecture and Android build
Hiraa
Hiraa (حراء) is an offline Quran for Android that draws every page exactly like the printed Madinah Mushaf. No ads, no tracking, no account.
Words checked against two sources
Pages, each with its own font
Automated tests
Cold start to a page on screen

01/Problem
Most Quran apps either render text with a generic Arabic font, which breaks the page layout people memorize by, or ship scanned images that are heavy and blurry on large screens.
A memorizer needs the exact page: same lines, same line breaks, same position of every ayah. And a Quran text cannot have a single wrong letter.
02/Constraints
- 01Pixel-exact to the printed Madinah Mushaf on every screen size, sharp at any zoom.
- 02Works fully offline from the first launch. Recitations download on demand.
- 03Smooth on weak phones: tested on a 1 GB, 2-core emulator as the floor.
- 04No release until font and data licences are cleared in writing.
03/Architecture
Screens
- feature:home
- feature:reader
- feature:downloads
- feature:settings
Rendering
- core:mushaf · Canvas
- QCF page fonts
- core:designsystem
Services
- core:audio
- core:downloads
- core:settings
Data
- core:database · Room
- core:model
- build-time Python pipeline
04/Decisions
Draw glyphs on a Canvas, not text in a TextView
Each of the 604 pages has its own QCF font where one glyph is one word in its printed shape. Drawing those glyphs line by line reproduces the printed page exactly and stays sharp at any size.
Trade-off: Search and copy cannot read the glyphs, so every ayah is also stored as text, in Uthmani and simple spelling.
Two sources must agree before a word ships
The page layout dataset and the Quran.com text are cross-checked on glyph, page and line for all 77,429 words, plus a letter-skeleton check on 6,236 ayahs. The one difference found was reviewed by hand.
Measure page turns, then fix them
A perf script reads cold start, memory and frame times from the device. Measuring fifteen lines of glyphs on the main thread was the jank, so pages are now measured in the background and neighbours composed ahead: reader cold start 286 ms to 215 ms, p99 frame 46 ms to 32-38 ms.
Trade-off: Emulator GPU numbers are not trusted; final frame numbers wait for real phones.
Licensing blocks the release, not the build
The fonts and recitation audio belong to their publishers. Each publisher gets a written permission request, and every reply is kept as the licence record. The app is built and tested in the meantime; nothing ships before the answers.
05/Screens




06/Stack
KotlinJetpack ComposeCanvasRoomMedia3Gradle modulesPythonfonttools