<?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: Rushikesh Lade</title>
    <description>The latest articles on DEV Community by Rushikesh Lade (@rushikes-dev).</description>
    <link>https://dev.to/rushikes-dev</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%2F4022357%2Fe06ff9c6-c40e-49cd-8ee3-c540f2854d7b.jpg</url>
      <title>DEV Community: Rushikesh Lade</title>
      <link>https://dev.to/rushikes-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rushikes-dev"/>
    <language>en</language>
    <item>
      <title>Stop Uploading Your Files to Random Websites: I Built a Privacy-First File Converter</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Mon, 13 Jul 2026 18:43:11 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/stop-uploading-your-files-to-random-websites-i-built-a-privacy-first-file-converter-1hhb</link>
      <guid>https://dev.to/rushikes-dev/stop-uploading-your-files-to-random-websites-i-built-a-privacy-first-file-converter-1hhb</guid>
      <description>&lt;h1&gt;
  
  
  Stop Uploading Your Files to Random Websites: I Built a Privacy-First File Converter
&lt;/h1&gt;

&lt;p&gt;Every day, millions of people upload PDFs, images, Word documents, and other files to online tools without giving it a second thought.&lt;/p&gt;

&lt;p&gt;Need to compress a PDF?&lt;/p&gt;

&lt;p&gt;➡️ Upload it.&lt;/p&gt;

&lt;p&gt;Need to convert a PNG to JPG?&lt;/p&gt;

&lt;p&gt;➡️ Upload it.&lt;/p&gt;

&lt;p&gt;Need to merge multiple PDFs?&lt;/p&gt;

&lt;p&gt;➡️ Upload them all.&lt;/p&gt;

&lt;p&gt;But have you ever stopped to ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where do those files actually go?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most online file converters require you to upload your documents to their servers. While many services are trustworthy, you're still handing over personal files and relying on someone else's promise to delete them later.&lt;/p&gt;

&lt;p&gt;That didn't feel right to me.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;&lt;/strong&gt;—a privacy-first collection of online file tools designed to keep your files where they belong: &lt;strong&gt;on your device.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Privacy Isn't a Feature—It Should Be the Default
&lt;/h2&gt;

&lt;p&gt;The core idea behind FileForge Tools is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If a file doesn't need to leave your computer, it shouldn't.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whenever technically possible, file processing happens &lt;strong&gt;entirely inside your browser&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 Your files stay on your device.&lt;/li&gt;
&lt;li&gt;🚫 No unnecessary uploads.&lt;/li&gt;
&lt;li&gt;⚡ Faster processing with no waiting for a server.&lt;/li&gt;
&lt;li&gt;📱 Works across desktop and mobile.&lt;/li&gt;
&lt;li&gt;👤 No account required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For sensitive files like resumes, invoices, IDs, certificates, or personal photos, this makes a huge difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Why Process Files in the Browser?
&lt;/h2&gt;

&lt;p&gt;Modern web technologies have come a long way.&lt;/p&gt;

&lt;p&gt;Using technologies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebAssembly (WASM)&lt;/li&gt;
&lt;li&gt;Modern JavaScript APIs&lt;/li&gt;
&lt;li&gt;Browser-based file processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;many common file operations can now happen locally.&lt;/p&gt;

&lt;p&gt;Instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Device → Internet → Server → Processing → Download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Device → Browser → Done ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No unnecessary middleman.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ What You Can Do
&lt;/h2&gt;

&lt;p&gt;FileForge Tools currently includes utilities like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📄 PDF tools&lt;/li&gt;
&lt;li&gt;🖼️ Image conversion&lt;/li&gt;
&lt;li&gt;📦 File compression&lt;/li&gt;
&lt;li&gt;🔄 Format conversion&lt;/li&gt;
&lt;li&gt;📑 Document utilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm continuously adding more tools based on user feedback.&lt;/p&gt;




&lt;h2&gt;
  
  
  👨‍💻 Why I Built It
&lt;/h2&gt;

&lt;p&gt;This started as a personal side project.&lt;/p&gt;

&lt;p&gt;I wanted simple file tools that respected user privacy instead of treating uploads as the default solution.&lt;/p&gt;

&lt;p&gt;The challenge was seeing how much modern browsers could do without relying on a backend server—and honestly, it's amazing how capable they are today.&lt;/p&gt;

&lt;p&gt;The result is a faster, cleaner, and more privacy-conscious experience.&lt;/p&gt;




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

&lt;p&gt;If you regularly work with documents, images, or PDFs and care about privacy, I'd love for you to give it a try.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://fileforgetools.in" rel="noopener noreferrer"&gt;https://fileforgetools.in&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm always looking for feedback from developers and users.&lt;/p&gt;

&lt;h3&gt;
  
  
  A few questions:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Which file tools do you use the most?&lt;/li&gt;
&lt;li&gt;Have you ever hesitated before uploading sensitive files online?&lt;/li&gt;
&lt;li&gt;What browser-based utility would you like to see next?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear your thoughts in the comments!&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Privacy shouldn't be a premium feature.&lt;/p&gt;

