<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PWA on Ujjwal Chowdhury</title><link>https://u77w41.github.io/tags/pwa/</link><description>Recent content in PWA on Ujjwal Chowdhury</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 27 Oct 2026 00:00:00 +0530</lastBuildDate><atom:link href="https://u77w41.github.io/tags/pwa/index.xml" rel="self" type="application/rss+xml"/><item><title>ANURUP: privacy-first photo and PDF tools</title><link>https://u77w41.github.io/p/anurup/</link><pubDate>Tue, 27 Oct 2026 00:00:00 +0530</pubDate><guid>https://u77w41.github.io/p/anurup/</guid><description>&lt;img src="https://u77w41.github.io/p/anurup/Anurup_background.png" alt="Featured image of post ANURUP: privacy-first photo and PDF tools" /&gt;&lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/" target="_blank" rel="noopener"&#10; &gt;Open the app&lt;/a&gt; · &lt;a class="link" href="https://github.com/U77w41/anurup/wiki" target="_blank" rel="noopener"&#10; &gt;Wiki&lt;/a&gt; · &lt;a class="link" href="https://github.com/U77w41/anurup" target="_blank" rel="noopener"&#10; &gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="overview"&gt;Overview&#10;&lt;/h2&gt;&lt;p&gt;Government exam, job, visa and KYC portals each want something slightly different: a 35×45 mm photo under 50 KB, a signature at 140×60 px, one merged PDF under 500 KB. ANURUP is a free set of photo and PDF tools for exactly these uploads.&lt;/p&gt;&#10;&lt;p&gt;It runs in the browser, so your files never leave your device, and there is no account to create. It works in Chrome, Edge, Firefox and Safari, on a computer or a phone, and you can install it as an app that keeps working offline.&lt;/p&gt;&#10;&lt;h2 id="all-tools"&gt;All tools&#10;&lt;/h2&gt;&lt;p&gt;Each tool has its own address, so you can bookmark the ones you use most.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Photo and signature&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;PDF&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/passport-photo/" target="_blank" rel="noopener"&#10; &gt;Passport Size Photo Maker&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-viewer/" target="_blank" rel="noopener"&#10; &gt;PDF Viewer&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/size-targeter/" target="_blank" rel="noopener"&#10; &gt;Resize Image to KB &amp;amp; Pixels&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/image-to-pdf/" target="_blank" rel="noopener"&#10; &gt;JPG to PDF Converter&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/image-compressor/" target="_blank" rel="noopener"&#10; &gt;Compress Image to KB&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-merger/" target="_blank" rel="noopener"&#10; &gt;Merge PDF&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/crop-rotate/" target="_blank" rel="noopener"&#10; &gt;Crop, Rotate &amp;amp; Flip Image&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-splitter/" target="_blank" rel="noopener"&#10; &gt;Split PDF&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/background-removal/" target="_blank" rel="noopener"&#10; &gt;Remove Image Background&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-page-manager/" target="_blank" rel="noopener"&#10; &gt;Organize PDF Pages&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/signature-cleaner/" target="_blank" rel="noopener"&#10; &gt;Signature Cleaner&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-compressor/" target="_blank" rel="noopener"&#10; &gt;Compress PDF to KB&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/format-converter/" target="_blank" rel="noopener"&#10; &gt;JPG, PNG &amp;amp; WebP Converter&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-to-images/" target="_blank" rel="noopener"&#10; &gt;PDF to JPG / PNG&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-stamp/" target="_blank" rel="noopener"&#10; &gt;Add Page Numbers &amp;amp; Watermark&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-sign/" target="_blank" rel="noopener"&#10; &gt;Sign &amp;amp; Fill PDF&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://u77w41.github.io/anurup/pdf-unlock/" target="_blank" rel="noopener"&#10; &gt;Remove PDF Password&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="how-it-works"&gt;How it works&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;Pick a tool on the home page, or search for the task, for example &lt;code&gt;50 KB&lt;/code&gt;, &lt;code&gt;signature&lt;/code&gt;, &lt;code&gt;merge&lt;/code&gt; or &lt;code&gt;password&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Drop a file on the upload box, click to browse, or paste an image with Ctrl/⌘+V.&lt;/li&gt;&#10;&lt;li&gt;Change the settings and click the main button. The result shows up below with a preview.&lt;/li&gt;&#10;&lt;li&gt;Download it, or send it straight to another tool.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="chaining-tools"&gt;Chaining tools&#10;&lt;/h3&gt;&lt;p&gt;A form upload usually takes more than one step. Every result has a &lt;strong&gt;Continue with this file&lt;/strong&gt; row that opens the file in the next tool, so you don&amp;rsquo;t have to download it and upload it again. Some common chains:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Crop → Remove background → Passport photo → Resize to KB&lt;/li&gt;&#10;&lt;li&gt;Signature Cleaner → Resize to KB → Sign &amp;amp; Fill PDF&lt;/li&gt;&#10;&lt;li&gt;JPG to PDF → Compress PDF&lt;/li&gt;&#10;&lt;li&gt;Remove PDF Password → Merge PDF → Compress PDF&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Files you pass along, or save with &lt;strong&gt;Save to workspace&lt;/strong&gt;, land in the &lt;strong&gt;Workspace&lt;/strong&gt;. It&amp;rsquo;s a shared tray that survives a page refresh and holds up to 60 files. Any upload box can pick from it, and you can select several files and send them to Merge PDF or JPG to PDF in one go.&lt;/p&gt;&#10;&lt;h2 id="privacy"&gt;Privacy&#10;&lt;/h2&gt;&lt;p&gt;ANURUP is a static website on GitHub Pages. Every tool runs inside your browser tab with Canvas, pdf-lib, PDF.js and QPDF compiled to WebAssembly, so no server ever receives your photos, PDFs or passwords.&lt;/p&gt;&#10;&lt;p&gt;The page downloads three things: the app itself, web fonts from Google Fonts and, the first time you use Remove Image Background, its AI model from IMG.LY&amp;rsquo;s CDN. Your photo is still processed on your device.&lt;/p&gt;&#10;&lt;p&gt;The browser keeps your workspace files (in IndexedDB), your light or dark choice (in localStorage) and a copy of the app for offline use. A PDF password is used once to decrypt the file and isn&amp;rsquo;t stored anywhere. Remove PDF Password also needs the real password. It doesn&amp;rsquo;t guess or crack anything.&lt;/p&gt;&#10;&lt;h2 id="install-and-use-offline"&gt;Install and use offline&#10;&lt;/h2&gt;&lt;p&gt;ANURUP is a Progressive Web App. Once installed, it opens in its own window from the dock, Start menu or home screen.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Where&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;How&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Chrome or Edge on a computer&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Click &lt;strong&gt;Install app&lt;/strong&gt; in the sidebar, or the install icon in the address bar&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Android (Chrome)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tap the download icon in the top bar, or &lt;strong&gt;Install app&lt;/strong&gt; in the menu&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;iPhone and iPad (Safari)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Share → &lt;strong&gt;Add to Home Screen&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Safari on a Mac&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;File → Add to Dock&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;After your first visit the app keeps a copy of itself (about 6 MB), and every tool works without internet, installed or not. Remove Image Background is the one exception: it downloads its AI model the first time and works offline after that. When a new version is out, ANURUP shows a &lt;strong&gt;Reload&lt;/strong&gt; prompt. Nothing changes until you click it, so a tool won&amp;rsquo;t reset in the middle of a job.&lt;/p&gt;&#10;&lt;h2 id="under-the-hood"&gt;Under the hood&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Part&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;What it uses&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Interface&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;React, TypeScript, Tailwind CSS, Radix UI&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PDF&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;pdf-lib, PDF.js, and QPDF compiled to WebAssembly for removing passwords&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Images&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Canvas, and IMG.LY&amp;rsquo;s background-removal model running on the device&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Build&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vite, plus a prerender step that writes a static page for every tool, a sitemap and a 404 page&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Offline&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;vite-plugin-pwa and a Workbox service worker&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tests&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vitest&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Hosting&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GitHub Pages, deployed by GitHub Actions on every push to &lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="guides"&gt;Guides&#10;&lt;/h2&gt;&lt;p&gt;The &lt;a class="link" href="https://github.com/U77w41/anurup/wiki" target="_blank" rel="noopener"&#10; &gt;ANURUP wiki&lt;/a&gt; has step-by-step guides:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/Getting-Started" target="_blank" rel="noopener"&#10; &gt;Getting started&lt;/a&gt;: how the app is laid out and how to move a file from one tool to the next&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/Install-as-an-App" target="_blank" rel="noopener"&#10; &gt;Install as an app&lt;/a&gt;: add it to your dock or home screen, update it, uninstall it&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/Photo-and-Signature-Guides" target="_blank" rel="noopener"&#10; &gt;Photo and signature guides&lt;/a&gt;: resize a photo to 20-50 KB, make a passport size photo, prepare a signature for an exam form, change a background to white&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/PDF-Guides" target="_blank" rel="noopener"&#10; &gt;PDF guides&lt;/a&gt;: JPG to PDF, compress a PDF to 100 KB, merge certificates, remove the password from a bank statement or e-Aadhaar, sign a form&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/Workspace-and-Chaining" target="_blank" rel="noopener"&#10; &gt;Workspace and chaining&lt;/a&gt;: keep files between tools without downloading them&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/Privacy-and-Security" target="_blank" rel="noopener"&#10; &gt;Privacy and security&lt;/a&gt;: what stays on your device and what the app downloads&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/FAQ" target="_blank" rel="noopener"&#10; &gt;FAQ&lt;/a&gt; and &lt;a class="link" href="https://github.com/U77w41/anurup/wiki/Troubleshooting" target="_blank" rel="noopener"&#10; &gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/U77w41/anurup/wiki/Development" target="_blank" rel="noopener"&#10; &gt;Development&lt;/a&gt;: run it locally, add a tool, deploy&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Found a bug? &lt;a class="link" href="https://github.com/U77w41/anurup/issues" target="_blank" rel="noopener"&#10; &gt;Open an issue&lt;/a&gt; with the tool name, your browser and what you expected to happen. Please don&amp;rsquo;t attach private documents.&lt;/p&gt;&#10;</description></item></channel></rss>