DEV Community

John Wilson
John Wilson

Posted on Originally published at vuthis.com

Screen sharing without screen mirroring: a phone-controlled TV display built on WebSockets and a QR code

Every meeting room, classroom and church hall has a screen, and every screen has a browser. Yet putting one thing on that screen, a PDF, a few photos, a countdown timer, still means hunting for an HDMI cable or mirroring your whole phone to the room, notifications included.

I built V U This to fix that with the smallest possible stack. Here is how it works and what I learned.

The idea: the screen is a dumb client, the phone is the remote

Open vuthis.com on any TV, projector laptop or Raspberry Pi. The page creates a display session and shows a QR code that encodes the full controller URL, plus a short code as a fallback. Scan it with a phone and the phone becomes the remote. Whatever you pick on the phone, the screen shows: a photo slideshow, a PDF with page controls, large text, an announcement, a clock in any time zone, a countdown / count-up / count-to timer, a tally counter or a Wi-Fi QR code.

Only the chosen content ever reaches the screen. That is the whole point: it is screen sharing without screen mirroring.

Why a browser and not an app

  • Every smart TV, Chromecast (browser mode), Fire TV (Silk), signage player and projector laptop already has a browser. Zero install on either side.
  • No pairing, no same-Wi-Fi requirement, no AirPlay/Miracast compatibility matrix. Works over 4G.
  • A QR code is the fastest possible pairing UX. People already know what to do with it.

The stack

Boring on purpose: Node.js + Express, SQLite for sessions and pass state, WebSockets for the display ↔ controller channel, pdf.js for documents rendered client-side, Stripe for passes, Postfix/OpenDKIM for magic-link login, everything behind Cloudflare. A CLI installer sets up an Ubuntu VPS end to end, and it can be self-hosted on a private LAN for schools and offices that cannot use cloud tools.

The display page is deliberately stateless: it subscribes to its session over a WebSocket and renders whatever "scene" JSON arrives ({type:"timer", mode:"countdown", seconds:600, label:"Break"}). The controller is space-adaptive: on a phone it shows the essentials, on a tablet or laptop it surfaces previews, queueing and context. Same code, more room, more controls.

Things that bit me

  1. TV browsers are old. Samsung Tizen and LG webOS ship Chromium builds several versions behind. No optional chaining in some, flaky requestFullscreen. Transpile, and test on a real TV.
  2. Screensavers and sleep. A display page that goes black after ten minutes is useless. The Wake Lock API helps where supported; otherwise a tiny looping video keeps some TVs awake.
  3. PDFs on a 4K screen. Rendering with pdf.js at device pixel ratio matters; "fit page" vs "fit width" need to be one tap on the phone, not a zoom gesture.
  4. Timers must survive reconnects. Store the end timestamp, not the remaining seconds, so a display that drops Wi-Fi and comes back shows the right number.
  5. Free tiers need limits that feel fair. One screen, 60 minutes, 20 photos, one PDF, no account. Paid passes ($5.99 for 24h up to $299.99 a year) add multiple screens, 250 MB storage and an automatic playlist mode that turns a TV into simple digital signage.

Where people actually use it

Teachers put a full-screen countdown timer on the classroom projector and worksheets on the board from a phone. Coworking spaces show the agenda on the meeting-room TV. Reception desks run a digital notice board. Event organisers show the schedule and the guest Wi-Fi as a QR code. Families show phone photos on the living-room TV without a casting device.

Try it

Open vuthis.com on a screen, scan, show. No sign-up. Feature guides: show photos on a TV, display a PDF on a TV, full-screen countdown timer, digital notice board on a TV.

If it fails on a specific TV browser, I would love to know which one. And if you find it useful, a link from your blog, README or wherever you post helps a bootstrapped two-person team more than you would think.

Top comments (0)