
MightyblueTim teknisi kami kehilangan data pengukuran ruangan tiga kali dalam sebulan. Bukan karena aplikasinya...
Tim teknisi kami kehilangan data pengukuran ruangan tiga kali dalam sebulan. Bukan karena aplikasinya buruk — tapi karena aplikasinya jujur: tidak ada sinyal, tidak ada simpan. Masalah konektivitas ini nyata dan masif; pemerintah sendiri masih menargetkan 2.500 desa blankspot terhubung internet mulai 2026, artinya ribuan titik kerja lapangan di Indonesia masih beroperasi tanpa jaminan koneksi. Dari frustrasi itulah proyek ini lahir: membangun PWA offline-first tim instalasi lapangan yang tetap bekerja saat dunia luar tidak bisa dihubungi.
Pendekatan ini bukan eksperimen buta. Riset komparatif yang mengevaluasi implementasi Progressive Web App terhadap performa website menunjukkan penurunan data transfer drastis dari 3,9 MB ke 320 kB dan lonjakan skor Lighthouse dari 71 ke 91 setelah service worker diterapkan — bukti bahwa arsitektur offline-first bukan sekadar "fitur tambahan". Kami mengangkat tema ini karena mayoritas tutorial PWA berhenti di level to-do list demo; jarang ada yang membedah kasus bisnis lapangan sungguhan di Indonesia, lengkap dengan kegagalan, revisi arsitektur, dan angka sebelum-sesudahnya.
TL;DR: Dengan service worker (cache-first untuk app shell), IndexedDB (antrean data pengukuran), dan Background Sync API (auto-sync saat koneksi pulih), form pengukuran ruangan yang tadinya gagal simpan di area tanpa sinyal kini mencapai zero data loss — tanpa aplikasi native, tanpa app store, tanpa biaya lisensi.
Klien kami adalah distributor plafon PVC yang melayani tiga kabupaten di Jawa Barat. Tim instalasinya melakukan pengukuran ruangan sebelum pemasangan — dan di sinilah masalah dimulai, karena lokasi kerja mereka hampir selalu bermusuhan dengan sinyal.
Rumah baru yang belum ada WiFi.
Gudang berdinding galvalum tebal.
Plafon lantai dua yang posisinya persis di dead spot BTS.
Tiga jenis lokasi itu adalah 80% medan kerja harian tim jasa pemasangan plafon PVC di Purwakarta yang menjadi studi kasus artikel ini. Mereka melayani area Purwakarta, Subang, dan Indramayu — dan semakin jauh dari pusat kota, semakin sering aplikasi berbasis cloud murni menyerah.
Sebelumnya alurnya seperti ini:
Kertas basah kena hujan. Chat tenggelam. Angka 4,25 m terketik 42,5 m. Satu kesalahan ukur berarti potongan panel WPC yang salah — dan itu biaya material yang hangus.
Sebelum menulis satu baris kode pun, kami sepakat pada satu prinsip: offline bukan error state, offline adalah default state. Koneksi dianggap bonus. Filosofi ini mengubah seluruh keputusan teknis, dari pemilihan storage sampai strategi caching — dan inilah fondasi dari setiap PWA offline-first tim instalasi lapangan yang serius.
Service worker bertindak sebagai programmable proxy antara aplikasi dan network. Untuk app shell (HTML, CSS, JS, ikon), kami memakai strategi cache-first:
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((cached) => {
return cached || fetch(event.request);
})
);
});
Hasilnya: aplikasi terbuka instan bahkan dalam mode pesawat. Kalau kamu baru mengenal konsep ini, artikel Intro to PWAs and Service Workers dari This Dot Media adalah primer yang solid sebelum lanjut ke bagian teknis di bawah.
LocalStorage terlalu kecil dan sinkron (blocking). Kami memilih IndexedDB dengan wrapper idb untuk menyimpan setiap hasil pengukuran sebagai record berstatus:
| Status | Arti | Aksi berikutnya |
|---|---|---|
draft |
Masih diedit teknisi | Tetap lokal |
queued |
Siap kirim, menunggu koneksi | Diambil background sync |
syncing |
Sedang dikirim | Tunggu ACK server |
synced |
Sudah di server | Boleh dibersihkan |
conflict |
Versi server berbeda | Resolusi manual |
Setiap record punya uuid yang digenerate di sisi klien — kunci penting untuk idempotency agar retry tidak menciptakan data ganda.
Inilah bintang utamanya. Saat teknisi menekan simpan tanpa koneksi, data masuk antrean dan aplikasi mendaftarkan sync tag:
const reg = await navigator.serviceWorker.ready;
await reg.sync.register('sync-pengukuran');
Begitu perangkat kembali online — bahkan jika tab sudah ditutup — browser membangunkan service worker dan memproses antrean. Teknisi tidak perlu ingat menekan tombol apa pun. Untuk browser tanpa dukungan Background Sync (Safari iOS), kami menyiapkan fallback listener online + retry berkala.
Bagian ini adalah panduan HowTo ringkas jika kamu ingin mereplikasi pola PWA offline-first tim instalasi lapangan untuk kasusmu sendiri — entah itu tim survei, kurir, atau inspeksi K3. Total waktu implementasi inti: sekitar dua minggu kerja untuk satu developer.
Langkah 1 — Audit alur data. Petakan data apa yang wajib bisa dibuat offline (form pengukuran, foto ruangan) vs yang boleh online-only (laporan agregat).
Langkah 2 — Bangun app shell statis. Pisahkan shell dari data. Shell di-precache saat install event service worker.
Langkah 3 — Desain skema IndexedDB. Satu object store pengukuran dengan index pada status dan updatedAt. Sertakan uuid klien.
Langkah 4 — Implementasi antrean + Background Sync. Simpan dulu, sinkron kemudian. Server harus idempotent terhadap uuid yang sama.
Langkah 5 — Bangun indikator status yang jujur. Badge kecil "3 data menunggu sinkron" jauh lebih menenangkan daripada spinner misterius.
Langkah 6 — Uji dengan throttling & mode pesawat. Chrome DevTools → Network → Offline. Lalu uji di perangkat asli, di gudang asli.
Setelah enam minggu berjalan di lapangan, angkanya berbicara sendiri. Tapi yang lebih menarik justru pelajaran non-teknisnya — hal-hal yang tidak pernah muncul di dokumentasi MDN.
| Metrik | Sebelum | Sesudah |
|---|---|---|
| Data pengukuran hilang/bulan | 3–5 kasus | 0 kasus |
| Input ulang manual | ±40 menit/hari | ~0 |
| Waktu buka aplikasi di lokasi | 8–15 detik (sering timeout) | < 1 detik (cache) |
| Kesalahan transkrip angka | 2–3/bulan | 0 |
Sinkronisasi itu mudah. Konflik itu susah.
Dua teknisi, satu proyek, dua ukuran berbeda — siapa yang menang?
Kami akhirnya memakai last-write-wins + flag conflict untuk review manusia. Sederhana, tapi cukup.
Pelajaran kedua: edukasi pengguna sama pentingnya dengan kode. Teknisi sempat tidak percaya datanya "sudah tersimpan" tanpa loading. Butuh satu sesi demo mematikan WiFi di depan mereka untuk membangun kepercayaan pada pola PWA offline-first tim instalasi lapangan ini.
Q: Kenapa tidak bikin aplikasi native saja?
A: Biaya dan distribusi. PWA cukup satu codebase, tanpa app store review, dan update instan. Untuk CRUD form lapangan, native adalah overkill.
Q: Apakah Background Sync jalan di iOS?
A: Belum penuh. Gunakan fallback event online + periodic retry saat app aktif. Antrean IndexedDB tetap aman karena persistensinya tidak bergantung pada sync API.
Q: Bagaimana dengan foto ruangan yang ukurannya besar?
A: Kompres di klien (Canvas API, target < 300 kB) sebelum masuk antrean, dan sinkronkan foto terpisah dari data numerik agar antrean angka tidak terblokir.
Q: Apakah pola ini cocok untuk tim non-konstruksi?
A: Sangat. Kurir, surveyor tanah, petugas inspeksi, sales kanvas — siapa pun yang bekerja di titik buta sinyal mendapat manfaat dari arsitektur PWA offline-first tim instalasi lapangan semacam ini.
Sebagai penutup, ada satu kalimat yang selalu saya kutip di setiap sesi review arsitektur proyek ini:
"Progressive Web Apps are just websites that took all the right vitamins."
— Alex Russell
Alex Russell adalah engineer yang bersama Frances Berriman mencetuskan istilah Progressive Web App pada 2015 saat bekerja di tim Google Chrome — figur yang paling bertanggung jawab atas keberadaan service worker sebagai standar web modern. Kutipannya menohok karena membalik cara pandang kita: PWA bukan spesies aplikasi baru yang eksotis, melainkan website biasa yang diberi "vitamin" yang tepat — caching, persistensi, dan ketahanan offline. Studi kasus di artikel ini membuktikannya secara harfiah: tidak ada framework ajaib, tidak ada infrastruktur mahal, hanya web platform standar yang dipakai sampai batas kemampuannya.
Dan vitamin itu paling terasa manfaatnya justru di tempat yang paling jarang dibahas konferensi teknologi: gudang galvalum di pinggiran Purwakarta, tempat seorang teknisi menekan tombol simpan — dan untuk pertama kalinya, tidak perlu berdoa dulu agar datanya selamat.
Kalau kamu pernah membangun solusi offline-first untuk tim lapangan, ceritakan pengalamanmu di komentar. Saya penasaran bagaimana kalian menangani konflik data. 👇