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

Chipfire

Game rantai ledakan di grid yang bisa dimainkan melawan teman di perangkat lain, tanpa server sama sekali

Tangkapan layar
server backend untuk permainan online
0
pemain per permainan di satu perangkat
2–4
permainan simulasi sebelum setiap deploy
3.000
tingkat kesulitan lawan AI
3
Di halaman ini

Masalahnya

Chain Reaction adalah permainan grid yang cukup terkenal, dengan puluhan tiruan di browser. Kebanyakan salah di dua hal. Yang pertama adalah aturannya sendiri. Saat sebuah sel mencapai kapasitasnya, isinya seharusnya dikurangi sebesar kapasitas itu, dan sisanya tetap tinggal. Kebanyakan versi malah mengosongkannya. Permainannya masih terlihat wajar, tapi sebenarnya sudah jadi permainan lain, dan tidak ada yang sadar.

Yang kedua adalah mode multipemain. Setiap versi online butuh lobi, sistem pencari lawan, dan server permainan, lengkap dengan tagihan hosting-nya. Biaya itulah yang membuat kebanyakan game kecil tidak pernah punya mode online.

Chipfire dibuat untuk dua kelompok. Pemain mendapat game cepat yang bisa dipelajari dalam dua menit dan dimainkan melawan teman di perangkat lain, tanpa akun. Pembaca teknis mendapat contoh yang berjalan dari multipemain tanpa backend sama sekali.

Yang saya bangun

Langkah yang sama selalu menghasilkan permainan yang sama

Saya membuat mesin aturannya sepenuhnya bisa ditebak. Mesin ini hanya memakai bilangan bulat, tanpa jam, dan keacakan hanya berasal dari seed yang tersimpan di dalam permainan. Perangkat apa pun, di browser apa pun, menghasilkan hasil yang sama dari langkah yang sama. Jadi sebuah permainan cukup disimpan sebagai daftar langkahnya. Replay, undo, kode permainan yang bisa dibagikan, dan sinkronisasi online semuanya lahir dari sifat itu. Tidak ada data lain yang disimpan atau dikirim sebagai sumber kebenaran.

Dua browser saling memeriksa setiap giliran

Dalam permainan online, setiap browser menyimpan salinan permainannya sendiri. Yang dikirim hanya langkah dan sidik jari pendek dari posisi papan. Kedua sisi menjalankan langkah yang sama lalu membandingkan sidik jarinya setiap giliran. Kalau berbeda, berarti kedua pemain sudah berada di dua permainan yang berlainan. Aplikasi langsung berhenti, memberi tahu kedua pemain, dan menawarkan untuk membangun ulang dari daftar langkah. Aplikasi tidak pernah diam-diam memilih pemenang.

Pemain sendiri yang mempertemukan perangkatnya

Dua browser di balik router rumah tidak bisa saling menemukan. Biasanya ada server yang memperkenalkan keduanya. Saya mengubah perkenalan itu menjadi kode pendek yang bisa ditempel. Kita mengirim satu kode lewat WhatsApp, teman membalas dengan satu kode, dan permainan tersambung. Tidak ada infrastruktur yang perlu dibayar, dibatasi, atau bisa dimatikan.

Rantai ledakan diproses dengan urutan tetap

Sebuah cascade diproses satu sel demi satu sel dari antrean, dengan urutan pemindaian yang sama di setiap perangkat. Dua browser yang memproses sel dengan urutan berbeda akan pelan-pelan tidak sinkron, dan bug seperti itu tidak akan pernah muncul di satu mesin. Kapasitas sebuah sel adalah jumlah tetangganya, dibaca dari satu fungsi. Dengan begitu, papan heksagonal atau papan yang tepinya menyambung bisa ditambahkan nanti tanpa banyak perubahan.

Koneksi yang gagal dijelaskan

