<?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: Jazi Tech</title>
    <description>The latest articles on DEV Community by Jazi Tech (@jazitech).</description>
    <link>https://dev.to/jazitech</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%2F4196352%2F838f628f-3fda-4b34-a7e1-deac190a4724.png</url>
      <title>DEV Community: Jazi Tech</title>
      <link>https://dev.to/jazitech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jazitech"/>
    <language>en</language>
    <item>
      <title>Everything Client-Side: How I Built 50+ Free Browser Tools That Never Upload Your Files</title>
      <dc:creator>Jazi Tech</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:24:44 +0000</pubDate>
      <link>https://dev.to/jazitech/everything-client-side-how-i-built-50-free-browser-tools-that-never-upload-your-files-5g6p</link>
      <guid>https://dev.to/jazitech/everything-client-side-how-i-built-50-free-browser-tools-that-never-upload-your-files-5g6p</guid>
      <description>&lt;p&gt;When I started building &lt;a href="https://segaflash.com/tools/" rel="noopener noreferrer"&gt;SegaFlash&lt;/a&gt;, I made one architectural decision that shaped everything: &lt;strong&gt;if a file can be processed in the browser, it never touches a server.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No upload queues. No "your file will be deleted in 24 hours" promises you have to trust. No storage costs. Here is what that looks like in practice, and what I learned shipping 50+ tools this way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack is boring — on purpose
&lt;/h2&gt;

&lt;p&gt;Almost everything is vanilla JavaScript plus a few well-chosen libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Canvas API&lt;/strong&gt; for image compression, resizing, watermarking and format conversion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pdf-lib / PDF.js&lt;/strong&gt; for merging, splitting and editing PDFs entirely in memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tesseract.js&lt;/strong&gt; for OCR that runs on the user's own CPU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ONNX Runtime Web&lt;/strong&gt; for AI tasks like background removal — the model downloads once (~40 MB) and then inference is 100% local&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lesson 1: File size is a UX problem, not a storage problem
&lt;/h2&gt;

&lt;p&gt;The background remover taught me this. Users would upload a 45 MP phone photo and the model would choke. The fix was simple: downscale to a max of 1024px on the longest edge &lt;em&gt;before&lt;/em&gt; inference. Quality stayed great for the output people actually need, and processing time dropped by ~5x.&lt;/p&gt;

&lt;p&gt;The same trick powers the &lt;a href="https://segaflash.com/2026/09/06/image-compressor/" rel="noopener noreferrer"&gt;image compressor&lt;/a&gt; — draw to canvas at the target dimensions, export at a quality ladder (try 0.85, step down until the size target is met), done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 2: WordPress will mangle your JavaScript
&lt;/h2&gt;

&lt;p&gt;Most of the tools live inside WordPress posts, and &lt;code&gt;wpautop&lt;/code&gt; loves injecting &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; tags into inline scripts — which silently kills them with syntax errors. Six of my tools were dead for exactly this reason (plus a regex-escaping bug and one missing brace).&lt;/p&gt;

&lt;p&gt;The durable fix was a single render-time snippet that protects tool scripts from &lt;code&gt;wpautop&lt;/code&gt; mangling, instead of editing 51 posts one by one. If you ship JS inside CMS content, sanitize at render time, not at authoring time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 3: "Runs locally" is a feature users understand
&lt;/h2&gt;

&lt;p&gt;I expected people to care about speed. They care about &lt;strong&gt;privacy&lt;/strong&gt; more. "Your files never leave your device" is the single line that converts visitors — for the &lt;a href="https://segaflash.com/2026/09/06/pdftoword/" rel="noopener noreferrer"&gt;PDF to Word converter&lt;/a&gt;, the &lt;a href="https://segaflash.com/password-generator/" rel="noopener noreferrer"&gt;password generator&lt;/a&gt;, everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trade-offs are real
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Big WASM models mean a heavy first load (mitigate: lazy-load the model only when the tool is opened, and show honest progress)&lt;/li&gt;
&lt;li&gt;Low-end phones struggle with OCR and AI inference&lt;/li&gt;
&lt;li&gt;You can't do anything that genuinely needs a server (real-time collab, huge files)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for the classic "utility tool" category — compress, convert, generate, calculate — the browser is enough, and the user wins on privacy, speed and cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try them
&lt;/h2&gt;

&lt;p&gt;All 50+ tools are free with no sign-up on the &lt;a href="https://segaflash.com/tools/" rel="noopener noreferrer"&gt;SegaFlash tools hub&lt;/a&gt;. The calculators (like the &lt;a href="https://segaflash.com/2026/10/09/mortgage-calculator/" rel="noopener noreferrer"&gt;mortgage calculator&lt;/a&gt; and &lt;a href="https://segaflash.com/bmi-calculator/" rel="noopener noreferrer"&gt;BMI calculator&lt;/a&gt;) are pure JS too — view source and steal whatever is useful.&lt;/p&gt;

&lt;p&gt;If you are building client-side tools, I would love to hear how you handle the model-size problem. Drop your approach in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
