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

Nusantara Languages

Peta 726 bahasa di Indonesia, terhubung ke pohon silsilahnya sehingga setiap cabang menyalakan wilayahnya

Tangkapan layar
bahasa Indonesia dalam satu peta terhubung
726
rumpun bahasa di pohon silsilah
56
bahasa dengan peta wilayah penutur
58%
pasangan warna rumpun yang diperbaiki untuk buta warna
48 → 2
Di halaman ini

Masalahnya

Indonesia punya lebih dari 700 bahasa, salah satu yang terpadat di dunia. Bagi kebanyakan orang, bentuk keragaman itu tidak kelihatan. Bahasa mana yang bersaudara? Bagaimana rumpun-rumpunnya menyebar di kepulauan ini? Peta bahasa sudah ada, pohon silsilah bahasa juga ada, tapi belum ada yang menghubungkan keduanya menjadi satu hal yang bisa dijelajahi.

Saya membangun Nusantara Languages untuk pelajar, linguis, dan siapa pun yang penasaran di mana rumpun-rumpun bahasa Indonesia bertemu. Contoh paling jelas adalah garis pertemuan rumpun Austronesia dan Papua yang melintasi Halmahera. Ini proyek pribadi yang open source. Situs ini tidak berafiliasi dengan "Peta Bahasa" resmi Badan Bahasa, jadi tidak memakai nama maupun tampilannya.

Yang saya bangun

Peta dan pohon silsilah adalah satu objek

Peta dan pohon membaca data yang sama. Arahkan kursor ke satu cabang pohon, dan semua wilayah di kelompok itu menyala di peta. Klik sebuah wilayah, dan pohon bergulir ke sana lalu membuka garis leluhurnya. Karena keduanya membaca satu struktur, keduanya tidak mungkin berbeda. Logika pohon dan geometrinya saya tulis sebagai fungsi biasa, sehingga logika yang paling rumit bisa diuji tanpa browser.

Kecepatan saya ukur sebelum styling

Situs ini statis dan tidak memanggil jaringan saat dibuka. Satu langkah build mengambil sumber data sedunia, menyaring Indonesia, menyederhanakan bentuk wilayah, lalu menulis satu bundle data beserta laporan cakupannya. Sebelum styling apa pun, saya mengukur apakah hover tetap terasa instan dengan 726 bahasa di layar. Hasilnya sekitar 0,01 milidetik dari batas 2 milidetik. Karena itu saya bisa tetap memakai gambar vektor biasa, dan membuat peta serta parser pohonnya sendiri.

Atlas yang direncanakan saya lepas karena lisensinya

Rencananya, wilayah bahasa digambar dari atlas tahun 1980-an, sumber yang diharapkan membuat petanya indah. Saat pengecekan lisensi, ternyata atlas itu hanya boleh dipakai untuk tujuan nonkomersial. Itu bertentangan dengan lisensi terbuka yang dipakai data situs ini. Saya menolak sumber itu, mencatat alasannya di halaman metode, dan beralih ke dua dataset berlisensi terbuka dari rentang 1990 sampai 2020. Era petanya ikut berubah. Ethnologue dilarang sepenuhnya, dan sebuah tes membuktikan tidak ada datanya yang ikut terbit. Kalau suatu angka hanya tersedia di sana, halaman tidak menampilkannya dan menyebutkan hal itu.

Bahasa tanpa wilayah tetap menjadi titik

Dari 726 bahasa, 421 punya peta wilayah penutur. Sisanya, 305 bahasa, tampil sebagai titik berlabel dengan gaya berbeda. Saya tidak meregangkannya menjadi bentuk wilayah supaya peta tampak lengkap. Angka 58% itu dihitung oleh proses build dari datanya, jadi tidak bisa melenceng. Garis pantainya diambil dari dataset geografis, tidak pernah dijiplak dari wilayah bahasa. Warna rumpun saya pilih agar tetap bisa dibedakan oleh tiga jenis buta warna, dan status terancam punah ditampilkan sebagai arsiran di atas warna rumpun.

Hasilnya

