<?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: yue xing</title>
    <description>The latest articles on DEV Community by yue xing (@token111).</description>
    <link>https://dev.to/token111</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%2F4087986%2F86b82555-4629-45b8-9c3a-6743e1932cb9.png</url>
      <title>DEV Community: yue xing</title>
      <link>https://dev.to/token111</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/token111"/>
    <language>en</language>
    <item>
      <title>Don't trust "processed locally" — check it yourself in three steps</title>
      <dc:creator>yue xing</dc:creator>
      <pubDate>Tue, 01 Sep 2026 02:41:25 +0000</pubDate>
      <link>https://dev.to/token111/dont-trust-processed-locally-check-it-yourself-in-three-steps-11f9</link>
      <guid>https://dev.to/token111/dont-trust-processed-locally-check-it-yourself-in-three-steps-11f9</guid>
      <description>&lt;p&gt;Last term I had a batch of coursework images with faces in them, and we'd agreed they weren't leaving the group.&lt;/p&gt;

&lt;p&gt;Everything I needed to do to them — compress, convert — pointed at some online tool whose landing page said "secure" and "never stored." I had no way to check that. Then someone showed me the Network tab.&lt;/p&gt;




&lt;h3&gt;
  
  
  First, be clear about what you're checking
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"Upload" means your file went from your machine to their server.&lt;/strong&gt; The direction is outbound.&lt;/p&gt;

&lt;p&gt;There's one thing that gets confused with it constantly: &lt;strong&gt;the page downloading something to your browser.&lt;/strong&gt; Codecs for certain formats, or AI models, get pulled down to your browser and run there. The first time you use one of those features you'll see a request anywhere from tens of KB to hundreds of MB. That's the opposite direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I got this wrong on my first attempt&lt;/strong&gt; — saw a chunky request, assumed my image had been shipped off, and only on a closer look noticed it was a &lt;code&gt;.wasm&lt;/code&gt; file fetched with GET.&lt;/p&gt;

&lt;p&gt;This is a skill worth having once and keeping: applying for internships, handling ID photos before a job application, converting a medical form. Same move every time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: open the Network tab and clear it
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;F12&lt;/code&gt;, or &lt;code&gt;Option + Command + I&lt;/code&gt; on a Mac. Switch to &lt;strong&gt;Network&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two things to set up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tick &lt;strong&gt;Preserve log&lt;/strong&gt;, so a page navigation doesn't wipe your evidence&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;🚫 Clear&lt;/strong&gt; and start from an empty list&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: process an image and watch the list
&lt;/h3&gt;

&lt;p&gt;Do the normal thing: pick your file, adjust settings, run it, download the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two columns carry the answer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method.&lt;/strong&gt; Uploading a file is almost always &lt;code&gt;POST&lt;/code&gt; (occasionally &lt;code&gt;PUT&lt;/code&gt;). &lt;strong&gt;If nothing POSTs across the whole operation, nothing was uploaded.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payload.&lt;/strong&gt; If there is a POST, open it. Either you can see your filename and a wall of binary in there, or you can't. It's not subtle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Glance at the preview image's source too. Locally-processed tools usually show &lt;code&gt;blob:&lt;/code&gt; URLs — that's an object living in browser memory, which never crossed the network.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: separate downloads from uploads
&lt;/h3&gt;

&lt;p&gt;If you do see something substantial, three tests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Upload&lt;/th&gt;
&lt;th&gt;Runtime / model download&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Method&lt;/td&gt;
&lt;td&gt;POST / PUT&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filename&lt;/td&gt;
&lt;td&gt;yours, or a random token&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.wasm&lt;/code&gt;, &lt;code&gt;.onnx&lt;/code&gt;, &lt;code&gt;.bin&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When&lt;/td&gt;
&lt;td&gt;every single image&lt;/td&gt;
&lt;td&gt;usually just the first use of a feature&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Method is the reliable one.&lt;/strong&gt; GET fetches something in; POST sends something out.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I got when I actually ran it
&lt;/h3&gt;

