Montara
Pemantauan konstruksi IKN tempat setiap perubahan proyek disetujui pejabat yang berwenang dan tercatat
- dashboard per peran dengan ekspor CSV dan PDF
- 8
- peran dengan hak masing-masing
- 5
- jenis perubahan yang perlu disetujui
- 4
Di halaman ini
Masalahnya
Nusantara, ibu kota baru Indonesia, sedang dibangun oleh banyak kontraktor sekaligus. Orang-orang yang memantau pekerjaan itu butuh hal yang berbeda, dan diberi kepercayaan yang berbeda pula. Kontraktor melaporkan progres fisik dan keuangan di proyek mereka sendiri. Pejabat Pembuat Komitmen (PPK) menyetujui atau menolak laporan itu, tapi hanya untuk proyek dalam lingkupnya. PPK butuh jejak audit, karena ini komitmen pemerintah. Tim kepatuhan dan pimpinan butuh dashboard yang bisa dipercaya tanpa harus membaca data mentah setiap proyek.
Sebelum ada Montara, semua ini berjalan lewat spreadsheet dan email. Tidak ada yang mengatur siapa boleh mengubah apa, dan tidak ada catatan siapa yang menyetujuinya.
Yang saya bangun
Frontend saya bangun duluan dan jadi acuan utama
Saya membangun prototipe lengkap di browser sebelum ada server sama sekali. Setiap peran, aturan hak akses, dan alur kerja berjalan dari awal sampai akhir, dengan data tersimpan di browser. Prototipe itu lalu melewati review kode formal, dan saya menyelesaikan temuan-temuannya. Baru setelah itu saya membangun backend, sebagai salinan di sisi server dari aturan yang sudah terbukti jalan. Spesifikasi lama hanya punya empat peran dan tidak memasukkan kontraktor. Prototipenya punya lima, dan kontraktor ikut jadi pengguna. Untuk setiap perbedaan, saya tuliskan aturannya: prototipe yang dipakai.
Setiap perubahan adalah permintaan yang harus disetujui
Proyek tidak punya satu status yang tinggal diganti dari draf ke disetujui. Setiap perubahan diajukan sebagai permintaan persetujuan tersendiri, entah itu membuat proyek, mengubahnya, melaporkan progres, atau menghapusnya. Status proyek diambil dari permintaan terakhirnya. Hasilnya, ada catatan lengkap siapa yang mengusulkan setiap perubahan dan siapa yang memutuskannya. PPK dan super-admin bisa mengubah langsung, dan perubahan itu dicatat terpisah supaya tetap terlihat.
Persetujuan yang sudah basi ditolak
Setiap proyek menyimpan nomor revisi. Saat permintaan diajukan, nomor itu ikut dicatat. Saat persetujuan, server mengeceknya lagi. Kalau proyek sudah berubah di antaranya, persetujuan ditolak dan data yang lebih baru tetap aman. Semua ini berjalan tanpa mengunci tabel.
Hapus proyek masih bisa dibatalkan sampai langkah terakhir
Mengarsipkan proyek akan menutup semua isu terbukanya dan mengingat status isu itu sebelumnya, jadi pemulihan bisa mengembalikannya. Hapus permanen lebih dulu menampilkan berapa banyak data dari tiap jenis yang akan ikut terhapus. Untuk arsip pemerintah, orang yang menghapus perlu melihat itu sebelum datanya hilang.
Backend memperbaiki prototipe di dua bagian
Di prototipe, notifikasi dihitung ulang setiap kali layar digambar. Di server, saya menyimpan setiap notifikasi saat kejadian pemicunya terjadi. Proses latar mengecek proyek yang terlambat dan menyiapkan ringkasan terjadwal. Spesifikasi juga membiarkan penampil model bangunan 3D sebagai pertanyaan terbuka. Saya menjawabnya dengan menghubungkan penampil itu ke Autodesk Platform Services. Penampil simulasi, yang diberi label jelas, tetap ada untuk proyek tanpa model.
Hasilnya
Montara adalah sistem privat yang sudah melewati tahap integrasi dan belum diluncurkan ke produksi. Ada delapan dashboard yang dibatasi per peran: ringkasan, peta, anggaran, progres, risiko, kepatuhan, portofolio, dan kinerja kontraktor, lengkap dengan ekspor CSV dan PDF. Lima peran ditegakkan di browser dan sekali lagi di server. Alur persetujuan mengikuti permintaan yang ditolak sampai diajukan ulang. Tes otomatis di frontend memeriksa, antara lain, bahwa satu peran tidak bisa melihat data peran lain. Saya membangun prototipenya selama sekitar enam minggu sejak akhir Mei 2026, lalu backend-nya pada 5 Juli. Kini frontend terhubung ke server lewat sebuah sakelar, jadi masih bisa kembali ke mode prototipe selama masa peralihan.
Di balik layarDetail teknis untuk engineer
- Frontend: Next.js App Router, React 18, TypeScript, shadcn/Radix UI, Tailwind CSS v4, react-hook-form, Leaflet, dan Recharts. Prototipenya berjalan sepenuhnya di
localStorage. types.tsdanbusinessRules.tsdari prototipe menjadi kontrak untuk model Django dan kelas permission DRF, jadi kedua sisi tidak bisa berjalan sendiri-sendiri.- Peran:
contractor,ppk,mki,executive, dansuper_admin. Hak persetujuan PPK dibatasi ke lingkup per proyek yang eksplisit. Pengecekan di klien hanya untuk tampilan; batas keamanannya ada di server. - Jenis
ApprovalRequest:CREATE,UPDATE,PROGRESS_UPDATE, danDELETE.Project.approvalStatusditurunkan dari permintaan terakhir. Penolakan wajib disertai komentar. - Konkurensi optimistis memakai integer
revisiondiProject, dicatat saat permintaan diajukan dan divalidasi ulang saat persetujuan. - Progres dipantau terhadap kurva S rencana, dengan jendela pelaporan, pengecekan agar progres tidak mundur, deteksi pengajuan ganda, dan frekuensi pelaporan yang bisa diatur di singleton
SystemSettings. - Isu punya transisi status dan prioritas, tindak lanjut, lampiran berkas, dan eskalasi dari tim kepatuhan ke pimpinan.
- Setiap penghapusan menulis catatan
ProjectDeletionLog. - Notifikasi berupa baris yang ditulis dalam transaksi yang sama dengan kejadian pemicunya. Celery dan Redis menjalankan deteksi keterlambatan dan agregasi terjadwal.
- Review frontend mencatat perbaikan seperti pemecahan komponen, memoization, logika otorisasi yang dipusatkan, autosave dengan debounce, dan sinkronisasi antartab.
- Backend: Django 5.1, DRF dengan API camelCase,
django-filter,drf-spectacularuntuk dokumentasi OpenAPI, dan PostgreSQL. 11 domain app dan 37 model. - 18 halaman. Sedikitnya 111 tes otomatis frontend di sekitar 10 berkas tes, dengan Vitest dan Testing Library.
- Frontend: 53 commit dari 25 Mei sampai 5 Juli 2026, sekitar 27.300 baris TypeScript. Backend: 20 commit pada 5 Juli 2026, sekitar 4.150 baris Python.
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.