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

castview

v0.1.2

Published

Mirror your screen to any device with a browser over LAN. Zero install on the viewer, QR code to connect, works over WiFi or a USB cable.

Readme

Castview

npm version license

Website: cstview.vercel.app

Mirror a computer's screen to any device with a browser — phone, tablet, or another computer. One command on the host, one QR scan on the viewer. Nothing to install on the viewing device, no admin rights, no accounts, no cloud.

Castview was built as a rescue tool for a laptop with a dead display: if the machine has Node.js and you have a USB cable, you have a screen again. It works just as well for everyday sharing — showing your screen to a tablet on your desk, a TV browser, or a colleague's laptop on the same network.

Quick start

npx castview

That's it. Castview:

  1. starts sharing your screen on your local network,
  2. opens a setup page in your browser with QR codes,
  3. adds a launcher to your Desktop so next time is a double-click.

Point a phone or tablet camera at a QR code, type the session PIN shown on the setup page, and the live screen opens in its browser.

Permanent install, if you prefer:

npm install -g castview
castview

Requirements

  • Node.js 18+ on the computer being shared. That's the only hard requirement.
  • ffmpeg (optional, recommended): enables smooth ~15 fps streaming with the cursor visible. Without it Castview falls back to a basic screenshot loop, which works but looks choppy. Any ffmpeg on PATH is fine — a portable build in a folder works, no installer or admin rights needed.

The viewing device needs only a browser (Chrome, Safari, Edge, Firefox).

Connection options

WiFi — both devices on the same network. Scan the QR code from the setup page or the terminal.

USB cable — no WiFi needed. Plug the phone/tablet into the computer and enable USB tethering on it (Settings, search "tethering"). The setup page detects the new connection within seconds and shows a QR code for it — no restart required.

The viewer

Open the QR link and you get a full-screen live view with a small control pill in the bottom-left corner:

  • Quality: HD / Fast — HD streams up to 1600px-wide frames; Fast sends much smaller frames for weak WiFi or lower latency.
  • Rotate — turns the picture 90 degrees, for holding a phone in portrait while viewing a landscape screen.
  • Full screen — with automatic landscape orientation lock where the browser supports it.

The viewer auto-reconnects if the connection drops, keeps the device awake while watching, and supports pinch-to-zoom. On iPhone (no fullscreen API), add the page to your Home Screen for a fullscreen experience.

The setup page

http://localhost:8080/host on the shared computer (opens automatically on start):

  • QR codes and addresses for every network you're on, labelled WiFi / USB, updating live
  • The session PIN
  • Low latency mode toggle — the setup tab captures the screen itself and streams WebRTC directly to viewers at ~30 fps with a fraction of the delay. Viewers switch over automatically and fall back to the JPEG stream if the tab closes. Keep the tab open while it runs.
  • Scan now button on the USB card — re-detects a freshly plugged-in phone, and tells you when a device is connected but hasn't been assigned an address yet
  • Stop sharing button — shuts the server down, no terminal needed
  • Desktop shortcut button — re-adds the launcher if you removed it
  • A warning banner if ffmpeg is missing

Security

  • Every session generates a random 4-digit PIN. Every viewer types it once in their browser; QR codes and printed URLs deliberately do not embed it, and the PIN is shown only on the shared computer itself.
  • The stream never leaves your local network. No cloud, no telemetry.
  • Stop and shortcut endpoints only accept requests from the shared computer.

This is LAN-convenience security, not cryptography: the stream is plain HTTP on your own network. Don't use it on networks you don't trust.

Configuration

All optional, via environment variables:

| Variable | Default | Meaning | |---|---|---| | PORT | 8080 | HTTP/WebSocket port. If another app holds it, the next free port is used automatically; if another Castview holds it, its setup page opens instead | | FPS | 15 | Target frame rate | | PIN | random | Fixed access PIN, or PIN=off to disable | | QUALITY | sharp | Starting quality: sharp (HD) or smooth (Fast) | | SCREEN | 0 | Display index to capture (macOS) | | NO_OPEN | unset | 1 skips auto-opening the setup page | | NO_SHORTCUT | unset | 1 skips creating the desktop launcher on first run |

Flags:

  • --no-pin — disable the PIN. Essential for the blind-rescue case: when the host screen is dead you can't read a random PIN, so type npx castview --no-pin blind and open the printed-style address from the viewer.

Examples:

FPS=30 PIN=1234 npx castview
npx castview --no-pin

Platform notes

  • macOS — first run asks for Screen Recording permission (System Settings → Privacy & Security). One-time OS prompt, not an install. The desktop launcher is a real .app with the Castview icon that starts sharing in the background.
  • Windows — runs without admin. Capture uses ffmpeg's gdigrab; the launcher is a .lnk that starts Castview hidden.
  • Linux — X11 capture via ffmpeg's x11grab; the launcher is a .desktop entry.

How it works

[Shared computer]                        [Any browser]
  castview (Node)                          scan QR / open URL
  ├─ ffmpeg captures the screen            └─ live view, ~15 fps
  │  as an MJPEG stream (cursor included)
  ├─ frames pushed over WebSocket
  └─ serves the viewer + setup pages

Deliberately simple: JPEG frames over a WebSocket, decodable by any browser with zero client code beyond one HTML page. No codecs to install, no build step — the dependencies are pure JavaScript.

When low latency mode is on, the setup tab captures the screen with getDisplayMedia and streams WebRTC video peer-to-peer over the LAN; the Node server only relays the signaling. Viewers use it automatically when available and fall back to the JPEG stream when it isn't.

Roadmap

  • Remote control from the viewer (mouse/keyboard passthrough)
  • Multi-monitor picker on the setup page

Issues and PRs welcome: github.com/ajithonmain/Castview

License

MIT — built by Ajith M Jose