&lt;p&gt;I did this on ImgIng's animation workshop (imging.ai), because I had a pile of GIFs to compress anyway.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Six animation files, 120×120 up to 720×405, largest 2.62 MB&lt;/li&gt;
&lt;li&gt;Imported, compressed and exported each of them, a dozen-plus rounds&lt;/li&gt;
&lt;li&gt;Result: &lt;strong&gt;zero POST requests across the whole session&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Preview URLs were &lt;code&gt;blob:&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing worth repeating, because it's the honest version: this tool states its own boundary in the interface — common formats run in the browser, &lt;strong&gt;but a few professional formats (HEIC writing, TIFF among them) are explicitly marked as server-side&lt;/strong&gt;, with a differently coloured chip. So "nothing uploaded" holds for the operations I actually performed. &lt;strong&gt;You verified your session, not the website.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the real takeaway. &lt;strong&gt;Verification is scoped to an operation, not to a domain.&lt;/strong&gt; Different feature, different format, look again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three things that trip people up
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analytics POSTs don't count.&lt;/strong&gt; Plenty of sites fire a few hundred bytes of telemetry. Open the payload — no image content, not an upload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No POST doesn't mean bulletproof.&lt;/strong&gt; In principle data could go out over a WebSocket or something more creative. For ordinary web tools, watching POST covers the overwhelming majority of cases. If what you're handling is genuinely sensitive, the stronger move is to &lt;strong&gt;pull your network connection and see whether the tool still works&lt;/strong&gt; — plenty of local-first tools do, and that's a much harder claim to fake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open the panel before you start.&lt;/strong&gt; It only records what happens after it's open. Obvious in hindsight, annoying at the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  That's it
&lt;/h3&gt;

&lt;p&gt;No frontend knowledge required, nothing to install, about three minutes end to end. &lt;strong&gt;Before you drop your ID scan, your coursework data, or a signed document into a website you've never heard of, three minutes is a good trade.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>images</category>
    </item>
    <item>
      <title>Why the same image comes back 4x smaller from one tool than another</title>
      <dc:creator>yue xing</dc:creator>
      <pubDate>Wed, 26 Aug 2026 12:08:31 +0000</pubDate>
      <link>https://dev.to/token111/why-the-same-image-comes-back-4x-smaller-from-one-tool-than-another-463b</link>
      <guid>https://dev.to/token111/why-the-same-image-comes-back-4x-smaller-from-one-tool-than-another-463b</guid>
      <description>&lt;p&gt;A designer sent me two versions of the same product shot. Hers was 840 KB. Mine, after running it through a different tool, was 190 KB. Side by side on a laptop screen, I could not tell them apart.&lt;/p&gt;

&lt;p&gt;That gap is not one tool being "better at compression." It comes from four separate decisions, and most tools make them silently. Once you know what the four are, you can tell whether a tool is optimizing or just quietly throwing away quality you did not agree to lose.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Format beats parameters, by a lot
&lt;/h2&gt;

&lt;p&gt;This is the one people skip, and it dominates everything else.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PNG&lt;/strong&gt; is lossless. Great for screenshots, icons, flat color, anything needing transparency. Storing photographs in it is the most common waste — photos have almost no repeating pixel patterns, so lossless has nothing to grab onto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JPEG&lt;/strong&gt; is lossy and built for photographs. No transparency, and hard edges on text pick up ringing artifacts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebP&lt;/strong&gt; lands roughly 25–35% under JPEG at comparable quality, and it supports transparency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AVIF&lt;/strong&gt; goes smaller still, but encodes slowly and older software may refuse to open it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if tool A hands you back a WebP when you fed it a PNG, of course its output is dramatically smaller. That is not a better algorithm. That is a different event.&lt;/p&gt;

&lt;p&gt;Before you compare two tools, check what container came back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// drop this in the console after downloading both files&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buf&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;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&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;sig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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;12&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// 89504e47 → PNG   ffd8ff → JPEG&lt;/span&gt;
&lt;span class="c1"&gt;// 52494646 ... 57454250 → RIFF….WEBP&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the signatures differ, the size comparison is meaningless and everything below is moot.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Quality 100 is not "safe," it is expensive
&lt;/h2&gt;

&lt;p&gt;Every lossy encoder exposes a quality knob, usually 0–100. The reflex is to drag it to 95 or 100 and feel responsible about it.&lt;/p&gt;

&lt;p&gt;Above roughly 85, file size climbs steeply while the visible difference collapses. A quality-100 JPEG can be more than twice the size of the same image at 85, and putting them side by side at 200% zoom, most people cannot call which is which.&lt;/p&gt;

&lt;p&gt;The part that actually matters: &lt;strong&gt;the best quality point depends on what is in the picture.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;Workable quality&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ordinary photos&lt;/td&gt;
&lt;td&gt;~75&lt;/td&gt;
&lt;td&gt;Losses stay below the noise floor of the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smooth gradients (sky, flat backdrops)&lt;/td&gt;
&lt;td&gt;~72&lt;/td&gt;
&lt;td&gt;Low information density to begin with&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High texture (grass, fabric, grain)&lt;/td&gt;
&lt;td&gt;~80&lt;/td&gt;
&lt;td&gt;Detail smears into mush below this&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graphics and text (screenshots, charts)&lt;/td&gt;
&lt;td&gt;84+&lt;/td&gt;
&lt;td&gt;Text edges are brutally sensitive to artifacts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A tool that classifies the image first and then suggests a value is doing real work. A tool that applies one number to everything is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The most underrated move: change the dimensions
&lt;/h2&gt;

