Skip to content

Releases

v0.3.8

Choose a tag to compare

@github-actions github-actions released this 13 Nov 12:04

Changed

  • WhatsApp commands now work in the bot's own "message yourself" chat, so an admin who uses the bot number can check gobill from the same phone. Other own messages are still ignored.
  • The "Answer WhatsApp commands" hint now tells about the # prefix.

v0.3.7

Choose a tag to compare

@github-actions github-actions released this 13 Nov 07:27

Changed

  • WhatsApp commands must start with #, / or !, for example #cek. Other messages are ordinary chat and get no reply, also from unknown numbers. A bare confirmation code still works. Replies wait 1-8 seconds and show "typing..." first, so the number looks less like a bot to WhatsApp.

v0.3.6

Choose a tag to compare

@github-actions github-actions released this 13 Nov 01:38
5eaa8e3

Keamanan

  • Go 1.26.11: memperbaiki GO-2026-6859 di net/http standard library.
  • Tebakan voucher tidak lagi mengunci NAS. Kegagalan voucher per NAS kini hanya memberi peringatan di log. Sebelumnya semua login di NAS itu ditolak.
  • Kunci akun RADIUS tidak membuka siapa yang ada. User yang terkunci karena password salah berkali-kali menerima pesan yang sama dengan password salah. Kejadiannya dicatat di log.
  • Batas percobaan dipesan sebelum menebak. Request paralel tidak bisa lagi melewati batas.
  • Transfer saldo dan kirim ke teman di portal membatasi pencarian penerima. Nama pelanggan tidak bisa ditebak beruntun.
  • Menyalakan, mematikan, atau mereset 2FA mengakhiri sesi admin lain.
  • radius_rest_secret minimal 16 karakter.
  • Header skema dari proxy hanya dipercaya dari proxy tepercaya.
  • Impor memberi peringatan untuk voucher pendek yang belum terpakai. Kode pendek mudah ditebak.

Perbaikan

  • Isolasi yang lewat batas waktu tidak lagi menumpuk. Jika job belum menutup isolasi lama, isolasi baru menutupnya (alasan expired) sehingga customer hanya punya satu isolasi terbuka.
  • Isolasi yang dilewati tidak lagi membuat plan Isolir.
  • Rule RouterOS memakai nama address-list isolir saat isiannya kosong. Sebelumnya rule berisi src-address-list= kosong, sementara RADIUS mengirim isolir.
  • Gerbang web isolir mengikuti definisi "terisolir" yang sama dengan RADIUS. Isolasi harus berjalan dan Isolir harus aktif.
  • Hari isolir negatif kini dibaca 30 hari, bukan "sampai bayar". Isi 0 untuk sampai bayar.
  • Allow-list menolak host berawalan atau berakhiran -. Alamat IPv4 mentah tetap boleh, tetapi hanya masuk address-list, tanpa rule tls-host.

Fitur

  • Perintah WhatsApp lewat GOWA. Bawaannya mati. Nyalakan wa_inbound dan isi alt_wga_webhook_secret di Pengaturan > Integrasi. Endpoint POST /wa/inbound memeriksa tanda tangan X-Hub-Signature-256. Lihat docs/id/integrations.md.
    • Pelanggan: cek, tagihan, kuota, paket, bayar (link bayar gateway, sama dengan portal), gangguan (diagnosis akun, laporan ke admin bila tak ada penyebab), dan menu angka lewat bantuan atau menu. Perintah boleh diawali /.
    • Admin: cari, isolir, ringkasan, info, jatuhtempo, router. perpanjang dan putus butuh kode konfirmasi 6 digit yang berlaku 5 menit.
    • Admin yang nomornya juga dipakai satu pelanggan bisa memakai perintah pelanggan untuk akunnya sendiri.
    • Fitur ini belum diuji dengan GOWA sungguhan. Laporkan jika ada pesan yang tidak dibalas.
  • API v1 (baca saja). GET /api/v1/{me,customers,subscriptions,plans,routers,nas,radius/sessions} dengan token bearer gbt_…. Bawaannya mati. SuperAdmin menyalakan API, mengatur peran per grup, dan membuat token di /admin/api. Batas 120 request per menit per token.

