<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Building editpdf.tools]]></title><description><![CDATA[Chandan Singh writes about building editpdf.tools, free PDF and image tools that run in your browser, and how to keep private documents off other servers.]]></description><link>https://chandan-editpdf.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ae2d7ba3e9c8a6d51157f98/06c10272-64bc-473e-ad98-c51f3f897ef2.png</url><title>Building editpdf.tools</title><link>https://chandan-editpdf.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 10:23:03 GMT</lastBuildDate><atom:link href="https://chandan-editpdf.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Do Online PDF Tools Upload Your Files? We Tested 18]]></title><description><![CDATA[We logged every network request while adding the same file to 18 free PDF and image tools. 12 uploaded it, 10 the moment it was chosen.]]></description><link>https://chandan-editpdf.hashnode.dev/do-online-pdf-tools-upload-your-files</link><guid isPermaLink="true">https://chandan-editpdf.hashnode.dev/do-online-pdf-tools-upload-your-files</guid><category><![CDATA[privacy]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Security]]></category><category><![CDATA[pdf]]></category><dc:creator><![CDATA[Chandan Singh]]></dc:creator><pubDate>Fri, 06 Nov 2026 10:07:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ae2d7ba3e9c8a6d51157f98/b6bc693b-11dd-42af-bfff-45eb7a8dc3a5.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR:</strong> We added the same test PDF and the same test photo to 18 popular free online PDF and image tools and logged every network request. 12 of the 18 sent the file to a server, and 10 of those uploads started the moment the file was chosen, before any button was pressed. All 8 PDF tools we could measure uploaded the file. The full table, deletion policies and raw CSV are on the <a href="https://editpdf.tools/research/do-online-pdf-tools-upload-your-files">research page at editpdf.tools</a>.</p>
<h2>What question did we want to answer?</h2>
<p>"Does this website upload my file?" Most tool pages answer it vaguely. We wanted a measured answer, with the same file and the same steps for every tool.</p>
<h2>How was the test run?</h2>
<ol>
<li>Same files for every tool: a one-page PDF of 150,608 bytes and a 2400 x 1800 px JPG of 326,154 bytes, made for the test with no personal data.</li>
<li>Same browser and start: a fresh Chromium tab on Windows, not logged in, cookie banners left unanswered.</li>
<li>A script put the file into each tool's own file picker and logged every <code>XHR</code>, <code>fetch</code> and <code>sendBeacon</code> request with its address and size.</li>
<li>Each upload was confirmed a second time with the browser's <code>Resource Timing</code> list.</li>
<li>Where a result had its own web address, we opened it in a fresh tab with no cookies.</li>
</ol>
<h2>What were the results?</h2>
<table>
<thead>
<tr>
<th>What we measured</th>
<th>Result</th>
</tr>
</thead>
<tbody><tr>
<td>Tools that sent the file to a server</td>
<td>12 of 18</td>
</tr>
<tr>
<td>PDF tools that uploaded (of those we could measure)</td>
<td>8 of 8</td>
</tr>
<tr>
<td>Image tools that uploaded</td>
<td>4 of 10</td>
</tr>
<tr>
<td>Uploads that started when the file was chosen</td>
<td>10 of 12</td>
</tr>
<tr>
<td>Results open at a public address without login</td>
<td>2 (both gone about 24 hours later)</td>
</tr>
</tbody></table>
<h2>Does uploading mean a tool is unsafe?</h2>
<p>No. Many services delete files after a set time. The stated times we found range from 20 minutes to 48 hours, and some give no time at all. Each tool's own wording is quoted next to its result on the research page. Uploading means one more copy exists for a while, which matters most for ID cards, bank statements and contracts.</p>
<h2>How did editpdf.tools do in the same test?</h2>
<p>We ran our own <a href="https://editpdf.tools/compress-pdf">Compress PDF</a> and <a href="https://editpdf.tools/compress-image-to-kb">Compress Image to KB</a> as a control. After the file was added, no request was larger than 1 KB. Edit PDF, our paid tool, does upload the file for processing, and its page says so.</p>
<h2>How can you check a tool yourself?</h2>
<ol>
<li>Open the tool and press F12.</li>
<li>Open the Network tab and clear it.</li>
<li>Add a small test file.</li>
<li>Look for a POST or PUT request about the size of your file.</li>
</ol>
<h2>What are the limits of the test?</h2>
<p>It reflects one browser on 4 November 2026. Any site can change after that. It shows that a file was sent and where, not what happens on the server.</p>
<h2>FAQ</h2>
<h3>Do online PDF tools upload your files?</h3>
<p>Most of the ones we tested do. All 8 measurable PDF tools uploaded the test PDF.</p>
<h3>Do image tools upload files too?</h3>
<p>4 of the 10 image tools did. The other 6 processed the photo in the browser.</p>
<h3>Can I use the data?</h3>
<p>Yes. The raw CSV is on the research page under a CC BY 4.0 licence.</p>
<h3>How often will you repeat the test?</h3>
<p>Every six months, with the new date on the same page.</p>
<h3>What if a tool has changed since the test?</h3>
<p>Tool owners can contact us, and we re-test and update the page with the date.</p>
]]></content:encoded></item><item><title><![CDATA[How Our Chrome Extension Compresses a Photo to a Target KB With Zero Permissions]]></title><description><![CDATA[How our zero-permission Chrome extension compresses a JPG, PNG or WebP photo to a target size in KB with canvas.toBlob and a binary search on quality.]]></description><link>https://chandan-editpdf.hashnode.dev/compress-image-to-target-kb-javascript-canvas</link><guid isPermaLink="true">https://chandan-editpdf.hashnode.dev/compress-image-to-target-kb-javascript-canvas</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[chrome extension]]></category><category><![CDATA[canvas]]></category><category><![CDATA[Image Compression]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Chandan Singh]]></dc:creator><pubDate>Tue, 03 Nov 2026 14:06:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ae2d7ba3e9c8a6d51157f98/f7a61c0f-fa6b-4401-bc41-1e3cc9f2a8df.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR:</strong> Our Chrome extension <a href="https://chromewebstore.google.com/detail/compress-image-to-kb-by-e/komomnoldmjjidnobbmomnpmnhjelfdp">Compress Image to KB by editpdf.tools</a> turns a JPG, PNG or WebP photo into a JPG under a target size, such as 50 KB. It runs a binary search over JPG quality with <code>canvas.toBlob</code>, and only shrinks the dimensions when quality alone cannot reach the target. It is Manifest V3, popup only, and asks for zero permissions, so the photo never leaves the user's computer. In our test, a 4.6 MB photo came out at 49.8 KB for a 50 KB target.</p>
<h2>What problem does the extension solve?</h2>
<p>Online application forms often set a maximum file size for photos and signatures, for example 20 KB, 50 KB or 100 KB. A phone photo is usually several MB. The user does not care about quality settings or pixel sizes. They care about one number: the KB limit on the form.</p>
<p>So the input is a target size, and the job is to return the clearest JPG that fits under it. That gives a clear order of preference:</p>
<ol>
<li>If the file is already a JPG under the target, return it untouched.</li>
<li>Otherwise keep the full dimensions and lower the JPG quality only as far as needed.</li>
<li>If quality alone cannot get there, shrink the dimensions and repeat.</li>
</ol>
<h2>How do you compress an image to a target size in JavaScript?</h2>
<p>Everything runs on an HTML canvas in the extension popup. We decode the image, draw it on a canvas, and encode it with <code>canvas.toBlob</code> using the <code>image/jpeg</code> type and a quality value between 0 and 1. The size of the returned <code>Blob</code> tells us whether the file fits.</p>
<p>PNG input needs one extra step. JPG has no transparency, so we fill the canvas with white before drawing. Transparent areas become a white background, which is also what most forms expect.</p>
<pre><code class="language-js">function drawOnWhite(img, w, h) {
  const canvas = document.createElement('canvas');
  canvas.width = w;
  canvas.height = h;
  const ctx = canvas.getContext('2d');
  ctx.fillStyle = '#ffffff';
  ctx.fillRect(0, 0, w, h);
  ctx.drawImage(img, 0, 0, w, h);
  return canvas;
}

