<?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: RB</title>
    <description>The latest articles on DEV Community by RB (@rahul33859111).</description>
    <link>https://dev.to/rahul33859111</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1407467%2F19cd066a-3cf8-42ce-aa0e-3a921086b3a9.png</url>
      <title>DEV Community: RB</title>
      <link>https://dev.to/rahul33859111</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rahul33859111"/>
    <language>en</language>
    <item>
      <title>Stop sending user PDFs to random cloud APIs (how to do it locally) published</title>
      <dc:creator>RB</dc:creator>
      <pubDate>Mon, 08 Jun 2026 11:59:48 +0000</pubDate>
      <link>https://dev.to/rahul33859111/stop-sending-user-pdfs-to-random-cloud-apis-how-to-do-it-locally-published-7ha</link>
      <guid>https://dev.to/rahul33859111/stop-sending-user-pdfs-to-random-cloud-apis-how-to-do-it-locally-published-7ha</guid>
      <description>&lt;p&gt;I recently had to build a feature where users could merge a bunch of invoices and scan them for specific keywords.&lt;/p&gt;

&lt;p&gt;My first instinct was to do what I always do: grab an API key from Adobe or some generic PDF service, send the file to their server, wait 4 seconds, and get the merged file back.&lt;/p&gt;

&lt;p&gt;But looking at the actual data—these were medical bills and tax documents—I realized how insane that workflow is. Why are we conditioning users to upload highly sensitive documents to random AWS buckets just to stitch two pages together? It’s a massive privacy risk, and honestly, the API latency is annoying.&lt;/p&gt;

&lt;p&gt;I spent the weekend ripping out the backend API and forcing everything to run client-side. Here is what I learned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't need a backend for PDF manipulation anymore&lt;/strong&gt;&lt;br&gt;
If you haven't checked out pdf-lib recently, you should. It compiles down to WebAssembly, which means your browser can chew through binary PDF manipulation just as fast as a Node backend.&lt;/p&gt;

&lt;p&gt;I threw together a simple utility function. No Express server, no AWS S3 buckets, no waiting for a network request to finish.&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pdf-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Runs entirely in the browser&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;mergeLocally&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file2&lt;/span&gt;&lt;span class="p"&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;pdf1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&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;pdf2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;file2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arrayBuffer&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;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;PDFDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Copy and append pages&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copyPages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pdf1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pdf1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPageIndices&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;p2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copyPages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pdf2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pdf2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPageIndices&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="nx"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nx"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

  &lt;span class="c1"&gt;// spit out a blob for the user to download&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Blob&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/pdf&lt;/span&gt;&lt;span class="dl"&gt;'&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 literally it.&lt;/p&gt;

&lt;p&gt;I got a bit obsessed with the "Zero Upload" architecture. Once I realized how snappy it felt to bypass the network tab entirely, I ended up building an entire UI around it.&lt;/p&gt;

&lt;p&gt;I put it live at &lt;a href="https://www.pdfpro.co.in" rel="noopener noreferrer"&gt;PDF Pro AI&lt;/a&gt; just to see how far I could push browser-based processing. I even got a Contract Analyzer working that extracts text locally via WASM before doing any AI checks, so the physical PDF never touches my database.&lt;/p&gt;

&lt;p&gt;If you're building SaaS products that handle NDAs, tax forms, or medical records, give client-side parsing a shot. It completely eliminates your server costs for file processing, and more importantly, you don't have to worry about accidentally leaking your users' files.&lt;/p&gt;

&lt;p&gt;Has anyone else completely ditched backend PDF rendering, or is there a use-case I'm missing where server-side is still strictly better?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Why I Built My Free PDF Editor with WebAssembly (Zero Server Uploads)</title>
      <dc:creator>RB</dc:creator>
      <pubDate>Fri, 22 May 2026 13:13:08 +0000</pubDate>
      <link>https://dev.to/rahul33859111/why-i-built-my-free-pdf-editor-with-webassembly-zero-server-uploads-1ibe</link>
      <guid>https://dev.to/rahul33859111/why-i-built-my-free-pdf-editor-with-webassembly-zero-server-uploads-1ibe</guid>
      <description>&lt;p&gt;If you’ve ever tried to compress a bank statement or merge sensitive PDF documents online, you’ve probably noticed the process: you upload the file, wait for a progress bar, and then download the result. &lt;/p&gt;

