screenbeam
v0.1.25
Published
Screen sharing lokal via **WebRTC** — tanpa internet, tanpa cloud, tanpa akun. Peserta di jaringan yang sama (LAN) saling berbagi layar lewat browser, seperti GMeet/Zoom: setiap peserta bisa share layar **sekaligus** dan **saling melihat**. Media mengalir
Downloads
3,415
Readme
ScreenBeam
Screen sharing lokal via WebRTC — tanpa internet, tanpa cloud, tanpa akun. Peserta di jaringan yang sama (LAN) saling berbagi layar lewat browser, seperti GMeet/Zoom: setiap peserta bisa share layar sekaligus dan saling melihat. Media mengalir peer-to-peer (full mesh), server hanya jadi signaling.
Butuh akses dari luar jaringan? Bisa dibuka ke publik lewat Cloudflare Tunnel.
Quick Start
Tidak perlu clone repo. Cukup:
npx screenbeamAtau install permanen:
npm install -g screenbeam
screenbeamOutput:
ScreenBeam siap:
Sender (no warning) : http://localhost:3003
HTTPS LAN (viewer) : https://localhost:3002
Viewer di LAN : https://192.168.1.12:3002- Peserta 1 buka
http://localhost:3003→ buat room → Share Layar → pilih layar/window. - Peserta lain (device di WiFi sama) scan QR atau buka URL viewer yang tampil.
- Klik Advanced → Proceed pada warning sertifikat → layar muncul.
- Setiap peserta lain bisa klik Share Layar juga → semua saling melihat sekaligus.
Urutannya bebas — peserta boleh join duluan, sender otomatis mengirim stream begitu tombol Share ditekan. Setiap orang punya tombol Share sendiri.
Hilangkan Warning Sertifikat
Warning ERR_CERT_AUTHORITY_INVALID itu wajar untuk sertifikat lokal. Koneksinya
tetap terenkripsi; klik Advanced → Proceed sudah cukup. Tapi bisa juga
dihilangkan permanen.
Penting: trust sertifikat bersifat per-device. Mempercayainya di komputer pengirim hanya menghilangkan warning di komputer itu. Setiap device viewer (HP, laptop lain) harus memasang CA-nya sendiri.
Dua mode sertifikat
ScreenBeam mendeteksi OS dan memilih otomatis:
| Mode | Kapan dipakai | Trust otomatis |
|------|---------------|----------------|
| mkcert | mkcert tersedia di PATH | macOS, Windows, Linux — termasuk Chrome & Firefox |
| self-signed | mkcert tidak ada | Hanya macOS (fallback bawaan) |
mkcert sangat direkomendasikan. Ia membuat CA lokal (CA:TRUE) lalu menerbitkan
sertifikat yang ditandatangani CA itu. Ini penting: sertifikat self-signed adalah
leaf (CA:FALSE), dan Chrome di Windows/Linux menolak leaf sebagai trust anchor
walaupun sudah dimasukkan ke system store. mkcert juga mengurus NSS store
(~/.pki/nssdb) dan profil Firefox, yang tidak membaca system CA store di Linux.
Di komputer yang menjalankan ScreenBeam
Saat pertama kali dijalankan dan sertifikat belum dipercaya, kamu ditanya sekali:
Sertifikat HTTPS lokal belum dipercaya di mesin ini.
Percayai sertifikat sekarang? (butuh sudo/admin) [y/N]Kalau mkcert belum terpasang, ScreenBeam mendeteksi package manager yang ada dan menawarkan memasangnya:
| OS | Perintah yang ditawarkan |
|----|--------------------------|
| macOS | brew install mkcert nss |
| Windows | choco install mkcert / scoop install mkcert / winget install FiloSottile.mkcert |
| Debian/Ubuntu | sudo apt-get install mkcert libnss3-tools |
| Fedora/RHEL | sudo dnf install mkcert nss-tools |
| Arch | sudo pacman -S mkcert nss |
| openSUSE | sudo zypper install mkcert mozilla-nss-tools |
Kalau tidak ada package manager yang terdeteksi, ScreenBeam mencetak link rilis mkcert dan tetap lanjut dengan self-signed.
Jawab N → pilihan diingat, tidak ditanya lagi. Prompt dilewati otomatis kalau
terminal non-interaktif (CI, background) atau SCREENBEAM_NO_TRUST=1.
Untuk menjalankannya eksplisit kapan saja:
screenbeam setupKalau IP LAN berubah (pindah WiFi / DHCP), terbitkan ulang sertifikat:
screenbeam setup --forceDengan mkcert, device viewer tidak perlu pasang ulang setelah IP berubah — yang mereka percayai adalah CA-nya, bukan sertifikat per-IP.
Di device viewer (HP / laptop lain)
Buka halaman trust bawaan lewat HTTPS:
https://<IP-LAN>:3002/#/trustHalaman itu menyediakan tombol unduh (/cert.pem) plus instruksi langkah demi
langkah untuk iOS, Android, macOS, Windows, dan Linux. Link menuju halaman ini
juga muncul di bagian bawah halaman viewer.
Yang diunduh menyesuaikan mode: root CA mkcert kalau mode mkcert, atau sertifikat self-signed kalau fallback.
Di iOS ada dua tahap: install profile dan aktifkan di Settings → General → About → Certificate Trust Settings. Kalau tahap kedua dilewat, warning tetap muncul.
Mencabut trust
mkcert -uninstall # mode mkcert
sudo security remove-trusted-cert -d ~/.screenbeam/certs/cert.pem # mode self-signed (macOS)Perintah
| Perintah | Fungsi |
|----------|--------|
| screenbeam | Jalankan server (menawarkan trust sekali kalau belum trusted) |
| screenbeam setup | Buat + percayai sertifikat di mesin ini |
| screenbeam setup --force | Regenerate sertifikat (IP LAN berubah) |
| screenbeam --help | Bantuan |
| screenbeam --version | Versi |
Environment variable
| Variable | Default | Keterangan |
|----------|---------|------------|
| HTTP_PORT | 3003 | Port HTTP untuk sender (bind 127.0.0.1) |
| PORT | 3002 | Port HTTPS untuk viewer LAN (bind 0.0.0.0) |
| SCREENBEAM_CERT_DIR | ~/.screenbeam/certs | Lokasi penyimpanan sertifikat |
| SCREENBEAM_NO_TRUST | — | Set 1 supaya tidak pernah menawarkan trust otomatis |
| SCREENBEAM_NO_MKCERT | — | Set 1 supaya selalu pakai self-signed, abaikan mkcert |
| SCREENBEAM_TELEGRAM_TOKEN | — | Bot token Telegram untuk laporan error (lihat di bawah) |
| SCREENBEAM_TELEGRAM_CHAT | — | Chat ID tujuan laporan; otomatis terdeteksi kalau bot pernah kamu chat |
PORT=8443 HTTP_PORT=8080 screenbeamKenapa dua port? Sender butuh secure context untuk getDisplayMedia, dan
http://localhost sudah dianggap secure oleh browser — jadi sender bebas warning.
Viewer diakses lewat IP LAN, yang wajib HTTPS.
Laporan Error ke Telegram
ScreenBeam bisa melaporkan error dari server maupun dari browser client (Windows, macOS, Linux, Android, iOS) langsung ke chat Telegram kamu, lengkap dengan platform, user agent, room, dan stack trace — supaya gampang diperbaiki.
SCREENBEAM_TELEGRAM_TOKEN=<token> SCREENBEAM_TELEGRAM_CHAT=<chat-id> screenbeamSCREENBEAM_TELEGRAM_TOKEN— bot token dari @BotFather.SCREENBEAM_TELEGRAM_CHAT— ID chat tujuan. Bisa diisi manual, atau diisi otomatis: kirim pesan apa pun ke bot kamu sekali, lalu jalankan ScreenBeam (tanpaSCREENBEAM_TELEGRAM_CHAT) — chat ID terdeteksi sendiri dan ditampilkan di log.
Yang dilaporkan:
- Error server: uncaught exception, unhandled rejection, error WebSocket.
- Error client:
window.onerror, unhandled promise rejection, gagalgetDisplayMedia, koneksi WebRTC/RTCPeerConnection gagal, koneksi signaling putus.
Laporan di-dedupe (max 1 pesan per jenis per menit) supaya chat tidak banjir. Kalau token tidak diset, fitur ini nonaktif total — tidak ada efek apa pun.
Mode Online (Cloudflare Tunnel)
Untuk viewer yang tidak satu jaringan.
brew install cloudflared # sekali saja
screenbeam # terminal 1
cloudflared tunnel --url http://localhost:3003 # terminal 2cloudflared mencetak URL publik, mis. https://xxxx.trycloudflare.com.
Sender dan viewer sama-sama membuka URL itu (#/share?room=... dan
#/viewer?room=...). URL viewer di UI otomatis menyesuaikan mode.
Di mode online Share audio ikut aktif. Viewer perlu klik play/unmute karena autoplay audio biasanya diblokir browser.
trycloudflare.commemberi URL acak tiap dijalankan. Untuk URL tetap, pakai named tunnel:cloudflared tunnel login→create→route dns.
Indikator Koneksi
| Warna | Arti |
|-------|------|
| 🟢 hijau | Terhubung (Signaling aktif, N viewer terhubung) |
| 🟡 kuning | Proses (Menunggu viewer…, Menghubungkan…, Menunggu sender…) |
| 🔴 merah | Putus (Signaling putus, Sender keluar) |
| ⚪ abu | Idle |
Terminal server juga mencetak log join/leave per room untuk memudahkan debug.
Requirement
- Node.js >= 18
- Browser modern (Chrome/Edge/Safari/Firefox)
- Opsional:
cloudflareduntuk mode online
Troubleshooting
Viewer loading terus. Pastikan sender sudah menekan Mulai Share dan
room di URL keduanya identik. Cek log terminal — ada baris
viewer join — BELUM ADA SENDER di room ini kalau room-nya salah.
Port 3002 sudah dipakai proses lain. Ada instance ScreenBeam lain yang masih
jalan. Hentikan dengan kill $(lsof -t -nP -iTCP:3002 -sTCP:LISTEN), atau pakai
port lain: PORT=4002 HTTP_PORT=4003 screenbeam.
Viewer tidak bisa membuka URL. Firewall macOS memblokir port. Buka System Settings → Network → Firewall → Options dan izinkan Node.
Layar hitam / stream tidak jalan padahal signaling hijau. Umumnya kedua device tidak benar-benar satu subnet (mis. salah satu di WiFi Guest, atau AP isolation aktif di router).
Warning cert muncul lagi setelah pindah WiFi. IP LAN berubah — jalankan
screenbeam setup --force, lalu pasang ulang sertifikat di device viewer.
Sudah screenbeam setup tapi HP masih warning. Wajar — trust hanya berlaku
di mesin yang menjalankan setup. Di HP, buka https://<IP-LAN>:3002/#/trust.
Sudah install cert di Windows/Linux tapi Chrome tetap warning. Kemungkinan
masih mode self-signed. Chrome menolak leaf cert sebagai trust anchor — pasang
mkcert di komputer sender lalu jalankan screenbeam setup --force.
Cek mode aktif lewat curl -k https://localhost:3002/api/info (field certMode).
iOS sudah install profile tapi masih warning. Aktifkan juga di Settings → General → About → Certificate Trust Settings.
Limitasi
- ICE hanya pakai host candidate (tanpa STUN/TURN) — didesain untuk satu LAN. Mode tunnel tetap P2P, media tidak melewati Cloudflare.
- Semua peserta bisa share layar sekaligus (full mesh). Bandwidth naik ~N× per peserta — nyaman untuk grup kecil (2–5 device); skala besar butuh SFU/MCU.
- Audio hanya tersedia di mode online.
- Tidak bisa di-deploy ke platform serverless (Vercel dsb) karena butuh WebSocket server yang stateful.
Development
git clone <repo> && cd share-screen-local
npm install
npm start # = node server.js
node server.js setup # = screenbeam setup
npm run release -- --otp=123456 # bump patch + publish ke npmLisensi
MIT
