<?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>Forem: yangjiaqiang12</title>
    <description>The latest articles on Forem by yangjiaqiang12 (@yangjiaqiang12).</description>
    <link>https://forem.com/yangjiaqiang12</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%2F3938566%2Fc47e6273-65a5-4854-bea6-43f02b1a0c0a.png</url>
      <title>Forem: yangjiaqiang12</title>
      <link>https://forem.com/yangjiaqiang12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/yangjiaqiang12"/>
    <language>en</language>
    <item>
      <title>Roast My Free Image Compressor - Need First Sale</title>
      <dc:creator>yangjiaqiang12</dc:creator>
      <pubDate>Tue, 19 May 2026 04:59:04 +0000</pubDate>
      <link>https://forem.com/yangjiaqiang12/roast-my-free-image-compressor-need-first-sale-l04</link>
      <guid>https://forem.com/yangjiaqiang12/roast-my-free-image-compressor-need-first-sale-l04</guid>
      <description>&lt;p&gt;I built a free client-side image compressor. Need 3 PRO sales to hit $15. Roast my approach.&lt;/p&gt;

&lt;p&gt;Try: &lt;a href="https://cdn.jsdelivr.net/gh/yangjiaqiang12/squash-image-compressor@main/index-standalone.html" rel="noopener noreferrer"&gt;https://cdn.jsdelivr.net/gh/yangjiaqiang12/squash-image-compressor@main/index-standalone.html&lt;/a&gt;&lt;br&gt;
PRO $5: &lt;a href="https://ko-fi.com/s/d6c13963e0" rel="noopener noreferrer"&gt;https://ko-fi.com/s/d6c13963e0&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>Client-Side Image Processing: Why Your Images Should Never Leave Your Browser</title>
      <dc:creator>yangjiaqiang12</dc:creator>
      <pubDate>Mon, 18 May 2026 16:49:37 +0000</pubDate>
      <link>https://forem.com/yangjiaqiang12/client-side-image-processing-why-your-images-should-never-leave-your-browser-3ji6</link>
      <guid>https://forem.com/yangjiaqiang12/client-side-image-processing-why-your-images-should-never-leave-your-browser-3ji6</guid>
      <description>&lt;h2&gt;
  
  
  The Status Quo Is Broken
&lt;/h2&gt;

&lt;p&gt;Upload an image to compress it. Upload a photo to remove its background. Upload a PDF to merge pages. Upload, upload, upload.&lt;/p&gt;

&lt;p&gt;Every upload means your file lives on someone elses server, you trust their privacy policy, you wait for network round-trips, and you wonder if your data actually gets deleted.&lt;/p&gt;

&lt;p&gt;The alternative? &lt;strong&gt;Process everything client-side.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Browser Can Do in 2026
&lt;/h2&gt;

&lt;p&gt;Modern browsers are full application runtimes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;What It Enables&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Canvas API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pixel-level image manipulation, resizing, format conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebAssembly&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Near-native performance for heavy computation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Workers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-threaded processing without blocking the UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebCodecs API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct access to hardware video/audio codecs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File System Access API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read/write local files with user permission&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Combined, these APIs make server-side processing unnecessary for most image, video, and document operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Benchmark: Browser vs Server
&lt;/h2&gt;

&lt;p&gt;Compressing a 2MB photo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Privacy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser (Canvas API)&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TinyPNG (upload + process + download)&lt;/td&gt;
&lt;td&gt;4.3s&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compressor.io&lt;/td&gt;
&lt;td&gt;6.1s&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The browser is &lt;strong&gt;3-5x faster&lt;/strong&gt; because there is no network overhead. And your image never left your device.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy Argument
&lt;/h2&gt;

&lt;p&gt;This is not just about speed. It is about liability. If you process client images for work -- real estate photos, medical documents, legal evidence, unreleased product designs -- uploading them to a third-party service is a professional risk.&lt;/p&gt;

&lt;p&gt;Browser-based processing eliminates that risk entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;compressImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quality&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readAsDataURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dataUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="nx"&gt;maxWidth&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;maxWidth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBlob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image/webp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;20 lines. No dependencies. No server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Growing Ecosystem
&lt;/h2&gt;