Perubahan

  • Menyimpan setting Isolir memberi peringatan jika plan Isolir dijual atau bukan plan RADIUS. Simpan tetap berhasil.
  • gobill update menolak file unduhan di atas 200 MiB. Biner rilis hanya sekitar 20 MiB.
  • Variabel baru GOBILL_JOBS. Isi 0 untuk mematikan job latar di satu proses.
  • Kode dipecah per modul. Tidak ada perubahan perilaku. Aturan import antar paket dicek di CI dengan depguard.

v0.3.5

Choose a tag to compare

@github-actions github-actions released this 09 Nov 04:25
ad86d61

Perbaikan

  • Panel Recharge tidak lagi menampilkan "0 B" untuk paket MikroTik. Pemakaian hanya dicatat lewat accounting RADIUS. Untuk paket non-RADIUS, baris pemakaian kini disembunyikan.
  • Paket dengan batas waktu saja kini juga menampilkan data terpakai di panel Recharge.

v0.3.4

Choose a tag to compare

@github-actions github-actions released this 09 Nov 03:32
61b503a

Perbaikan

  • Print dan Export CSV di laporan kini memakai periode yang dipilih. Sebelumnya tanda = dan & di link ikut di-escape. Akibatnya filter hilang, dan Print selalu menampilkan laporan harian hari ini. Link Export usage CSV juga diperbaiki.
  • Laporan bisa difilter ke transaksi RADIUS dan Balance. Transaksi RADIUS tidak punya router, jadi dulu tidak bisa dipilih. Filter router kini punya "RADIUS (tanpa router)" dan "Balance". Di tabel, router kosong tampil sebagai RADIUS.
  • Role Report tidak lagi melihat link invoice yang berujung 403. Nomor invoice tampil sebagai teks biasa.
  • Rentang tanggal terbalik di Period Report ditukar otomatis. Dulu hasilnya kosong.
  • Filter metode di laporan kini berupa pilihan. Isinya metode yang pernah tercatat, ditambah Agent - Deposit. Link lama dengan ?method= tetap jalan.

Perubahan

  • Tampilan cetak laporan dirancang ulang untuk A4 hitam putih. Ada nama dan alamat perusahaan, periode, filter yang aktif, waktu dan nama pencetak, ringkasan (total, jumlah, rata-rata), rekap per tipe dan metode, lalu rincian dengan baris total dan kolom tanda tangan. Kolom Expires On dihapus. Judul tabel diulang di tiap halaman.
  • Panel ringkasan di halaman Recharge menampilkan pemakaian paket aktif. Isinya data atau waktu yang terpakai dari batas paket. Angkanya sama dengan yang dipakai RADIUS untuk memblokir. Paket tanpa batas menampilkan pemakaian sejak paket dimulai. Jika kuota habis, tertulis "Kuota habis".
  • Tombol Recharge di atas halaman customer kini hanya tampil di layar kecil. Di desktop, kotak Recharge Account sudah terlihat di halaman yang sama.

v0.3.3

Choose a tag to compare

@github-actions github-actions released this 09 Nov 02:19
56e05dd

Fitur

  • Period Report punya bagian Usage. Total unduh dan unggah untuk rentang tanggal, grafik per hari, dan 20 pengguna teratas. Datanya hanya dari radius_usage_daily, jadi tidak terpengaruh filter tipe, metode, router, dan paket, dan tidak terpengaruh pembersihan log. Hanya SuperAdmin dan Admin yang melihatnya, sama seperti card Usage di dashboard.
  • Ekspor CSV usage di /admin/reports/usage.csv: satu baris per pengguna per hari. Hanya untuk SuperAdmin dan Admin. Rentang dibatasi 366 hari terakhir.

Perubahan

  • Period Report tanpa rentang kini mengikuti periode pendapatan dashboard. Mulai dari tanggal 1 bulan ini atau reset_day, sampai hari ini. Dulu 30 hari terakhir.
  • Definisi pendapatan ada di satu tempat. View income_transactions (migrasi 0042) dipakai dashboard dan semua query laporan. Hasilnya tidak berubah.
  • Query DeleteRadiusUsageDailyBefore dan SumRadiusOctetsByUsers yang tidak terpakai dihapus.

Perbaikan

  • Membersihkan log RADIUS tidak lagi menghapus data usage. Sebelumnya radius_usage_daily ikut terhapus dengan cutoff yang sama, jadi card Usage dan grafik usage berkurang. Kini pembersihan log hanya menghapus session yang sudah ditutup. Usage harian adalah data aplikasi dan disimpan terus. Data yang sudah terhapus tidak bisa dihitung ulang; pulihkan dari backup jika perlu.

