<?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: Dinesh Kumar</title>
    <description>The latest articles on DEV Community by Dinesh Kumar (@dinesh_kumar-g).</description>
    <link>https://dev.to/dinesh_kumar-g</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%2F4244442%2F30ac3bdc-007f-4c97-9148-6cba6889b4a8.png</url>
      <title>DEV Community: Dinesh Kumar</title>
      <link>https://dev.to/dinesh_kumar-g</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dinesh_kumar-g"/>
    <language>en</language>
    <item>
      <title>How I built a file converter that never uploads your files</title>
      <dc:creator>Dinesh Kumar</dc:creator>
      <pubDate>Sat, 14 Nov 2026 12:12:43 +0000</pubDate>
      <link>https://dev.to/dinesh_kumar-g/how-i-built-a-file-converter-that-never-uploads-your-files-3oa5</link>
      <guid>https://dev.to/dinesh_kumar-g/how-i-built-a-file-converter-that-never-uploads-your-files-3oa5</guid>
      <description>&lt;p&gt;Every time I needed to merge a couple of PDFs or turn an iPhone HEIC into a JPG, I hit the same wall: almost every “free online converter” wants me to upload my file to their server. For a meme, fine. For a signed contract, a payslip, or a passport scan? That’s a copy of a private document sitting on a machine I don’t control, for as long as that service decides to keep it.&lt;/p&gt;

&lt;p&gt;So I built ConvertWarp around one rule: the file never leaves your device.&lt;/p&gt;

&lt;p&gt;The core idea: no conversion backend at all&lt;/p&gt;

&lt;p&gt;The interesting constraint is that there is no server-side conversion. There’s no upload endpoint, no processing queue, no “we’ll delete your file in 2 hours” promise to trust — because the file is never sent anywhere. Everything runs in the browser via WebAssembly.&lt;/p&gt;

&lt;p&gt;The stack:&lt;/p&gt;

&lt;p&gt;ffmpeg.wasm — audio/video. MP4→MP3, extract audio, compress video, MKV/MOV→MP4, GIF making. It’s literally FFmpeg compiled to WASM, running on the user’s CPU.&lt;br&gt;
pdf-lib + pdf.js — PDF operations. Merge, split, compress, delete pages, rotate, PDF→image, image→PDF.&lt;br&gt;
Tesseract.js — OCR. Image-to-text and scanned-PDF text extraction, entirely client-side.&lt;br&gt;
Format-specific libs (HEIC decoding, Office/spreadsheet handling) for the long tail of ~70 tools.&lt;/p&gt;

&lt;p&gt;The whole thing is a static export (Next.js) hosted on Cloudflare. No server runtime means no per-conversion CPU cost and nothing to scale — the user’s own device does the work. A nice side effect: once the WASM is cached, the tools work offline.&lt;/p&gt;

&lt;p&gt;Why this is a genuinely better privacy model&lt;/p&gt;

&lt;p&gt;The usual privacy pitch is “we delete your files.” That’s a promise. The in-browser model removes the need for the promise: open your browser’s Network tab while you convert, and you’ll see no file data leaving the page. Go offline and the conversion still works. There’s no server-side copy to leak, subpoena, or sell — it was never created.&lt;/p&gt;

&lt;p&gt;That turned out to be the whole product’s identity: free, no signup, no watermarks, no size paywall, and private by architecture rather than by policy.&lt;/p&gt;

&lt;p&gt;The trade-offs (because there are always trade-offs)&lt;/p&gt;

&lt;p&gt;This approach isn’t free lunch:&lt;/p&gt;

&lt;p&gt;Browser memory is the ceiling. A server can stream a 4GB video through FFmpeg; a browser tab can’t. Large video jobs are where client-side genuinely struggles, and I’m honest about that in the UI.&lt;br&gt;
WASM is slower than native. For a big batch, a native desktop app will beat it. For the everyday “convert these 10 photos” case, it’s plenty fast and the privacy win is worth it.&lt;br&gt;
Bundle size. ffmpeg.wasm and the PDF/OCR engines are big. Lazy-loading per tool (you only pull FFmpeg when you open a video tool) was essential to keep the initial load sane.&lt;br&gt;
No server means no server-side features — things like scheduled jobs or huge-file handling are simply out of scope by design.&lt;br&gt;
What I learned&lt;/p&gt;

&lt;p&gt;The biggest lesson: a constraint can be the product. “No backend” started as a privacy idea and ended up shaping everything — the hosting (static/Cloudflare, basically free to run), the offline capability, and the honest marketing (“your files are never uploaded” is a fact you can verify, not a slogan).&lt;/p&gt;

&lt;p&gt;If you’re building anything that handles users’ files, it’s worth asking how much actually needs a server. For a surprising amount of file manipulation, the answer is “none” — and WebAssembly has quietly made that practical.&lt;/p&gt;

&lt;p&gt;If you want to poke at it, it’s live at convertwarp.com — I’d love feedback on the approach, and especially on what breaks.&lt;/p&gt;

&lt;p&gt;Tags: #webdev #javascript #privacy #showdev&lt;/p&gt;

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