<?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: Basil Aslam n p</title>
    <description>The latest articles on DEV Community by Basil Aslam n p (@basilaslamnp).</description>
    <link>https://dev.to/basilaslamnp</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3976211%2Fdba5163b-4d51-4fe8-98fa-b262079d3894.jpg</url>
      <title>DEV Community: Basil Aslam n p</title>
      <link>https://dev.to/basilaslamnp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/basilaslamnp"/>
    <language>en</language>
    <item>
      <title>I built 30+ file tools that run entirely in your browser — no server, no uploads</title>
      <dc:creator>Basil Aslam n p</dc:creator>
      <pubDate>Tue, 09 Jun 2026 14:53:36 +0000</pubDate>
      <link>https://dev.to/basilaslamnp/i-built-30-file-tools-that-run-entirely-in-your-browser-no-server-no-uploads-20n8</link>
      <guid>https://dev.to/basilaslamnp/i-built-30-file-tools-that-run-entirely-in-your-browser-no-server-no-uploads-20n8</guid>
      <description>&lt;p&gt;Most "free online tools" sites have the same dirty secret: when you merge a PDF or compress an image, your file gets uploaded to their server. For anything sensitive — contracts, IDs, personal photos — that's a problem most people never think about.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://useonlinetools.com" rel="noopener noreferrer"&gt;UseOnlineTools&lt;/a&gt; as an experiment: a tools site where &lt;em&gt;nothing&lt;/em&gt; touches a server. Every operation runs client-side in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Astro&lt;/strong&gt; — ships zero JS by default, each tool is an island, great Core Web Vitals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WASM + &lt;code&gt;pdf-lib&lt;/code&gt; / &lt;code&gt;pdf.js&lt;/code&gt;&lt;/strong&gt; — PDF operations (merge, split, compress, rotate, convert)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas + WASM codecs&lt;/strong&gt; — image work (compress, resize, HEIC→JPG, PNG→WebP, EXIF stripping)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure JS&lt;/strong&gt; — dev tools (JSON formatter, regex tester, JWT decoder, hashing, UUIDs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Pages&lt;/strong&gt; — fully static hosting, near-zero ops cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The interesting constraint
&lt;/h2&gt;

&lt;p&gt;Deciding what &lt;em&gt;can't&lt;/em&gt; be done client-side. Anything needing a rate-limited third-party API or heavy video transcode got cut.&lt;/p&gt;

&lt;p&gt;The rule became: &lt;strong&gt;if a tool needs a backend, it doesn't belong on this site.&lt;/strong&gt; That constraint is also the privacy guarantee and the cost model — all three are the same decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few things I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HEIC decoding in the browser is genuinely painful.&lt;/strong&gt; The WASM decoder is large and you have to lazy-load it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Your file never leaves your device" is hard to &lt;em&gt;communicate&lt;/em&gt;.&lt;/strong&gt; Users don't believe it by default. Still working on how to surface that trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static-first means SEO content and the tool can coexist&lt;/strong&gt; on one fast page without a framework fighting you.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;It's live and free. I'd love feedback from this crowd specifically — on the architecture choices, on tools that break, or on what client-side tool you wish existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you have built differently?&lt;/strong&gt;&lt;/p&gt;

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