Keamanan

  • /radius.php menolak request lewat proxy di jalur allow-list. Reverse proxy di host yang sama (Nginx, Caddy, cloudflared) membuat semua klien internet terlihat sebagai 127.0.0.1. Dengan radius_rest_allow = 127.0.0.1, siapa pun bisa menebak password customer, me-redeem voucher, dan menulis accounting palsu. Request yang membawa X-Forwarded-For, X-Real-IP, Forwarded atau CF-Connecting-IP kini ditolak di jalur allow-list. Jika FreeRADIUS lewat proxy, pakai radius_rest_secret.
  • Gigaword dari /radius.php dibatasi sebelum digeser 32 bit, jadi angka besar tidak wrap.
  • Batas percobaan login dan OTP tahan request paralel. Percobaan dihitung sebelum bcrypt, bukan sesudahnya. Batas OTP lupa password dan verifikasi kontak kini disimpan di server per kode, bukan di session. Berlaku untuk login admin, 2FA admin, login portal, OTP lupa password, dan OTP kontak.

v0.3.2

Choose a tag to compare

@github-actions github-actions released this 06 Nov 04:15
0bd5eef

Log hanya catatan: kuota dan pembayaran tidak lagi bergantung pada tabel yang dibersihkan retensi. Migrasi 0041.

Penting sebelum upgrade

  • Kuota disimpan di langganan. Data dan waktu terpakai kini dihitung di subscriptions, bukan dijumlahkan dari log sesi RADIUS. Sebelumnya, membersihkan log (otomatis setelah log_keep_days atau manual) menurunkan kuota terpakai, sehingga sisa kuota membengkak. Paling terasa pada perpanjangan dini berulang yang jendelanya lebih panjang dari retensi.
  • Migrasi mengisi angka awal dari log yang masih ada. Pemakaian yang lognya sudah terhapus tidak bisa dikembalikan, jadi sisa kuota yang sudah membengkak tetap. Mulai versi ini tidak membengkak lagi.
  • Kuota GB dan MB di mode API router kini biner, sama dengan RADIUS: 1 GB = 1024³ byte (dulu 10⁹). Berlaku saat user hotspot disinkron ulang ke router.

Fitur

  • Hitung ulang pemakaian (menu Lainnya di halaman pelanggan): menaikkan data dan waktu terpakai ke angka di log sesi, misalnya setelah sempat rollback ke versi lama. Counter tidak pernah diturunkan.
  • Diagnosa pelanggan memberi tanda "Log pemakaian: Tertinggal" jika log sesi mencatat lebih banyak dari hitungan paket.

Perbaikan

  • Pembayaran pending dan expired disimpan minimal 7 hari, berapa pun log_keep_days. Callback "Paid" untuk referensi yang sudah terhapus dulu hanya dicatat sebagai peringatan, dan uangnya tidak tercatat di mana pun.
  • Callback Paid untuk referensi tidak dikenal kini dicatat sebagai error, dikirim sebagai alert ke operator, dan ditandai merah di Status Sistem.
  • Halaman penggunaan portal menghitung kedua nama login (username dan PPPoE), sama dengan penegakan kuota.

Performa

  • Batch accounting memakai ulang prepared statement di dalam transaksi, sehingga query tidak di-parse ulang per paket. Ini menutup biaya update counter per interim.

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 06 Nov 01:34

Dukungan NAS non-MikroTik, perbaikan laporan dan backup, serta RADIUS accounting yang lebih cepat. Migrasi 0040.

Penting sebelum upgrade

  • Pemasukan agen dihitung ulang. Setoran agen masuk pemasukan, penukaran kode agen tidak. Total laporan, dashboard, ringkasan harian, dan CSV bisa berubah untuk periode yang sudah lewat.
  • Restore memeriksa kunci enkripsi. Backup baru membawa sidik jari kunci. Restore ditolak jika kuncinya berbeda dan backup berisi nilai terenkripsi.