&lt;p&gt;It should be the standard.&lt;/p&gt;

&lt;p&gt;The web has become powerful enough that many file operations no longer need a server at all—and I think that's a direction worth embracing.&lt;/p&gt;

&lt;p&gt;If FileForge Tools saves you time or helps you keep your files private, then this project has accomplished exactly what I set out to build.&lt;/p&gt;

&lt;p&gt;Thanks for reading! ❤️&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Added Browser-Based HEIC to JPG Conversion (No Server, No Upload)</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Sat, 11 Jul 2026 18:46:03 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/how-i-added-browser-based-heic-to-jpg-conversion-no-server-no-upload-28kf</link>
      <guid>https://dev.to/rushikes-dev/how-i-added-browser-based-heic-to-jpg-conversion-no-server-no-upload-28kf</guid>
      <description>&lt;p&gt;Every iPhone since iOS 11 saves photos as HEIC by default. It's a genuinely better format — same visual quality as JPEG at roughly half the file size, thanks to being built on HEVC compression instead of the decades-old JPEG codec. The problem is compatibility: plenty of websites, Windows apps, Android devices, and upload forms still can't open it. So "why won't this site accept my photo" is one of the most common small frustrations on the internet, and it's exactly the kind of problem a browser tool can solve without needing a server at all.&lt;/p&gt;

&lt;p&gt;I just added a &lt;a href="https://fileforgetools.in/heic-to-jpg" rel="noopener noreferrer"&gt;HEIC to JPG converter&lt;/a&gt; to &lt;a href="https://fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;, my privacy-first file conversion site. Here's what building it actually involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this can't just be &lt;code&gt;&amp;lt;img src="photo.heic"&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Browsers don't natively decode HEIC. Safari can &lt;em&gt;display&lt;/em&gt; HEIC images because Apple's OS-level codec handles it beneath WebKit, but that's not something JavaScript or the Canvas API can hook into directly — there's no &lt;code&gt;ctx.drawImage()&lt;/code&gt; path from a raw HEIC buffer. You need an actual decoder.&lt;/p&gt;

&lt;p&gt;That's what &lt;a href="https://github.com/alexcorvi/heic2any" rel="noopener noreferrer"&gt;heic2any&lt;/a&gt; provides. Under the hood it's a WASM build of libheif that decodes the HEIC bitstream in-browser, hands you back a canvas-compatible image, and lets you re-encode it as JPEG (or PNG) at whatever quality you specify. The whole pipeline — decode, re-encode, download — happens in the browser's memory. Nothing is ever sent to a server.&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;heic2any&lt;/span&gt; &lt;span class="p"&gt;}&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;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heic2any&lt;/span&gt;&lt;span class="dl"&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;heic2any&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;blob&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="na"&gt;toType&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/jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&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;That's genuinely most of the API. The interesting parts were everything around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch conversion needs its own progress model
&lt;/h2&gt;

&lt;p&gt;People rarely convert one HEIC photo — it's usually "I need to send my whole camera roll from this trip to someone on Windows." heic2any processes one file at a time, so batch conversion means a manual loop with per-file progress:&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="k"&gt;for &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;i&lt;/span&gt; &lt;span class="o"&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;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setProgress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Converting &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="s2"&gt; of &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;heic2any&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;files&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="na"&gt;toType&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/jpeg&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="c1"&gt;// heic2any can return an array for multi-image HEIC containers — always handle both&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;out&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="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;files&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;blob&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;That last line matters more than it looks — HEIC is technically a &lt;em&gt;container&lt;/em&gt; format, and a single &lt;code&gt;.heic&lt;/code&gt; file can hold multiple images (think burst shots). heic2any returns an array in that case, and if you don't check for it, you'll occasionally get &lt;code&gt;[object Blob]&lt;/code&gt; written straight to a filename instead of an actual image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some HEIC files will fail, and that's fine
&lt;/h2&gt;

