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

Suara ke Kursi

Model interaktif DPR 580 kursi tempat Anda mengubah aturan Pemilu 2024 dan melihat kursi berpindah

Tangkapan layar
suara sah yang tidak menghasilkan kursi pada 2024
17.304.303
kursi di 84 dapil, dihitung ulang langsung
580
pengaturan aturan, tersimpan di tautan
4
pelanggaran aksesibilitas di tiga lebar layar
0
Di halaman ini

Masalahnya

Wartawan, mahasiswa, dan staf legislatif yang membaca RUU Pemilu menghadapi hambatan yang sama. Indonesia mengubah suara menjadi kursi DPR lewat dua aturan yang hampir tidak mungkin dihitung dengan tangan. Partai yang suaranya di bawah ambang batas nasional 4% tidak mendapat kursi di mana pun, termasuk di dapil tempat ia menang. Setelah itu, setiap dari 84 dapil membagi kursinya dengan metode Sainte-Laguë, yaitu membagi suara partai dengan 1, 3, 5, 7, dan seterusnya.

Pada Pemilu 2024, 18 partai ikut serta dan 8 lolos ambang batas. Sebanyak 17.304.303 suara sah tidak menghasilkan kursi. PPP, partai yang sebelumnya ada di DPR, kurang sekitar 0,13 poin persentase dari ambang batas. Mahkamah Konstitusi menyatakan angka 4% berlaku untuk 2024 saja dan meminta pembentuk undang-undang menetapkan angka baru sebelum 2029, dengan syarat suara yang terbuang ditekan. Itu adalah perhitungan, dan belum ada alat publik yang menjalankannya.

Yang saya bangun

Hitungan kursi ada di satu fungsi kecil yang bisa diperiksa

Saya memisahkan mesin alokasi dari bagian lain aplikasi. Mesin ini menerima suara partai, data dapil, dan seperangkat aturan, lalu mengembalikan hasil lengkapnya. Tidak ada dependensi, tidak ada unsur acak, tidak ada jam. Kode yang sama bisa dijalankan sebagai skrip biasa di luar browser, jadi siapa pun bisa memeriksa angkanya tanpa harus percaya pada tampilannya.

Penjelasannya menampilkan aritmetika yang sebenarnya

Setiap kursi yang diberikan mesin menyimpan tabel hasil bagi lengkap pada saat kursi itu dimenangkan. Tampilan "tunjukkan cara hitungnya" menggambar catatan itu langsung dan tidak pernah menghitung ulang. Untuk dapil mana pun, Anda bisa menelusuri kursi satu per satu dan membaca setiap pembagiannya. Gambarnya tidak mungkin berbeda dari hitungannya, karena keduanya satu data yang sama.

Kursi berpindah saat aturan diubah

Tampilan utamanya adalah ruang sidang berisi 580 kursi. Geser ambang batas dari 4,0% ke arah nol, dan kursi-kursi berpindah satu per satu dari blok satu partai ke blok partai lain. Mesin menghitung ulang ke-84 dapil dalam 0,23 milidetik, jadi hitungan bisa diulang di setiap frame animasi. Saya menggerakkan ke-580 kursi dalam satu loop animasi supaya gerakannya tetap mulus di ponsel. Begitu slider melewati 3,87%, PPP masuk ke ruang sidang.

Hasil 2024 harus cocok dulu sebelum simulasi boleh tampil

Saya menetapkan aturan bahwa aplikasi harus mereproduksi hasil resmi 2024 sebelum menampilkan skenario apa pun, dan pemeriksaan ini menghentikan build kalau gagal. Tabel suara per dapil per partai hanya tersedia di PDF rekapitulasi KPU hasil pindaian, dan ekstraksinya belum saya selesaikan. Karena itu, header aplikasi menyatakan dengan jelas bahwa hasil resmi belum tereproduksi. Angka nasional memakai data resmi, dan jumlah suara yang terbuang sama persis dengan hitungan independen Perludem.

Setiap aturan merujuk ke undang-undang

Setiap aturan mengutip pasalnya di UU 7/2017, dan setiap angka utama mengutip dokumen KPU sumbernya. Kutipan terbuka di panel yang bisa dijangkau dengan keyboard dan dibaca tanpa terburu-buru. Bahasanya menggambarkan hasil secara netral, misalnya "sepuluh partai tidak memperoleh kursi".

