DEV Community

Cover image for I built a free P2P device sync tool — no account needed, just scan a QR code
Frank
Frank

Posted on

I built a free P2P device sync tool — no account needed, just scan a QR code

I got tired of emailing files to myself.

Every time I needed to move a photo from my phone to my laptop I had
to either send it via WhatsApp Web, upload to Google Drive, or email
it to myself. All of these require accounts, have storage limits, and
are honestly overkill for "I just need this file on my other screen
right now."

So I built VaultSync — (https://vsyn.cc)

The whole concept fits in one sentence:

Open the same URL on two devices, scan the QR code, and they're
connected — no account, no app, no waiting.

That's it. The QR code encodes a session URL. When Device B scans it,
both browsers join the same WebRTC signaling channel, negotiate a
direct connection, and start syncing.


How the connection works

When you open vsyn.cc, the server generates a unique session token
and embeds it in the QR code.

After the handshake, the signaling server steps out completely.
Data flows directly between browsers using WebRTC Data Channels.


Text sync

The textarea syncs in real time across both devices. When you type
on Device A, it saves to the session every few seconds and Device B
polls for updates. Simple but effective for notes, URLs, passwords
and clipboard content.


File transfer

For the free tier, files are uploaded to a temporary server slot
(JPG, PNG, PDF up to 10MB, 1 slots). They're deleted automatically
when the session ends.

On the receiving end, chunks are collected in an array and assembled
into a Blob when the done signal arrives:


Private Rooms

The free QR session lasts 10 minutes. For something persistent I
built Private Rooms — password-protected encrypted spaces that
survive page refreshes and reconnect automatically.

A Private Room includes:

  • No time limit — stays active for 1 year
  • Multiple devices — connect as many as you want
  • Voice chat — WebRTC audio tracks, peer-to-peer
  • Whiteboard — real-time collaborative canvas via Socket.IO
  • P2P Transfer — up to 2GB, direct between browsers
  • 5 file slots — 10MB each, persistent

The room credentials are saved in localStorage so returning to the
URL auto-logs you back in without entering the password again.


The voice chat implementation

Adding voice was surprisingly straightforward once the PeerConnection
was already set up for data.

I use HTTP polling for signaling (instead of a persistent WebSocket
for the RTC negotiation) which keeps the server simpler but adds
~1.5s latency to the initial handshake. Fine for this use case.


Privacy tools I added along the way

Since the whole product is about moving data privately, I added two
client-side tools that fit the theme:

EXIF Metadata Analyzer

Most people don't realize that photos taken on a smartphone contain
the exact GPS coordinates of where the photo was taken — embedded
silently in the file's EXIF metadata.

The analyzer reads all hidden fields (GPS, camera model, timestamps,
software, author) and displays them. It also strips everything and
lets you download a clean copy, using a manual JPEG binary parser

Background Remover

Uses Google's MediaPipe Selfie Segmentation running via WebGL
in the browser — no server call, no API key, no upload:

Post-processing sliders let you control edge blur, threshold and
expansion to improve the cutout quality.


What I struggled with

NAT traversal — about 15% of connections fail with STUN alone
because of symmetric NAT. I use a TURN relay as fallback which works
but adds latency.

Mobile Safari autoplay — iOS Safari blocks audio.play() without
a direct user gesture. I had to add a tap-to-unmute flow for voice.

WebRTC renegotiation — adding audio tracks after a data channel
is already established requires a full offer/answer cycle. Managing
the signaling state machine to avoid glare conditions took time.

Large file transfers — sending a 2GB file in 64KB chunks over a
Data Channel works, but back-pressure management is critical. Without
the bufferedAmount check, Chrome would exhaust memory trying to
buffer the entire file.


The stack

  • Backend: PHP (yes, PHP — fast to deploy, works everywhere)
  • Real-time: Socket.IO for whiteboard sync
  • P2P signaling: custom HTTP polling endpoint
  • Voice signaling: separate HTTP polling (1.5s interval)
  • AI: MediaPipe WebGL (background removal)
  • QR generation: qrcode.js (client-side)
  • Zero frontend framework — vanilla JS throughout

Try it

👉 vsyn.cc — free, no account needed

Open it on two devices right now — one on your laptop, one on your
phone. Scan the QR. You're connected in under 3 seconds.

Private Rooms are $5 one-time for 1 year if you need something
persistent with voice and whiteboard.


What's next

I'm planning to add:

  • OCR tool — extract text from images, runs in browser via Tesseract.js
  • File hash verifier — generate SHA-256 checksums client-side
  • Password analyzer — entropy + HaveIBeenPwned k-anonymity check

Would love to hear what you'd find useful. Drop a comment or reach
me at soporte@vsyn.cc

Top comments (0)