&lt;p&gt;Not every file with a &lt;code&gt;.heic&lt;/code&gt; extension decodes cleanly. Certain portrait-mode captures (which embed depth-map data alongside the image), some burst-photo variants, and HEIC files from non-Apple cameras use encodings the WASM decoder doesn't fully support. Rather than let a batch conversion silently produce a corrupt file or crash the whole loop, I wrapped each conversion individually:&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="k"&gt;try&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;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;heic2any&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;blob&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="na"&gt;toType&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/jpeg&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="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`"&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;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" could not be converted — it may use a HEIC variant this browser can't decode.`&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;One bad file in a batch of twenty shouldn't take down the other nineteen. Fail loud on the one file, keep going on the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this specifically needed to be client-side
&lt;/h2&gt;

&lt;p&gt;Photos are a different privacy category from PDFs or JSON. A camera roll can carry faces, home addresses baked into EXIF GPS data, screenshots of private conversations, IDs — genuinely sensitive stuff, uploaded to convert a file &lt;em&gt;format&lt;/em&gt;, of all things. Every other "HEIC to JPG" converter I checked uploads your file to a server first. For a task this mechanical, that's an unnecessary trust exercise.&lt;/p&gt;

&lt;p&gt;Running the whole thing through WASM in the browser means the conversion is provably private — you can watch your network tab, or just go offline after the page loads, and it still works. That's the actual point of doing it this way, not just an implementation detail.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://fileforgetools.in/heic-to-jpg" rel="noopener noreferrer"&gt;fileforgetools.in/heic-to-jpg&lt;/a&gt; — batch convert up to 20 photos, adjustable JPG quality, nothing uploaded.&lt;/p&gt;

&lt;p&gt;Built with Next.js 14 on Vercel. If you're building anything with heic2any and hit the multi-image-array gotcha, hopefully this saves you the debugging session it cost me.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>I Added PDF-to-Word, PDF-to-JPG, and PDF-to-PowerPoint to My Privacy-First File Tools Site</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Sat, 11 Jul 2026 10:18:13 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/i-added-pdf-to-word-pdf-to-jpg-and-pdf-to-powerpoint-to-my-privacy-first-file-tools-site-51be</link>
      <guid>https://dev.to/rushikes-dev/i-added-pdf-to-word-pdf-to-jpg-and-pdf-to-powerpoint-to-my-privacy-first-file-tools-site-51be</guid>
      <description>&lt;p&gt;A few months ago I built &lt;a href="https://fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;, a free site for everyday file conversions (image, PDF, text, dev utilities) that runs entirely in the browser. No file ever touches a server. This week I shipped the update I've wanted to build since day one: real PDF conversion tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PDF to JPG&lt;/strong&gt;, every page of a PDF becomes a JPG image, with resolution and quality controls. Download pages individually or grab everything as a ZIP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDF to Word&lt;/strong&gt;, extracts the text layer of a PDF into an editable &lt;code&gt;.docx&lt;/code&gt; file. It reconstructs paragraphs from the PDF's positioned text data, and it explicitly detects and warns when a PDF is a scan with no selectable text (rather than silently producing garbage).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDF to Google Docs&lt;/strong&gt;, same conversion engine, but the page is written for the "I just need this open in Docs" search intent, with a quick guide for the Drive import step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PDF to PowerPoint&lt;/strong&gt;, renders each page at high resolution and drops it into a &lt;code&gt;.pptx&lt;/code&gt; where the slide dimensions match your document's aspect ratio, so nothing gets stretched or cropped.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it stays private
&lt;/h2&gt;

&lt;p&gt;All four tools run on &lt;a href="https://github.com/mozilla/pdf.js" rel="noopener noreferrer"&gt;pdf.js&lt;/a&gt; in the browser, the same rendering engine Firefox uses for its built-in PDF viewer. The &lt;code&gt;.docx&lt;/code&gt; files are built with the &lt;code&gt;docx&lt;/code&gt; npm package, and the &lt;code&gt;.pptx&lt;/code&gt; files with &lt;code&gt;pptxgenjs&lt;/code&gt;. Everything happens in memory on your device; nothing is uploaded anywhere. You could disconnect your Wi-Fi mid-conversion and it'd still finish.&lt;/p&gt;

&lt;p&gt;This did surface a genuinely annoying bundling problem worth sharing: &lt;code&gt;pptxgenjs&lt;/code&gt; pulls in Node built-ins (&lt;code&gt;fs&lt;/code&gt;, &lt;code&gt;https&lt;/code&gt;) that don't exist in a browser. Webpack refused to bundle it until I added a &lt;code&gt;NormalModuleReplacementPlugin&lt;/code&gt; in &lt;code&gt;next.config.mjs&lt;/code&gt; to strip the &lt;code&gt;node:&lt;/code&gt; scheme and fall back cleanly. If you're bundling &lt;code&gt;pptxgenjs&lt;/code&gt; for the browser, that's the fix.&lt;/p&gt;

&lt;p&gt;The other gotcha: pdf.js needs its standard font and cMap data files to render PDFs that reference fonts like Helvetica without embedding them (extremely common), or that use CJK character maps. Those normally live in &lt;code&gt;node_modules&lt;/code&gt;, which a browser can't reach, so I copied them into &lt;code&gt;/public/pdfjs/&lt;/code&gt; and pointed &lt;code&gt;standardFontDataUrl&lt;/code&gt; / &lt;code&gt;cMapUrl&lt;/code&gt; at them. Skip this and you get silently broken glyphs on a chunk of real-world PDFs, not an obvious crash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also new: three guides
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://fileforgetools.in/blog/convert-pdf-to-word-without-losing-text" rel="noopener noreferrer"&gt;Converting a PDF to Word without losing formatting&lt;/a&gt;, and why complex layouts sometimes break&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fileforgetools.in/blog/pdf-to-jpg-when-and-how" rel="noopener noreferrer"&gt;PDF to JPG: when it's the right call&lt;/a&gt;, resolution and quality settings explained&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fileforgetools.in/blog/present-a-pdf-like-a-slide-deck" rel="noopener noreferrer"&gt;Presenting a PDF like an actual slide deck&lt;/a&gt;, PDF to PowerPoint, and when to use it over PDF to Word&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://fileforgetools.in/pdf-to-word" rel="noopener noreferrer"&gt;fileforgetools.in/pdf-to-word&lt;/a&gt; · &lt;a href="https://fileforgetools.in/pdf-to-jpg" rel="noopener noreferrer"&gt;pdf-to-jpg&lt;/a&gt; · &lt;a href="https://fileforgetools.in/pdf-to-powerpoint" rel="noopener noreferrer"&gt;pdf-to-powerpoint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with Next.js 14, deployed on Vercel. Happy to answer questions about the pdf.js/webpack setup if anyone's fighting the same bundling issues.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>How I Took a Site From 69 to 96 on PageSpeed by Fixing One Script Tag</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Fri, 10 Jul 2026 17:19:44 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/how-i-took-a-site-from-69-to-96-on-pagespeed-by-fixing-one-script-tag-o00</link>
      <guid>https://dev.to/rushikes-dev/how-i-took-a-site-from-69-to-96-on-pagespeed-by-fixing-one-script-tag-o00</guid>
      <description>&lt;p&gt;I run a small Next.js site (free browser-based file conversion tools). Yesterday I ran PageSpeed Insights on mobile and got a 69 — "needs improvement," with First Contentful Paint at 4.0s and Largest Contentful Paint at 5.6s under slow-4G throttling. Today it's 96.&lt;/p&gt;

&lt;p&gt;The fix took about five minutes once I found the actual cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Like a lot of small sites trying to monetize, I have a Google AdSense script in my root layout. It was added as a plain tag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;
  &lt;span class="na"&gt;async&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-xxxxx"&lt;/span&gt;
  &lt;span class="na"&gt;crossOrigin&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;async&lt;/code&gt; looks like it should be enough. It isn't — for what actually matters here.&lt;/p&gt;

&lt;h2&gt;
  
  
  What PageSpeed was actually flagging
&lt;/h2&gt;

&lt;p&gt;The diagnostics called out "Reduce unused JavaScript — Est. savings of 186 KiB." That's a big number for a lightweight site. The twist: my AdSense account is still pending approval, so the script was loading its &lt;em&gt;full&lt;/em&gt; weight and doing &lt;em&gt;nothing&lt;/em&gt; — no ads were rendering yet. Pure cost, zero benefit, and it was still competing with my actual page content for parsing priority during initial load.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Next.js ships a purpose-built &lt;code&gt;&amp;lt;Script&amp;gt;&lt;/code&gt; component specifically for this situation, with a &lt;code&gt;strategy&lt;/code&gt; prop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Script&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/script&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Script&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-xxxxx"&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"lazyOnload"&lt;/span&gt;
  &lt;span class="na"&gt;crossOrigin&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;lazyOnload&lt;/code&gt; defers loading until the browser is idle, well after your actual content has painted. The script still loads — ads will still work once approved — it just stops competing with your page for the critical early-loading window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Performance: 69 → 96&lt;/li&gt;
&lt;li&gt;The 186 KiB "unused JavaScript" flag: gone&lt;/li&gt;
&lt;li&gt;Zero change to how AdSense actually functions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;If you're running any third-party script (ads, chat widgets, analytics beyond the basics) as a raw &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag in a Next.js app, it's worth auditing. &lt;code&gt;next/script&lt;/code&gt;'s &lt;code&gt;strategy&lt;/code&gt; prop has four options (&lt;code&gt;beforeInteractive&lt;/code&gt;, &lt;code&gt;afterInteractive&lt;/code&gt;, &lt;code&gt;lazyOnload&lt;/code&gt;, &lt;code&gt;worker&lt;/code&gt;) and picking the right one for non-critical scripts is close to a free performance win — no functionality lost, no removed features, just better loading priority.&lt;/p&gt;

&lt;p&gt;For anything genuinely optional to the initial render — ads, chat bubbles, feedback widgets — &lt;code&gt;lazyOnload&lt;/code&gt; is usually the right call.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>How to Generate a Strong Password (And What Actually Makes One Strong)</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Thu, 09 Jul 2026 08:14:10 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/how-to-generate-a-strong-password-and-what-actually-makes-one-strong-p8m</link>
      <guid>https://dev.to/rushikes-dev/how-to-generate-a-strong-password-and-what-actually-makes-one-strong-p8m</guid>
      <description>&lt;p&gt;A lot of password advice focuses on the wrong thing. Swapping an "a" for an "@" or adding an exclamation mark at the end feels like it's making a password stronger, but attackers' cracking tools have known these tricks for years, they barely slow anything down. Real password strength comes from two much simpler factors: length and true randomness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why length matters more than complexity tricks
&lt;/h2&gt;

&lt;p&gt;Every extra character in a password multiplies the number of possible combinations an attacker would need to try. A random 8-character password might have around 50 bits of entropy, crackable by modern hardware in a practical amount of time. A random 16-character password with the same character variety jumps to roughly 100 bits of entropy, which is far beyond what's realistically crackable by brute force with current technology.&lt;/p&gt;

&lt;p&gt;In other words, a long password made of ordinary lowercase letters is often stronger than a short password stuffed with symbols and substitutions. Length beats cleverness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why true randomness matters
&lt;/h2&gt;

&lt;p&gt;The second ingredient is genuine randomness. Humans are bad at generating random-feeling passwords, we gravitate toward patterns, keyboard walks (like "qwerty123"), and personal references (birthdays, pet names) that feel random to us but are actually highly predictable to an attacker's cracking software, which is trained on exactly these patterns.&lt;/p&gt;

&lt;p&gt;A password generator that draws from a cryptographically secure random source avoids this entirely. Every character is chosen independently with no underlying pattern, which is precisely what makes brute-force guessing infeasible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a good password generator should do
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Use a cryptographic random source (like the Web Crypto API in a browser), not a simple pseudo-random function that could theoretically be predicted.&lt;/li&gt;
&lt;li&gt;Let you set a meaningful length, 16 characters as a reasonable minimum, 20+ for anything important like a primary email or financial account.&lt;/li&gt;
&lt;li&gt;Include a mix of character sets, lowercase, uppercase, digits and symbols, and guarantee at least one of each so the password meets typical site requirements.&lt;/li&gt;
&lt;li&gt;Never transmit or log the generated password anywhere. A password generated in your browser and never sent over the network is inherently safer than one generated by a server you have to trust.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The part most people skip: using a password manager
&lt;/h2&gt;

&lt;p&gt;Generating a strong password solves half the problem. The other half is not reusing it. A password manager lets you use a different, fully random, long password for every single account without having to remember any of them, you only need to remember one master password. This is genuinely the single biggest security improvement most people can make, and it's what makes long random passwords practical to use everywhere rather than just for your most important accounts.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I built &lt;a href="https://www.fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;, 38 free file conversion and document tools that all run client-side, including a &lt;a href="https://www.fileforgetools.in/password-generator" rel="noopener noreferrer"&gt;Password Generator&lt;/a&gt; using the Web Crypto API. No uploads, no accounts, no watermarks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>CSV to JSON: A Beginner's Guide</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Thu, 09 Jul 2026 08:11:22 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/csv-to-json-a-beginners-guide-1k6c</link>
      <guid>https://dev.to/rushikes-dev/csv-to-json-a-beginners-guide-1k6c</guid>
      <description>&lt;p&gt;If you work anywhere near spreadsheets and code, you'll eventually run into this exact situation: someone hands you a CSV export from Excel or Google Sheets, and you need it as JSON for an API, a script, or a database import. Or the reverse, you have JSON and someone wants a spreadsheet.&lt;/p&gt;

&lt;p&gt;It sounds like it should be trivial, and mostly it is, until your data has a comma inside a value, or a name with an apostrophe, or a blank cell, and suddenly your "quick conversion" is producing broken output. Here's what's actually going on under the hood, so you can do this reliably.&lt;/p&gt;

&lt;h2&gt;
  
  
  What CSV and JSON actually are
&lt;/h2&gt;

&lt;p&gt;CSV (comma-separated values) is a plain text format for tables: one line per row, values separated by commas, and usually a header row naming each column. It's what you get when you export a spreadsheet as plain text.&lt;/p&gt;

&lt;p&gt;JSON (JavaScript Object Notation) represents structured data as nested objects and arrays, the format nearly every API, config file, and modern app expects. A table of people in CSV becomes, in JSON, an array where each row is one object with the column names as keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that trips people up: quoting
&lt;/h2&gt;

&lt;p&gt;CSV's one-comma-separated-line-per-row rule breaks the moment a value itself contains a comma, like a name written "Smith, Jane" or an address with a comma in it. The CSV standard handles this by wrapping such values in double quotes: &lt;code&gt;"Smith, Jane"&lt;/code&gt;. A naive converter that just splits every line on commas will incorrectly treat that quoted comma as a new column, silently shifting every value after it one column to the right.&lt;/p&gt;

&lt;p&gt;A second, sneakier issue: what if a value itself contains a double quote? The standard says you escape it by doubling it, &lt;code&gt;"She said ""hello"""&lt;/code&gt; represents the text &lt;code&gt;She said "hello"&lt;/code&gt;. Converters that don't implement proper CSV parsing (rather than a simple string split) will mishandle this too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The other trap: numbers that aren't really numbers
&lt;/h2&gt;

&lt;p&gt;CSV has no concept of data types, everything is just text. This causes a specific, easy-to-miss bug: a ZIP code like &lt;code&gt;01234&lt;/code&gt; or a product code like &lt;code&gt;007&lt;/code&gt; has a meaningful leading zero. If your converter automatically detects and converts number-looking values into actual JSON numbers, that leading zero silently disappears, &lt;code&gt;01234&lt;/code&gt; becomes &lt;code&gt;1234&lt;/code&gt;, and now your ZIP code is wrong.&lt;/p&gt;

&lt;p&gt;The safe default is to keep everything as text unless you specifically know a column is safe to convert, good tools give you this as a toggle rather than an automatic, all-or-nothing decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing it correctly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Use a converter that implements proper CSV parsing (quote handling, escaped quotes, embedded commas and line breaks) rather than a naive comma-split.&lt;/li&gt;
&lt;li&gt;If your data has any column with meaningful leading zeros (ZIP codes, ID numbers), leave number detection off, or check the output carefully if you turn it on.&lt;/li&gt;
&lt;li&gt;Check your delimiter, spreadsheets in some regional locales export with semicolons instead of commas. If your output looks like one giant column, this is usually why.&lt;/li&gt;
&lt;li&gt;Spot-check a row or two of the output against the original, especially any row that had a comma or quote inside a value, that's where naive tools break first.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;I built &lt;a href="https://www.fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;, 38 free file conversion and document tools that all run client-side, including a proper &lt;a href="https://www.fileforgetools.in/csv-to-json" rel="noopener noreferrer"&gt;CSV to JSON&lt;/a&gt; converter that handles all of this correctly. No uploads, no accounts, no watermarks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>json</category>
    </item>
    <item>
      <title>JPG vs PNG vs WebP: Which Should You Actually Use?</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Thu, 09 Jul 2026 08:05:57 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/jpg-vs-png-vs-webp-which-should-you-actually-use-566f</link>
      <guid>https://dev.to/rushikes-dev/jpg-vs-png-vs-webp-which-should-you-actually-use-566f</guid>
      <description>&lt;p&gt;Most people use whatever image format their phone, camera, or screenshot tool happens to save by default, without ever thinking about it, and most of the time that's fine. But if you've ever wondered why some images load faster than others, why a logo looks blurry after conversion, or why a colleague asked you to "send it as a PNG instead," the answer comes down to a genuine, practical difference between these three formats.&lt;/p&gt;

&lt;h2&gt;
  
  
  JPG: the default for photos
&lt;/h2&gt;

&lt;p&gt;JPG uses lossy compression, meaning it throws away some detail the eye is least likely to notice in exchange for a much smaller file. For photographs, with their gradual color transitions and natural detail, this trade-off is usually invisible at normal viewing sizes, which is exactly why it's the default format for cameras and phones.&lt;/p&gt;

&lt;p&gt;JPG's real limitation: no transparency support, and it handles sharp edges (like text or line art) poorly, compression artifacts show up as blurring or blocky patterns around hard edges, which is why a JPG screenshot of a document often looks slightly fuzzy around the text.&lt;/p&gt;

&lt;h2&gt;
  
  
  PNG: the default for screenshots, logos, and anything needing transparency
&lt;/h2&gt;

&lt;p&gt;PNG uses lossless compression, every pixel is preserved exactly. This makes it the right choice for anything with sharp edges or flat colors: screenshots, logos, icons, and any graphic with a transparent background. The trade-off is size: a PNG of a photograph is typically much larger than the equivalent JPG, since lossless compression can't take advantage of the same detail-discarding tricks.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebP: the modern all-rounder
&lt;/h2&gt;

&lt;p&gt;WebP is a newer format that supports both lossy and lossless compression, plus transparency, essentially combining what JPG and PNG each do well into one format. A WebP photo at similar visual quality is typically 20-35% smaller than the equivalent JPG, and a WebP graphic with transparency is often 60-90% smaller than the equivalent PNG.&lt;/p&gt;

&lt;p&gt;The only real limitation is compatibility with very old software that hasn't been updated to support it, but every current browser, and most modern image-editing tools, handle WebP natively. For anything destined for the web, it's now the better default over both JPG and PNG.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple decision guide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Photo, going on a website:&lt;/strong&gt; WebP (fallback to JPG only for legacy compatibility needs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo, need maximum compatibility with older software:&lt;/strong&gt; JPG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot, logo, or icon with transparency, going on a website:&lt;/strong&gt; WebP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot, logo, or icon, need maximum compatibility or a lossless master copy:&lt;/strong&gt; PNG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archiving an image you might edit further:&lt;/strong&gt; PNG (lossless, so no quality is lost before you've even started editing)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I built &lt;a href="https://www.fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;, 38 free file conversion and document tools that all run client-side, including converters between &lt;a href="https://www.fileforgetools.in/image-tools" rel="noopener noreferrer"&gt;JPG, PNG and WebP&lt;/a&gt;. No uploads, no accounts, no watermarks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>privacy</category>
    </item>
    <item>
      <title>How to Reduce a PDF's File Size for Email</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Thu, 09 Jul 2026 08:03:19 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/how-to-reduce-a-pdfs-file-size-for-email-3da6</link>
      <guid>https://dev.to/rushikes-dev/how-to-reduce-a-pdfs-file-size-for-email-3da6</guid>
      <description>&lt;p&gt;It's a familiar moment: you attach a PDF to an email, hit send, and get an error saying the attachment is too large. Most email providers cap attachments somewhere between 20-25 MB, and it doesn't take much, a handful of scanned pages, or a report with a few embedded photos, to blow past that.&lt;/p&gt;

&lt;p&gt;The fix depends on &lt;em&gt;why&lt;/em&gt; the PDF is large in the first place, since a scanned contract and a report full of high-resolution photos need different approaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why PDFs get this large in the first place
&lt;/h2&gt;

&lt;p&gt;A PDF's size is almost always driven by the images inside it, scanned pages are essentially just full-resolution photographs of paper, and a report with several high-quality photos embeds all of that image data directly into the file. Text itself takes up very little space; a 50-page text-only PDF might be under a megabyte, while five scanned pages at high resolution can easily exceed 20 MB on their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it's a scanned document
&lt;/h2&gt;

&lt;p&gt;Scanned pages are usually scanned at a much higher resolution than needed for on-screen reading or even printing. If you have access to the original scanning software, rescanning at a lower DPI (150-200 is usually plenty for readable text) makes an enormous difference. If you only have the final PDF, look for a tool that can recompress the embedded images directly, since that reduces the size without needing to redo the scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it's a document with embedded photos
&lt;/h2&gt;

&lt;p&gt;Here the fix is more direct: reduce the size of the images before they go into the PDF. If you're the one assembling the document (for example, combining photos into a PDF for a report), compress each image first, cutting a photo from a phone camera down to reasonable web-viewing quality routinely shrinks it by 70-90% with no visible difference at normal viewing size, and the resulting PDF shrinks proportionally.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;If you're building the PDF yourself from photos, compress each image first (a tool set to 75-85% quality works well), then combine them into a PDF, this gives you far more control than compressing after the fact.&lt;/li&gt;
&lt;li&gt;If you already have a large PDF and need to shrink it directly, look for a PDF compression tool that recompresses the embedded images, or split it into smaller parts if the whole document doesn't need to go in one email.&lt;/li&gt;
&lt;li&gt;Check your email provider's actual limit before assuming compression alone will get you there, for very large scanned documents, sending a link to a shared file may be more practical than repeated compression.&lt;/li&gt;
&lt;li&gt;Always keep your original, uncompressed file. Compression is one-directional, you can't get the lost detail back once you've shrunk it.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;I built &lt;a href="https://www.fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;, 38 free file conversion and document tools that all run client-side, including a &lt;a href="https://www.fileforgetools.in/compress-pdf" rel="noopener noreferrer"&gt;PDF Compressor&lt;/a&gt; and &lt;a href="https://www.fileforgetools.in/split-pdf" rel="noopener noreferrer"&gt;Split PDF&lt;/a&gt; tool for exactly this problem. No uploads, no accounts, no watermarks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Compress a PNG Without Losing Quality</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Thu, 09 Jul 2026 08:00:51 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/how-to-compress-a-png-without-losing-quality-1b6p</link>
      <guid>https://dev.to/rushikes-dev/how-to-compress-a-png-without-losing-quality-1b6p</guid>
      <description>&lt;p&gt;PNG has a reputation for producing large files, and for good reason: it's a lossless format, meaning it stores every pixel exactly as it is, with no data thrown away. That's great for quality but often means a simple screenshot or logo ends up several megabytes in size, far bigger than it needs to be for how it will actually be used.&lt;/p&gt;

&lt;p&gt;The trick to compressing a PNG well is understanding that you're not really "compressing" a PNG at all in the traditional sense, you're converting it to a smarter format that achieves a similar look at a fraction of the size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you can't just 'compress' a PNG directly
&lt;/h2&gt;

&lt;p&gt;PNG's compression is lossless and largely fixed, there's no quality slider because there's no quality to trade away. Every pixel is preserved exactly. That's precisely why PNG files can be so large: unlike JPG, which can throw away detail the eye barely notices, PNG has to represent everything faithfully.&lt;/p&gt;

&lt;p&gt;The practical way to shrink a large PNG, then, is to re-encode it into a format that does support a quality trade-off, most commonly WebP or JPG, while keeping the visual result close enough to the original that nobody notices the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebP: the best option for most PNGs
&lt;/h2&gt;

&lt;p&gt;WebP is the modern choice for shrinking PNGs, for one key reason: it supports transparency, just like PNG does, but with far more efficient compression. A logo, icon, or screenshot with a transparent background can typically be converted to WebP at 90%+ quality and come out 60–90% smaller than the original PNG, with no visible difference at normal viewing sizes.&lt;/p&gt;

&lt;p&gt;This makes WebP the default recommendation for anything that started life as a PNG because it needed transparency or sharp edges, screenshots, icons, logos, UI mockups. You keep the exact same visual behavior, just in a dramatically smaller file.&lt;/p&gt;

&lt;h2&gt;
  
  
  When JPG makes more sense instead
&lt;/h2&gt;

&lt;p&gt;If the destination absolutely requires maximum compatibility, an older system, a print shop, or a platform that doesn't accept WebP, JPG is the fallback. The catch is that JPG doesn't support transparency at all, so any transparent areas in your PNG get filled with a solid background color you choose. For a photo-like PNG with no transparency, this is a fine option; for a logo with a transparent background, it usually isn't what you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical workflow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start with your original PNG, don't compress a copy that's already been compressed once, since starting fresh gives the cleanest result.&lt;/li&gt;
&lt;li&gt;Choose WebP as the output format if the image has transparency or will only be used digitally.&lt;/li&gt;
&lt;li&gt;Set the quality to around 90% as a starting point, this typically preserves fine detail and text while still shrinking the file substantially.&lt;/li&gt;
&lt;li&gt;Compare the before and after file sizes. If the saving isn't enough and the image quality still looks fine, try lowering the quality a bit further.&lt;/li&gt;
&lt;li&gt;Only fall back to JPG if the destination specifically can't accept WebP.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;I built &lt;a href="https://www.fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt; — 38 free file conversion and document tools that all run client-side. No uploads, no accounts, no watermarks. Would love feedback if you try it out.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>jpg</category>
    </item>
    <item>
      <title>How to Merge PDF Files Without Uploading Them Online</title>
      <dc:creator>Rushikesh Lade</dc:creator>
      <pubDate>Thu, 09 Jul 2026 07:57:37 +0000</pubDate>
      <link>https://dev.to/rushikes-dev/how-to-merge-pdf-files-without-uploading-them-online-3j77</link>
      <guid>https://dev.to/rushikes-dev/how-to-merge-pdf-files-without-uploading-them-online-3j77</guid>
      <description>&lt;p&gt;If you've ever needed to combine a few PDFs, merging scanned receipts, stitching together a multi-part report, or combining signed contract pages, you've probably run into the same problem: most free "merge PDF" tools require you to upload your files to a server first.&lt;/p&gt;

&lt;p&gt;For most documents that's a minor inconvenience. But if your PDFs contain anything sensitive, financial statements, medical records, signed agreements, ID scans, uploading them to an unknown third-party server is a real privacy risk, even if the site promises to "delete files after 24 hours."&lt;/p&gt;

&lt;p&gt;The good news: your browser can do the entire job itself, with nothing ever leaving your device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why browser-based merging is different
&lt;/h2&gt;

&lt;p&gt;Every modern browser (Chrome, Firefox, Safari, Edge) can read, combine and rebuild PDF files directly using JavaScript. When a tool is built this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your files are read into your browser's memory, processed there, and the result is handed back to you as a download&lt;/li&gt;
&lt;li&gt;Nothing is transmitted over the network, you could disconnect your Wi-Fi partway through and it would still finish&lt;/li&gt;
&lt;li&gt;There's no server-side copy to worry about, no "we deleted it after 24 hours" trust required, and no risk of a data breach on someone else's infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off is that very large files (hundreds of megabytes) can be slower than a dedicated desktop app, since your browser is doing the work your computer's own memory allows. For everyday use, merging a handful of scanned pages or a multi-file report, it's fast and completely private.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step: merging PDFs in your browser
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open a browser-based merge tool.&lt;/strong&gt; &lt;a href="https://www.fileforgetools.in/merge-pdf" rel="noopener noreferrer"&gt;FileForge's Merge PDF tool&lt;/a&gt; is a free option, no account, no upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add your PDF files.&lt;/strong&gt; Drag and drop them in, or click to choose files from your computer. You can add as many as you need, up to the tool's file-count limit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reorder if needed.&lt;/strong&gt; Most merge tools let you drag files up or down in the list, this becomes the page order in your final PDF, so double check it before merging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click merge.&lt;/strong&gt; Because everything happens locally, this is usually near-instant even for several files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download your combined PDF.&lt;/strong&gt; The result is generated in your browser and saved straight to your downloads folder.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When you might still want a desktop app
&lt;/h2&gt;

&lt;p&gt;Browser tools are great for occasional, single-session tasks. If you're merging PDFs constantly as part of a daily workflow, or need advanced features like adding page numbers, watermarks, or digital signatures across the merged file, a dedicated desktop PDF editor might serve you better long-term.&lt;/p&gt;

&lt;p&gt;But for the common case, you just need a few PDFs combined into one, right now, without giving them to a stranger's server, a browser tool does the job with zero setup and zero privacy trade-off.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I built &lt;a href="https://www.fileforgetools.in" rel="noopener noreferrer"&gt;FileForge Tools&lt;/a&gt;, 38 free file conversion and document tools that all run client-side. No uploads, no accounts, no watermarks. Would love feedback if you try it out.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