Nusantara Languages sudah live dalam bahasa Inggris dan Indonesia, sepenuhnya statis, dan bisa dipakai offline. Selain peta dan pohon, situs ini menjawab tiga pertanyaan dari data yang sama. Bahasa mana kerabat terdekat sebuah bahasa? Seberapa jauh sebuah rumpun menyebar? Austronesia membentang sekitar 5.010 km, Timor-Alor-Pantar sekitar 350 km. Bahasa dari rumpun berbeda mana saja yang bersentuhan? Ada 67 pasang. Setiap jawaban menampilkan aturan dan batasannya di samping angkanya. Pengguna juga bisa mewarnai per subkelompok, mengikuti tur terpandu ke garis-garis pertemuan rumpun, dan mengekspor PNG yang sudah memuat atribusi, sesuai syarat lisensinya. Situs ini menyatakan bahwa batas antarbahasa bersifat bertahap, serta berapa bahasa yang punya wilayah dan berapa yang berupa titik. Saya membangunnya sendiri antara Agustus dan September 2026.

Di balik layarDetail teknis untuk engineer
  • Static export Next.js di GitHub Pages; React, TypeScript strict, Tailwind, Zod untuk manifest sumber, Vitest, tsx untuk skrip pipeline, pnpm. Tipografinya Newsreader untuk judul dan teks panjang, IBM Plex Sans Condensed untuk label, IBM Plex Mono untuk data dan angka, semuanya di-hosting sendiri lewat next/font.
  • Dua bug yang hanya muncul di browser lolos dari type checker dan test suite. Tag <style> dengan teks anak merusak hydration, diperbaiki dengan beralih ke dangerouslySetInnerHTML. Mengelompokkan daratan berdasarkan jenis geometri diam-diam menghilangkan 273 pulau kecil; perbaikannya mengelompokkan berdasarkan ada-tidaknya pulau tetangga.
  • Tanpa pustaka peta, GIS, Newick, atau topologi. Parser Newick dan plate SVG beserta hit-testing hover-nya ditulis sendiri; lib/tree dan lib/geo berupa fungsi murni yang diuji di Node.
  • sources:build mengambil data, memeriksa lisensi, menyaring Indonesia, menyederhanakan poligon, mencocokkan silsilah, lalu menulis bundle beserta coverage.json. Dump mentah sedunia tidak pernah di-commit.
  • Anggaran render M0: 19.570 vertex dari batas 60.000, hover sekitar 0,01 ms dari batas 2 ms, jadi SVG dipertahankan dan canvas tidak diperlukan.
  • Gate lisensi mewajibkan setiap sumber mendeklarasikan lisensi yang di-pin dan dicek mesin. Atlas Wurm & Hattori (diterbitkan ulang sebagai GeoJSON oleh Glottography) berlisensi CC-BY-NC-4.0, tidak cocok dengan CC-BY-SA-4.0 milik bundle, dan tercatat di manifest sebagai decision: 'refused'. Penggantinya asher2007world dan schapper2020papuan, keduanya CC-BY-4.0. test:licence memastikan tidak ada field turunan Ethnologue.
  • Bahasa berbentuk titik memakai koordinat Glottolog, yang sering berupa titik tengah populasi. Convex hull dan isian Voronoi dilarang oleh invarian yang diuji. Garis pantai Natural Earth ditambahkan kembali di tengah proyek setelah pulau-pulau tampak "tergerogoti"; lapisannya pointer-events-none.
  • Warna rumpun diambil dari set OKLCH yang dikurasi dan dinilai terhadap tiga jenis buta warna; pasangan warna yang mudah tertukar turun dari 15 menjadi 0 pada penglihatan normal. Saturasi hanya dipakai untuk pilihan yang aktif.
  • Aksesibilitas: pohon memakai role="tree" dengan roving tabindex, satu tab stop, turun dari 1.716 saat terbuka penuh. Beberapa role ARIA tanpa perilaku keyboard yang sesuai (tablist, combobox) dihapus dan diganti elemen HTML bawaan.
  • Gate yang tidak stabil memakai Math.max(...samples) terhadap batas 16 ms; hasil yang teramati berkisar 0,57 ms sampai 27,34 ms.
  • 726 bahasa, 56 rumpun tingkat atas, 23 bahasa isolat. Pasangan yang bersentuhan dihitung dengan cek kedekatan antarsegmen. Anggaran JS: 234 KB gzip di luar geometri, diukur terhadap target 250 KB.
  • Sekitar 21.135 baris TypeScript, 579 tes di 37 berkas tes, 18 komponen, sekitar 10 route, 112 commit dari 12 Agustus sampai 27 September 2026.

Tangkapan layar

Beranda
Maps
Fullscreen Maps
Language Page
Guided Views
Method

Sedang merekrut, atau membangun hal serupa?

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