Hasilnya

Suara ke Kursi sudah live, terbuka untuk umum, dan berbahasa Indonesia. Ada empat pengaturan aturan: ambang batas, cakupan ambang batas, metode pembagi, dan peta dapil. Setiap pengaturan tersimpan di tautan, jadi perdebatan soal ambang batas 2% bisa dikirim sebagai link. Aplikasi ini memodelkan 580 kursi, 84 dapil, dan 18 partai dalam lima tampilan. Setiap tampilan punya tabel dengan angka yang sama, bisa dijangkau dengan keyboard. Audit otomatis tidak menemukan satu pun pelanggaran aksesibilitas di tiga lebar layar, dalam mode terang dan gelap. Saya membangunnya dalam sekitar 28 jam, pada 2 dan 3 September 2026.

Di balik layarDetail teknis untuk engineer
  • Mesinnya ada di src/engine/, 621 baris tanpa satu pun import. allocate(parties, dapil, rules) adalah seluruh antarmuka publiknya: sinkron dan deterministik. Isinya mencakup ambang batas, empat aturan pembagi (Sainte-Laguë, D'Hondt, Sainte-Laguë modifikasi, kuota Hare dengan sisa terbesar), penyelesaian suara seri, objek trace, dan lima metrik disproporsionalitas (termasuk Gallagher, Loosemore–Hanby, dan jumlah partai efektif).
  • Dasar hukum: UU 7/2017 Pasal 414 ayat (1) untuk ambang batas 4%, Pasal 415 ayat (2) untuk Sainte-Laguë. Putusan MK-nya adalah 116/PUU-XXI/2023. Jumlah kursi per dapil diambil dari PKPU 6/2023.
  • Loop utama memakai typed array yang diindeks per urutan partai, lalu diubah ke objek hanya di batas modul. Trace dilewati saat hitung ulang dari slider. Median 0,23 ms untuk ke-84 dapil dengan anggaran 16 ms; median 60 fps saat menggeser 4,0% ke 0 di build produksi, frame p95 17,6 ms. Tanpa debounce, tanpa requestIdleCallback, tanpa web worker.
  • src/ui/motion.ts berisi solver cubic-Bézier buatan sendiri dan satu loop rAF yang menginterpolasi ke-580 kursi dalam satu putaran.
  • Kelima tampilan ditulis manual sebagai SVG yang dirender React. d3-array, d3-scale, dan d3-shape hanya dipakai untuk matematika tata letak dan tidak pernah menyentuh DOM. Total lima dependensi runtime.
  • Status aturan disimpan di query string, misalnya ?t=2.0&scope=national&d=sainte-lague&geo=dapil.
  • public/data/dapil-2024.json adalah placeholder sintetis bertanda "provenance": "synthetic". npm run verify keluar dengan status gagal dan CI melaporkan gate sebagai belum bisa diuji. Mengganti berkas itu dengan versi bertanda "certified" membuat semuanya hijau.
  • Palet warna partai dihitung oleh scripts/extract/solve-colors.ts. Latar abu-abu sedang membuat target kontras 3:1 mustahil dipenuhi warna jenuh, jadi saya memindahkan instrumen ke latar hampir hitam. Sekarang semua warna lolos 3,5:1 dan tujuh partai, termasuk empat terbesar, memakai warna logonya persis.
  • Spesifikasi meminta penanda "~1%" dari rumus Laakso–Taagepera. Dengan rata-rata besaran dapil 6,90, rumus itu menghasilkan 9,5%, jadi penanda dirilis dengan nilai hasil hitungan.
  • Total payload sekitar 440 KB (228 KB JS, 31 KB CSS, 141 KB font self-hosted, 58 KB data) dengan batas 1 MB yang dicek di CI. Nol pelanggaran axe-core terhadap WCAG 2.1 A dan AA di 380, 720, dan 1400 px.
  • 40 tes Vitest, setiap nilai yang diharapkan dihitung manual di kertas lebih dulu. Sekitar 8.000 baris, 42 commit.

Tangkapan layar

Ruang Sidang
Angka Ringkas
Ambang Batas
Aturan
Suara Sah Nasional
Dapil

Sedang merekrut, atau membangun hal serupa?

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