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

WA Daily Scrum Bot

Bot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

Tangkapan layar
anggota tim dipantau setiap hari kerja
14
pengecekan pengingat sehari, makin tegas
4
hari sebelum tugas macet ditandai
3
perintah chat swalayan
3
Di halaman ini

Masalahnya

Tim OIKN THD, tim software beranggotakan 14 orang, menjalankan standup harian di grup WhatsApp. Setiap anggota menulis apa yang dikerjakan kemarin dan apa rencananya hari ini. Tanpa bantuan, team lead harus mengecek siapa yang belum menulis lalu mengingatkannya, beberapa kali sehari, setiap hari. Untuk 14 orang, ini melelahkan dan gampang terlupa. Akibatnya ada laporan yang terlewat atau datang terlalu telat untuk berguna.

Tim ini butuh sesuatu yang memantau grup, mengirim pengingat yang makin tegas sepanjang hari, dan menutup setiap hari dengan ringkasan berperingkat. Laporan datang dalam bahasa Indonesia dan Inggris, jadi keduanya harus dikenali.

Yang saya bangun

Bot menjalankan WhatsApp Web, karena tidak ada API untuk bot

WhatsApp tidak punya API resmi untuk bot grup. API bisnisnya butuh persetujuan Meta dan berbayar, jadi tidak cocok untuk alat internal tim. Karena itu bot menjalankan WhatsApp Web di browser di dalam container. Bot mengecek empat kali sehari, pukul 09.00, 10.00, 11.00, dan 14.00, dan setiap pengingat lebih tegas dari sebelumnya. Pesan hanya dikirim kalau masih ada yang belum melapor. Kalau semua sudah melapor, bot diam.

Laporan dihitung kalau kedua bagiannya ada

Sebuah pesan dianggap laporan standup kalau memuat pasangan frasa, misalnya "kemarin" dan "hari ini", atau "yesterday" dan "today". Cara ini jalan di kedua bahasa dan untuk format apa pun. Pengecekan kedua membuang kata kunci itu dan melihat sisanya. Kalau hampir tidak ada isinya, bot menegur laporan yang hanya berisi kata kunci itu di grup. Hari libur nasional dan tanggal cuti setiap anggota diatur di konfigurasi, jadi tidak ada yang dikejar-kejar saat libur.

Bot mengenali tugas yang jalan di tempat

Bot juga membaca setiap poin tugas dan mengikutinya dari hari ke hari. "fix login bug" dan "fixing the login bug issue" dianggap tugas yang sama, berdasarkan berapa banyak kata yang sama. Tugas yang tetap berada di bagian "hari ini" selama tiga hari atau lebih tanpa pernah dilaporkan selesai akan ditandai. Tugas rutin seperti piket, cuti, dan standby tidak pernah ditandai. Untuk QA lead tim yang bebannya berat, tugas testing yang macet disertai tawaran bantuan dari rekan yang disebut namanya.

Melewatkan tugas yang macet tidak mereset hitungannya

Awalnya hitungan tugas macet direset setiap Senin. Anggota juga bisa menghindarinya dengan tidak menulis tugas itu sehari saja. Saya mengubahnya supaya hitungan terbawa lintas minggu dan baru hilang saat tugas yang sama dilaporkan selesai. Supaya tetap aman saat restart, bot membaca ulang 500 pesan terakhir di grup ketika menyala, lalu memutarnya kembali secara berurutan. Deploy ulang tidak pernah menghilangkan pelacakannya.

Rekap Jumat saya uji dulu sebelum dikirim otomatis

Rekap Jumat menggabungkan tingkat penyelesaian, rentetan tepat waktu, perbandingan kesehatan tim dengan minggu lalu, dan daftar tugas yang macet. Salah satu saja bisa menampilkan angka yang keliru di depan seluruh tim. Saya merilisnya dengan pengiriman otomatis dimatikan dan tombol kirim manual. Setelah hasilnya saya cek terhadap data tim selama satu siklus penuh, pengiriman otomatis saya nyalakan lagi.

Hasilnya

Bot ini berjalan di produksi untuk standup harian tim dan memantau 14 anggota setiap hari kerja. Saya membangunnya dalam 18 hari di bulan Juni 2026. Awalnya hanya mendeteksi laporan dan mengirim pengingat, lalu berkembang menjadi pelacakan tugas, analitik mingguan, dan perintah mandiri. Anggota bisa mengetik !mystats untuk melihat persentase tepat waktu, rentetan, dan tingkat penyelesaiannya sendiri, !rank untuk papan peringkat, dan !help untuk daftar perintah. Data tersimpan di berkas biasa pada volume yang di-mount, jadi restart tidak menghapus progres hari itu. Saya juga membuat dashboard React sebagai demo jadwal dan pesan. Dashboard itu tidak terhubung ke bot yang berjalan.

Di balik layarDetail teknis untuk engineer
  • Node.js 18 dengan whatsapp-web.js (Puppeteer dan Chromium), node-cron untuk penjadwalan, dan qrcode-terminal untuk menautkan ponsel. Sesi bergantung pada ponsel tertaut yang tetap online dan bisa rusak saat WhatsApp memperbarui klien web-nya.
  • Image Docker memakai node:18-bookworm-slim dengan Chromium sistem. Unduhan Chromium bawaan Puppeteer dilewati dan hostname container dipatok supaya tidak terjadi bentrok kunci profil. entrypoint.sh menghapus berkas kunci Singleton Chromium yang tertinggal sebelum Node berjalan.
  • Di tengah proyek, WhatsApp mengganti ID kontak dari format @c.us ke ID @lid yang tidak terbaca, sehingga pencocokan anggota rusak. Saya mencatat ID pengirim dari pesan yang masuk lalu memperbarui konfigurasi anggota.
  • Deteksi memakai dua string kata kunci ditambah tiga pasangan kata kunci dwibahasa.
  • detectSection() mengelompokkan baris ke Yesterday, Today, atau Impediment. parseSectionTasks() mengambil poin-poinnya. normalizeTask() dan taskSimilarity() memakai kemiripan token Jaccard dengan ambang 0,7. CONFIG.staleTask.minDays bernilai 3.
  • .week-state.json menyimpan reports, carry, ledger, dan history. State harian ada di .bot-state.json.
  • Delapan cron job harian: kickoff, pengingat tugas terbawa pukul 08.02 dengan ambang dua hari, empat pengecekan, ringkasan akhir hari, dan slot rekap mingguan. Rekap Jumat terkirim pukul 17.05. Rekap Senin mengirim ulang tugas macet minggu lalu.
  • Tepat waktu berarti sebelum pukul 09.00 WITA, dalam jendela bergulir 4 minggu atau 20 hari kerja. Rentetan tidak putus karena hari cuti.
  • Pengaturan per anggota staleHelp dan stalePriority; weeklyRecapAutoSend mengatur rekap. SIGUSR1 memicu pengingat, SIGUSR2 mencetak rekap ke log, dan SIGHUP mengirimnya.
  • !mystats membalas di grup dengan @mention. !leaderboard adalah alias untuk !rank.
  • GitHub Actions membangun image ke GHCR. bot.js berisi 1.166 baris dan dashboard 386 baris. 25 commit dari 10 sampai 28 Juni 2026.

Tangkapan layar

Morning Kickoff
Escalating Reminders
Weekly Leaderboard

Sedang merekrut, atau membangun hal serupa?

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