A simple WebRTC-based screen sharing application for podcasters. Share screens bidirectionally with full-screen display, perfect for recording podcast guests' screens.
- ๐ Bidirectional Screen Sharing: Both users can share their screens simultaneously
- ๐ฅ๏ธ Full Screen Display: Screens automatically fit to viewport (100vw/100vh)
- ๐ฏ Zero Setup: No login, no signup - just share a link
- ๐ Audio-Free: Designed for screen capture only (muted by default)
- โจ๏ธ Hidden Controls: Toggle controls with
Cmd+Shift+H - ๐ฑ Same WiFi Optimized: Works best when both users are on the same network
- ๐จ Clean UI: Minimal interface that stays out of the way
- Node.js (v14 or higher)
- npm or yarn
-
Clone or navigate to the project:
cd vibescreen -
Install dependencies:
npm install
-
Start the server:
npm start
For development with auto-restart:
npm run dev
-
The server will start on port 3000:
๐ฌ VibeScreen server running on port 3000 ๐ฑ Local access: http://localhost:3000 ๐ฑ Network access: http://<your-local-ip>:3000
-
Find your local IP address:
Mac/Linux:
ifconfig | grep "inet " | grep -v 127.0.0.1
Windows:
ipconfig
Look for "IPv4 Address" (usually starts with 192.168.x.x or 10.x.x.x)
-
Start the server (on the host computer):
npm start
-
Open the app in your browser:
http://localhost:3000A unique room will be created automatically.
-
Share the link with your guest:
- Click "๐ Copy Link" button, or
- Share the URL shown in your browser (e.g.,
http://192.168.1.100:3000?room=abc1234)
-
Both users:
- Click "๐ฅ Start Sharing My Screen"
- Select which screen/window to share
- Both screens will appear side-by-side in full screen
-
Toggle controls:
- Press
Cmd+Shift+H(Mac) orCtrl+Shift+H(Windows/Linux) - Controls will slide up/down
- Press
If you're not on the same WiFi, you can use ngrok to expose your local server:
-
Install ngrok:
- Download from ngrok.com
- Or install via homebrew:
brew install ngrok
-
Start your server:
npm start
-
In a new terminal, start ngrok:
ngrok http 3000
-
Share the ngrok URL:
- Copy the
https://xxxx.ngrok.ioURL - Share it with your guest
- Both can access:
https://xxxx.ngrok.io?room=yourroom
- Copy the
- Start Sharing: Click "๐ฅ Start Sharing My Screen"
- Stop Sharing: Click "โน๏ธ Stop Sharing" or click browser's native stop sharing button
- Toggle Controls:
Cmd+Shift+H(Mac) orCtrl+Shift+H(Windows/Linux) - Copy Room Link: Click "๐ Copy Link"
- Frontend: Vanilla JavaScript, HTML5, CSS3
- Backend: Node.js + Express + Socket.IO
- WebRTC: Peer-to-peer connection for screen sharing
- Signaling: WebSocket (Socket.IO) for WebRTC handshake
- User A opens the app and joins a room
- User B joins the same room via shared link
- Socket.IO exchanges WebRTC signaling data (SDP offer/answer, ICE candidates)
- WebRTC peer connection is established
- Screen sharing streams flow directly between peers
- Both users can share screens simultaneously
The app uses free public Google STUN servers for NAT traversal:
stun:stun.l.google.com:19302stun:stun1.l.google.com:19302stun:stun2.l.google.com:19302
These work well for local network and most internet connections. TURN servers are not needed for same-WiFi scenarios.
vibescreen/
โโโ server.js # Node.js server with Socket.IO signaling
โโโ package.json # Dependencies
โโโ README.md # This file
โโโ public/
โโโ index.html # Main HTML page
โโโ styles.css # Styling
โโโ app.js # WebRTC client logic
Edit server.js or set environment variable:
PORT=8080 npm startEdit public/styles.css:
.videos-container.single- single screen layout.videos-container.dual- dual screen layout
Edit iceServers in public/app.js:
const iceServers = {
iceServers: [
{ urls: 'stun:stun.l.google.com:19302' },
{ urls: 'turn:your-turn-server.com', username: 'user', credential: 'pass' }
]
};- Chrome/Edge: Works out of the box
- Firefox: Works but may show different sharing options
- Safari: Requires HTTPS (use ngrok or enable experimental features)
- Make sure both are using the same room URL
- Check firewall settings
- Try using ngrok if on different networks
- Check browser console for errors (F12)
- Make sure both users are on the same WiFi
- Close other bandwidth-heavy applications
- The stream quality is determined by WebRTC's automatic adaptation
- Setup: Start server on your computer
- Invite: Send link to your guest via WhatsApp
- Connect: Guest opens link and shares their screen
- Record: Use screen recording software (QuickTime, OBS, etc.) to record the full-screen display
- Hide UI: Press
Cmd+Shift+Hto hide all controls - Clean Recording: You now have a clean full-screen recording of your guest's screen
Created by Aemal Sayer
Built with โค๏ธ for podcasters who want simple, clean screen sharing.
MIT License - feel free to use for your podcasts!
Copyright (c) 2025 Aemal Sayer. See LICENSE file for details.
For issues or questions, check:
- Browser console (F12) for JavaScript errors
- Server terminal for connection logs
- Ensure browsers have permission to access screen sharing
Happy Podcasting! ๐๏ธ