Aksara
Perpustakaan pengetahuan Otorita IKN yang bisa dicari, dengan server memeriksa akses setiap pembaca di tiga tingkat

- unit organisasi tempat dokumen dikelompokkan
- 43
- domain pengetahuan yang menyusun seluruh arsip
- 10
- subkategori topik di bawah sepuluh domain itu
- 92
- tingkat akses diperiksa di server
- 3
Di halaman ini
- Masalahnya
- Yang saya bangun
- Setiap dokumen punya kode publik yang permanen
- Satu fungsi yang menentukan siapa boleh membuka dokumen tertutup
- Pemeriksaan mengikuti tahap tetap dengan riwayat lengkap
- Pencarian yang memaafkan salah ketik dan menyimpan tautannya
- Dokumen hukum nasional difederasikan, tidak disalin
- Hasilnya
- Di balik layar
Masalahnya
Otorita IKN menghasilkan banyak pengetahuan institusional di sepuluh unit Eselon-1: regulasi, laporan teknis, kajian akademik, dan catatan lapangan. Sistem lama menyimpan semuanya, tapi sulit dipakai. Tidak ada pencarian, jadi staf meminta file ke rekan lewat chat. Mengunggah berarti mengisi formulir dua langkah yang panjang tanpa fitur draf, sehingga sebagian besar pengetahuan tidak pernah diunggah, dan pimpinan tidak bisa melihat apa saja yang ada atau unit mana yang aktif berkontribusi.
Ada tiga kelompok pengguna Aksara: publik, yang menjelajahi pengetahuan terbit tanpa login; staf, yang mengunggah dan membaca materi internal; serta verifikator, kurator, dan administrator, yang menyetujui dan menata semuanya. Sebagian besar materi tidak bersifat publik, dan sebagian lagi hanya boleh dilihat direktorat pemiliknya.
Yang saya bangun
Setiap dokumen punya kode publik yang permanen
Setiap dokumen punya ID internal sejak masih draf. Saat pertama kali terbit, dokumen itu juga mendapat kode publik, dan kode itulah alamat publiknya. Saya memilih cara ini karena tautan publik harus permanen dan bisa dikutip, dan tautan yang dibentuk dari judul akan rusak begitu ada yang membetulkan salah ketik. Kode tidak pernah dipakai ulang, dan dokumen yang ditarik lalu diterbitkan lagi mendapat kode lamanya kembali.
Satu fungsi yang menentukan siapa boleh membuka dokumen tertutup
Ada tiga tingkat akses: publik, internal OIKN, dan terbatas, diperiksa di server untuk setiap permintaan berdasarkan unit kerja, eselon, peran, dan akses sementara yang pernah diberikan. Satu fungsi tunggal menentukan siapa yang boleh membuka dokumen terbatas tanpa mengajukan akses, dipanggil dari setiap tempat dokumen disajikan, supaya aturannya tidak melenceng antara daftar, pencarian, dan unduhan file. Awalnya saya memberikan wewenang itu ke peran admin yang lebih luas, lalu saya persempit ke satu peran superadmin saja setelah menyadari betapa sensitifnya hal ini.
Pemeriksaan mengikuti tahap tetap dengan riwayat lengkap
Dokumen bergerak dari draf ke verifikasi, lalu kurasi, lalu terbit, atau dikembalikan, atau ditolak. Hanya sistem yang boleh mengubah status itu, tidak lewat edit manual. Verifikator dan kurator bekerja di antrean layar terbelah dengan tiga pilihan: setujui, kembalikan dengan catatan wajib, atau tolak. Setiap langkah tercatat di linimasa yang tidak bisa diubah siapa pun, dan dokumen yang sudah terbit dan direvisi tetap tampil sampai revisinya lolos pemeriksaan lagi.
Pencarian yang memaafkan salah ketik dan menyimpan tautannya
Saya memakai pencarian teks penuh di database, lengkap dengan toleransi salah ketik dan saran "mungkin maksud Anda", di balik satu antarmuka sehingga nanti bisa diganti mesin pencari yang lebih besar tanpa mengubah halamannya. Semua filter, urutan, dan nomor halaman tersimpan di alamat halaman, jadi hasil yang sudah difilter bisa di-bookmark, dibagikan, atau dimuat ulang.
Dokumen hukum nasional difederasikan, tidak disalin
Dokumen hukum nasional ada di sistem lain milik OIKN, namanya JDIH, jadi Aksara tidak pernah menyalin dokumennya. Saya hanya menyimpan metadata ringan, menyegarkannya lewat task harian, dan mengambil isi aslinya dari API JDIH saat seseorang membuka dokumennya, dengan cache singkat di server. Menyalin data JDIH justru akan membuat duplikat regulasi yang lama-lama tidak sinkron. Integrasi ini akhirnya jauh lebih besar dari rencana awal: kini ada pengklasifikasi otomatis dan pencarian teks penuhnya sendiri, di atas sinkronisasi metadata yang diminta spesifikasi awal.
Hasilnya
Saya membangun Aksara sendirian, mulai Juli 2026, dan sekarang sudah live di aksara.ikn.go.id. Portal publiknya terbuka untuk siapa saja, dan setiap dokumen diperiksa di server terhadap tiga tingkat akses. Dokumen dikelompokkan menurut 43 unit organisasi, 10 domain pengetahuan, dan 92 subkategori topik yang lebih rinci. Di luar rencana awal, integrasi JDIH berkembang dengan pengklasifikasi otomatis dan indeks pencariannya sendiri, dan saya menambahkan gazetteer serta modul pencapaian. Sebuah aplikasi mobile kini memakai backend yang sama.
Di balik layarDetail teknis untuk engineer
- Kode publik berbentuk
AKS-2026-0042-K7mPdan muncul di URL seperti/pengetahuan/AKS-2026-0042-K7mP. Bagian nomor urutnya dialokasikan dengan row lock agar dua publikasi bersamaan tidak bertabrakan. - Tingkat akses Publik / Internal OIKN / Terbatas diselesaikan di queryset. Enum database tetap memakai nilai asli PRD (Publik / Terbatas / Tertutup); hanya label UI yang berubah lewat satu peta di lapisan presentasi, karena "Terbatas" dan "Tertutup" nyaris bersinonim.
- Lampiran dipindahkan dari path
/media/mentah ke endpoint unduhan yang memeriksa akses. Task Celery mencabut izin akses yang kedaluwarsa dan mengirim notifikasi. - Status alur: Draft → Menunggu Verifikasi → Menunggu Kurasi → Terpublikasi, ditambah Dikembalikan dan Ditolak, hanya diubah lewat transition service. Linimasa per dokumen bernama "Riwayat Alur", didukung audit log global yang mencatat setiap create, update, delete, persetujuan, penolakan, login, dan logout.
- Pencarian memakai full-text search Postgres (indeks GIN, ranking, highlight) di balik abstraksi
SearchBackendagar Elasticsearch bisa dipasang kelak. Fallback trigrampg_trgmmenghasilkan saran "mungkin maksud Anda" dari kueri yang pernah berhasil. - Daftar dan hitungan facet digabung menjadi satu request (
with_facets=1). Pergantian filter memakaikeepPreviousDataagar panel filter tidak bergeser. - Integrasi JDIH tumbuh jadi sekitar 22 file kode dan 6.200 baris, termasuk task sinkronisasi harian, live API client, pengklasifikasi otomatis, dan indeks pencarian sendiri, di atas tabel metadata
jdih_indexyang diminta spesifikasi awal. - Sub-sistem place/gazetteer untuk penjelajahan geografis, dan modul pencapaian untuk kontributor, sama-sama ditambahkan setelah rencana pembangunan 12-milestone awal.
- Diagram relasi entitas dibuat saat diminta, langsung dari model Django, sehingga menghasilkan halaman dokumentasi sekaligus halaman "Skema Basis Data" di backoffice dan tidak pernah basi.
- Portal: Kontributor, Verifikator, Kurator, dan Administrator, dengan
active_roledisimpan di server. - Keycloak SSO dan JDIH awalnya dibangun terhadap antarmuka tiruan, lalu diganti implementasi sungguhan. Endpoint token-exchange melayani aplikasi mobile.
- Kontribusi berupa wizard empat langkah dengan draf, hingga 10 lampiran, dan impor massal CSV hingga 200 baris; baris yang tidak valid masuk sebagai draf bertanda.
- Backend Django + DRF khusus API dan SPA React, feature-sliced, dengan TanStack Query dan 52 route file terbagi antara portal publik dan backoffice. Frontend tanpa library komponen, formulir, atau state. Tidak ada ML di V1.
- 16 aplikasi Django, 45 model konkret, 14 viewset DRF terdaftar, 206 baris masterdata yang di-seed, 53.323 baris Python dan 30.022 baris TypeScript, 1.595 fungsi tes backend di 65 file, 429 commit antara 6 Juli dan 25 September 2026.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.