Langsung ke konten
AFM Studio
  • Halaman

    AFM Studio
  • Karya
  • Lab
  • Tentang
  • CV
  • Kontak
  • Proyek

    AksaraPerpustakaan pengetahuan Otorita IKN yang bisa dicari, dengan server memeriksa akses setiap pembaca di tiga tingkat
  • Daily TaqwaSistem presensi salat anti-manipulasi untuk ~2.000 pegawai OIKN di Masjid Negara IKN
  • Lantara v2Mesin perizinan Otorita IKN tempat administrator menambah jenis izin baru dari layar, tanpa developer
  • eKiosk IKNDua ruang kendali untuk Nusantara: konten kios dan pelacakan bus live dengan estimasi kedatangan yang menilai dirinya sendiri
  • E-Monev IKNPlatform pemantauan pembangunan Nusantara selama 23 tahun, melacak progres triwulan setiap unit terhadap 24 KPI
  • JDIH OIKNPortal dokumen hukum publik OIKN, dengan alur penerbitan terkendali dan ringkasan AI yang tidak pernah keluar dari server
  • Jejak PenanamanAplikasi absen acara penanaman pohon IKN yang membuktikan peserta hadir di lokasi lewat selfie ber-geofence
  • Dashboard SAKTIPipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN
  • DoseRxKalkulator dosis untuk 127 obat yang membulatkan dosis ke tablet dan sirup yang dijual apotek Indonesia
  • CubiqPelatih speedcubing dengan timer setara kompetisi dan solver buatan sendiri untuk 8 puzzle utama
  • ScimotionPerpustakaan sains interaktif berisi 86 artikel, masing-masing dijelaskan bersama animasi yang bisa dikendalikan pembaca
  • WA Daily Scrum BotBot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

↑ ↓ untuk berpindah · Enter untuk membuka · Esc untuk menutup

Falak

Alat kalender Hijriah, jadwal salat, dan arah kiblat yang menampilkan angka bulan dan matahari di balik setiap jawaban

Tangkapan layar
bulan baru historis yang cocok dengan JPL
50
biaya hosting, semua jalan di browser
$0
malam yang nyaris salah tanggal karena bug
28
titik di peta visibilitas Indonesia
3.255
Di halaman ini

Masalahnya

Setiap tahun, orang Indonesia menunggu kapan Ramadan, Syawal, dan Dzulhijjah dimulai. Kadang organisasi yang berbeda mengumumkan tanggal yang berbeda. Mereka memakai kriteria hisab yang berbeda untuk menentukan apakah hilal, bulan sabit muda, sudah bisa terlihat. Sidang isbat pemerintah menggabungkan perhitungan dengan laporan rukyat, tapi masyarakat hanya mendengar keputusannya.

Aplikasi konversi tanggal Hijriah yang ada biasanya berupa tabel tanpa perhitungan astronomi, atau alat resmi yang memberi jawaban tanpa menunjukkan alasannya. Saya membangun Falak untuk umat Muslim yang ingin memeriksa sendiri tanggal dan jadwal salat, untuk pengajar ilmu falak di madrasah dan pesantren, dan untuk developer yang ingin melihat implementasi yang terbuka.

Yang saya bangun

Posisi matahari dan bulan saya hitung sendiri

Saya mengimplementasikan model standar yang sudah dipublikasikan untuk posisi matahari dan bulan, tanpa layanan astronomi dari luar. Mesinnya tidak butuh API key dan bisa jalan offline. Setiap angka yang tampil bisa ditelusuri ke sebuah rumus di repositori. Setiap jawaban, misalnya apakah hilal terlihat, kapan Magrib, atau ke mana arah kiblat, disertai panel berisi angka mentahnya: ketinggian, elongasi, umur bulan, dan selisih waktu terbenam.

Tiga metode berdampingan

Saya mengimplementasikan tiga kriteria visibilitas hilal yang bersaing: Wujudul Hilal, MABIMS-2021, dan Odeh. Masing-masing dihitung terpisah, dan riwayat kriteria di halaman Awal Bulan menunjukkan kapan ketiganya sepakat dan kapan berbeda. Aplikasi ini tidak mengumumkan tanggal; aplikasi ini menunjukkan hasil hitungan setiap metode untuk malam dan tempat tertentu. Peta Indonesia memeriksa 3.255 titik di seluruh negeri, dan pada malam tertentu garis visibilitas memotong Sumatra dan Jawa, sehingga tanggal yang sama bisa menjadi hari Hijriah yang berbeda tergantung di mana Anda berada.

