-
-
MarketShield: satellite-based eruption early warning for residents, markets and aid posts.
-
The resident home screen changes with PVMBG levels I–IV and always shows one main action.
-
How it works: satellite signals, message filter, one action per level, fair prices.
-
Operator console in Live mode: XGBoost forecast from Firestore and live alerts.
-
3D eruption simulation on Semeru terrain, with villages and aid posts in the flow path.
-
The same Flutter app runs on Android and in the browser.
-
Three data modes: demo, live view-only and live operator.
-
Architecture: Earth Engine and models, Firestore in Jakarta, and the app, console and API on Vercel.
-
CI/CD: build check per PR, production deploy on merge, signed APK per tag.
-
Risk engine on 2024–2026: ROC-AUC 0.899 vs 0.784 baseline, with SHAP drivers.
-
IndoBERT: 98.4% test accuracy vs 96.9% TF-IDF; confusion matrix and training curve.
-
Firestore document for Semeru with the published XGBoost forecast.
-
Live status page checking the API and map providers every 30 seconds.
-
Risk API returning the official level and the model forecast.
-
18 screens of the resident app: onboarding, persona, home per level, map, evacuation, SOS, hoax check, HET prices, go-kit, aid posts.
Inspiration
Saat Semeru erupsi pada 4 Desember 2021, awan panas guguran turun lewat Besuk Kobokan hanya dalam satu sore. Level dari PVMBG sudah tepat, tetapi sampai ke warga hanya sebagai status, Level III Siaga, tanpa petunjuk apa yang harus dilakukan. Warga tetap harus menebak sendiri.
Setiap kali status naik, kami melihat tiga masalah muncul bersamaan. Pesan berantai di WhatsApp ("lahar sudah masuk Pronojiwo, segera pergi!") menyebar lebih cepat daripada klarifikasi. Warga membeli masker dan air bersih pada saat yang sama, sehingga harga melonjak dan apotek kehabisan stok dalam sehari. Bantuan menumpuk di desa yang dekat jalan besar, sementara desa yang paling terpapar masih menunggu.
Kami ingin membuat alat untuk orang-orang di lereng gunung: petani yang harus memutuskan kapan memindahkan ternaknya, pelajar yang mengecek pesan di grup keluarga, apoteker yang ingin raknya tetap terisi dengan harga wajar, relawan yang poskonya sudah penuh, dan petugas BPBD yang memilih desa mana yang mendapat truk berikutnya. Kami juga tidak mau bergantung pada alat yang harus dipasang di gunung aktif, jadi semua data masukan berasal dari katalog citra satelit publik dan sumber resmi.
What it does
MarketShield adalah sistem kesiapsiagaan bencana untuk warga di sekitar gunung api aktif di Indonesia. Ada empat pilar:
- GeoAI Predictive Engine. Fitur mingguan dari Google Earth Engine (titik panas NASA FIRMS, gas SO₂ Sentinel-5P, backscatter radar Sentinel-1, curah hujan GPM IMERG) diolah model XGBoost untuk memprakirakan peluang aktivitas termal gunung dalam 7 hari ke depan, lengkap dengan faktor pendorong dari SHAP. Prakiraan ini tampil di samping level resmi PVMBG dan tidak menggantikannya.
- Pre-emptive Procurement Nudge. Saat Level II (Waspada), aplikasi mengajak warga menyiapkan Kit Siaga secara bertahap per kohort dengan patokan harga HET, supaya pembelian tersebar dan stok tidak habis dalam sehari.
- Anti-Hoax Feed. Warga menempelkan pesan berantai, lalu mendapat label, kata pemicu, cek silang citra satelit, dan fakta resmi terdekat dalam hitungan detik.
- Emergency Price Tracker. Harga pasar dibandingkan dengan HET. Harga yang lebih dari 30% di atas HET ditandai sebagai indikasi spekulasi.
Semuanya sampai ke pengguna lewat tiga kanal yang membaca satu database Cloud Firestore di Jakarta:
- Aplikasi warga (Flutter, APK Android dan web). Beranda berubah sesuai level PVMBG I–IV dan selalu menaruh satu langkah utama di atas: siapkan tas siaga, belanja wajar, kenali rute evakuasi, atau evakuasi sekarang. Ada juga peta bahaya dengan cincin KRB dan rute evakuasi, tampilan erupsi 3D, cek pesan hoaks, posko terdekat dengan status Buka/Penuh secara real-time, protokol sektor untuk petani dan peternak, serta tombol SOS (tahan 3 detik). Warga tidak perlu membuat akun, dan aplikasi tetap jalan saat offline dengan data tersimpan atau data bawaan.
- Konsol web operator (Next.js). BPBD melihat prakiraan satelit, Indeks Prioritas Bantuan per desa (paparan × bahaya × kerentanan ÷ bantuan yang sudah diterima), pantauan harga, filter sinyal, dan siaran bertahap per kohort. Koordinator posko memperbarui status posko, dan perubahan itu muncul di semua konsol yang terbuka dalam sekitar satu detik. Donatur dan distributor melihat desa mana yang paling butuh pasokan.
- API publik REST. Delapan endpoint di
/api/v1: gunung api, risiko, prioritas desa, harga, posko, peringatan, intel, dan cek pesan.
Halaman utama juga menampilkan simulasi erupsi 3D di medan Semeru (MapLibre + three.js): kolom abu, awan panas guguran lewat Besuk Kobokan, sebaran abu regional dengan kualitas udara per kota, serta linimasa dengan dan tanpa MarketShield.
Keputusan keselamatan tetap berasal dari sumber resmi atau rumus yang pasti. Level gunung berasal dari PVMBG, prioritas bantuan dan tanda harga memakai rumus sederhana, dan hanya operator BPBD yang sudah login yang bisa mengirim siaran.
How we built it
Data dan model (Python, Google Earth Engine, Colab).
- Risk engine. Kami mengambil fitur mingguan Earth Engine untuk 25 gunung api di Indonesia dari Januari 2019 sampai Oktober 2026: 407 minggu, 10.067 data gunung-minggu. Riwayat level PVMBG tidak tersedia dalam format yang bisa dibaca mesin, jadi targetnya adalah proksi satelit: apakah NASA FIRMS mencatat titik panas dalam radius 5 km dari puncak pada 7 hari berikutnya. Target ini berbeda dari level PVMBG, dan aplikasi selalu menampilkan level resmi secara terpisah. Model XGBoost (300 pohon, kedalaman 4, bobot kelas) dilatih dengan data 2019–2023 dan diuji dengan data 2024–2026, sehingga model tidak pernah melihat data masa depan. Hasilnya dibandingkan dengan baseline persistensi ("minggu depan sama seperti minggu ini"). SHAP menjelaskan setiap prakiraan. Sebuah skrip menerbitkan prakiraan terbaru per gunung ke Firestore, lalu dibaca oleh konsol dan API risiko.
- Filter hoaks. Kami melakukan fine-tuning IndoBERT (
indobenchmark/indobert-base-p1) dengan dataset publikmzuama/IndonesianHoaxdetection(12.136 teks setelah duplikat dihapus, sebelum dibagi 80/10/10), ditambah augmentasi potongan pendek dan 60 pesan bencana pendek yang kami tulis sendiri khusus untuk pelatihan. Model TF-IDF + regresi logistik dipakai sebagai baseline.
Backend. Cloud Firestore di asia-southeast2 (Jakarta) dengan security rules yang menegakkan peran dari custom claims Firebase Auth (admin, bpbd, posko, donor). API publik berupa route handler Next.js di Vercel yang memakai Firebase Admin SDK, dengan service account berhak akses minimum dan data cadangan bawaan yang selalu diberi label di setiap respons (source: firestore atau static).
Web. Next.js 16 dengan React 19, TypeScript, Tailwind CSS 4, Zustand, Recharts, dan Driver.js untuk halaman utama, halaman produk, dan konsol operator. Konsol memakai listener Firestore real-time dan punya tiga mode: demo (data contoh, tidak ada yang disimpan), live hanya-lihat, dan live operator. MapLibre GL 6.16 menampilkan globe dengan citra Sentinel-2 dan medan 3D, dan layer kustom three.js menggambar erupsinya.
Aplikasi warga. Flutter 3.41 dengan flutter_map, shared_preferences, dan webview_flutter. Satu kode menghasilkan APK Android sekitar 20 MB dan versi web di /mobile. Aplikasi menampilkan data bawaan lebih dulu, lalu data tersimpan, lalu memperbarui dari API setiap 5 menit.
Rilis. GitHub Actions: setiap pull request menjalankan build lengkap Flutter web dan Next.js sebagai pengecekan, merge ke main langsung deploy ke Vercel production, dan tag v* membangun APK arm64/armv7 bertanda tangan dengan checksum SHA-256 di GitHub Releases. Kami bekerja lewat pull request sejak commit pertama.
Alat AI. Kami memakai Claude Code (Anthropic) untuk membantu menulis dan merapikan kode, debugging, pengecekan di browser, dan menyusun draf dokumentasi. Tim meninjau, menguji, dan me-merge setiap perubahan lewat pull request. Semua penggunaan AI dan aset pihak ketiga dicatat di repo (docs/AI_USE_AND_THIRD_PARTY.md).
Challenges we ran into
- Model hoaks pertama gagal di pesan sungguhan. Percobaan pertama mendapat 98,3% di data uji, tetapi hanya 50% pada 40 pesan pendek bergaya WhatsApp, karena model belajar bahwa "teks pendek = hoaks" dari data latih yang berupa artikel panjang. Masalah ini ketahuan lewat set uji tambahan sebelum dirilis. Kami lalu menambahkan augmentasi potongan pendek dan contoh pesan bencana. Percobaan terakhir mencapai 90% pada set uji tersebut.
- Riwayat level PVMBG tidak tersedia dalam format data. Kami tidak bisa melatih model dengan data kenaikan status resmi, jadi kami memakai proksi satelit yang objektif (aktivitas termal FIRMS) dan bisa dihitung ulang siapa saja, dan kami selalu menyebutnya sebagai proksi.
- Model 500 MB tidak muat di fungsi serverless. IndoBERT sudah dilatih dan dievaluasi, tetapi API masih memakai pengklasifikasi berbasis aturan dengan format respons yang sama sampai model bisa di-hosting terpisah.
- Batas paket gratis. Upload preview untuk setiap PR menghabiskan kuota harian gratis Vercel, jadi PR kami ubah menjadi pengecekan build saja dan deploy hanya dari
main. - Kunci yang bocor. Saat pengembangan, kunci service account khusus Datastore sempat tertempel di notebook yang dibagikan lewat link. Kunci itu kami nonaktifkan dalam hitungan menit, kami buat kunci baru, tidak ditemukan penulisan data yang mencurigakan, dan kunci notebook dipindah ke Colab Secrets.
- Memisahkan data demo dan data live. Pengunjung perlu mencoba tanpa mengubah data asli, sementara operator perlu menyimpan data sungguhan. Kami membuat tiga mode yang jelas dengan penanda di setiap layar, dan Firestore rules menolak penulisan dari siapa pun yang tidak punya peran.
- Tetap berguna saat offline. Aplikasi bencana yang kosong saat sinyal hilang tidak membantu, jadi setiap kanal membawa data bawaan dan memberi tahu saat sedang memakainya.
Accomplishments that we're proud of
- Seluruh sistem sudah live: situs, konsol operator, API publik, aplikasi Flutter versi web, dan APK Android bertanda tangan, semuanya di satu database real-time.
- Risk engine mencapai ROC-AUC 0,899 dibanding 0,784 untuk baseline persistensi pada data 2024–2026, dengan PR-AUC 0,674 dibanding 0,455 dan recall 78% dibanding 63%. Pada minggu awal aktivitas (minggu sebelumnya tidak ada titik panas), model mencapai ROC-AUC 0,81, kondisi yang sama sekali tidak bisa ditebak oleh baseline persistensi.
- IndoBERT mencapai akurasi 98,4% di data uji dibanding 96,9% untuk TF-IDF, 96,6% pada potongan pendek, dan 90% pada pesan pendek bergaya WhatsApp. Percobaan yang gagal juga kami dokumentasikan karena dari situ kami paling banyak belajar.
- Posko yang ditandai Penuh oleh koordinatornya berubah oranye di semua konsol yang terbuka dalam sekitar satu detik.
- Keamanan diuji dari luar: klien anonim bisa membaca koleksi publik tetapi mendapat 403 untuk
signals,reports, danusers. Cek hoaks menyimpan label dan kata pemicu, tetapi tidak menyimpan isi pesan (UU PDP 27/2022). - Pengecekan kualitas: audit Playwright untuk 23 halaman di ukuran desktop dan HP tanpa error console atau overflow,
flutter analyzebersih, 7 tes Flutter lulus, dan checksum SHA-256 dipublikasikan untuk setiap APK. - Tanpa sensor lapangan: semuanya berjalan dengan data satelit publik dan sumber resmi.
What we learned
- Skor uji yang tinggi bisa menutupi perbedaan data. Menguji dengan input yang benar-benar dipakai produk (pesan berantai pendek) lebih penting daripada menaikkan akurasi di data uji.
- Pembagian data berdasarkan waktu dan baseline sederhana membuat penilaian model tetap jujur. Persistensi adalah baseline yang kuat untuk aktivitas gunung api, dan nilai tambah model ada pada minggu awal aktivitas.
- Jelaskan apa yang sebenarnya diprediksi model. Menyebut target sebagai proksi satelit dan selalu menampilkan level resmi lebih dulu membangun kepercayaan.
- Menaruh otorisasi di database (Firestore rules dengan custom claims) lebih sederhana dan aman untuk tim dua orang daripada mempercayai aplikasi klien.
- Untuk alat yang dipakai saat bencana, mode offline dan label demo/live harus ada sejak versi pertama.
- Pull request kecil dengan pengecekan build otomatis membuat dua orang bisa merilis banyak hal tanpa merusak production.
What's next for MarketShield
- Menjadwalkan pipeline Earth Engine dan model risiko setiap 6 jam lewat GitHub Actions dan service account.
- Menjalankan model IndoBERT hasil fine-tuning di
/api/v1/signals/check. - Push notification lewat FCM, dikirim per kohort supaya siaran tidak memicu panic buying.
- Pilot di satu desa di lereng Semeru bersama BPBD Lumajang (usulan: Kecamatan Candipuro), dengan data posko dan harga sungguhan, serta baseline yang diukur sebelum kami mengklaim dampak.
- Melatih ulang risk engine dengan data kenaikan status resmi setelah riwayat level PVMBG tersedia dalam format data.
- Rilis Play Store (pendaftaran PSE), versi iOS, citra peta komersial, lalu menambah gunung api di Jawa Timur dan daerah lain.
- Ide riset yang belum dibangun: SAR-Vault, kotak logistik IoT dengan kunci pintar untuk distribusi tanpa penimbunan.
Model bisnis: warga selalu gratis. Pemerintah kabupaten (Pemda/BPBD) membayar Rp10,4 juta per kabupaten per bulan dengan paket tahunan yang mencakup semua desa dan posko. Desa bisa berlangganan sendiri seharga Rp124.000 per bulan (tahunan) atau Rp149.000 bulanan. Perusahaan membayar untuk API risiko (tambahan Rp75.000 per 1.000 panggilan). Harga sesuai halaman /harga, belum termasuk PPN.
Batasan saat ini:
- Data desa, posko, harga, peringatan, dan intel di database masih data contoh (seed), belum dari BPBD atau survei pasar.
- Target risiko adalah proksi satelit (aktivitas termal FIRMS dalam radius 5 km selama 7 hari), berbeda dari level PVMBG. Tanpa data seismik, erupsi mendadak bisa terlewat.
- Model dilatih secara offline, prakiraan diterbitkan lewat skrip, dan cek pesan di API masih berbasis aturan.
- Semeru dimodelkan lengkap, sedangkan 24 gunung lainnya baru memiliki cincin bahaya.
- Belum ada push notification, dan aplikasi native baru tersedia untuk Android.
- Citra peta (EOX Sentinel-2 cloudless, CC BY-NC-SA 4.0) dan pendaftaran Earth Engine kami berstatus non-komersial.
Built with
flutter, dart, next.js, react, typescript, javascript, tailwindcss, node.js, python, firebase, cloud-firestore, firebase-authentication, google-cloud, google-earth-engine, vercel, github-actions, maplibre, three.js, xgboost, shap, scikit-learn, pandas, pytorch, hugging-face, transformers, indobert, google-colab, zustand, recharts, driver.js, flutter-map, nasa-firms, sentinel-1, sentinel-5p, sentinel-2, gpm-imerg, openstreetmap, playwright, claude-code
"Try it out" links
- Situs: https://marketshield-inception.vercel.app
- Konsol operator (tanpa akun, pilih Data contoh atau Data live): https://marketshield-inception.vercel.app/app/login
- Aplikasi warga di browser: https://marketshield-inception.vercel.app/mobile
- APK Android (rilis terbaru): https://github.com/aarieffawwaz/marketshield/releases/latest
- Simulasi erupsi 3D: https://marketshield-inception.vercel.app/embed/peta?sim=1
- API publik: https://marketshield-inception.vercel.app/api/v1/volcanoes
- Status sistem: https://marketshield-inception.vercel.app/status
- Kode sumber: https://github.com/aarieffawwaz/marketshield
- Video demo: https://youtu.be/oceCSCnBmjg
- Pitch deck: https://drive.google.com/drive/folders/1ypw_RPtIklhbmFj5fhVZ3T04-rk1DNi-?usp=sharing
- Tag Submission 24h: https://github.com/aarieffawwaz/marketshield/releases/tag/submission-24h
Video demo link
Built With
- firebase
- github-actions
- google-colab
- google-earth-engine
- hugging-face
- indobert
- maplibre
- openstreetmap
- pandas
- playwright
- python
- pytorch
- react
- scikit-learn
- sentinel-1
- sentinel-2
- sentinel-5p
- three.js
- transformers
- typescript
- xgboost
Log in or sign up for Devpost to join the conversation.