Lewati ke konten
AFM Studio
Personal ProjectWeb AppAstronomy

Falak

Hijri calendar, prayer times, and qibla direction computed from real moon/sun astronomy — every verdict shows its numbers

Semua proyek4 mnt baca

Peran

Fullstack Developer

Periode

Jul 2026

Di halaman ini

Permasalahan

Di Indonesia dan sebagian besar dunia Muslim, awal Ramadan, Syawal, dan Dzulhijjah adalah titik kebingungan publik yang berulang: organisasi berbeda kadang mengumumkan tanggal awal yang berbeda karena mereka menggunakan kriteria hisab (perhitungan) yang berbeda untuk apakah hilal baru terlihat. Proses resmi pemerintah menggabungkan perhitungan dengan laporan rukyat fisik, tetapi publik jarang melihat matematika di baliknya — mereka hanya mendapat pengumuman. Konverter tanggal hijriah yang ada saat ini adalah tabel lookup sederhana tanpa astronomi nyata di baliknya, atau alat resmi yang memberi vonis tanpa cara untuk memeriksa alasannya.

Pendekatan

Astronomi dihitung dari prinsip dasar, bukan diambil dari API

Alih-alih memanggil API ephemeris pihak ketiga, Falak mengimplementasikan model posisi matahari VSOP87 terpotong dan model posisi bulan ELP2000/Meeus langsung — hanya mengimpor math dan datetime. Ini menjaga alat tetap mandiri (tanpa kunci API, tanpa batas laju, berfungsi offline) dan, untuk produk kalender keagamaan, dapat diaudit: setiap angka yang ditampilkan aplikasi dapat ditelusuri kembali ke rumus di repositori, bukan kotak hitam. Setiap kesimpulan — apakah hilal terlihat, jam berapa Maghrib, berapa arah kiblat — dipasangkan dengan cara memeriksa angka mentah yang menghasilkannya (altitude, elongasi, umur bulan, lag time) melalui komponen CalculationPanel bersama, jawaban langsung atas keluhan "kotak hitam" yang memotivasi proyek ini.

Tiga metode yang bersaing, ditampilkan berdampingan

Alih-alih memilih satu kriteria "benar" untuk visibilitas hilal, engine mengimplementasikan tiga metode nyata yang bersaing — Wujudul Hilal, MABIMS-2021 imkanur rukyat, dan kriteria Odeh — sebagai fungsi murni independen, dengan tampilan Method Divergence khusus yang menunjukkan persis di mana mereka tidak sepakat. Peta visibilitas se-Indonesia mengevaluasi kriteria di grid 3.255 titik berlangkah 0,5° yang digambar di atas garis pantai nyata; batas visibilitas yang membelah Sumatra dan Jawa pada malam parsial adalah gambar tunggal terjelas dari keseluruhan produk — tanggal yang sama adalah hari Hijriah berbeda tergantung di mana Anda berdiri.

Divalidasi sebelum dipercaya

Urutan pembangunan proyek menegakkan aturan bahwa tidak ada fitur perhitungan yang dirilis tanpa validasi. Sebelum pekerjaan UI apa pun dimulai, engine diperiksa silang terhadap Skyfield menggunakan ephemeris JPL DE440 — sumber independen setara riset — untuk 50 konjungsi bulan historis, cocok dalam toleransi 5 menit. Skyfield adalah dependensi dev/test saja, tidak pernah diimpor oleh jalur produksi, menjaga aturan "tanpa API astronomi pihak ketiga saat runtime" sambil tetap membuktikan akurasi terhadapnya.

Seluruh produk dipindahkan ke browser

Tiga keputusan sebelumnya memungkinkan ini: setiap endpoint adalah fungsi murni dari parameter kuerinya, tabel Postgres adalah cache dari keluaran deterministik alih-alih sumber kebenaran, dan engine tidak punya dependensi pihak ketiga. Aplikasi tanpa state, tanpa I/O, dan tanpa dependensi tidak butuh server — sehingga engine astronomi diport ke TypeScript dan backend dihapus dari jalur request. Hasilnya adalah situs statis di GitHub Pages yang tidak berbiaya untuk dijalankan dan tidak bisa rusak karena backend mati. Grid 3.255 titik, yang dulu task Celery, di-shard ulang lintas Web Workers (satu per core, dibatasi delapan) — sekitar 1,6 detik dibanding 6,3 detik single-threaded. Backend Python dipertahankan sebagai oracle yang tervalidasi, tidak di-deploy.

Dua engine, satu sumber kebenaran — ditegakkan secara mekanis

Memport engine kalender keagamaan ke bahasa kedua mengundang penyimpangan diam-diam, sehingga implementasi Python tetap menjadi oracle dan port TypeScript dipatok padanya: sebuah generator membekukan keluaran oracle untuk ~2.000 input terpilih, dan suite konformansi memutar ulang semuanya melalui port. CI meregenerasi fixture, memeriksanya ulang secara numerik, lalu menjalankan konformansi — dan memblokir deploy pada kegagalan apa pun. Disiplin itu menangkap bug nyata: satu titik grid lepas pantai Merauke tidak sepakat dengan oracle sebesar 1,6×10⁻⁷ derajat altitude bulan sementara 362 titik lain cocok persis. Penyebabnya merepresentasikan instan sebagai milidetik floating-point — bisection menyimpang sepersekian mikrodetik dari grid, dan karena waktu sidereal dikalikan 360,98, ia muncul kembali teramplifikasi sebagai error altitude yang terlihat, tepat di ambang MABIMS 3° tempat ia bisa membalik vonis. Diperbaiki dengan memakai mikrodetik integer, persis seperti datetime Python. Bug itu ditemukan justru karena toleransinya cukup ketat untuk menyadarinya.

Hasil

Live di andifathulms.github.io/falak-visualizer dengan biaya hosting $0, ter-deploy dan terverifikasi di browser nyata — seluruh sembilan halaman menghitung tanpa error konsol, dan peta visibilitas memunculkan delapan Web Workers untuk merender grid penuh. 86 commit, solo: kurang lebih tiga hari dari repo kosong hingga rangkaian fitur awal, lalu satu pass berikutnya yang memindahkan seluruh produk ke browser dan merilisnya. Engine ada dua kali — 1.544 baris Python tervalidasi dan 2.313 baris TypeScript di 15 modul — dijaga selaras oleh ~2.083 golden vector, dengan 100 test backend (termasuk cross-check JPL DE440) dan 51 test frontend menggerbangi setiap deploy. Cakupan melangkah jauh melampaui MVP di PRD: Method Divergence, Kalender Visibilitas, pelacakan Akurasi Isbat terhadap catatan Kemenag historis nyata, dan kalibrasi matahari Rashdul Qibla — kalibrasi kiblat dari bayangan, tanpa instrumen — semuanya ditunda ke "Phase 2" tetapi tetap dirilis.

Hasil

Hosting — runs in the browser
$0
Golden vectors pinning both engines
~2,083
Engine ports, one oracle
2
Commits, single author
86

Tangkapan Layar

Beranda
Calendar Conversion
Hilal Visibility
Visibility Map
Prayer Times
Visibility Calendar

Punya proyek serupa?

Jika Anda butuh sistem yang dibangun dengan ketelitian yang sama — scope jelas, eksekusi solid — mari bicara.

Mulai proyek