&lt;p&gt;This usually beats parameter tuning outright, and almost nobody does it first.&lt;/p&gt;

&lt;p&gt;Phone cameras happily produce 4000×3000. The place you are about to put that image — a chat thread, a doc, a web page — often renders it at 800 px wide. Every pixel beyond that is pure overhead, and size scales with area: &lt;strong&gt;halve the longest edge and you land near a quarter of the bytes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So the order is: decide the display size, resize to it, &lt;em&gt;then&lt;/em&gt; argue about quality. Tuning quality on a 4000-pixel-wide image is effort spent in the wrong place.&lt;/p&gt;

&lt;p&gt;Rough targets that hold up in practice: 1500 px for chat, under 1200 px for in-article web images, 800 px for document figures.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The bytes you cannot see
&lt;/h2&gt;

&lt;p&gt;A photo straight off a phone carries more than pixels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EXIF&lt;/strong&gt; — capture time, camera model, exposure settings, GPS coordinates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ICC profile&lt;/strong&gt; — sometimes hundreds of KB on its own&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded thumbnail&lt;/strong&gt; — a second, smaller copy of the image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depth and HDR gain maps&lt;/strong&gt; — newer phones write these routinely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together these can run to tens or hundreds of KB. Some tools strip all of it and post an instant win. Others preserve everything.&lt;/p&gt;

&lt;p&gt;There is a privacy edge to this one. EXIF GPS records where the photo was taken. Posting an original straight to the web can publish your home address alongside it. Most social platforms strip EXIF on upload — but not all of them, and files you send through cloud storage, forums, or email usually keep it intact.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// crude check: does the file still carry an EXIF block?&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;head&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;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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;65536&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&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;hasExif&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;b&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="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x45&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x78&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x69&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mh"&gt;0x66&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "Exif"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hasExif&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;metadata still present&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stripped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Even lossless has room
&lt;/h2&gt;

&lt;p&gt;PNG output varies between tools too, which surprises people who read "lossless" as "only one possible result."&lt;/p&gt;

&lt;p&gt;PNG lets the encoder pick a row filter per scanline, and a good encoder tries several and keeps the best. Separately, reducing a truecolor image to a 256-color palette is technically lossy, but for icons, screenshots, and UI elements the difference is usually invisible while the file drops to roughly a third.&lt;/p&gt;

&lt;p&gt;That palette step is where implementations diverge hardest. Same 256 colors on paper — but how the palette is chosen, and how precisely each pixel maps into it, decides whether you get clean output or banding and muddy patches.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to catch a tool degrading your image quietly
&lt;/h2&gt;

&lt;p&gt;Smaller is not automatically better. Four checks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the format change?&lt;/strong&gt; You uploaded PNG. Is the download still PNG? A silent switch to JPEG turns transparency into black or white.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the dimensions change?&lt;/strong&gt; Some tools cap the longest edge by default and never mention it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zoom in on the failure-prone areas.&lt;/strong&gt; Text edges, smooth gradients, dark regions. Blurry glyphs, ringed banding across a sky, blocky patches in shadows — all signs of overcompression.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it tell you where processing happens?&lt;/strong&gt; On your machine, or on their server? A serious tool states this outright. To verify, open DevTools → Network, process an image, and watch what moves. You should see codecs being downloaded &lt;em&gt;to&lt;/em&gt; you, not your image going &lt;em&gt;out&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That last check is what pushed me toward &lt;a href="https://imging.ai" rel="noopener noreferrer"&gt;ImgIng&lt;/a&gt; for everyday work. Common-format conversion and compression run locally in the browser with no upload request for the image itself, and the interface marks which capabilities are local versus which go server-side — HEIC &lt;em&gt;writing&lt;/em&gt; and some professional formats still require an upload, and it says so rather than hiding it. That is a claim you can confirm in thirty seconds with the Network panel, which is worth more than any assurance in a marketing page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;When the same image comes out four times smaller somewhere else, it is usually a combination of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Format changed&lt;/strong&gt; — the largest single factor; confirm you are comparing like with like&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different quality target&lt;/strong&gt; — returns collapse above 85, and the sweet spot moves with content type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions changed&lt;/strong&gt; — the most effective and most overlooked; half the edge, a quarter of the bytes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata stripped&lt;/strong&gt; — EXIF, ICC, thumbnails; also a privacy question&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Working order: size first, then format, then quality. Reversed, most of the effort goes where the returns are smallest.&lt;/p&gt;

</description>
      <category>design</category>
      <category>performance</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