&lt;p&gt;But what happens to that file on the server?&lt;br&gt;
Most free PDF tools (like ILovePDF or Smallpdf) upload your highly sensitive documents to remote servers to process them. This is a massive privacy risk for documents containing PAN cards, Aadhaar numbers, and financial statements. &lt;/p&gt;

&lt;p&gt;To solve this, I built &lt;strong&gt;&lt;a href="https://www.pdfpro.co.in" rel="noopener noreferrer"&gt;PDF Pro&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why WebAssembly (WASM)?
&lt;/h3&gt;

&lt;p&gt;Instead of sending your files to a server, I used WebAssembly to compile a heavy C++ PDF processing library directly into Javascript. &lt;/p&gt;

&lt;p&gt;This means the entire PDF engine runs &lt;strong&gt;locally inside your browser&lt;/strong&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Uploads:&lt;/strong&gt; Your file literally never leaves your computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Speed:&lt;/strong&gt; Because there is no network latency, compressing a 10MB file happens in milliseconds instead of minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% Free:&lt;/strong&gt; No servers means no cloud computing costs. I can afford to offer this tool completely free with zero daily limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Built for the Indian Web
&lt;/h3&gt;

&lt;p&gt;I specifically optimized PDF Pro to target government portal limits. The Staff Selection Commission (SSC) and UPSC require documents to be strictly under 200KB. &lt;/p&gt;

&lt;p&gt;Instead of arbitrarily dropping quality and making your scanned certificates blurry, the WebAssembly engine strips embedded fonts and intelligently down-samples resolution to exactly 150 DPI—maintaining crystal clear vector text while satisfying the portal sizes.&lt;/p&gt;

&lt;p&gt;If you are a developer, CA, or student tired of uploading your personal data to random websites, try it out: &lt;strong&gt;&lt;a href="https://www.pdfpro.co.in" rel="noopener noreferrer"&gt;PDF Pro - Free &amp;amp; Private PDF Tools&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>webassembly</category>
      <category>privacy</category>
    </item>
    <item>
      <title>ShowDev: I built a 100% local, zero-upload PDF editor using WebAssembly</title>
      <dc:creator>RB</dc:creator>
      <pubDate>Thu, 21 May 2026 13:36:08 +0000</pubDate>
      <link>https://dev.to/rahul33859111/showdev-i-built-a-100-local-zero-upload-pdf-editor-using-webassembly-19o5</link>
      <guid>https://dev.to/rahul33859111/showdev-i-built-a-100-local-zero-upload-pdf-editor-using-webassembly-19o5</guid>
      <description>&lt;p&gt;Why I Built a Privacy-First PDF Tool for India's Government Portals (And the Tech Behind It)&lt;br&gt;
Updated&lt;br&gt;
May 20, 2026&lt;br&gt;
•&lt;br&gt;
5 min read&lt;br&gt;
RahulBanerjee&lt;br&gt;
RahulBanerjee&lt;br&gt;
Part of series&lt;br&gt;
Building in Public — PDF Pro&lt;br&gt;
Every Indian who has applied for a government job, filed an ITR, or renewed their passport knows the frustration I'm about to describe.&lt;/p&gt;

&lt;p&gt;You have spent hours gathering your documents — Aadhaar card, PAN card, marksheets, photographs. You open the portal. You upload your carefully scanned PDF. And then you see it:&lt;/p&gt;

&lt;p&gt;❌ "File size exceeds the maximum limit of 200KB. Please upload a smaller file."&lt;/p&gt;

&lt;p&gt;Your file is 2.1MB. You try again. 1.8MB. Still rejected. You are now frantically Googling "how to compress PDF online free" at 11:45 PM, the night before the application deadline.&lt;/p&gt;

&lt;p&gt;Every tool you find has the same catch: upload your document to our servers first.&lt;/p&gt;

&lt;p&gt;That is exactly the problem I set out to solve.&lt;/p&gt;

&lt;p&gt;The Privacy Problem Nobody Talks About Think about what you are uploading when you use a typical online PDF compressor:&lt;/p&gt;

&lt;p&gt;Your Aadhaar card (your national identity number) Your PAN card (your tax identity) Your bank statements (your complete financial history) Your ITR filings (income, assets, liabilities) These files are being sent to servers in the US, Europe, or wherever the company is hosted. You have no idea what happens to them after processing. Are they stored? For how long? Are they used to train AI models? Are they sold?&lt;/p&gt;

&lt;p&gt;Most privacy policies of these tools are vague at best and alarming at worst.&lt;/p&gt;

&lt;p&gt;When I dug into this problem, I realized the solution already existed in the browser. We just weren't using it.&lt;/p&gt;

