<?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: PdfPixel Tech</title>
    <description>The latest articles on DEV Community by PdfPixel Tech (@pdfpixeltechtech).</description>
    <link>https://dev.to/pdfpixeltechtech</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%2F4229528%2F0c364d71-4e09-4639-881b-c7c25a249a15.png</url>
      <title>DEV Community: PdfPixel Tech</title>
      <link>https://dev.to/pdfpixeltechtech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pdfpixeltechtech"/>
    <language>en</language>
    <item>
      <title>Processing PDFs entirely in the browser: what building 168 client-side tools taught me</title>
      <dc:creator>PdfPixel Tech</dc:creator>
      <pubDate>Fri, 06 Nov 2026 02:42:52 +0000</pubDate>
      <link>https://dev.to/pdfpixeltechtech/processing-pdfs-entirely-in-the-browser-what-building-168-client-side-tools-taught-me-4e2p</link>
      <guid>https://dev.to/pdfpixeltechtech/processing-pdfs-entirely-in-the-browser-what-building-168-client-side-tools-taught-me-4e2p</guid>
      <description>&lt;p&gt;Every PDF website you have used asks the same quiet favour: upload your file to our server.&lt;br&gt;
For a menu PDF that is fine. For a bank statement, a medical report or a signed contract,&lt;br&gt;
"trust us" is a much bigger ask. A few years ago the honest alternative did not exist.&lt;br&gt;
Today it does, and building &lt;a href="https://pdfpixel.tech" rel="noopener noreferrer"&gt;PdfPixel&lt;/a&gt; — 168 PDF and image tools that&lt;br&gt;
never upload anything — taught me exactly where the browser is strong, and where it still bites.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture in one paragraph
&lt;/h2&gt;

&lt;p&gt;PdfPixel is a single-origin app. There is no upload endpoint because there is no backend to&lt;br&gt;
upload to. Each tool lazy-loads its own engine: &lt;a href="https://pdf-lib.js.org/" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt; for writing&lt;br&gt;
and merging, PDF.js for parsing and rendering, Tesseract's WASM build for OCR, and an ONNX&lt;br&gt;
model for subject cut-out in the background remover. Cloudflare Functions sit in front only to&lt;br&gt;
serve per-route static &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tags, hreflang blocks and JSON-LD; the bytes of your document&lt;br&gt;
never leave the device.&lt;/p&gt;

&lt;p&gt;That constraint shaped everything else. If the phone has 4 GB of RAM and a WASM heap ceiling,&lt;br&gt;
you cannot decompress a 400-page scan into bitmaps all at once. So compression works in page&lt;br&gt;
chunks, OCR streams tile by tile, and the background remover downloads its model once and&lt;br&gt;
caches it for later runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three problems worth your evening
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HEIC is a licensing ghost.&lt;/strong&gt; iPhone photos arrive as HEIC, and browsers outside the Apple&lt;br&gt;
ecosystem cannot decode it natively. The fix is a WASM build of libheif, but the real lesson is&lt;br&gt;
product-shaped: detect early, tell the user in plain words, and convert once, deliberately,&lt;br&gt;
instead of re-encoding through three pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXIF orientation lies to you.&lt;/strong&gt; A photo "rotated wrong" is usually a JPEG whose orientation&lt;br&gt;
flag was ignored by one pipeline and honoured by another. Read the flag, apply it once at&lt;br&gt;
decode time, then strip metadata on export. Users experience this as "the tool fixed my&lt;br&gt;
photo", and really it is the tool refusing to be confused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OCR errors cluster, they do not scatter.&lt;/strong&gt; Zero for O, one for lowercase L, &lt;code&gt;rn&lt;/code&gt; becoming&lt;br&gt;
&lt;code&gt;m&lt;/code&gt;, and in Devanagari, matras shifting silently so a word changes meaning. Knowing the&lt;br&gt;
cluster lets you design the proofread pass: numbers get read aloud, Hindi gets word-level&lt;br&gt;
attention, everything else gets a glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy as a feature, not a banner
&lt;/h2&gt;

&lt;p&gt;"No uploads" sounds like marketing until you watch where the bytes go. DevTools network tab,&lt;br&gt;
file open, tool run, export: zero document requests. Analytics and ads are consent-gated and&lt;br&gt;
load only after an explicit allow. The privacy promise became an architecture review instead&lt;br&gt;
of a policy page, and that is the only kind users can verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would tell myself at tool #1
&lt;/h2&gt;

&lt;p&gt;Ship the boring tools first. Merge, split, compress and JPG-to-PDF carry most real usage; the&lt;br&gt;
exotic ones (favicon from PNG, pixel-art converter) are joy and long-tail SEO, not the core.&lt;br&gt;
Write the guide next to the tool: "compress under 100 KB for SSC forms" answers a question&lt;br&gt;
people actually type, and the tool is the answer's last paragraph.&lt;/p&gt;

&lt;p&gt;If you want to poke at the behaviour, the whole suite is at&lt;br&gt;
&lt;a href="https://pdfpixel.tech" rel="noopener noreferrer"&gt;pdfpixel.tech&lt;/a&gt; — open DevTools, watch the network tab stay quiet, and&lt;br&gt;
break something interesting. Questions and war stories welcome in the comments.&lt;/p&gt;

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