September 24, 2026
Mac Service Admin.
Cerita bikin control panel sendiri untuk dev environment di Mac — supaya urusan paket, service, dan konfigurasi nggak perlu buka aplikasi satu per satu.
Setiap kali mau mulai ngoding, ritualnya selalu sama: cek apakah MySQL jalan (brew services list), buka OrbStack untuk lihat container, buka Herd untuk ganti versi PHP, nvm use di terminal, lalu edit .zshrc karena ada PATH yang saling tabrakan. Belum lagi kalau laptop terasa panas dan aku harus buka Activity Monitor.
Semua alatnya ada, tapi tersebar di mana-mana. Setiap alat punya CLI dan UI-nya sendiri yang harus diingat. Karena sehari-hari aku berurusan dengan panel hosting, muncul pikiran: kenapa laptopku sendiri nggak punya panel seperti itu? Jadi aku bikin sendiri.
Masalahnya: Terlalu Banyak Pintu
Dev environment di Mac biasanya tersebar di:
brew servicesuntuk database, Nginx, Redis, dan kawan-kawan.- OrbStack / Docker Desktop untuk container.
- Laravel Herd untuk situs PHP lokal.
- nvm, pyenv, rbenv, dan manajer versi lain untuk bahasa pemrograman.
- File konfigurasi seperti
.zshrc,/etc/hosts,~/.ssh/config,php.ini, dan.envdi setiap project. - Activity Monitor untuk melihat kenapa kipas tiba-tiba berisik.
Pertanyaan sepele seperti “kenapa MySQL nggak mau start?” atau “PHP yang aktif sekarang versi berapa?” bisa berujung buka tiga aplikasi dan dua tab terminal. Aku ingin satu dashboard yang menjawab semuanya.
Aturan Mainnya
Sebelum mulai, aku pasang beberapa batasan untuk diri sendiri:
- Tanpa dependensi. Backend pakai Python standard library, frontend pakai vanilla JavaScript. Tidak ada
pip installataunpm install, jadi tool ini nggak ikut “rusak” waktu environment-nya yang sedang dibereskan. - Lokal & offline. Server hanya listen di
127.0.0.1, dan semua aset (ikon, xterm.js) disimpan di repo. - Dibuat untuk Apple Silicon. Mesin yang aku pakai sehari-hari memang itu.
Menjalankannya cukup:
git clone [email protected]:FannyDevz/mac-service-admin.git
cd mac-service-admin
./install.sh
Installer membuat Service Admin.app kecil (launcher yang ditulis dengan Swift) di /Applications, jadi bisa dibuka dari Spotlight. Ada juga LaunchAgent supaya server otomatis menyala saat login. Kalau mau manual, cukup python3 server.py lalu buka http://127.0.0.1:8765.
Satu Halaman untuk Setiap Urusan
Pelan-pelan, setiap “pintu” tadi aku pindahkan ke dalam dashboard:
- Dashboard sistem: CPU per core (performance/efficiency), RAM dan memory pressure, suhu CPU/SSD/baterai dari sensor Apple Silicon tanpa
sudo, GPU, jaringan, disk, kesehatan baterai, dan grafik riwayat 5 menit. - Paket & service Homebrew: start/stop/restart service, lihat log, katalog service populer, dan 100 rekomendasi paket development yang bisa diinstall sekali klik. Setiap service punya halaman detail berisi port, folder data, dan editor config dengan validasi (
nginx -t,mysqld --validate-config,php-fpm -t, …). - Docker: statistik container secara live, log, console, form
docker runyang mengecek bentrok port, Compose up/down/edit, dan pembuat compose dari 16 template. - Laravel Herd: daftar situs, HTTPS, versi PHP per situs, sampai wizard Aplikasi Laravel baru (versi, starter kit, auth, framework test, database, package manager).
- Bahasa pemrograman: satu halaman untuk PHP, Node.js, Python, Go, Rust, Java, Ruby, dan lainnya: pilih versi default, install versi baru, kelola tool-nya.
- File konfigurasi: editor yang memvalidasi sebelum menyimpan, dengan backup otomatis.
/etc/hostsdisimpan lewat dialog password admin macOS. - Aplikasi Mac: daftar aplikasi beserta sumbernya (App Store / Homebrew / manual), ukuran, dan kapan terakhir dibuka, termasuk menghapus tanda karantina Gatekeeper dan mereset izin privasi.
- Cloudflare Tunnel : login, buat tunnel, route DNS, dan atur ingress. Ini sisa kebiasaan dari home lab .
Bagian Paling Seru: Terminal Sungguhan di Browser
Dashboard tanpa terminal rasanya kurang. Tapi aku nggak mau terminal palsu yang cuma menjalankan satu perintah lalu menampilkan output. Aku ingin zsh sungguhan dengan .zshrc-ku sendiri, tempat vim, htop, php artisan tinker, bahkan Claude Code bisa jalan normal.
Caranya: backend membuka PTY (pseudo-terminal) di sisi server, lalu input/output-nya dialirkan ke xterm.js di browser lewat HTTP biasa dengan long-polling. Tanpa library WebSocket , karena aturan “tanpa dependensi” tadi. Hasilnya:
- Bisa banyak tab sesi, warna dan resize ikut jalan.
- Sesi tetap hidup walaupun halaman di-refresh.
- Perintah yang lama (install paket,
compose up,laravel new) jalan sebagai job di server, jadi outputnya nggak hilang. Semuanya bisa dipantau di tab Proses.
Trik Ganti Versi Bahasa
Ganti versi PHP atau Python di Mac itu sering jadi drama PATH: Herd menyuntikkan PATH-nya, Homebrew juga, nvm juga. Solusi yang akhirnya aku pakai cukup sederhana:
# >>> mac-service-admin >>>
export PATH="$HOME/.service-admin/bin:$PATH"
[ -f "$HOME/.service-admin/env.zsh" ] && source "$HOME/.service-admin/env.zsh"
# <<< mac-service-admin <<<
Blok ini ditaruh di paling bawah ~/.zshrc supaya menang dari PATH lain. Versi default cukup berupa symlink di ~/.service-admin/bin. Ganti versi berarti ganti symlink, dan terminal yang sudah terbuka pun ikut berubah.
“Cuma Lokal” Bukan Berarti Aman
Ini pelajaran yang paling nggak aku duga. Tool ini bisa menjalankan perintah di laptop, jadi kalau ada celah, halaman web mana pun yang aku buka berpotensi ikut menyuruhnya. Jadi keamanannya aku buat berlapis:
- Hanya bind ke
127.0.0.1. - Mengecek header
Hostuntuk mencegah DNS rebinding. - Setiap POST wajib membawa header khusus untuk mencegah CSRF.
- Perintah dijalankan tanpa shell dan dengan input yang divalidasi.
- File hanya bisa dibuka dari daftar yang sudah ditentukan, dan secret disamarkan.
- File sistem ditulis lewat dialog admin macOS, bukan lewat
sudoyang di-cache.
Yang Aku Pelajari
- Terminal itu cuma aliran byte. Setelah membangun PTY + long-polling sendiri, xterm.js jadi terasa jauh lebih masuk akal.
- Sensor Apple Silicon bisa dibaca tanpa hak istimewa, asalkan tahu caranya.
- Threat modelling tetap wajib untuk tool lokal. Justru karena terasa “cuma di laptop sendiri”, celahnya gampang terlewat.
- Tanpa dependensi itu membebaskan. Nggak ada lagi
npm installyang gagal di tengah jalan.
Keterbatasan
- Dites di macOS dengan Apple Silicon (M4). Sensor suhu mungkin nggak tersedia di Mac Intel atau VM.
- UI dan dokumentasinya berbahasa Indonesia.
Ringkasan teknis dan screenshot-nya ada di halaman project Mac Service Admin .

Hey! I’m Fanny, the software engineer tending to this digital garden. You can read more about me, or subscribe by email.