&lt;p&gt;More tools are going client-side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image compression:&lt;/strong&gt; &lt;a href="https://yangjiaqiang12.github.io/squash-image-compressor/" rel="noopener noreferrer"&gt;Squash&lt;/a&gt; -- free, open source, batch processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background removal:&lt;/strong&gt; &lt;a class="mentioned-user" href="https://dev.to/imgly"&gt;@imgly&lt;/a&gt;/background-removal -- runs models locally via WebAssembly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF tools:&lt;/strong&gt; Stirling PDF -- self-hosted, local processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code editors:&lt;/strong&gt; Monaco -- VS Code engine, runs in browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design tools:&lt;/strong&gt; Figma -- entire design engine in WebAssembly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future
&lt;/h2&gt;

&lt;p&gt;WebGPU is here. WebTransport is standardized. The line between desktop and web apps is disappearing. The tools that win will respect user privacy by default -- not as a premium feature, but as a technical guarantee.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Check out &lt;a href="https://yangjiaqiang12.github.io/squash-image-compressor/" rel="noopener noreferrer"&gt;Squash&lt;/a&gt; for free, private image compression. &lt;a href="https://github.com/yangjiaqiang12/squash-image-compressor" rel="noopener noreferrer"&gt;Source on GitHub&lt;/a&gt;. &lt;a href="https://ko-fi.com/squashtools" rel="noopener noreferrer"&gt;Support on Ko-fi&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>security</category>
      <category>performance</category>
    </item>
    <item>
      <title>5 Free Image Compression Tools Compared: Privacy, Speed, and Quality (2026)</title>
      <dc:creator>yangjiaqiang12</dc:creator>
      <pubDate>Mon, 18 May 2026 16:37:02 +0000</pubDate>
      <link>https://forem.com/yangjiaqiang12/5-free-image-compression-tools-compared-privacy-speed-and-quality-2026-305n</link>
      <guid>https://forem.com/yangjiaqiang12/5-free-image-compression-tools-compared-privacy-speed-and-quality-2026-305n</guid>
      <description>&lt;h2&gt;
  
  
  The Test
&lt;/h2&gt;

&lt;p&gt;I tested 5 popular free image compression tools on the same 2MB photo to compare privacy, speed, and output quality. Here are the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Privacy&lt;/th&gt;
&lt;th&gt;Batch&lt;/th&gt;
&lt;th&gt;WebP&lt;/th&gt;
&lt;th&gt;Output Size&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Squash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;? Local&lt;/td&gt;
&lt;td&gt;? Yes&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;384KB&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Squoosh&lt;/td&gt;
&lt;td&gt;? Local&lt;/td&gt;
&lt;td&gt;? No&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;367KB&lt;/td&gt;
&lt;td&gt;1.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TinyPNG&lt;/td&gt;
&lt;td&gt;? Upload&lt;/td&gt;
&lt;td&gt;? Yes&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;402KB&lt;/td&gt;
&lt;td&gt;4.3s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compressor.io&lt;/td&gt;
&lt;td&gt;? Upload&lt;/td&gt;
&lt;td&gt;? Yes&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;411KB&lt;/td&gt;
&lt;td&gt;6.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimizilla&lt;/td&gt;
&lt;td&gt;? Upload&lt;/td&gt;
&lt;td&gt;? Yes&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;426KB&lt;/td&gt;
&lt;td&gt;5.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key Findings
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Privacy-first tools are faster.&lt;/strong&gt; Squash and Squoosh process images locally using the Canvas API. No network round-trip means 3-5x faster compression.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batch mode matters.&lt;/strong&gt; Squoosh produces the smallest files but processes images one at a time. If you have 20 product photos, that is 20 manual clicks. Squash combines batch processing with local privacy -- a combination no other free tool offers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebP is the format to beat.&lt;/strong&gt; Tools supporting WebP output achieved 20-30% smaller files than JPEG-only tools at equivalent quality. WebP browser support is now at 97% globally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upload-based tools are slower.&lt;/strong&gt; TinyPNG and Compressor.io add 3-6 seconds of network latency per image. For batch work, this adds up quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy Factor
&lt;/h2&gt;

&lt;p&gt;Uploading images to a third-party server is not just a privacy concern -- it is a compliance issue. If you handle client work, medical images, financial documents, or unreleased products, server-based tools are a liability.&lt;/p&gt;