Fitur

  • Tipe NAS: mikrotik (bawaan), wispr (kecepatan WISPr, kuota CoovaChilli), dan standard (atribut RFC saja).
  • Panduan OpenWrt: uspot sebagai NAS yang disarankan, CoovaChilli sebagai alternatif. Langkahnya diuji di lab.
  • Lab OpenWrt: lab/openwrt.sh up|test|down menjalankan OpenWrt dan uspot di qemu. Lab ini menguji login, kecepatan WISPr, accounting, CoA, Disconnect, kuota, dan isolir.
  • Lonceng portal: hasil pembayaran terakhir dan kuota habis. Item tidak ditandai dibaca saat admin masuk sebagai pelanggan.
  • Preview impor menampilkan data PHPNuxBill yang tidak diimpor atau tidak dipakai gobill.

Perbaikan

  • Disconnect dan CoA: Message-Authenticator hanya dikirim ke NAS yang juga mengirimnya. NAS selain MikroTik tidak menerima Framed-IP-Address dan mendapat NAS-Identifier, bukan NAS-IP-Address.
  • Perpanjangan darurat dihitung dari tanggal kedaluwarsa asli.
  • Tooltip "More actions" di tabel tidak lagi terpotong di tepi card.

Performa

  • RADIUS accounting: counter terakhir setiap sesi disimpan di memori, jadi interim tidak lagi membaca radius_sessions sebelum upsert. Dengan 1 core dan 5.000 pelanggan, accounting naik dari 1.000/s ke 1.200/s, dan p99 di 1.000/s turun dari 535 ms ke 144 ms.
  • Angka benchmark RADIUS di README diperbarui (2026-11-05).

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 02:24

Hasil audit menyeluruh (uang, siklus langganan, router, keamanan, operasional) beserta perbaikannya, ditambah fitur RADIUS baru. Migrasi 0029 sampai 0039.

Penting sebelum upgrade

  • /radius.php tertutup secara bawaan. Sebelumnya radius_rest_allow kosong berarti loopback saja; sekarang semua request ditolak (403) sampai radius_rest_allow (misalnya 127.0.0.1, ::1) atau radius_rest_secret (header X-Gobill-Secret) diisi di Pengaturan > System & Security > FreeRADIUS. Pengguna FreeRADIUS lewat REST wajib mengisinya, atau login pelanggan berhenti.
  • Rilis bertanda tangan kini memuat versi. make sign menulis baris VERSION ke SHA256SUMS; gobill update menolak rilis tanpa baris itu, berbeda dari tag, atau lebih lama dari versi berjalan (kecuali --version eksplisit untuk rollback).
  • Mode akses peran bawaan strict. Deposit saldo, Recharge Zero, dan buat voucher hanya untuk SuperAdmin/Admin; peran Report hanya membaca laporan (tanpa ekspor pelanggan, pencarian, dan transaksi). Pilih phpnuxbill di Pengaturan > Akses untuk hak akses lama.
  • Password admin minimal 10 karakter untuk password baru atau yang diganti. Admin hasil impor PHPNuxBill (hash sha1) wajib mengganti password saat login pertama.

Fitur

  • RADIUS: Acct-Interim-Interval di Access-Accept (pengaturan, bawaan 300 detik), Idle-Timeout per paket, alasan sesi berakhir (Acct-Terminate-Cause) di log sesi, log percobaan login (/admin/logs/auth, CSV), halaman Tes login, validasi NAS-Port-Type terhadap tipe paket, kunci akun ke MAC dan/atau NAS-Port-Id, pencarian "siapa memakai IP X pada jam T".
  • Jadwal paket: jendela jam login (mis. Mon-Fri 08:00-17:00, Session-Timeout dipotong di akhir jendela) dan kecepatan boost terjadwal lewat CoA.
  • shared_users_pppoe: batas perangkat bisa diterapkan ke PPPoE.
  • Antrian retry router: pelepasan pelanggan yang gagal karena router mati dicatat dan diulang tiap 5 menit; jumlahnya tampil di Status Sistem.
  • Mode koneksi API router (biasa/TLS) di form router; router port 8729 otomatis TLS.
  • gobill healthcheck dan HEALTHCHECK di Dockerfile.
  • Webhook membawa id (dan header X-Event-Id) dan tercatat di log pesan.

Perubahan dari PHPNuxBill