Mesinnya saya validasi sebelum membangun tampilan

Rencana build saya punya satu aturan: tidak ada fitur perhitungan yang dirilis tanpa validasi. Sebelum mengerjakan antarmuka, saya mencocokkan mesin ini dengan ephemeris DE440 dari JPL, rujukan setingkat riset, untuk 50 peristiwa bulan baru di masa lalu. Semuanya cocok dalam selisih lima menit. Pustaka rujukan itu hanya dipakai saat tes, tidak pernah di aplikasi. Halaman Kalender membandingkan setiap metode dengan pengumuman Kemenag di masa lalu, yang diisi hanya dari catatan bersumber.

Seluruh aplikasi pindah ke browser

Versi pertamanya memakai backend Django. Setiap endpoint hanya berisi perhitungan murni, database-nya cuma menyimpan cache hasil, dan mesinnya hanya memakai matematika standar, jadi sebenarnya tidak perlu server. Saya memindahkan mesinnya ke TypeScript dan menerbitkan situs statis di GitHub Pages. Biaya hosting-nya nol, dan server yang mati tidak bisa merusaknya. Peta 3.255 titik kini dibagi ke paling banyak delapan thread latar, bukan berjalan di satu thread saja.

Mesin asli memeriksa versi port-nya

Dua salinan mesin kalender keagamaan pasti akan berbeda kalau tidak ada yang menjaganya. Saya mempertahankan mesin Python sebagai rujukan dan membekukan jawabannya untuk 2.083 kasus uji, mencakup setiap jenis perhitungan yang dilakukan aplikasi ini. Proses build memutar ulang semuanya lewat port TypeScript dan menahan deploy kalau ada yang tidak cocok. Untuk membuktikan suite ini menangkap penyimpangan, saya merusak port-nya sebagai uji coba dengan tiga cara, membalik satu ambang batas, koefisien bulan yang keliru, dan pergeseran kecil pada waktu sideris, dan ketiganya gagal di suite.

Hasilnya

Falak sudah live dan gratis, dengan biaya hosting $0, membandingkan 3 kriteria hisab lewat peta visibilitas 3.255 titik di seluruh Indonesia, semuanya di browser. Isinya konversi Hijriah, visibilitas hilal, jadwal salat dengan jadwal bulanan yang bisa dicetak, dan arah kiblat berikut Rashdul Qibla, di lima destinasi ditambah satu instrumen beranda. Fitur awalnya selesai dalam sekitar tiga hari pada Juli 2026; pemindahan ke browser dan desain ulang berbahasa Indonesia menyusul dalam bulan-bulan setelahnya. Penyapuan validasi di bulan September menangkap bug yang bisa memulai sebagian bulan sehari lebih awal di salah satu kriteria, ditemukan di 28 malam historis dan kini ditutup dengan tes regresi. Mesinnya masih cocok dengan semua 50 bulan baru historis yang dicocokkan dengan ephemeris JPL.

