Ada satu momen yang selalu mengganggu di tengah pengembangan: kamu butuh aplikasi lokalmu diakses dari luar. Entah untuk mengetes tampilan di HP, menunjukkan progres ke klien, atau menerima webhook dari payment gateway yang hanya mau mengirim ke alamat publik.
Pilihan yang ada biasanya tidak menyenangkan. Deploy ke staging cuma untuk melihat satu halaman. Memasang ngrok berarti membuat akun dan menyimpan token. Membuka port di router berarti berurusan dengan NAT dan firewall.
Localfly mencoba menjawab itu dengan satu ide sederhana: simpan port aplikasimu, nyalakan sakelar, alamat publiknya langsung jadi.
Apa itu Localfly
Localfly adalah aplikasi menu bar untuk macOS, berlisensi MIT, ditulis dengan Swift dan SwiftUI. Repo-nya raqibnur/localfly, dibuat 8 November 2026, dan saat artikel ini ditulis punya 21 bintang dengan 1 fork. Angka itu kecil, dan itu wajar untuk proyek yang baru berumur tiga hari.
Klaimnya jelas dan sempit: memberi aplikasi apa pun di Mac-mu alamat publik, gratis, tanpa akun, tanpa analitik. Ada juga alternatif berbayar yang sedang dipertimbangkan, tapi versi gratisnya tidak dikunci.
Yang saya suka dari repo ini adalah kerapian strukturnya:
| Folder | Isi |
|---|---|
LocalflyCore/ | paket Swift berisi mesin tunnel, protokol bore di atas Network.framework, tanpa UI |
App/ | aplikasi SwiftUI, panel menu bar dan jendela utama, lapisan tipis di atas TunnelManager |
deploy/ | relay untuk self-host, bore server plus Caddy dalam docker compose |
site/ | situs web di GitHub Pages |
Pemisahan seperti itu membuat bagian yang berisiko, yaitu jaringan dan reconnecting, bisa diuji tanpa membuka aplikasi. Tesnya pun dijalankan melawan server bore sungguhan di 127.0.0.1, dan dilewati kalau bore tidak terpasang.
Cara kerjanya
Localfly tidak membuat server di komputermu dan tidak menyentuh router. Dia memakai protokol tunnel bore karya Eric Zhang.
Alurnya:
- Mac-mu membuka koneksi keluar ke server relay.
- Kamu meminta alamat publik, misalnya
bore.pub:43228. - Ketika seseorang membuka alamat itu, relay meneruskan koneksi ke Mac-mu lewat koneksi yang sudah terbuka tadi.
Karena arahnya keluar, tidak ada port forwarding, tidak ada perubahan firewall, dan tidak ada IP publik yang perlu kamu miliki. Ini pola yang sama dengan Cloudflare Tunnel dan Tailscale Funnel, hanya dengan protokol dan relay yang berbeda.
Bawaannya Localfly memakai bore.pub, relay publik gratis. Konsekuensinya dua: alamatnya berubah setiap kali tunnel dibuka, dan alamat itu bisa diakses siapa pun yang tahu.
Memakainya
Unduh Localfly.dmg dari halaman rilis, buka, dan aplikasinya tinggal di menu bar. Syaratnya macOS 13 atau lebih baru, baik Apple silicon maupun Intel.
Alur kerjanya seperti ini:
- Klik ikon di menu bar.
- Tambahkan aplikasi dengan menyebut port-nya, misalnya
3000. - Nyalakan sakelarnya.
- Salin alamat publik yang muncul.
Beberapa detail kecil yang menunjukkan aplikasi ini dibuat oleh orang yang benar-benar memakainya:
- Titik status menunjukkan apakah dev server sedang hidup, dan Localfly menolak membuka tunnel ke port kosong.
- Port umum seperti
3000dan5173langsung terdeteksi dan siap ditambahkan. - Menutup jendela tidak mematikan tunnel. Ini penting, karena aplikasi menu bar yang ikut mati saat jendela ditutup akan menyebalkan.
- Menyambung ulang sendiri setelah Wi-Fi putus atau laptop tidur, dan meminta alamat yang sama kembali.
- Statistik lalu lintas per tunnel: waktu hidup, jumlah koneksi, byte masuk dan keluar.
Tidak ada akun, tidak ada login, tidak ada telemetri. Secret relay disimpan di keychain macOS.
Saat butuh alamat yang tidak berubah
Alamat bore.pub:43228 cukup untuk melihat hasil kerja di HP. Tapi dia tidak cukup untuk dua hal: webhook yang didaftarkan di layanan pihak ketiga, dan tautan yang kamu kirim ke klien.
Untuk itu, jalankan relay sendiri. Hasilnya alamat https:// di domainmu, port yang tetap, dan tunnel yang hanya bisa dibuka orang yang punya secret.
Kebutuhan minimalnya: satu VPS Linux sekitar 5 dolar sebulan dan satu domain.
Langkah 1, arahkan DNS. Satu record wildcard cukup:
*.domainmu.com A <IP server>
Langkah 2, buka firewall. Port 7835/tcp untuk Localfly menghubungi relay, dan 80 serta 443 untuk Caddy mengambil sertifikat.
Langkah 3, jalankan relay. Isi repo sudah menyiapkan compose-nya:
git clone https://github.com/raqibnur/localfly.git
cd localfly/deploy
cp .env.example .env
sed -i "s/change-me/$(openssl rand -hex 24)/" .env
nano Caddyfile
docker compose up -d
Isi compose-nya sederhana: satu layanan bore versi 0.6.0 dan satu layanan caddy. Keduanya memakai network_mode: host, karena bore membuka satu port untuk setiap tunnel, dan itu sulit dilakukan lewat NAT Docker.
Langkah 4, daftarkan nama di Caddy. Satu blok per aplikasi, port-nya harus sama dengan port publik di Localfly:
web.domainmu.com {
reverse_proxy 127.0.0.1:40001
}
Setelah mengubah Caddyfile, jalankan docker compose restart caddy. Caddy akan mengambil dan memperbarui sertifikat HTTPS sendiri.
Langkah 5, hubungkan aplikasi. Di Localfly, isi Server dengan domain atau IP server, dan Secret dengan BORE_SECRET dari .env. Lalu untuk setiap aplikasi, buka Edit, isi Public port sesuai blok Caddy, dan isi Address dengan https://web.domainmu.com.
Kalau HTTPS belum diperlukan, relay bisa dijalankan sendirian:
docker compose up -d bore
Asal BIND_TUNNELS di .env diubah menjadi 0.0.0.0 dan port 40000 sampai 40100 dibuka. Tanpa Docker, bore juga bisa dijalankan langsung:
BORE_SECRET=… bore server --bind-tunnels 127.0.0.1 --min-port 40000 --max-port 40100
Kalau kamu memakai Linux
Bagian ini tidak ada di dokumentasinya, tapi berguna: Localfly hanyalah antarmuka untuk protokol bore. Relay-nya sendiri adalah bore server, dan kliennya memakai bore local.
Artinya di Linux atau Windows kamu tetap bisa menikmati relay yang sama dengan menjalankan bore local 3000 --to domainmu.com --port 40001 --secret …. Kamu kehilangan panel menu bar, deteksi port otomatis, dan statistik, tapi tunnel-nya jalan. Untuk kebutuhan sederhana, itu sudah cukup.
Biaya yang sebenarnya
| Komponen | Biaya | Catatan |
|---|---|---|
| Aplikasi Localfly | gratis, MIT | tanpa akun, tanpa batas waktu |
Relay publik bore.pub | gratis | alamat berubah tiap koneksi |
| VPS untuk relay sendiri | sekitar 5 dolar per bulan | cukup 1 GB RAM |
| Domain | biaya tahunan | wildcard memudahkan banyak nama |
| Sertifikat HTTPS | gratis | Caddy mengurus sendiri |
| Waktu setup | sekitar 30 menit | sekali saja |
Yang tidak terlihat di tabel: kalau kamu memakai relay publik, alamatmu ikut berbagi dengan orang lain di server yang sama. Untuk halaman statis yang tidak sensitif, itu tidak masalah. Untuk panel admin, jangan.
Risiko yang perlu disadari
Alamat publik berarti publik. Selama sakelar menyala, siapa pun yang punya alamat itu bisa membuka aplikasimu. Tidak ada autentikasi bawaan di Localfly. Kalau aplikasimu punya login sendiri, aman. Kalau tidak, tambahkan proteksi di depan: basic auth di Caddy, atau Cloudflare Access kalau domainmu di Cloudflare.
Secret relay bukan pengganti autentikasi aplikasi. Secret hanya memastikan orang lain tidak bisa membuka tunnel lewat relay-mu. Dia tidak mengatur siapa yang boleh membuka alamat yang sudah jadi.
Jangan pernah mengekspos database. Port PostgreSQL, MySQL, atau Redis yang dibuka ke internet akan dipindai dalam hitungan jam. Localfly bagus untuk aplikasi web, bukan untuk port layanan internal.
Alamat publik di relay bersama bisa dicoba orang lain. Ini bukan celah Localfly, tapi sifat relay publik. Kalau datanya sensitif, pakai relay sendiri.
Proyeknya masih sangat muda. Rilis pertama 8 November 2026, 21 bintang, tanpa issue terbuka. Untuk alat bantu pengembangan, itu wajar. Jangan jadikan satu-satunya jalan masuk ke layanan produksi.
Dibandingkan dengan yang lain
| Alat | Biaya | Domain sendiri | Perlu akun | Platform | Alamat stabil |
|---|---|---|---|---|---|
| Localfly, relay publik | gratis | tidak | tidak | macOS | tidak |
| Localfly, relay sendiri | VPS sekitar 5 dolar | ya | tidak | macOS | ya |
| ngrok | gratis terbatas | berbayar | ya | semua | berbayar |
| Cloudflare Tunnel | gratis | ya, domain di Cloudflare | ya | semua | ya |
| Tailscale Funnel | gratis terbatas | ya | ya | semua | ya |
| LocalCan | berbayar | ya | ya | macOS | ya |
Kalau kamu sudah memakai Cloudflare untuk domain dan tidak keberatan dengan akun, Cloudflare Tunnel lebih matang dan gratis. Localfly menang di dua hal: tanpa akun, dan relay-nya bisa kamu jalankan sendiri tanpa ketergantungan layanan lain.
Kalau ada masalah
| Pesan di Localfly | Artinya |
|---|---|
| Couldn't reach relay | port 7835 tertutup, atau alamat server salah |
| This relay requires a secret | isi secret di bagian Relay |
| Relay didn't ask for a secret | relay jalan tanpa BORE_SECRET, kosongkan secret |
| Port already in use | port publik itu sedang dipakai tunnel lain |
| Client port number not in allowed range | pilih port publik di antara MIN_PORT dan MAX_PORT |
Untuk webhook, alamat yang berubah-ubah adalah masalah nyata. Layanan seperti payment gateway menyimpan URL callback, jadi setiap kali alamat berubah kamu harus mendaftar ulang. Di sinilah relay sendiri dengan port tetap dan domain sendiri membayar dirinya sendiri dalam satu sore.
Kapan Localfly masuk akal
Cocok kalau:
- kamu mengembangkan di macOS dan sering perlu melihat hasilnya di perangkat lain
- kamu butuh alamat publik untuk webhook saat mengembangkan integrasi
- kamu tidak ingin membuat akun hanya untuk meneruskan satu port
- kamu punya domain dan tidak keberatan menjalankan satu VPS kecil
Kurang cocok kalau:
- kamu memakai Windows atau Linux sebagai mesin utama dan ingin antarmuka grafis
- kamu butuh inspeksi request dan respons seperti di ngrok, karena fitur itu masih rencana
- kamu mencari solusi untuk mengekspos layanan produksi, bukan pengembangan
Penutup
Localfly menyelesaikan satu masalah kecil dengan cara yang rapi: satu sakelar, satu alamat, tanpa akun. Yang membuatnya layak dicoba bukan jumlah bintangnya, tapi keputusan untuk memakai protokol terbuka yang sudah ada, memisahkan mesin tunnel dari antarmuka, dan menyertakan panduan self-host di dalam repo yang sama.
Kalau kamu ingin melihat sendiri, aplikasinya ada di github.com/raqibnur/localfly dan situsnya di localfly.raqibnur.com. Untuk pemakaian serius, langsung lompat ke bagian self-hosting. Selisih satu VPS kecil itu sepadan dengan alamat yang tidak berubah setiap kali laptop bangun dari tidur.