function toJpeg(canvas, quality) {
  return new Promise(resolve =&gt; canvas.toBlob(resolve, 'image/jpeg', quality));
}
</code></pre>
<h2>Why use a binary search over JPG quality?</h2>
<p>JPG file size grows with the quality value, so there is no need to try every value. We run a binary search between 0.05 and 0.95 for 7 steps. Each step encodes once, checks the size, and moves the lower or upper bound. We keep the highest quality that fits.</p>
<p>Seven encodes per dimension size is a small, fixed amount of work, and it lands close to the target.</p>
<pre><code class="language-js">async function fitByQuality(canvas, targetBytes) {
  let lo = 0.05, hi = 0.95, fit = null;
  for (let i = 0; i &lt; 7; i++) {
    const q = (lo + hi) / 2;
    const blob = await toJpeg(canvas, q);
    if (blob.size &lt;= targetBytes) {
      fit = blob;   // fits: try a higher quality
      lo = q;
    } else {
      hi = q;       // too big: go lower
    }
  }
  return fit;       // null if nothing fit at this size
}
</code></pre>
<h2>What happens when lowering quality is not enough?</h2>
<p>For a large photo and a small target, even the lowest quality in the range can be too big. In that case we scale the width and height to 85% of the previous step (a 15% reduction), redraw on white, and run the quality search again. We repeat until a blob fits. The real code also stops once the image gets too small to be useful.</p>
<pre><code class="language-js">let w = img.naturalWidth, h = img.naturalHeight;
let result = await fitByQuality(drawOnWhite(img, w, h), targetBytes);
while (!result &amp;&amp; w &gt; 1 &amp;&amp; h &gt; 1) {
  w = Math.round(w * 0.85);
  h = Math.round(h * 0.85);
  result = await fitByQuality(drawOnWhite(img, w, h), targetBytes);
}
</code></pre>
<p>Trying quality first and dimensions second is a deliberate choice. Forms usually display photos small, and a full-size image at moderate quality tends to look cleaner than a tiny image at high quality. Only when quality cannot carry it do we give up pixels.</p>
<p>Before any of this, we check the input. If it is a JPG that is already under the target, we hand back the original file. Re-encoding would only lose quality for no gain.</p>
<h2>How close does it get to the target?</h2>
<p>We ran one 4.6 MB photo through the extension with two targets:</p>
<table>
<thead>
<tr>
<th>Input</th>
<th>Target</th>
<th>Output</th>
<th>Under target?</th>
</tr>
</thead>
<tbody><tr>
<td>4.6 MB photo</td>
<td>50 KB</td>
<td>49.8 KB</td>
<td>Yes</td>
</tr>
<tr>
<td>4.6 MB photo</td>
<td>20 KB</td>
<td>18.4 KB</td>
<td>Yes</td>
</tr>
</tbody></table>
<p>Both results stayed under the target, and the 50 KB result landed very close to it, which is what the quality search is meant to do. Results depend on the photo.</p>
<h2>Why does the extension need no permissions?</h2>
<p>The extension is Manifest V3 and popup only. The manifest declares no permissions and no host permissions. It does not need <code>activeTab</code>, <code>storage</code>, <code>downloads</code> or any site access:</p>
<ul>
<li>The user picks a file with a normal file input inside the popup.</li>
<li>The canvas does the compression.</li>
<li>The result is saved through a normal download link.</li>
</ul>
<p>There is no network code either. We tested the popup and saw no external requests. Nothing is uploaded, nothing is stored, and no data is collected. That made the Chrome Web Store privacy section simple to fill in honestly, and users see no permission warning when they install.</p>
<h2>What are the limits?</h2>
<ul>
<li><strong>JPG output only.</strong> If a form needs PNG, this is not the right tool.</li>
<li><strong>No HEIC inside the extension.</strong> For iPhone photos, use the web version, <a href="https://editpdf.tools/compress-image-to-kb">Compress Image to KB on editpdf.tools</a>, which opens HEIC and also works in the browser without uploading the photo.</li>
<li><strong>Very small targets can force small dimensions.</strong> A few KB from a large photo may need many shrink steps, and the result can be too small to read. Always check the output.</li>
<li><strong>PNG transparency becomes white.</strong> That is a JPG limit.</li>
</ul>
<h2>Frequently asked questions</h2>
<h3>Does the extension upload my photo?</h3>
<p>No. The photo is read and compressed inside the extension popup on your computer. The extension has no permissions and no network code.</p>
<h3>Which formats does it accept?</h3>
<p>JPG, PNG and WebP as input. The output is always JPG.</p>
<h3>Can it compress a photo to exactly 50 KB?</h3>
<p>It returns the clearest JPG it can find that is at or under 50 KB. In our test it produced 49.8 KB for a 50 KB target.</p>
<h3>Why not lower the dimensions first?</h3>
<p>Small displays on forms make a full-size photo at moderate quality look cleaner than a small photo at high quality, so we only shrink when quality alone cannot reach the target.</p>
<h3>Is there a web version?</h3>
<p>Yes. <a href="https://editpdf.tools/compress-image-to-kb">Compress Image to KB</a> on <a href="https://editpdf.tools/">editpdf.tools</a> does the same job in the browser and also accepts iPhone HEIC photos.</p>
<h2>Try it</h2>
<p>The extension is free, with no signup and no watermark. Install it from the <a href="https://chromewebstore.google.com/detail/compress-image-to-kb-by-e/komomnoldmjjidnobbmomnpmnhjelfdp">Chrome Web Store</a>. If you try it, an honest review on the store helps a lot.</p>
<p>If you have ideas for smarter stopping rules, better quality steps or a cleaner way to handle tiny targets, tell us in the comments.</p>
]]></content:encoded></item><item><title><![CDATA[Adding HEIC and WebP Support to an Image Tool That Never Uploads Files]]></title><description><![CDATA[Our site, editpdf.tools, runs its free tools entirely in the browser: files never go to a server. When users asked for iPhone HEIC support and WebP to PDF…]]></description><link>https://chandan-editpdf.hashnode.dev/adding-heic-and-webp-support-to-an-image-tool-that-never-uploads-files</link><guid isPermaLink="true">https://chandan-editpdf.hashnode.dev/adding-heic-and-webp-support-to-an-image-tool-that-never-uploads-files</guid><dc:creator><![CDATA[Chandan Singh]]></dc:creator><pubDate>Sun, 01 Nov 2026 18:55:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ae2d7ba3e9c8a6d51157f98/abd8788f-d3d8-4bae-9f2e-c76e031054f3.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Our site, editpdf.tools, runs its free tools entirely in the browser: files never go to a server. When users asked for iPhone HEIC support and WebP to PDF, that constraint shaped every decision. Here is what we did and what surprised us.</p>
<ol>
<li>HEIC: decode only when needed</li>
</ol>
<p>Chrome, Edge and Firefox cannot decode HEIC in an <img /> tag. We used the open source heic2any library to turn HEIC into PNG or JPEG inside the page. It is large (about 1.35 MB), so we host it ourselves and load it lazily, only when the user actually picks a .heic or .heif file. Everyone else never downloads it.</p>
<p>Detection uses both the extension and the MIME type, because some systems hand you HEIC with an empty file.type. Also remember accept="image/*,.heic,.heif" on the file input, or Windows will hide those files in the picker.</p>
<ol start="2">
<li>Safari cannot encode WebP</li>
</ol>
<p>This one cost us a bug report. canvas.toBlob(cb, 'image/webp') on Safari (and every browser on iOS) does not fail. It silently returns a PNG. Our tool then named that PNG photo.webp.</p>
<p>The fix: check blob.type after encoding. If you asked for WebP and got something else, fall back to a WebP encoder compiled for the browser (we used @jsquash/webp, loaded on demand). Desktop Chrome never loads it.</p>
<ol start="3">
<li>EXIF orientation in PDFs</li>
</ol>
<p>Phone cameras often store pixels sideways plus an EXIF orientation tag. Browsers respect the tag on screen, so thumbnails looked correct. But we embedded the original JPEG bytes into the PDF with pdf-lib, and PDFs ignore EXIF. Result: rotated pages.</p>
<p>We now read the orientation tag from the JPEG header and rotate the image on the PDF page (90, 180 or 270 degrees) without encoding it again, so quality and file size stay the same. The rare mirrored orientations go through a canvas first.</p>
<ol start="4">
<li>WebP to PDF</li>
</ol>
<p>pdf-lib embeds only JPEG and PNG. WebP files are drawn to a canvas over a white background and saved as JPEG before embedding.</p>
<p>Try it and break it</p>
<p><a href="https://editpdf.tools/image-format-convert">https://editpdf.tools/image-format-convert</a>
<a href="https://editpdf.tools/image-to-pdf">https://editpdf.tools/image-to-pdf</a></p>
<p>If you find an edge case (strange HEIC variants, odd EXIF), tell us at <a href="mailto:support@editpdf.tools">support@editpdf.tools</a> or through <a href="https://editpdf.tools/contact">https://editpdf.tools/contact</a>. We fix what people report.</p>
]]></content:encoded></item><item><title><![CDATA[Where Does Your PDF Go When You Use a Free Online Tool?]]></title><description><![CDATA[Most free PDF sites upload your file to their server. Here is what happens to it, why it matters for private documents, and how to check any tool.]]></description><link>https://chandan-editpdf.hashnode.dev/where-does-your-pdf-go</link><guid isPermaLink="true">https://chandan-editpdf.hashnode.dev/where-does-your-pdf-go</guid><category><![CDATA[privacy]]></category><category><![CDATA[pdf]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Chandan Singh]]></dc:creator><pubDate>Thu, 29 Oct 2026 07:02:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ae2d7ba3e9c8a6d51157f98/5425f8da-40c8-4164-a2de-dc17ec1d8f4e.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You need to shrink a PDF for a job portal, so you search "compress PDF free", open the first result, drop your file in and download the smaller version. Thirty seconds, done.</p>
<p>But in those thirty seconds, your file took a trip. Most people never think about where it went.</p>
<h2>What happens on most PDF sites</h2>
<p>On a typical online PDF tool, the work does not happen on your computer. It happens on the company's server.</p>
<ol>
<li>Your browser sends a full copy of the file to that server.</li>
<li>The server opens it, does the job (compress, merge, sign) and creates a new file.</li>
<li>You download the result.</li>
</ol>
<p>That means at least one copy of your document now exists on a machine you do not control. What happens to it next depends on that company: how long they keep it, who on their team can open it, how well the server is protected, and what their privacy policy really allows.</p>
<p>For a recipe or a school worksheet, this may not matter. But look at what people usually upload:</p>
<ul>
<li>Signed contracts and rental agreements</li>
<li>ID cards and passports for applications</li>
<li>Payslips, bank statements and tax forms</li>
<li>Medical reports and insurance claims</li>
</ul>
<p>These are exactly the files you would never email to a stranger. Yet we upload them to strangers every day, just to make them smaller.</p>
<h2>The other way: the tool comes to the file</h2>
<p>Modern browsers are powerful. Many everyday PDF and image jobs can now run entirely inside the browser tab, on your own phone or computer. The page loads the tool, you choose your file, and the work happens locally. Nothing is sent anywhere.</p>
<p>That is the idea behind <a href="https://editpdf.tools">editpdf.tools</a>. Our 14 free tools work this way, from <a href="https://editpdf.tools/compress-pdf">compressing a PDF</a> to <a href="https://editpdf.tools/pdf-sign">signing one</a>, merging, splitting, filling forms and resizing images to an exact size in KB. <strong>No signup and no watermark.</strong></p>
<p>One tool is different, and we say so openly. <strong>Edit PDF</strong>, which changes existing text inside a PDF, needs a server. That file is uploaded for processing and not stored. Every other tool keeps your file on your device.</p>
<h2>How to tell which kind of tool you are using</h2>
<p>You do not need to trust any website's privacy promise, including ours. Your browser can show you every file a page sends. Open the developer tools, go to the <strong>Network tab</strong>, use the tool and watch whether your file goes out. We show this test in a short video on our <a href="https://editpdf.tools/security#proof">security page</a>, and I will walk through it step by step in a separate post.</p>
<h2>A simple rule</h2>
<p>Before you upload a document anywhere, ask one question: <strong>would I be fine if a stranger kept a copy of this?</strong> If the answer is no, use a tool that works on your device.</p>
<p>Thanks for reading. If you have questions about how browser-based tools handle files, leave a comment and I will answer.</p>
<p><em>Chandan, editpdf.tools</em></p>
]]></content:encoded></item></channel></rss>