<?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: RaveTools</title>
    <description>The latest articles on DEV Community by RaveTools (@rave-tools).</description>
    <link>https://dev.to/rave-tools</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%2F4032175%2Fecb2be1a-e221-4b07-8b67-ed7c2aa11d76.png</url>
      <title>DEV Community: RaveTools</title>
      <link>https://dev.to/rave-tools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rave-tools"/>
    <language>en</language>
    <item>
      <title>Building a Browser-Only Batch Image Compressor with WebAssembly</title>
      <dc:creator>RaveTools</dc:creator>
      <pubDate>Thu, 27 Aug 2026 01:01:19 +0000</pubDate>
      <link>https://dev.to/rave-tools/building-a-browser-only-batch-image-compressor-with-webassembly-1nh3</link>
      <guid>https://dev.to/rave-tools/building-a-browser-only-batch-image-compressor-with-webassembly-1nh3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fma00kj32qhxzvqueoob3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fma00kj32qhxzvqueoob3.png" alt="RaveTools Image Compressor showing a batch compressed from 79 MB to 1.5 MB with a 400 kB target per image" width="799" height="416"&gt;&lt;/a&gt;I built a batch image compressor that runs inside the browser.&lt;/p&gt;

&lt;p&gt;In my demo, I set a 400 kB target for each of four images totaling 79 MB. The final batch came out at 1.5 MB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WebP, AVIF, MozJPEG, and lossless PNG output&lt;/li&gt;
&lt;li&gt;Before-and-after comparison with synchronized zoom and pan&lt;/li&gt;
&lt;li&gt;Quality-based compression&lt;/li&gt;
&lt;li&gt;Target file-size mode&lt;/li&gt;
&lt;li&gt;Per-image format and compression settings&lt;/li&gt;
&lt;li&gt;Batch selection and settings transfer&lt;/li&gt;
&lt;li&gt;Optional resizing and palette reduction&lt;/li&gt;
&lt;li&gt;ZIP export for multiple files&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running image codecs in the browser
&lt;/h2&gt;

&lt;p&gt;The compressor uses codecs from &lt;code&gt;@jsquash&lt;/code&gt;, compiled to WebAssembly.&lt;/p&gt;

&lt;p&gt;A pool of Web Workers keeps encoding work away from the main UI thread. Each worker processes one file at a time, while the pool handles several batch items at once.&lt;/p&gt;

&lt;p&gt;The browser loads each codec on demand. Selecting WebP does not load the AVIF or PNG encoder.&lt;/p&gt;

&lt;p&gt;Before encoding, the processing pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decodes the source image&lt;/li&gt;
&lt;li&gt;Corrects EXIF orientation&lt;/li&gt;
&lt;li&gt;Applies optional resizing&lt;/li&gt;
&lt;li&gt;Handles transparency and background flattening&lt;/li&gt;
&lt;li&gt;Applies optional palette reduction&lt;/li&gt;
&lt;li&gt;Sends the prepared pixels to the selected encoder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The worker caches the prepared pixel data. Moving the quality slider can reuse the decoded and resized image instead of repeating the entire preprocessing pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Targeting a specific file size
&lt;/h2&gt;

&lt;p&gt;Target mode accepts a limit such as 400 kB.&lt;/p&gt;

&lt;p&gt;The worker encodes the image several times while searching across the available quality range. It keeps the closest result that stays below the selected budget.&lt;/p&gt;

&lt;p&gt;The compressor does not reduce image dimensions to force a match. The user controls resolution through the separate Resize settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cancelling WebAssembly work
&lt;/h2&gt;

&lt;p&gt;Changing settings during a long AVIF encode created a worker-management problem.&lt;/p&gt;

&lt;p&gt;The codec’s WebAssembly call runs synchronously inside its worker. A JavaScript cancellation flag cannot interrupt the encode halfway through. The worker reads that flag after the codec finishes, when the expensive work has already happened.&lt;/p&gt;

&lt;p&gt;If an outdated job blocks a full worker pool, the compressor terminates and rebuilds that worker slot. Jobs running in the other slots continue processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch settings
&lt;/h2&gt;

&lt;p&gt;Each image keeps its own format, quality, resize, and codec settings.&lt;/p&gt;

&lt;p&gt;The compressor processes the active image while the user edits it. Selecting multiple files and pressing &lt;strong&gt;Apply current settings&lt;/strong&gt; copies the active configuration across the selection.&lt;/p&gt;

