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

Dashboard SAKTI

Pipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN

Tangkapan layar
satker disinkronkan setiap malam
6
jenis data SAKTI diambil per job
6
WIB sinkronisasi malam, tanpa unduh manual
02.00
dari repositori kosong sampai pipeline berjalan
2 hari
Di halaman ini

Masalahnya

Otorita IKN punya enam satuan kerja (satker), dan data anggaran serta realisasi setiap satker tersimpan di SAKTI, sistem milik Kementerian Keuangan. Setiap kali biro perencanaan butuh angka untuk laporan, rapat pimpinan, atau Power BI, seseorang harus login ke SAKTI, mengunduh file Excel per satker, lalu menggabungkannya secara manual.

Akibatnya tidak ada riwayat dan tidak ada tampilan tunggal. Tidak ada yang bisa melihat pergerakan belanja dari waktu ke waktu. Setiap alat lain yang butuh angkanya mendapatkannya lewat salin-tempel. Tim data ingin angka-angka itu terkumpul otomatis, tersimpan dari waktu ke waktu, dan tampil di satu tempat.

Yang saya bangun

Pipeline malam yang mengambil data setiap satker

Sebuah job terjadwal berjalan setiap malam pukul 02.00 WIB. Job ini menarik enam jenis data SAKTI untuk setiap satker aktif secara paralel, lalu menyimpannya ke database. Daftar satker dibaca dari database saat job dimulai. Administrator cukup menambah atau menonaktifkan satker di panel admin, dan job berikutnya langsung mengikuti. Tidak ada satker yang di-hardcode. Setiap job aman diulang, karena menyimpan data yang sama dua kali akan memperbaruinya, bukan menggandakannya.

Saya mensimulasikan SAKTI supaya pekerjaan tidak menunggu akses

Kredensial SAKTI yang asli belum tersedia. Cara login SAKTI juga tidak biasa: setiap respons memberikan kunci sekali pakai yang baru, dan kunci sebelumnya langsung tidak berlaku. Saya membangun server tiruan kecil yang berperilaku sama, termasuk respons kunci kedaluwarsa, dan menyajikan data contoh untuk keenam jenis data. Seluruh pipeline berjalan di atasnya. Pindah ke sistem asli cukup dengan mengubah dua pengaturan, tanpa mengubah kode.

Satu tempat untuk logika penyimpanan

Job terjadwal menulis ke database lewat model data yang sama dengan aplikasi web. Saya memilih cara ini ketimbang menaruh API web di antara keduanya, supaya aturan penyimpanan data hanya ada di satu tempat. Konsekuensinya, penjadwal bergantung pada kode aplikasi web. Untuk enam satker, itu pertukaran yang wajar.

Dashboard dengan penanda sinkronisasi dan ekspor Excel

Dashboard-nya punya tiga halaman. Halaman ringkasan menampilkan total anggaran, total realisasi, dan persentase serapan, lengkap dengan grafik tren dan gauge. Halaman detail merinci satu satker per program dan kegiatan, dengan filter tanggal. Halaman pengelolaan menampilkan daftar satker. Setiap job malam mencatat status, jumlah baris, durasi, dan pesan error, lalu dashboard menampilkan kapan data terakhir disinkronkan. Tampilan apa pun bisa diekspor ke file Excel yang sudah diformat.

Hasilnya

Saya membangun platform ini dalam dua hari di bulan Juni 2026, dari repositori kosong. Semuanya berjalan dari ujung ke ujung: job malam, client SAKTI, database, API, dashboard, dan ekspor Excel. Saat ini platform berjalan di atas server SAKTI tiruan dengan data contoh. Setup produksinya sudah siap dan teruji bisa menyala dengan bersih. Data asli menunggu Kementerian Keuangan memberikan kredensial. Di versi pertama ini dashboard belum punya login sendiri, dan ditujukan untuk jaringan internal OIKN.

Di balik layarDetail teknis untuk engineer
  • DAG Airflow sakti_daily_sync membaca tabel Satker saat runtime dan memakai .expand() untuk dynamic task mapping. Task-nya: fetch_ref_sts, fetch_ref_admin_uraian, lalu fetch_data_ang, fetch_spp_header, dan fetch_capaian_ro per satker, lalu normalize_and_load dan log_sync_result.
  • Task DAG mengimpor model Django langsung: source backend di-mount ke container Airflow dengan DJANGO_SETTINGS_MODULE terpasang. Upsert memakai update_or_create.
  • Django app mock_sakti menyimpan token di memori dengan rotasi UUID, meniru Bearer token sekali pakai milik SAKTI dan endpoint bootstrap resetToken, serta menyajikan fixture JSON yang deterministik.
  • SaktiClient memisahkan state token (auth.py) dari alur request (client.py) dan mencoba ulang dengan exponential backoff lewat tenacity.
  • SyncLog menyimpan status, jumlah baris, durasi, dan error per task. Hook notify_failure_placeholder sudah terpasang di DAG.
  • Ekspor Excel memakai openpyxl: header tebal, lebar kolom otomatis, format mata uang, dan baris header yang dibekukan.
  • Baris Anggaran tidak punya kolom tanggal, jadi toggle granularitas di grafik membagi total anggaran secara merata. Riwayat refSts yang bertanggal akan menggantikannya.
  • Data aplikasi dan metadata Airflow berbagi satu container MySQL 8, sebagai database terpisah dengan user terpisah.
  • Lima service Docker dengan multi-stage build dan healthcheck; docker-compose.prod.yml memakai restart: unless-stopped.
  • 8 Django app, 9 endpoint REST termasuk health dan status sinkronisasi, 10 komponen React, sekitar 5.000 baris Python dan JSX, 10 commit dalam sembilan fase.

Tangkapan layar

Login Page
Overview
Detail Satker
Kelola Satker
Log Aktivitas

Sedang merekrut, atau membangun hal serupa?

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