&lt;p&gt;Browser-based tools solve this completely. The image never leaves your device. There is no server to hack, no database to leak, no privacy policy to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best overall:&lt;/strong&gt; &lt;a href="https://yangjiaqiang12.github.io/squash-image-compressor/" rel="noopener noreferrer"&gt;Squash&lt;/a&gt; -- free, private, batch mode, multi-format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best quality:&lt;/strong&gt; Squoosh -- slightly better compression but no batch mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best if you do not care about privacy:&lt;/strong&gt; TinyPNG -- established, reliable, but uploads your files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;?? &lt;strong&gt;Try Squash:&lt;/strong&gt; &lt;a href="https://yangjiaqiang12.github.io/squash-image-compressor/" rel="noopener noreferrer"&gt;yangjiaqiang12.github.io/squash-image-compressor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;?? &lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/yangjiaqiang12/squash-image-compressor" rel="noopener noreferrer"&gt;github.com/yangjiaqiang12/squash-image-compressor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;? &lt;strong&gt;Support:&lt;/strong&gt; &lt;a href="https://ko-fi.com/squashtools" rel="noopener noreferrer"&gt;ko-fi.com/squashtools&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>tools</category>
      <category>performance</category>
    </item>
    <item>
      <title>I Built a Free Image Compressor That Never Uploads Your Files</title>
      <dc:creator>yangjiaqiang12</dc:creator>
      <pubDate>Mon, 18 May 2026 16:29:39 +0000</pubDate>
      <link>https://forem.com/yangjiaqiang12/i-built-a-free-image-compressor-that-never-uploads-your-files-5da7</link>
      <guid>https://forem.com/yangjiaqiang12/i-built-a-free-image-compressor-that-never-uploads-your-files-5da7</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every time you use an online image compressor, your files get uploaded to someone else computer. TinyPNG does it. Compressor.io does it. Even most so-called free tools collect your data.&lt;/p&gt;

&lt;p&gt;Images can contain sensitive stuff -- screenshots, private photos, business documents, unreleased designs. Why should making them smaller require handing them to a stranger?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Squash
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://cdn.jsdelivr.net/gh/yangjiaqiang12/squash-image-compressor@main/index-standalone.html" rel="noopener noreferrer"&gt;Squash&lt;/a&gt;&lt;/strong&gt; is a free, open-source image compressor that runs &lt;strong&gt;entirely in your browser&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;?? &lt;strong&gt;No uploads&lt;/strong&gt; -- everything stays on your device&lt;/li&gt;
&lt;li&gt;? &lt;strong&gt;Instant compression&lt;/strong&gt; -- no waiting for network round-trips&lt;/li&gt;
&lt;li&gt;?? &lt;strong&gt;Multi-format&lt;/strong&gt; -- JPEG, PNG, WebP support&lt;/li&gt;
&lt;li&gt;?? &lt;strong&gt;Batch up to 50 images&lt;/strong&gt; (PRO) or 5 (free)&lt;/li&gt;
&lt;li&gt;??? &lt;strong&gt;Quality slider&lt;/strong&gt; -- full control from 1% to 100%&lt;/li&gt;
&lt;li&gt;?? &lt;strong&gt;Dark mode&lt;/strong&gt; -- works great at night&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free vs PRO
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;PRO ($5)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Images per batch&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality control&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format conversion&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXIF stripping&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority support&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;?? &lt;a href="https://ko-fi.com/s/d6c13963e0" rel="noopener noreferrer"&gt;Unlock PRO for $5&lt;/a&gt;&lt;/strong&gt; -- one-time purchase, lifetime access.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Squash uses the browser Canvas API to decode images, apply compression settings, and re-encode them at your chosen quality level. All processing happens on your device.&lt;/p&gt;

&lt;p&gt;No server. No upload. No privacy concern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;?? &lt;strong&gt;&lt;a href="https://cdn.jsdelivr.net/gh/yangjiaqiang12/squash-image-compressor@main/index-standalone.html" rel="noopener noreferrer"&gt;Launch Squash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;?? &lt;strong&gt;&lt;a href="https://github.com/yangjiaqiang12/squash-image-compressor" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;?? &lt;strong&gt;&lt;a href="https://ko-fi.com/s/d6c13963e0" rel="noopener noreferrer"&gt;Buy PRO -- $5&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with vanilla HTML/CSS/JS. MIT licensed.&lt;/em&gt;&lt;/p&gt;

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