npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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 screenbeam

Atau install permanen:

npm install -g screenbeam
screenbeam

Output:

ScreenBeam siap:
  Sender (no warning) : http://localhost:3003
  HTTPS LAN (viewer) : https://localhost:3002
  Viewer di LAN      : https://192.168.1.12:3002
  1. Peserta 1 buka http://localhost:3003 → buat room → Share Layar → pilih layar/window.
  2. Peserta lain (device di WiFi sama) scan QR atau buka URL viewer yang tampil.
  3. Klik Advanced → Proceed pada warning sertifikat → layar muncul.
  4. 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 setup

Kalau IP LAN berubah (pindah WiFi / DHCP), terbitkan ulang sertifikat:

screenbeam setup --force

Dengan 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/#/trust

Halaman 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 screenbeam

Kenapa 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> screenbeam
  • SCREENBEAM_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 (tanpa SCREENBEAM_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, gagal getDisplayMedia, 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 2

cloudflared 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.com memberi URL acak tiap dijalankan. Untuk URL tetap, pakai named tunnel: cloudflared tunnel logincreateroute 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: cloudflared untuk 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 npm

Lisensi

MIT