Zero Shadow Day
Menemukan dua hari setahun saat matahari tepat di atas kepala di seluruh Indonesia, dicek dengan tabel BMKG

- tanggal resmi BMKG yang cocok persis
- 75/76
- kota di Indonesia dengan koordinat bawaan
- 86
- permintaan jaringan saat runtime
- 0
Di halaman ini
- Masalahnya
- Yang saya bangun
- Semuanya dihitung dari lintang, bujur, dan tanggal
- Matematikanya saya cek sebelum membuat tampilan apa pun
- Bayangan tidak pernah hilang sepenuhnya, jadi saya melaporkan rentang waktu
- Saat hasil saya berbeda dengan BMKG, tesnya menjelaskan alasannya
- Bayangan itulah angkanya
- Hasilnya
- Di balik layar
Masalahnya
Indonesia dilintasi khatulistiwa, jadi setiap tempat di negeri ini mengalami dua hari dalam setahun ketika matahari tepat berada di atas kepala saat tengah hari. Pada "hari tanpa bayangan" itu, tongkat yang berdiri tegak hampir tidak punya bayangan. BMKG menerbitkan tanggalnya setiap tahun, kota demi kota. Tapi hampir tidak ada orang di luar kalangan ahli yang tahu peristiwa ini terjadi, kenapa terjadi, atau cara menunjukkannya.
Saya membangun Zero Shadow Day untuk tiga kelompok. Warga bisa menemukan dua tanggal di kotanya dan melihat kenapa tanggalnya jatuh di situ. Guru dan siswa mendapat kegiatan kelas: berpasangan dengan sekolah yang jaraknya beberapa ratus kilometer, lalu mengulang pengukuran Bumi oleh Eratosthenes yang berusia 2.200 tahun. Yang lain bisa mendapat fakta cepat soal tengah hari matahari, ketinggian matahari, dan arah bayangan.
Yang saya bangun
Semuanya dihitung dari lintang, bujur, dan tanggal
Aplikasi ini tidak punya sumber data, API key, database, maupun backend. Beberapa proyek saya sebelumnya tersendat karena soal lisensi data, dan proyek tanpa ketergantungan data tidak punya apa pun untuk dilisensikan atau menjadi basi. Mesin posisi matahari, geometri bayangan, pencarian tanggal, modul Eratosthenes, dan adegan 3D-nya saya tulis sendiri. Tidak ada pustaka astronomi, tanggal, zona waktu, atau 3D.
Matematikanya saya cek sebelum membuat tampilan apa pun
Milestone pertama tidak punya antarmuka sama sekali, hanya perhitungan posisi matahari yang dicocokkan dengan tabel astronomi yang sudah dipublikasikan. Rumus pintas yang umum dipakai untuk posisi matahari bisa meleset setengah derajat. Di dekat garis balik, selisih itu berubah menjadi tanggal yang salah beberapa hari tapi tetap tampak masuk akal. Geometri bayangan juga saya tulis tanpa berbagi kode dengan mesin matahari, dan sebuah tes menjaganya. Kalau ada kesalahan, ia akan muncul sebagai dua perhitungan yang tidak cocok.
Bayangan tidak pernah hilang sepenuhnya, jadi saya melaporkan rentang waktu
Piringan matahari lebarnya sekitar setengah derajat, jadi bayangan menyusut sampai titik terpendeknya dan tidak pernah nol. Aplikasi selalu memberi rentang waktu, yang lebarnya dihitung dari ukuran tampak matahari pada tanggal itu. Pengguna yang penasaran dan berdiri di luar dengan tongkat bisa membantah klaim satu detik yang pasti. Untuk menemukan tanggalnya, saya mencari bayangan tengah hari terpendek di antara hari-hari kandidat setiap tahun. Di dekat garis balik, tempat dua tanggal menyatu menjadi satu saat titik balik matahari, cara ini berjalan tanpa kasus khusus.
Saat hasil saya berbeda dengan BMKG, tesnya menjelaskan alasannya
Saya mencocokkan aplikasi ini dengan 76 tanggal dari tabel resmi BMKG tahun 2025 dan 2026, yang mencakup 38 ibu kota provinsi. Tujuh puluh lima cocok persis, ke-76 selisihnya paling banyak sehari, dan jamnya selisih kurang dari lima detik. Satu-satunya yang meleset adalah Pekanbaru 2026: saya menyebut 22 Maret, BMKG menyebut tanggal 21. Kota itu hanya 0,53° dari khatulistiwa, jadi matahari melintas tepat di atasnya di antara dua tengah hari. Empat baris Papua di tabel BMKG 2025 tampaknya hanya mencantumkan waktu pertamanya. Sebuah tes menurunkan hal itu dari fisikanya.
Bayangan itulah angkanya
Tampilan utamanya adalah tongkat dan bayangan 3D beranimasi untuk tempat dan tanggal apa pun. Panjang dan arah bayangan itulah angkanya, bukan gambar pelengkap. Adegan 3D-nya saya buat sendiri supaya seluruh aplikasi tetap sekitar 110 KB JavaScript, di bawah batas 150 KB. Mesin 3D umum saja sudah akan menghabiskan seluruh batas itu.
Hasilnya
Zero Shadow Day sudah live dalam bahasa Indonesia dan Inggris sebagai situs statis. Koordinat Anda tetap di browser, dan aplikasi tidak memanggil jaringan sama sekali. Aplikasi ini menunjukkan dua tanggal Anda beserta waktu kulminasi sampai hitungan detik, dan menjelaskan selisih antara tengah hari jam dan tengah hari matahari. Aplikasi ini juga menggambar kurva ujung bayangan dan analema berbentuk angka delapan. Mode Eratosthenes mencarikan mitra pengukuran di tempat lain di Nusantara dan menunjukkan selisih hasil Anda dengan keliling Bumi yang sebenarnya, karena selisih itulah pelajarannya. Animasi sapuan menampilkan titik matahari di atas kepala yang bergerak melintasi kepulauan sepanjang tahun. Setiap tampilan bisa dibagikan lewat tautan, dan tanggalnya bisa diekspor ke kalender. Saya membangun versi pertamanya dalam dua hari pada Agustus 2026, lalu kembali pada akhir September untuk tahap lanjutan yang mendesain ulang tampilannya.
Di balik layarDetail teknis untuk engineer
lib/solaradalah algoritma posisi matahari NOAA/Meeus dalam TypeScript murni, tanpa import React, Next, DOM, atau jaringan. Modul ini dipakai bersama Falak, dantests/solar/extractable.test.tsmenjaganya tetap bisa dipisahkan.lib/shadowterpisah darilib/solar; sebuah tes memastikan import-nya tidak ada.lib/zsdmenemukan tanggal dengan meminimalkan panjang bayangan tengah hari; Di luar daerah tropis, hasilnya berupa no-result terstruktur yang menyebut batas lintangnya.lib/eratosthenespunya tes bolak-balik sintetis yang memulihkan jari-jari yang diketahui secara persis.- Inti numeriknya hanya memakai bilangan Julian Day.
Datedan zona waktu hanya ada di satu modul tampilan,lib/clock, karena Indonesia punya tiga zona waktu tanpa DST. - Pekanbaru 2026: aturan aplikasi memilih residu zenit tengah hari yang lebih kecil, 0,111° pada 22 Maret dibanding 0,284° pada 21 Maret. Empat baris 2025 itu adalah Jayapura, Nabire, Wamena, dan Merauke. Waktunya dicek terhadap dua kota di zona dan tabel yang sama, yang selisihnya cocok dengan perubahan Equation of Time.
- Gnomon 3D memakai kamera dan proyeksi perspektif buatan sendiri sekitar 450 baris, dengan langit yang mengikuti ketinggian matahari. Tanpa Three.js.
- Palet "bleached concrete" yang datar dari PRD (dengan trio jenis huruf serif/sans/mono) diganti langit siang/malam dan animasi hero sepanjang hari, kini memakai Bricolage Grotesque, Plus Jakarta Sans, dan JetBrains Mono. Dua aturan dipertahankan: vermilion hanya untuk penanda hari tanpa bayangan, dan bayangan adalah warna tergelap di halaman.
- Perbaikan aksesibilitas: focus ring, pengaitan pesan error ke field, heading yang benar, petunjuk keyboard untuk elemen canvas, status tombol toggle, dan pengumuman slider. Rasio kontras diuji di tes.
- Perbaikan performa: batas deklinasi per tahun di-cache, variable font dikunci ke satu bobot yang dipakai, dan chunk data kota yang terkirim dua kali per route dihapus.
- Static export Next.js 14 di GitHub Pages, TypeScript strict, Tailwind, Vitest, pnpm, font di-hosting sendiri. CI menjalankan
pnpm test:solarlebih dulu, lalu seluruh suite, typecheck, dan lint. - Sekitar 11.157 baris TypeScript, 235 tes, 15 halaman hasil ekspor statis (7 route dalam 2 bahasa, ditambah satu halaman pengalihan di root), 91 commit antara 13 Agustus dan 28 September 2026, dengan jeda panjang sebelum tahap terakhir pada akhir September yang menambah tes dan mendesain ulang tampilannya.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.