Aplikasi tahfidz berbasis PWA untuk hafalan, murajaah, setoran, penilaian guru, dan pemantauan progres belajar Al-Qur'an.
Repository ini disusun untuk membantu proses menghafal Al-Qur'an secara lebih rapi: memilih target, menandai hafalan, menyusun murajaah, merekam setoran, memberi penilaian, dan memantau progres santri.
Dokumentasi ini juga dibuat supaya project:
- mudah dijalankan secara lokal;
- mudah diduplikasi untuk sekolah, pesantren, atau halaqah lain;
- mudah diganti branding dan endpoint;
- tetap aman dibagikan karena contoh kredensial disamarkan.
- Login dan daftar dengan captcha matematika.
- Role
santri,guru, danadmin. - Admin dapat mengelola role user dan mengakses panel guru.
- Pilih surah, ayat awal, ayat akhir, dan jumlah pengulangan.
- Audio ayat dengan pilihan qari.
- Sinkronisasi audio dengan ayat aktif.
- Tampilan mobile-first yang sudah dioptimalkan untuk HP maupun laptop.
Mode tampilan yang tersedia:
Arab + TerjemahanTerjemahan sajaArab sajaMushaf PojokAwal ayat saja
Catatan:
- Mode
Terjemahan sajamenyembunyikan blok Arab sepenuhnya. - Mode
Awal ayat sajamenampilkan pemantik 1 kalimah pertama dengan format titik di depan, lalu bisa diklik untuk menampilkan ayat utuh. - Opsi
Tes tanpa tekssudah dihapus agar alur lebih sederhana.
- Basis tampilan menggunakan halaman mushaf, bukan surah/ayat.
- Tersedia dropdown
Halaman Mushaf1-604. - Bisa berpindah halaman dengan gesture slide.
- Tiap ayat pada mode ini bisa disembunyikan seperti mode
Awal ayat saja, lalu dibuka kembali saat diklik.
- Susun jadwal dari ayat yang sudah ditandai hafal.
- Tidak otomatis menambah jadwal saat ayat ditandai, sehingga daftar tetap rapi.
- Bisa menandai hasil murajaah dan membersihkan daftar bila tidak diperlukan.
- Rekam audio langsung dari browser.
- Indikator rekaman aktif agar santri tahu aplikasi sedang merekam.
- Audio preview sebelum/ketika proses simpan.
- Pilih guru tujuan dari dropdown yang selalu mengambil daftar role
guruaktif. - Setoran tersimpan ke server dan tampil di panel guru.
- Setoran sementara dibersihkan otomatis setelah lewat masa retensi.
- Guru melihat daftar setoran masuk.
- Nama santri, catatan setoran, audio, dan status penilaian ditampilkan lebih jelas.
- Form penilaian tampil dalam popup.
- Santri bisa melihat hasil penilaian dari guru.
- Progress ring untuk user yang sudah login.
- Jadwal shalat dengan lokasi default atau GPS.
- Popup pemilihan lokasi jadwal shalat.
- Theme toggle.
- PWA installable dengan manifest dan favicon/logo.
- Frontend: HTML, CSS, JavaScript
- Data Al-Qur'an: Kemenag
- Backend: Cloudflare Worker
- Database: Cloudflare D1
- Penyimpanan audio setoran: Cloudflare R2
- Offline support: Service Worker + Web App Manifest
tahfidz/
|-- index.html
|-- README.md
|-- ADMIN-SETUP.md
|-- manifest.webmanifest
|-- sw.js
|-- assets/
|-- css/
|-- data/
|-- js/
|-- tools/
`-- worker/
|-- package.json
|-- wrangler.toml
|-- schema.sql
|-- migrations/
`-- src/
Folder penting:
assets/untuk logo, favicon, dan ikon.css/untuk seluruh styling aplikasi.js/untuk auth, hafalan, murajaah, setoran, panel guru, dan utilitas UI.data/untuk data Al-Qur'an Kemenag yang dipakai frontend.worker/untuk API, D1, R2, cron cleanup, dan endpoint admin.
Jangan buka lewat file:// karena browser bisa memblokir pembacaan JSON.
python -m http.server 8000Buka:
http://127.0.0.1:8000
npx -y serve .Buka:
http://127.0.0.1:3000
cd worker
npm install
npm run devScript yang tersedia:
| Script | Fungsi |
|---|---|
npm run dev |
Menjalankan Worker lokal |
npm run deploy |
Deploy Worker ke Cloudflare |
npm run d1:migrate:local |
Apply migration ke D1 lokal |
npm run d1:migrate:remote |
Apply migration ke D1 remote |
git clone <url-repo-anda>
cd tahfidzPeriksa dan sesuaikan:
assets/logo.pngassets/logo-manifest-192.pngassets/logo-manifest-512.pngassets/icon.svg- judul di
index.html - teks nama aplikasi di
js/
Sesuaikan js/config.js dengan Worker milik Anda sendiri:
window.HIFZ_CONFIG = {
apiBase: 'https://worker-anda.subdomain-anda.workers.dev',
quranDataPath: 'data/quran-kemenag-combined.json',
quranIndexPath: 'data/quran-kemenag-index.json'
};Jika tidak memakai backend, frontend tetap bisa dipakai untuk mode baca dan eksplorasi data Al-Qur'an.
Di worker/wrangler.toml, jangan salin kredensial project lama. Gunakan nilai baru milik environment Anda sendiri.
Contoh aman:
name = "nama-worker-anda"
main = "src/index.js"
compatibility_date = "YYYY-MM-DD"
[[d1_databases]]
binding = "DB"
database_name = "nama-db-anda"
database_id = "<database-id-anda>"
[[r2_buckets]]
binding = "SUBMISSIONS_BUCKET"
bucket_name = "nama-bucket-anda"
[vars]
ALLOWED_ORIGINS = "https://domain-anda.example"
SUBMISSION_RETENTION_DAYS = "3"
SUBMISSION_CLEANUP_BATCH_SIZE = "200"
[triggers]
crons = ["0 */6 * * *"]Yang wajib diganti:
database_iddatabase_namebucket_nameALLOWED_ORIGINS- nama Worker
Jangan menaruh token, secret, atau ID produksi asli ke dalam README.
cd worker
npm install
npm run d1:migrate:remote- Metadata setoran disimpan di D1.
- File audio disimpan di R2.
- Target guru diambil dari endpoint guru aktif.
Setoran audio sementara dihapus otomatis setelah lewat masa retensi.
Konfigurasi saat ini:
SUBMISSION_RETENTION_DAYS = "3"SUBMISSION_CLEANUP_BATCH_SIZE = "200"- cron Worker berjalan setiap 6 jam
Tersedia endpoint admin kecil untuk menjalankan cleanup manual dari panel/admin tanpa menunggu cron.
Pilihan qari hafalan saat ini mendukung beberapa sumber audio EveryAyah, di antaranya:
- Alafasy
- Abdurrahman As-Sudais
- Saood Ash-Shuraym
- Husary Mujawwad
- Minshawy Murattal
- Maher Al-Muaiqly
Pilihan qari disimpan di preferensi tampilan user dan dipakai pada menu hafalan.
Panduan singkat juga tersedia di:
ADMIN-SETUP.md
Contoh query aman:
UPDATE users
SET role = 'admin', updated_at = CURRENT_TIMESTAMP
WHERE lower(email) = 'admin@example.com';Verifikasi:
SELECT id, name, email, role, status
FROM users
WHERE lower(email) = 'admin@example.com';Data utama berada di:
data/quran-kemenag-combined.jsondata/quran-kemenag-index.jsondata/quran_kemenag/
Jika perlu membangun ulang data gabungan:
node tools/normalize-kemenag-json.mjs- Logo, nama aplikasi, dan favicon sudah disesuaikan
-
apiBasemengarah ke Worker milik environment baru -
database_iddanbucket_namelama tidak ikut terbawa -
ALLOWED_ORIGINSsudah sesuai domain baru - Login, daftar, hafalan, murajaah, setoran, panel guru, dan profil sudah diuji
- Tidak ada kredensial sensitif di README atau file config publik
- pastikan file dibuka lewat server lokal, bukan
file://; - lakukan hard refresh;
- cek path aset CSS/JS dan service worker cache.
- cek
apiBasedijs/config.js; - pastikan Worker aktif;
- pastikan migration D1 sudah lengkap.
- pastikan santri menekan simpan setoran setelah rekam;
- pastikan guru tujuan benar;
- cek Worker, D1, dan R2 aktif;
- cek origin frontend sudah diizinkan.
- cek endpoint delete di Worker;
- pastikan object R2 dan metadata D1 sama-sama bisa dihapus;
- cek log network browser untuk request yang gagal.
| Teknologi | Fungsi |
|---|---|
| HTML | Struktur halaman |
| CSS | Tampilan aplikasi |
| JavaScript | Interaksi frontend |
| Service Worker | Dukungan offline |
| Web App Manifest | Installable app |
| Cloudflare Worker | Backend API |
| Cloudflare D1 | Database |
| Cloudflare R2 | Penyimpanan audio setoran |
Dirancang agar mudah dipakai, mudah diubah, dan mudah diteruskan.
developed with ❤ by cakgup
