<?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: Finn Liu</title>
    <description>The latest articles on DEV Community by Finn Liu (@_bd31c79786d454464f39ed).</description>
    <link>https://dev.to/_bd31c79786d454464f39ed</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%2F4128233%2Ffc057ebb-5407-4abd-8b4b-2ff03f1b1014.jpg</url>
      <title>DEV Community: Finn Liu</title>
      <link>https://dev.to/_bd31c79786d454464f39ed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_bd31c79786d454464f39ed"/>
    <language>en</language>
    <item>
      <title>Build Notes: A Browser-Local Image Compressor for Everyday Upload Problems</title>
      <dc:creator>Finn Liu</dc:creator>
      <pubDate>Thu, 08 Oct 2026 23:41:28 +0000</pubDate>
      <link>https://dev.to/_bd31c79786d454464f39ed/build-notes-a-browser-local-image-compressor-for-everyday-upload-problems-4b80</link>
      <guid>https://dev.to/_bd31c79786d454464f39ed/build-notes-a-browser-local-image-compressor-for-everyday-upload-problems-4b80</guid>
      <description>&lt;p&gt;I built Quick Image Kit as a small browser-local image toolkit: &lt;a href="https://quickimagekit.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;quickimagekit.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The product is intentionally practical. Many people do not need a full photo editor. They need to make a phone photo small enough for an upload form, profile page, email attachment, document portal, school system, job application, or favicon package.&lt;/p&gt;

&lt;p&gt;The design constraint is simple: the image should be processed in the browser where possible, so the original file does not need to be uploaded to a processing server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why local processing matters
&lt;/h2&gt;

&lt;p&gt;Image compression sounds low-risk until the files are personal. The same workflow often handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ID photos&lt;/li&gt;
&lt;li&gt;passport-style photos&lt;/li&gt;
&lt;li&gt;document scans&lt;/li&gt;
&lt;li&gt;school records&lt;/li&gt;
&lt;li&gt;legal or medical paperwork&lt;/li&gt;
&lt;li&gt;internal screenshots&lt;/li&gt;
&lt;li&gt;application form attachments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those files, the safest default is not "upload first, compress later." A browser-local flow lets the user load the image, create a smaller copy, download the result, and then upload only that final copy to the actual destination.&lt;/p&gt;

&lt;p&gt;That is the main positioning behind Quick Image Kit's &lt;a href="https://quickimagekit.com/compress-image?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;browser-local image compressor&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main UX problem is not the codec
&lt;/h2&gt;

&lt;p&gt;For an image compressor, it is tempting to start with codecs, quality settings, or performance. Those matter, but they are not the first user problem.&lt;/p&gt;

&lt;p&gt;The first problem is that users usually do not know what changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the image get smaller?&lt;/li&gt;
&lt;li&gt;Is it now under the upload limit?&lt;/li&gt;
&lt;li&gt;Did the dimensions change?&lt;/li&gt;
&lt;li&gt;Is the face still clear?&lt;/li&gt;
&lt;li&gt;Is document text still readable?&lt;/li&gt;
&lt;li&gt;Is the output format accepted by the form?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the interface has to explain the result in normal upload-language, not just expose a quality slider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resize before heavy compression
&lt;/h2&gt;

&lt;p&gt;Large phone photos often start at 3000 to 4000 pixels wide. If the target is a small profile photo or form attachment, resizing usually improves the result more than pushing JPEG quality lower and lower.&lt;/p&gt;

&lt;p&gt;The practical order is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crop away unnecessary background.&lt;/li&gt;
&lt;li&gt;Resize when the source image is far larger than the upload needs.&lt;/li&gt;
&lt;li&gt;Compress toward the target size.&lt;/li&gt;
&lt;li&gt;Check readability before downloading.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is why a useful image toolkit needs &lt;a href="https://quickimagekit.com/resize-image?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;resizing&lt;/a&gt;, &lt;a href="https://quickimagekit.com/crop-image?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;cropping&lt;/a&gt;, &lt;a href="https://quickimagekit.com/convert-image?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;conversion&lt;/a&gt; and compression together, even if each tool stays simple.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exact KB pages are workflow pages, not just SEO pages
&lt;/h2&gt;

&lt;p&gt;Searches like "compress image to 20KB" or "compress photo under 200KB" look repetitive, but the user intent is real. Someone is blocked by a form that rejects their file.&lt;/p&gt;

&lt;p&gt;The page should not only say "upload your image." It should explain what to try when the target is too small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;crop first if there is empty background&lt;/li&gt;
&lt;li&gt;resize if the source is a large phone photo&lt;/li&gt;
&lt;li&gt;use JPG for photo-like images when the form accepts it&lt;/li&gt;
&lt;li&gt;avoid shrinking documents so far that text becomes unreadable&lt;/li&gt;
&lt;li&gt;aim slightly below the limit, not dramatically below it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For that reason, Quick Image Kit has a separate &lt;a href="https://quickimagekit.com/compress-image-to-exact-size?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;exact-size workflow&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The growth lesson
&lt;/h2&gt;

&lt;p&gt;The technical build was the easy part. The harder part is that a new utility site does not get traffic just because the pages exist.&lt;/p&gt;

&lt;p&gt;The current growth work is deliberately simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ship focused pages for real upload scenarios&lt;/li&gt;
&lt;li&gt;create useful external tutorials&lt;/li&gt;
&lt;li&gt;submit to relevant tool lists&lt;/li&gt;
&lt;li&gt;track whether links become live instead of treating submissions as wins&lt;/li&gt;
&lt;li&gt;look for search impressions and referrals, not just sitemap counts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful distinction is this: a submitted link is not a live backlink. A live backlink is only counted after the external page actually links back.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would keep if rebuilding it
&lt;/h2&gt;

&lt;p&gt;If I rebuilt the tool from scratch, I would keep these decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep the core image work local in the browser&lt;/li&gt;
&lt;li&gt;make the output file size and dimensions visible&lt;/li&gt;
&lt;li&gt;create separate workflows for exact KB, forms, passport-style uploads, and documents&lt;/li&gt;
&lt;li&gt;keep the original file unchanged&lt;/li&gt;
&lt;li&gt;avoid login requirements for the core task&lt;/li&gt;
&lt;li&gt;make each page answer one concrete upload problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool is here: &lt;a href="https://quickimagekit.com/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;quickimagekit.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the main compression workflow is here: &lt;a href="https://quickimagekit.com/compress-image?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=browser_local_build_notes" rel="noopener noreferrer"&gt;compress an image in the browser&lt;/a&gt;&lt;/p&gt;

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