Di balik layarDetail teknis untuk engineer
  • Posisi matahari memakai model VSOP87 yang dipangkas; posisi bulan memakai ELP2000 versi Meeus. Mesin Python hanya meng-import math dan datetime.
  • Validasi mencocokkan 50 konjungsi bulan historis (1 Januari/Juni, berpatokan pada tanggal berjalan) dengan Skyfield memakai ephemeris JPL DE440, masing-masing dalam toleransi 5 menit. Skyfield hanya ada di requirements-dev.txt.
  • Lima model: Location, ConjunctionEvent, PrayerTimeConvention, VisibilityResult, IsbatRecord. Cache miss selalu dihitung ulang dari mesin. IsbatRecord diisi dari siaran pers Kemenag yang dikutip, tidak pernah dihitung balik dari mesin, supaya tidak melingkar.
  • Grid-nya berjarak 0,5°. Awalnya berupa task Celery precompute_visibility_grid, lalu dipindah ke Web Worker (satu per core, maksimal delapan) dengan progres live.
  • Ke-10 endpoint Django REST asli mempertahankan nama dan bentuk respons saat menjadi fungsi browser. Backend Django tetap ada di repositori semata sebagai oracle tervalidasi yang dicek CI terhadap port browser, masih dijalankan di setiap push yang menyentuh backend/**, tapi tidak di-deploy. Alternatif yang ditolak, Fly.io dengan web, worker, Postgres, dan Redis, diperkirakan sekitar $6–11 per bulan.
  • Bug kedua, ditemukan dengan cara yang sama: pemeriksaan "ijtimak sebelum matahari terbenam" membandingkan suatu malam dengan konjungsi yang paling baru lewat, bukan konjungsi bulan yang bersangkutan, sehingga malam sebelum ijtimak sebenarnya bisa salah lolos. Penyapuan tahun Hijriah 1400–1470H di Jakarta, Banda Aceh, dan Jayapura menemukan 28 malam terdampak, semuanya Wujudul Hilal, masing-masing memulai bulan sehari lebih awal, misalnya Ramadan 1439H di Jakarta jatuh 16 Mei 2018, bukan 17 Mei 2018. Kedua mesin kini memeriksa konjungsi bulan yang bersangkutan; tak satu pun dari 2.083 golden vector mencakup bulan yang terdampak, jadi tidak ada yang perlu diubah, dan tes regresi ditambahkan ke kedua suite.
  • DESIGN.md v2, dari September 2026, mengganti sembilan halaman lama yang bernama bahasa Inggris dengan lima destinasi berbahasa Indonesia, Salat, Kiblat, Awal Bulan, Kalender, dan Belajar, ditambah halaman beranda yang didesain ulang. Path lama tetap mengarahkan ulang di sisi klien, jadi tautan lama yang sudah dibagikan tetap berfungsi.
  • Bug Merauke: satu titik grid ketinggian bulannya berbeda 0,00000016 derajat dari rujukan sementara 362 titik lain cocok, ditelusuri ke port yang menyimpan waktu sebagai milidetik float, bukan mikrodetik integer seperti datetime di Python. Di dekat ambang 3° MABIMS, selisih seperti itu bisa membalik hasil.
  • CI menjalankan suite Python dengan service Postgres, membuat ulang fixture golden vector, membandingkannya secara numerik pada toleransi 1e-9 (libm macOS dan glibc berbeda di digit terakhir sin/cos/atan2), membandingkan hasil, tanggal, dan boolean secara persis, lalu menjalankan suite konformitas Vitest.
  • Warna peta diuji dengan validator CVD dan kontras. Warna teal "kriteria terpenuhi" yang lama terukur ΔE 12,8 terhadap slate, di bawah batas 15. Langkah warna baru mencapai 21,1 (terang) dan 25,3 (gelap), dan "terpenuhi" digambar sebagai kotak penuh, sedangkan "tidak terpenuhi" sebagai titik kecil.
  • Garis pantai diekstrak sekali saat build dari Natural Earth lewat world-atlas dan topojson-client menjadi GeoJSON 111 KB yang di-commit. Jadwal salat menentukan zona waktu dengan tz-lookup; bug awal sempat menampilkannya dalam UTC mentah.
  • Kartu pratinjau sosialnya adalah gambar 1200×630 yang di-commit, dibuat ulang secara manual, bukan dibangun saat diminta, karena GitHub Pages menyajikan gambar OG konvensi Next sebagai application/octet-stream, yang ditolak kebanyakan pembuat pratinjau tautan.
  • 115 tes backend (110 langsung terverifikasi lolos; sisanya butuh role Postgres yang hidup dan dicakup CI proyek sendiri) dan 113 tes frontend di 9 file menjaga deploy. Mesinnya 2.354 baris Python dan 2.889 baris TypeScript di 17 modul. 169 commit oleh satu orang, 5 Juli sampai 27 September 2026.

Tangkapan layar

Beranda
Beranda (2)
Shalat
Jadwal Sebulan Shalat
Kiblat
Awal Bulan

Sedang merekrut, atau membangun hal serupa?

Saya terbuka untuk posisi full-time dan proyek freelance tertentu.