PHPNuxBill kini sumber data, bukan sumber perilaku. Perilaku lama yang salah diperbaiki:

  • Masa aktif bulanan di akhir bulan di-clamp: 31 Jan + 1 bulan = 28/29 Feb (dulu 3 Mar). Paket Period dengan tanggal tagihan 29-31 tidak lagi melompati satu bulan, baik aktivasi pertama maupun perpanjangan.
  • Faktur prorata pertama dihitung dari jumlah hari sebenarnya, bukan 30 hari (15 hari dari Rp 300.000 di bulan 31 hari = Rp 145.161).
  • Perpanjangan otomatis dari saldo dilakukan di tempat: pelanggan tidak lagi diputus dari router lalu ditambahkan ulang, dan tidak ada baris langganan baru.
  • Recharge pada langganan yang sudah lewat masa aktif dihitung dari sekarang, bukan dari tanggal habis lama (dulu bisa langsung expired lagi).
  • Hotspot: user di router diubah di tempat (set), tidak dihapus lalu dibuat ulang; counter pemakaian tidak lagi ter-reset saat sinkron.
  • Status Banned/Disabled/Suspended memutus pelanggan dari router; kembali Aktif menyinkronkan ulang.
  • Harga transaksi selalu sama dengan uang yang diterima (aktivasi Period pertama lewat gateway dulu tercatat Rp 0).
  • Kupon dengan batas pemakaian direservasi saat order dibuat; order yang kedaluwarsa atau gagal mengembalikannya.
  • Laporan dan dashboard memakai satu definisi pemasukan: pembelian dari saldo dan "Balance - Gift" tidak dihitung lagi di laporan, sehingga total laporan bisa turun.
  • Nomor invoice dari sequence, tidak lagi max(id)+1.
  • Kode voucher yang belum terpakai disamarkan untuk peran yang tidak bisa membuat voucher.

