<?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: Rhein</title>
    <description>The latest articles on DEV Community by Rhein (@rhein).</description>
    <link>https://dev.to/rhein</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%2F4056679%2F3af808c3-fd29-43c1-9c1d-20bf58113a1c.jpg</url>
      <title>DEV Community: Rhein</title>
      <link>https://dev.to/rhein</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rhein"/>
    <language>en</language>
    <item>
      <title>I built 79 browser tools that never upload your data — here's why client-side matters</title>
      <dc:creator>Rhein</dc:creator>
      <pubDate>Fri, 31 Jul 2026 13:27:31 +0000</pubDate>
      <link>https://dev.to/rhein/i-built-79-browser-tools-that-never-upload-your-data-heres-why-client-side-matters-2o29</link>
      <guid>https://dev.to/rhein/i-built-79-browser-tools-that-never-upload-your-data-heres-why-client-side-matters-2o29</guid>
      <description>&lt;p&gt;Every developer has hit this: you need to resize an image, decode a JWT, or format a messy JSON blob. So you search "online [thing]", land on some tool, and… it wants to upload your file to a server first.&lt;/p&gt;

&lt;p&gt;For a random stock photo, fine. For a customer CSV, a production JWT, or a screenshot of an internal dashboard? You just handed a stranger's server your data.&lt;/p&gt;

&lt;p&gt;I got tired of that, so I built &lt;strong&gt;&lt;a href="https://smart-tools.xyz" rel="noopener noreferrer"&gt;SmartTools&lt;/a&gt;&lt;/strong&gt; — 79 small, single-purpose tools that do all the work &lt;strong&gt;in your browser&lt;/strong&gt;. Nothing is uploaded. Ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule: the data never leaves the tab
&lt;/h2&gt;

&lt;p&gt;Open any tool, open your browser's Network tab, and use it. You'll see no upload request. That's the whole design constraint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image tools&lt;/strong&gt; (resize, crop, compress, convert JPG/PNG/WebP, favicon, colour-palette extraction) run on a &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;. The file is read with &lt;code&gt;FileReader&lt;/code&gt;, drawn, re-encoded, and handed back — the bytes never touch a network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text &amp;amp; dev tools&lt;/strong&gt; (JSON formatter, Base64, JWT decode, hash, regex tester, URL encode, cron parser, UUID, number-base) are plain JavaScript on the string you paste.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculators&lt;/strong&gt; (finance, health, math) are just arithmetic on your device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because there's no server round-trip, the tools also work offline after first load, and there are no accounts, no rate limits, and no "upgrade to process files over 5 MB".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is more than a privacy nicety
&lt;/h2&gt;

&lt;p&gt;A few things fall out of the client-side approach that genuinely surprised me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The JSON formatter uses your browser's own &lt;code&gt;JSON.parse&lt;/code&gt;.&lt;/strong&gt; If it says your document is valid, every runtime built on the same spec parses it too — no lenient validator quietly accepting a trailing comma that breaks in prod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The UUID generator uses &lt;code&gt;crypto.getRandomValues&lt;/code&gt;, not &lt;code&gt;Math.random&lt;/code&gt;.&lt;/strong&gt; That distinction matters the moment a UUID becomes a token instead of a row id — predictable randomness is a real breach class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image conversion strips EXIF/GPS as a side effect&lt;/strong&gt; of redrawing on a canvas. Handy when you're about to post a phone photo somewhere public.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that needs a backend. It's all sitting in the browser already; most "online tools" just don't use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest trade-offs
&lt;/h2&gt;

&lt;p&gt;Client-side isn't free of limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Big images hit browser memory/canvas caps (a 50 MP photo is ~200 MB decoded before you even encode).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest trade-offs
&lt;/h2&gt;

&lt;p&gt;Client-side isn't free of limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Big images hit browser memory/canvas caps (a 50 MP photo is ~200 MB decoded before you even encode).&lt;/li&gt;
&lt;li&gt;There's no server to do heavy lifting like OCR or real video transcoding.&lt;/li&gt;
&lt;li&gt;You're trusting the page's JavaScript — but that's inspectable, and "no network request" is verifiable in a way "we delete your file after an hour" never is.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free and multilingual
&lt;/h2&gt;

&lt;p&gt;79 tools, 7 languages (EN/DE/ES/FR/IT/NL/UK), no sign-up. Every calculator's maths is cross-checked against an independent implementation before it ships, because a calculator that's confidently wrong is worse than none.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://smart-tools.xyz" rel="noopener noreferrer"&gt;smart-tools.xyz&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd genuinely like feedback — especially: &lt;strong&gt;which tool would you want next?&lt;/strong&gt; I pick what to build from real demand, so tell me what you keep googling.&lt;/p&gt;

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