<?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: yangjiaqiang12</title>
    <description>The latest articles on DEV Community by yangjiaqiang12 (@yangjiaqiang12).</description>
    <link>https://dev.to/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>DEV Community: yangjiaqiang12</title>
      <link>https://dev.to/yangjiaqiang12</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yangjiaqiang12"/>
    <language>en</language>
    <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://dev.to/yangjiaqiang12/client-side-image-processing-why-your-images-should-never-leave-your-browser-3ji6</link>
      <guid>https://dev.to/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://dev.to/yangjiaqiang12/5-free-image-compression-tools-compared-privacy-speed-and-quality-2026-305n</link>
      <guid>https://dev.to/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://dev.to/yangjiaqiang12/i-built-a-free-image-compressor-that-never-uploads-your-files-5da7</link>
      <guid>https://dev.to/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's computer. TinyPNG does it. Compressor.io does it. Even most so-called "free" tools collect your data on their servers.&lt;/p&gt;

&lt;p&gt;This has always felt wrong to me. Images can contain sensitive stuff -- screenshots of conversations, 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://yangjiaqiang12.github.io/squash-image-compressor/" 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 processing&lt;/strong&gt; -- compress multiple images at once&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;Resize&lt;/strong&gt; -- set max dimensions while compressing&lt;/li&gt;
&lt;li&gt;🌓 &lt;strong&gt;Dark mode&lt;/strong&gt; -- works great at night&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Completely free&lt;/strong&gt; -- no limits, no watermarks&lt;/li&gt;
&lt;/ul&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 the heavy lifting happens on your device hardware -- not on some server farm.&lt;/p&gt;

&lt;p&gt;The processing pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Load&lt;/strong&gt; -- Image is decoded from file into raw pixel data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resize&lt;/strong&gt; -- If a max width is set, image is scaled down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encode&lt;/strong&gt; -- Pixel data is re-encoded at the chosen quality and format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download&lt;/strong&gt; -- The compressed result is ready to save&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I wanted a tool that respects privacy. Not as a marketing slogan -- as a &lt;strong&gt;technical guarantee&lt;/strong&gt;. Your images literally cannot be uploaded because there is no server to upload them to. The entire application is static HTML, CSS, and JavaScript served from GitHub Pages.&lt;/p&gt;

&lt;p&gt;The source code is open (MIT license). You can inspect every line. You can host it yourself. You can verify that nothing leaves your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison with Other Tools
&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 Mode&lt;/th&gt;
&lt;th&gt;WebP Support&lt;/th&gt;
&lt;th&gt;Price&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 only&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Squoosh&lt;/td&gt;
&lt;td&gt;✅ Local only&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TinyPNG&lt;/td&gt;
&lt;td&gt;❌ Uploads&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Free (20/day)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compressor.io&lt;/td&gt;
&lt;td&gt;❌ Uploads&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Free (10MB cap)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The key difference:&lt;/strong&gt; Squash and Squoosh process locally. But Squoosh has no batch mode. Squash is the only tool that combines &lt;strong&gt;local processing + batch mode + multi-format + unlimited use&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vanilla HTML/CSS/JavaScript&lt;/strong&gt; -- No frameworks, no dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas API&lt;/strong&gt; -- Browser-native image processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Pages&lt;/strong&gt; -- Free, fast static hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero backend&lt;/strong&gt; -- No server, no database, no API calls&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://yangjiaqiang12.github.io/squash-image-compressor/" 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;Source Code on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful, consider &lt;a href="https://ko-fi.com/squashtools" rel="noopener noreferrer"&gt;buying me a coffee&lt;/a&gt; ☕ -- it helps keep the project alive and improving.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with vanilla HTML/CSS/JS. No frameworks, no dependencies, no build step. MIT licensed.&lt;/em&gt;&lt;/p&gt;

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