Diperbaiki

  • Peringatan operator lebih sedikit: NAS diam hanya diperingatkan bila masih punya sesi terbuka, router dinyatakan tidak terjangkau setelah 2 ping gagal berturut-turut, peringatan NAS/gangguan massal ditahan saat router NAS itu sudah tidak terjangkau, dan status peringatan aktif disimpan sehingga restart tidak mengirim ulang.
  • Pengaturan Ya/Tidak yang belum pernah disimpan kini tampil sesuai perilaku sebenarnya. Sebelumnya tampil "Ya", sehingga sekali Simpan menyalakan isolir, trust proxy, nonaktif voucher, dan lainnya tanpa disadari. Periksa tab Pengaturan bila pernah menyimpannya di versi lama.
  • Tombol "Impor dari PHPNuxBill" di wizard setup tidak lagi 404.
  • Portal: halaman isolir punya tombol bayar/perpanjang; pembayaran yang menunggu tampil di dasbor dan riwayat; halaman pembayaran memberi langkah lanjut per status; pelanggan tanpa gateway diberi cara bayar; kode lupa password bisa diminta ulang setelah 60 detik.
  • Admin: deposit punya langkah konfirmasi dan menolak paket + nominal sekaligus; "Hapus tetap" tampil di halaman pelanggan setelah router gagal; restore/impor tidak kehilangan pratinjau saat password/2FA salah.
  • Form menampilkan ringkasan kolom yang salah; kolom tersembunyi tidak ikut dikirim; daftar membedakan "kosong" dan "tidak ada hasil filter"; halaman 403/404 bergaya aplikasi.
  • Aksesibilitas: tab bisa dengan panah keyboard, skip link, menu atas dan drawer ramah keyboard, level status tampil sebagai teks, penghapusan router tertunda menaikkan level status.
  • Portal: bantuan di lupa password, petunjuk registrasi, "Kurang Rp X" saat saldo kurang, kupon dilipat, kembali dari invoice dan QRIS, pesan jelas untuk akun nonaktif (hanya setelah password benar).
  • Admin: tanda wajib bersyarat di form paket dan router, contoh jadwal yang bisa diketuk, TLS memindah port ke 8729, bulk bar menghitung pilihan, konfirmasi untuk token metrics, reset 2FA, reset peer WireGuard, mematikan isolir dan mode akses PHPNuxBill; kode pemulihan 2FA bisa disalin/diunduh; tes Duitku memakai kunci Duitku.
  • Pemantauan: halaman status tidak memuat ulang saat dipakai dan bisa dijeda, IP lookup berupa tabel, log aktivitas berlabel dengan nama admin, grafik penjualan berformat uang, sesi online tidak hilang saat dipilih.
  • Perbaikan kecil: dashboard tetap tampil bila satu kartu gagal; tile jaringan menyebut router offline; konfirmasi bersihkan log menyebut jumlah hari; peringatan Recharge Zero; badge fitur di daftar paket; angka desimal diberi pesan jelas; transfer saldo menampilkan nama penerima tersamar (mis. "Budi S."); tanggal grafik memakai format ISO; uang negatif tampil "-Rp 1.000"; judul halaman masuk admin dan pelanggan dibedakan; gaya cetak menyembunyikan menu.
  • Istilah Indonesia diseragamkan (Berakhir/Kedaluwarsa, Tambah Saldo, Pelanggan, Ubah, Masuk/Keluar) dan puluhan pesan yang masih berbahasa Inggris diterjemahkan.
  • Garis tepi kolom input lebih tegas (kontras minimal 3:1, WCAG 1.4.11), garis kartu sedikit lebih gelap.
  • Panic di job latar belakang tidak lagi mematikan proses (RADIUS, UI, WireGuard).
  • Rollback gobill update memulihkan database secara atomik dan tidak menjalankan service bila pemulihan gagal.
  • Start ditolak bila file kunci baru dibuat padahal database berisi data terenkripsi (GOBILL_ALLOW_NEW_KEY=1 untuk memaksa). Database yang lebih baru dari binary ditolak.
  • Backup harian disusul bila jam 02:00 terlewat; alert backup dan job expiry tidak diam saat jam sistem mundur.
  • Satu router mati tidak lagi menahan expiry untuk semua pelanggan: langganan tetap expired di database, pelepasan masuk antrian retry.
  • Provisioning WireGuard baru mengganti kredensial router setelah router mengambil script; revoke memulihkan kredensial lama.
  • Hapus pelanggan melepas dari router dulu; bila router gagal, penghapusan ditolak dengan tombol "Hapus tetap".
  • Rollback migrasi RADIUS hanya mengaktifkan kembali akun yang dinonaktifkan oleh migrasi.
  • Order yang sudah dibayar tetapi tidak bisa diproses (paket terhapus) dikreditkan ke saldo pelanggan dengan alert operator; refund gateway dicatat dan dikirimi alert.
  • Edit/extend admin dan extend portal mengakhiri isolir yang berjalan; langganan yang dinonaktifkan admin tidak bisa dihidupkan lagi lewat extend portal.
  • Deposit dan recharge admin memakai token sekali pakai (tidak tercatat dobel saat diklik dua kali).
  • Ganti host/port router wajib memasukkan ulang password; trust_proxy/trusted_proxies hanya SuperAdmin dan menolak 0.0.0.0/0; 2FA dibatasi 5 percobaan per login dan dikunci per akun; registrasi portal dibatasi per IP; restore dan import meminta password (dan kode 2FA).
  • Pengingat H-7/3/1 diulang bila gateway gagal dan tidak dikirim dua kali; alert operator mengikuti alert_channel; invoice yang gagal terkirim diulang 3 kali.
  • Import --force bisa menimpa database yang punya agent batch; import CLI membuat snapshot dulu. install.sh mem-backup database sebelum upgrade.
  • Ekspor CSV log dibaca bertahap; index customers.created_at; snapshot lama dipangkas; isolir selesai dan inbox lama ikut retensi; header HSTS dan Permissions-Policy.

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 31 Oct 07:44

Diubah

  • Sesi Online: tabel jadi fokus. Tinggal dua kartu (Online/Aktif, Throughput); kartu login/putus sejam terakhir, grafik 24 jam, dan Per NAS/Per paket dihapus. Tombol "Putus yang dipilih" pindah ke toolbar tabel dan hanya muncul bila ada baris dicentang. Kolom Mulai digabung ke Durasi (tanggal di tooltip), Upload dan Download jadi satu kolom Pemakaian.
  • Dashboard admin: kartu Pelanggan (segera habis) di atas kolom lebar, Pemakaian pindah ke kanan. Kedua kolom berakhir sejajar tanpa hitungan tinggi JS. Kartu info pelanggan tidak lagi terpotong di baris bawah (terbuka ke atas bila perlu). Kartu Jaringan tenang saat semua NAS hidup, merah bila ada yang mati. Total pemakaian seukuran angka KPI, log aktivitas 5 baris dengan waktu relatif, grafik berwarna info, tombol WhatsApp netral dengan ikon hijau.
  • Warna aksen hanya untuk aksi utama, status aktif, dan link: meter dan progress pakai warna info, satu tombol utama per halaman, menu Setup cepat jadi menu biasa dengan badge. Tombol ghost kini benar-benar tanpa garis.