<?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: Indie Maker</title>
    <description>The latest articles on DEV Community by Indie Maker (@indiemaker).</description>
    <link>https://dev.to/indiemaker</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%2F4153644%2F797c4242-6e6d-414f-928c-5539b164039f.png</url>
      <title>DEV Community: Indie Maker</title>
      <link>https://dev.to/indiemaker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/indiemaker"/>
    <language>en</language>
    <item>
      <title>Your files don't need to leave the device: building browser-local tools</title>
      <dc:creator>Indie Maker</dc:creator>
      <pubDate>Thu, 01 Oct 2026 05:22:34 +0000</pubDate>
      <link>https://dev.to/indiemaker/your-files-dont-need-to-leave-the-device-building-browser-local-tools-3doa</link>
      <guid>https://dev.to/indiemaker/your-files-dont-need-to-leave-the-device-building-browser-local-tools-3doa</guid>
      <description>&lt;p&gt;Most "free online tools" work like this: you upload your file to a server, it does the work, you download the result. For many tasks, that round trip is pointless — your browser can do the whole job locally, faster and more privately.&lt;/p&gt;

&lt;p&gt;I learned this building a small toolbox of utilities, and the pattern is simpler than people expect. Here's the playbook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading files without uploading.&lt;/strong&gt; The File API gives you everything: an &lt;code&gt;&amp;lt;input type="file"&amp;gt;&lt;/code&gt; plus &lt;code&gt;URL.createObjectURL()&lt;/code&gt; lets you work with the file entirely in memory. No &lt;code&gt;fetch&lt;/code&gt;, no &lt;code&gt;FormData&lt;/code&gt;, no server involved at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images: canvas does the heavy lifting.&lt;/strong&gt; Compression and format conversion are just &lt;code&gt;drawImage&lt;/code&gt; into a canvas followed by &lt;code&gt;canvas.toBlob()&lt;/code&gt; with a quality setting, or &lt;code&gt;toDataURL('image/webp')&lt;/code&gt; for conversion. Resizing is the same pipeline. The browser's image decoders are excellent — you get quality comparable to server-side tools for the common cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDFs: real libraries run in the browser now.&lt;/strong&gt; pdf-lib can merge and split PDFs purely client-side; pdf.js renders previews. These are the same libraries server tools use, just bundled for the browser. The main gotcha is memory: a 200MB PDF will hurt on a low-end phone, so process in chunks where you can and warn the user before tackling huge files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text and dev utilities are trivially local.&lt;/strong&gt; JSON formatting, Base64, UUIDs, hashing, QR codes — all pure functions. There's never a reason for these to touch a network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The architecture payoff.&lt;/strong&gt; With zero backend, the whole thing is a static site. Hosting costs next to nothing, there are no servers to scale, and the privacy story writes itself: files never leave the device because there's nowhere for them to go. That's not a marketing line — it's a structural guarantee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for.&lt;/strong&gt; Mobile Safari has quirks around large blobs and downloads; always test the download step (&lt;code&gt;a[download]&lt;/code&gt; + object URL) on real devices. And be honest about limits: browser-local can't do OCR well or handle truly massive files — say so in the UI instead of failing mysteriously.&lt;/p&gt;

&lt;p&gt;I put this approach into practice with Quick Toolbox (&lt;a href="https://tools.toppn.com/" rel="noopener noreferrer"&gt;https://tools.toppn.com/&lt;/a&gt;) — 14 free utilities, all client-side, no sign-up. If you're building tools like these, start local-first and only add a server when the browser genuinely can't do the job.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>privacy</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
