<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yousiff Taqi</title>
    <description>The latest articles on DEV Community by Yousiff Taqi (@fencer).</description>
    <link>https://dev.to/fencer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4100726%2Ff0c46c20-d3d1-40d2-8932-6ca570807da6.jpg</url>
      <title>DEV Community: Yousiff Taqi</title>
      <link>https://dev.to/fencer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fencer"/>
    <language>en</language>
    <item>
      <title>I built browser-to-browser remote file access with WebRTC – no app required</title>
      <dc:creator>Yousiff Taqi</dc:creator>
      <pubDate>Sat, 29 Aug 2026 20:36:36 +0000</pubDate>
      <link>https://dev.to/fencer/i-built-browser-to-browser-remote-file-access-with-webrtc-no-app-required-84b</link>
      <guid>https://dev.to/fencer/i-built-browser-to-browser-remote-file-access-with-webrtc-no-app-required-84b</guid>
      <description>&lt;p&gt;I’ve been building a browser-first project called RelicBeam, and one feature I wanted was simple in theory:&lt;/p&gt;

&lt;p&gt;Open a folder on one device and temporarily browse it from another device without installing anything.&lt;/p&gt;

&lt;p&gt;That became Remote Files, part of RelicBeam’s Device Portal.&lt;/p&gt;

&lt;p&gt;The host selects a folder, another device joins with a QR/code, the host approves the connection, and the second device can browse, preview and download files.&lt;/p&gt;

&lt;p&gt;The folder itself is never uploaded to RelicBeam.&lt;/p&gt;

&lt;p&gt;File data travels over a WebRTC DataChannel. If a direct connection isn’t possible, my own TURN server relays the encrypted traffic.&lt;/p&gt;

&lt;p&gt;Device Portal traffic is end-to-end encrypted between the connected browsers.&lt;/p&gt;

&lt;p&gt;The interesting problems&lt;/p&gt;

&lt;p&gt;The file browser itself was actually the easy part.&lt;/p&gt;

&lt;p&gt;Android file pickers kept killing sessions&lt;/p&gt;

&lt;p&gt;When I added optional uploads, I noticed something odd during testing.&lt;/p&gt;

&lt;p&gt;The first upload worked, but after opening the Android file picker a few times, the Remote Files session could suddenly disconnect.&lt;/p&gt;

&lt;p&gt;It turned out Android can background or suspend the browser while the native file picker is open. That could temporarily drop the Socket.IO signaling connection, and my server was treating any disconnect as the viewer leaving permanently.&lt;/p&gt;

&lt;p&gt;The fix was a short reconnect grace period.&lt;/p&gt;

&lt;p&gt;Temporary disconnects now get time to recover, while explicit Leave and End session actions still terminate access immediately.&lt;/p&gt;

&lt;p&gt;Firefox and Safari can browse, but not host uploads&lt;/p&gt;

&lt;p&gt;Remote Files works read-only across browsers, but writable folder access is more limited.&lt;/p&gt;

&lt;p&gt;Chrome and Edge expose writable directory handles through the File System Access API, so a host can optionally allow remote uploads into the selected folder.&lt;/p&gt;

&lt;p&gt;Firefox and Safari don’t currently expose the same writable directory picker.&lt;/p&gt;

&lt;p&gt;So today:&lt;/p&gt;

&lt;p&gt;Chrome / Edge host&lt;/p&gt;

&lt;p&gt;Browse ✅&lt;br&gt;
Preview ✅&lt;br&gt;
Download ✅&lt;br&gt;
Optional uploads ✅&lt;/p&gt;

&lt;p&gt;Firefox / Safari host&lt;/p&gt;

&lt;p&gt;Browse ✅&lt;br&gt;
Preview ✅&lt;br&gt;
Download ✅&lt;br&gt;
Host uploads ❌&lt;/p&gt;

&lt;p&gt;Firefox and Safari can still be the remote device and upload to a compatible Chrome/Edge host.&lt;/p&gt;

&lt;p&gt;Instead of silently hiding the feature, RelicBeam now explains when the host browser is operating in read-only mode.&lt;/p&gt;

&lt;p&gt;I kept uploads deliberately non-destructive&lt;/p&gt;

&lt;p&gt;Remote Files has no controls for:&lt;/p&gt;

&lt;p&gt;delete&lt;br&gt;
rename&lt;br&gt;
move&lt;br&gt;
intentional overwrite&lt;/p&gt;

&lt;p&gt;If an incoming filename already exists, the upload is rejected.&lt;/p&gt;

&lt;p&gt;The goal is to keep remote access useful without turning it into full remote filesystem control.&lt;/p&gt;

&lt;p&gt;WebRTC vs malware scanning&lt;/p&gt;

&lt;p&gt;There’s also an interesting security tradeoff.&lt;/p&gt;

&lt;p&gt;RelicBeam’s normal file-sharing modes send uploaded files through the server so they can be malware-scanned with ClamAV and then encrypted at rest.&lt;/p&gt;

&lt;p&gt;Those transfers are therefore not E2EE.&lt;/p&gt;

&lt;p&gt;Device Portal uses WebRTC instead, so Remote Files and Remote View are E2EE between browsers, but Remote Files uploads cannot be server-side malware-scanned because RelicBeam never receives the plaintext.&lt;/p&gt;

&lt;p&gt;I’d rather make that distinction clear than slap one vague security claim over everything.&lt;/p&gt;

&lt;p&gt;The rest of RelicBeam&lt;/p&gt;

&lt;p&gt;Remote Files is one part of the project:&lt;/p&gt;

&lt;p&gt;Room — share files/text with a group using one QR/code&lt;br&gt;
Quick Beam — one-to-one file/text sharing&lt;br&gt;
Beam Link — temporary direct-download links&lt;br&gt;
Device Portal — Remote Files + view-only Remote View&lt;br&gt;
Convert — local PDF/image tools before sharing&lt;/p&gt;

&lt;p&gt;No accounts, and no permanent RelicBeam file library.&lt;/p&gt;

&lt;p&gt;You can try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relicbeam.com" rel="noopener noreferrer"&gt;https://relicbeam.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Device Portal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://relicbeam.com/device-portal" rel="noopener noreferrer"&gt;https://relicbeam.com/device-portal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m at the point where I’m trying to find rough edges rather than add more features.&lt;/p&gt;

&lt;p&gt;If anyone tries Remote Files, I’d especially appreciate feedback on browser compatibility, mobile behavior, WebRTC failures, or anything that feels confusing.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