&lt;p&gt;Export finishes any remaining files before creating the ZIP archive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;You can use the Image Compressor for free:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rave-tools.com/tools/image-compressor" rel="noopener noreferrer"&gt;Open the RaveTools Image Compressor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you test it, let me know which codec option or browser-side image workflow you would add next.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>webassembly</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I built a free, 100% client-side tool to view and remove file metadata</title>
      <dc:creator>RaveTools</dc:creator>
      <pubDate>Fri, 17 Jul 2026 22:31:30 +0000</pubDate>
      <link>https://dev.to/rave-tools/i-built-a-free-100-client-side-tool-to-view-and-remove-file-metadata-45d9</link>
      <guid>https://dev.to/rave-tools/i-built-a-free-100-client-side-tool-to-view-and-remove-file-metadata-45d9</guid>
      <description>&lt;p&gt;Every file you share carries hidden metadata, and most of it is more&lt;br&gt;
revealing than people realize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Photos&lt;/strong&gt; store GPS coordinates - literally where the shot was taken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI images&lt;/strong&gt; embed the full workflow: ComfyUI node graphs, Automatic1111
prompts, seeds, models. Post a PNG and you leak the whole recipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDFs&lt;/strong&gt; keep the author's real name, software and timestamps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MP3s&lt;/strong&gt; carry ID3 tags; &lt;strong&gt;JPEGs&lt;/strong&gt; carry camera make, model and serial.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;strong&gt;Metadata Viewer &amp;amp; Remover&lt;/strong&gt; - a free tool that does two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Views&lt;/strong&gt; everything embedded in a file and interprets it (GPS on a map,
"this PNG contains a ComfyUI workflow", C2PA Content Credentials, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Removes&lt;/strong&gt; it with one click by raw-cutting the byte buffer (no re-encode,
no quality loss) and hands back a clean file. Batch to ZIP supported.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The part I care about most: &lt;strong&gt;it's 100% client-side.&lt;/strong&gt; No upload, no API, no&lt;br&gt;
account needed. Your file never leaves the browser - which is exactly what&lt;br&gt;
you'd want from a privacy tool.&lt;/p&gt;

&lt;p&gt;🎥 30-second demo: &lt;a href="https://youtube.com/shorts/SWcEqQk-TTk?si=ZE4bn9VQavssD6SG" rel="noopener noreferrer"&gt;YouTube Reel&lt;/a&gt;&lt;br&gt;
🔗 Try it: &lt;a href="https://rave-tools.com/tools/metadata-viewer" rel="noopener noreferrer"&gt;https://rave-tools.com/tools/metadata-viewer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with Next.js, all parsing (EXIF / PNG chunks / ID3 / MP4 atoms / PDF)&lt;br&gt;
written from scratch to keep it fully in-browser. Happy to answer anything&lt;br&gt;
about how the parsers work.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>15 free, in-browser dev &amp; design tools. No sign-up required.</title>
      <dc:creator>RaveTools</dc:creator>
      <pubDate>Thu, 16 Jul 2026 13:03:52 +0000</pubDate>
      <link>https://dev.to/rave-tools/15-free-in-browser-dev-design-tools-no-sign-up-required-enf</link>
      <guid>https://dev.to/rave-tools/15-free-in-browser-dev-design-tools-no-sign-up-required-enf</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://rave-tools.com" rel="noopener noreferrer"&gt;RaveTools&lt;/a&gt; is a collection of 15 free developer and design tools that run entirely in your browser, with no upload, no account, and no tracking.&lt;/strong&gt; It includes an OKLCH color picker with Tailwind v4 palette export, a CSS gradient generator, an SVG-to-JSX converter, a designer QR code generator (SVG export, no redirects), a JSON formatter, a JWT decoder, cron and Unix-timestamp converters, and an OG/social image resizer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4odigizjlcosielgwqax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4odigizjlcosielgwqax.png" alt=" " width="799" height="446"&gt;&lt;/a&gt;&lt;br&gt;
There are lighter tools too: a hover-effect CSS snippet gallery, a PDF-to-scanned-look converter, a 3D packing calculator, and a couple of fun ones like a typing game and a "what to watch tonight" media randomizer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Everything is 100% client-side, so your data never touches a server, and each tool is a clean, shareable URL.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free forever. Try it at &lt;a href="https://rave-tools.com" rel="noopener noreferrer"&gt;https://rave-tools.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>developertools</category>
      <category>designtools</category>
      <category>css</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