Sekitar 10 sampai 20% koneksi, di jaringan kantor yang ketat dan sebagian router rumah, tidak bisa menyambungkan dua perangkat secara langsung tanpa server relay berbayar. Relay akan merusak ide tanpa backend. Jadi Chipfire mendeteksi kegagalan itu dengan cepat, menjelaskannya dalam bahasa yang mudah dipahami, dan langsung menawarkan permainan lokal.

Hasilnya

Chipfire sudah live dalam bahasa Indonesia dan Inggris. Kita bisa bermain bergantian di satu perangkat untuk 2 sampai 4 orang, melawan AI dengan tiga tingkat kesulitan, atau melawan teman secara online lewat kode yang ditempel. Ada juga penampil replay, kode permainan yang bisa dibagikan, pratinjau langkah, dan tutorial lima pelajaran. Setiap deploy lebih dulu memainkan 3.000 permainan simulasi untuk membuktikan mesinnya konsisten. Saya membangunnya dalam waktu kurang dari 24 jam pada 2 dan 3 Agustus 2026, dari spesifikasi tertulis sampai situs ter-deploy.

Di balik layarDetail teknis untuk engineer
  • applyMove(state, move) murni: tanpa Date, tanpa Math.random (generator ber-seed disimpan di state), tanpa float, termasuk di penilaian AI.
  • Cascade memakai antrean FIFO eksplisit dengan urutan pemindaian tetangga yang tetap. Tanpa rekursi, yang bisa meluap di rantai panjang, dan tanpa iterasi atas Set atau key objek. Uint8Array berisi penanda posisi dipakai sebagai pengganti Set.
  • Deteksi desync menukar hash FNV-1a 32-bit dari seluruh state setiap giliran. Ukuran papan dan seed ikut dalam offer; setelah itu hanya langkah yang dikirim.
  • Signalling memakai offer RTCPeerConnection yang dikompresi dengan CompressionStream (deflate-raw) menjadi kode yang bisa ditempel. Dua server STUN publik Google hanya dipakai untuk menemukan alamat. Tidak ada relay TURN. Signalling lewat broker PeerJS (M5) dan encoding QR masih belum dikerjakan.
  • AI memakai minimax dengan alpha-beta pruning dan iterative deepening di Web Worker, dengan anggaran waktu dan jam yang di-inject. Penilaiannya mencakup keunggulan orb dan sel, kontrol sudut dan tepi, serta kerentanan. Tingkat kesulitan mencari di kedalaman 1, 3, dan 6, dilemahkan hanya dengan noise ber-seed.
  • Pratinjau langkah menjalankan langkah asli di mesin asli pada salinan sementara (lib/engine/preview.ts).
  • Mesin mengeluarkan event place, explode, convert, eliminate, dan win yang berurutan dalam gelombang. Renderer memutarnya ulang dan menghormati prefers-reduced-motion.
  • Pelajaran tutorial memakai posisi papan asli yang hasilnya diverifikasi di tes. Setiap warna pemain dipasangkan dengan susunan orb yang berbeda, jadi warna tidak pernah jadi satu-satunya penanda.
  • Namanya diganti dari Rantai ke Chipfire setelah mekanismenya dikenali sebagai chip-firing game (model abelian sandpile). Kedua key localStorage dimigrasikan dengan fallback lama.
  • Bug Tailwind yang hanya muncul di production menghilangkan warna pemain karena lib/ tidak masuk jalur pemindaian class.
  • CI menjalankan typecheck, lint, seluruh tes (termasuk simulasi 3.000 permainan dan kecocokan antar-instance), lalu mengecek hasil export untuk .nojekyll dan rute bahasa.
  • Dependensi runtime: next, react, react-dom. Mesin 984 baris, AI 300 baris, jaringan 404 baris. Sekitar 6.700 baris TypeScript di 66 berkas, 70 tes di 15 berkas, 26 commit.

Tangkapan layar

Main Page
The Game
Tutorial
Tanding Page

Sedang merekrut, atau membangun hal serupa?

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