&lt;p&gt;The Solution: WebAssembly Changes Everything Modern browsers ship with a technology called WebAssembly (Wasm) — a binary instruction format that lets you run near-native speed code directly inside the browser sandbox.&lt;/p&gt;

&lt;p&gt;Libraries like pdf-lib and Ghostscript compiled to Wasm mean you can run a full PDF compression engine entirely inside the user's browser tab.&lt;/p&gt;

&lt;p&gt;Here is what this means practically:&lt;/p&gt;

&lt;p&gt;Traditional Cloud Tool: User → Upload file to server → Server compresses → Download result ↑ Your private document lives on their infrastructure PDF Pro (Wasm-based): User → File loads in browser memory → Browser compresses locally → Download result ↑ Your document never leaves your computer The file never touches a remote server. Not even for a millisecond.&lt;/p&gt;

&lt;p&gt;Building PDF Pro I built PDF Pro (&lt;a href="https://pdfpro.co.in" rel="noopener noreferrer"&gt;https://pdfpro.co.in&lt;/a&gt;) as a Next.js application with a Wasm core. Here is the architecture in plain terms:&lt;/p&gt;

&lt;p&gt;Frontend: Next.js 16 (App Router) hosted on Vercel PDF Engine: WebAssembly-compiled compression libraries running client-side Analytics: Google Analytics for aggregate visitor counting only — no PII Backend: None. There is no backend that touches your files.&lt;/p&gt;

&lt;p&gt;The stack is intentionally minimal. The less infrastructure you have, the less can go wrong from a privacy standpoint.&lt;/p&gt;

&lt;p&gt;The Compression Challenge Government portals in India have wildly different file size requirements:&lt;/p&gt;

&lt;p&gt;Portal Limit UPSC IAS Application 200KB SSC CGL 200KB IBPS PO 500KB Passport Seva 1MB ITR Filing 1MB Visa Application 1MB Building a single tool that handles all these targets while preserving document readability was the core engineering challenge. Too aggressive on compression and your Aadhaar number becomes unreadable. Too gentle and the portal rejects the file.&lt;/p&gt;

&lt;p&gt;The solution was letting the user control the compression level explicitly, with a real-time preview of the output file size before they download.&lt;/p&gt;

&lt;p&gt;What I Learned Building This&lt;/p&gt;

&lt;p&gt;Indian users are underserved by Western productivity tools Most global PDF tools are built for English-speaking Western users filing corporate documents. The specific pain point of compressing identity documents for strict-size government portals is a uniquely Indian problem that nobody was solving well.&lt;/p&gt;

&lt;p&gt;Privacy is a feature, not a checkbox When I started describing PDF Pro as "your files never leave your browser," the response from users was immediate and emotional. People care about this. They had just never had a tool that made it the central promise.&lt;/p&gt;

&lt;p&gt;WebAssembly is criminally underused in productivity tools The performance of Wasm-compiled PDF libraries surprised even me. Compression that would take a server round-trip (upload → process → download) now completes in under 3 seconds on a mid-range phone, entirely offline, with no latency.&lt;/p&gt;

&lt;p&gt;The Bigger Picture We talk a lot in the developer community about building products for global audiences. But there are 1.4 billion people in India navigating government digital infrastructure that was not designed with them in mind.&lt;/p&gt;

&lt;p&gt;If you know WebAssembly, you have a genuine superpower to fix these problems — tools that work offline, respect privacy by design, and don't require a subscription or an account.&lt;/p&gt;

&lt;p&gt;PDF Pro is proudly built in India. Not as a marketing line, but as a genuine statement of intent about who this tool is for.&lt;/p&gt;

&lt;p&gt;Try It The tool is completely free with no account required:&lt;/p&gt;

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

&lt;p&gt;If you are a developer curious about the Wasm implementation, feel free to reach out at &lt;a href="mailto:rahulorama@gmail.com"&gt;rahulorama@gmail.com&lt;/a&gt; . I am happy to discuss the technical architecture in more detail.&lt;/p&gt;

&lt;p&gt;And if you are an Indian developer building tools for Indian problems — I would love to connect. This space needs more of us.&lt;/p&gt;

&lt;p&gt;Rahul Banerjee is an independent developer based in India. He builds privacy-first productivity tools using modern web technologies.&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev
&lt;/h1&gt;

&lt;h1&gt;
  
  
  javascript
&lt;/h1&gt;

&lt;h1&gt;
  
  
  webassembly
&lt;/h1&gt;

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