<?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: Jack Green</title>
    <description>The latest articles on DEV Community by Jack Green (@jack_green_7b74cb2cdf9e23).</description>
    <link>https://dev.to/jack_green_7b74cb2cdf9e23</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%2F1995706%2F84828d29-3bb0-490e-b1b3-1733aad9a88b.jpg</url>
      <title>DEV Community: Jack Green</title>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jack_green_7b74cb2cdf9e23"/>
    <language>en</language>
    <item>
      <title>PDF Merge &amp; Split: The $19 One-Time Alternative to Smallpdf</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Wed, 29 Jul 2026 05:55:20 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/pdf-merge-split-the-19-one-time-alternative-to-smallpdf-1ki3</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/pdf-merge-split-the-19-one-time-alternative-to-smallpdf-1ki3</guid>
      <description>&lt;h2&gt;
  
  
  The Problem With Smallpdf and Similar Services
&lt;/h2&gt;

&lt;p&gt;Most online PDF tools like Smallpdf, iLovePDF, and Adobe Acrobat Online work the same way: you upload your files to their servers, they process them, and you download the result. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your data leaves your device&lt;/strong&gt; — sensitive documents are temporarily stored on third-party servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription traps&lt;/strong&gt; — features are locked behind monthly payments ($12–$25/month)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy concerns&lt;/strong&gt; — who knows what they do with your uploaded files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage limits&lt;/strong&gt; — free tiers come with strict file size and daily quota restrictions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution: 100% Browser-Based PDF Operations
&lt;/h2&gt;

&lt;p&gt;Meet &lt;strong&gt;PDF Merge &amp;amp; Split&lt;/strong&gt; — a completely client-side tool that runs in your browser. Your PDF never leaves your device. Not for a second.&lt;/p&gt;

&lt;p&gt;Built with &lt;a href="https://pdf-lib.org/" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt;, the library powers all PDF operations directly in JavaScript. You drag and drop your files, and the app handles everything locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge multiple PDFs&lt;/strong&gt; into a single file — combine reports, contracts, or any documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split PDFs by page range&lt;/strong&gt; — extract specific pages or sections (e.g., pages 1-3, 5, 7-10)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero uploads&lt;/strong&gt; — processing happens entirely in your browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No subscriptions&lt;/strong&gt; — $19 one-time payment, forever yours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No tracking&lt;/strong&gt; — no analytics, no cookies, no data collection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline&lt;/strong&gt; — once loaded, you can merge/split PDFs without internet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports all modern browsers&lt;/strong&gt; — Chrome, Firefox, Safari, Edge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fvia.placeholder.com%2F600x400%2Ff8f9fa%2F1a1a2e%3Ftext%3DPDF%2BMerge%2B%2526%2BSplit%2BInterface" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fvia.placeholder.com%2F600x400%2Ff8f9fa%2F1a1a2e%3Ftext%3DPDF%2BMerge%2B%2526%2BSplit%2BInterface" alt="PDF Merge &amp;amp; Split interface showing drag-and-drop zones for merge and split tabs" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing: Simple and Fair
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;$19.00 one-time&lt;/strong&gt; — that's it. No monthly bills, no hidden fees, no expiring access.&lt;/p&gt;

&lt;p&gt;Compare this to Smallpdf's Pro at $12/month ($144/year) or Adobe Acrobat's $23.99/month ($288/year). Over five years, you'd pay &lt;strong&gt;$720+&lt;/strong&gt; for alternatives — while PDF Merge &amp;amp; Split is yours for just $19.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://pdf-merge-split.jackgreen.top" rel="noopener noreferrer"&gt;PDF Merge &amp;amp; Split&lt;/a&gt; in your browser&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Merge&lt;/strong&gt; to combine multiple PDFs, or &lt;strong&gt;Split&lt;/strong&gt; to extract pages&lt;/li&gt;
&lt;li&gt;Drag and drop your PDF files or click to browse&lt;/li&gt;
&lt;li&gt;For splitting, enter page ranges like &lt;code&gt;1-3, 5, 7-10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click the action button and wait for processing to complete&lt;/li&gt;
&lt;li&gt;Download your merged or split PDFs — they're saved directly to your device&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It First
&lt;/h2&gt;

&lt;p&gt;You can use PDF Merge &amp;amp; Split for free — the merge and split features are completely available at no cost. The free version includes all core functionality; simply upgrade to Pro ($19) to remove the watermark and support continued development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started Today
&lt;/h2&gt;

&lt;p&gt;Head over to &lt;a href="https://pdf-merge-split.jackgreen.top" rel="noopener noreferrer"&gt;pdf-merge-split.jackgreen.top&lt;/a&gt; and try merging or splitting your first PDF. Your privacy, your files, your terms.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;PDF Merge &amp;amp; Split is part of the &lt;a href="https://jackgreen.top" rel="noopener noreferrer"&gt;jackgreen.top&lt;/a&gt; collection of client-side web tools. All tools share the same philosophy: powerful functionality without compromising your privacy.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>PDF Engine — Rust/WASM PDF Processing in Your Browser</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Wed, 29 Jul 2026 05:55:16 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/pdf-engine-rustwasm-pdf-processing-in-your-browser-2499</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/pdf-engine-rustwasm-pdf-processing-in-your-browser-2499</guid>
      <description>&lt;h1&gt;
  
  
  Tired of $288/Year PDF Subscriptions? Try $19 Forever (Zero Uploads)
&lt;/h1&gt;

&lt;p&gt;You open a cloud PDF editor, sign in, upload a tax return, wait thirty seconds, then wonder if someone's indexing your receipts. Stop it. In 2026 you should be able to merge two PDFs without handing over your document.&lt;/p&gt;

&lt;p&gt;It's 2026 and we're still handing our sensitive documents over to cloud services just to merge two files or compress a PDF.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Cloud PDF editors are convenient until you need privacy. Legal docs, tax returns, medical records — these aren't things you want floating around some startup's database. And the pricing is absurd: Adobe charges ~$20/month ($240/year), Smallpdf runs $15/month, most free tools cap you at 2–5 documents per day, and &lt;strong&gt;all of them&lt;/strong&gt; want you to create an account first.&lt;/p&gt;

&lt;p&gt;Subscriptions for PDF tools make zero sense when the operations themselves are simple: combine pages, split pages out, re-compress images. These are &lt;strong&gt;existing file format&lt;/strong&gt; operations. They don't require servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;PDF Engine&lt;/strong&gt; — a lightweight browser-based app that does everything you need and nothing you don't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; multiple PDFs into one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split&lt;/strong&gt; PDFs by page range&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compress&lt;/strong&gt; PDFs to reduce file size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% client-side&lt;/strong&gt; — your files never leave your device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline&lt;/strong&gt; — no internet needed after loading&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No sign-up, no account, no tracking&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built with Rust compiled to WebAssembly using &lt;code&gt;wasm-pack&lt;/code&gt; and the &lt;code&gt;pdf-lib&lt;/code&gt; library. Everything runs in the browser using modern Web APIs. No upload step, no server processing — just open the URL and start working.&lt;/p&gt;

&lt;p&gt;And the price? &lt;strong&gt;$19, once.&lt;/strong&gt; No subscription, no limits, no hidden catches — just $19 and free updates forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Everything runs on your machine using modern browser APIs. No upload step, no server processing — just open the URL and start working.&lt;/p&gt;

&lt;p&gt;Built with Rust (compiled to WASM), vanilla HTML/CSS/JS, and deployed behind Nginx. Zero external dependencies on the server side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pdf-engine.example.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Try the free demo at pdf-engine.example.com&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://pdf-engine.example.com/buy" rel="noopener noreferrer"&gt;&lt;strong&gt;Buy Pro — $19, one-time&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Philosophy
&lt;/h2&gt;

&lt;p&gt;The server code is open. The core PDF operations use well-documented PDF Reference specifications. No vendor lock-in, no "just works until the API changes" black boxes.&lt;/p&gt;

&lt;p&gt;Because privacy shouldn't cost $240 a year.&lt;/p&gt;




&lt;p&gt;Built by &lt;a href="https://www.jackgreen.top" rel="noopener noreferrer"&gt;jackgreen.top&lt;/a&gt; — shipping simple tools that respect your time and your data.&lt;/p&gt;

&lt;h1&gt;
  
  
  pdf #rust #wasm #opensource #privacy #webdev
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Paid $30/Month for Xnapper — Then Built a Free Alternative in One HTML File</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 16:52:20 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/i-paid-30month-for-xnapper-then-built-a-free-alternative-in-one-html-file-19h7</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/i-paid-30month-for-xnapper-then-built-a-free-alternative-in-one-html-file-19h7</guid>
      <description>&lt;p&gt;I wasted $360 on Xnapper last year. $30/month for a macOS app that adds pretty backgrounds to screenshots.&lt;/p&gt;

&lt;p&gt;Then I realized: it's just CSS gradients and canvas drawing. No server. No account. No subscription.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://screenshot.jackgreen.top/" rel="noopener noreferrer"&gt;Screenshot Beautifier&lt;/a&gt; — a free, client-side alternative that runs in any browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Xnapper is great at what it does. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$30/month&lt;/strong&gt; — that's $360/year for a tool that manipulates pixels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS only&lt;/strong&gt; — Windows and Linux users are out of luck&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload required&lt;/strong&gt; — your screenshots go to their servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account wall&lt;/strong&gt; — create an account just to beautify a screenshot&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://screenshot.jackgreen.top/" rel="noopener noreferrer"&gt;Screenshot Beautifier&lt;/a&gt; does the same thing, differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free demo&lt;/strong&gt; — drag a screenshot, add a background, export. Done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$9 one-time&lt;/strong&gt; for HD export — cheaper than ONE month of Xnapper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% client-side&lt;/strong&gt; — your screenshots never leave your browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works everywhere&lt;/strong&gt; — Chrome, Firefox, Safari, Edge on any OS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account&lt;/strong&gt; — just open the URL and go&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;It's surprisingly simple. The entire app is one HTML file with inline CSS and JavaScript:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drag &amp;amp; drop&lt;/strong&gt; — loads the image into a hidden &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas API&lt;/strong&gt; — draws the screenshot onto a canvas with your chosen background, shadow, and frame&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; — &lt;code&gt;canvas.toBlob()&lt;/code&gt; downloads the result as PNG&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The device frame presets (macOS window, browser window, phone) are just rectangles drawn on canvas before the screenshot. The blur backgrounds use CSS &lt;code&gt;backdrop-filter&lt;/code&gt; on the canvas element.&lt;/p&gt;

&lt;p&gt;Zero libraries. Zero dependencies. One HTML file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Screenshot tools are utilities, not products. You shouldn't pay monthly for something that boils down to &lt;code&gt;ctx.drawImage()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This tool proves that simple utilities should be simple: free, fast, private, and works offline.&lt;/p&gt;

&lt;p&gt;Try it at &lt;a href="https://screenshot.jackgreen.top/" rel="noopener noreferrer"&gt;screenshot.jackgreen.top&lt;/a&gt; — no signup, no upload, no cost.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fill &amp; Sign PDF — Complete Any Form in Your Browser (No Uploads, No Server)</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 16:52:01 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/fill-sign-pdf-complete-any-form-in-your-browser-no-uploads-no-server-460o</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/fill-sign-pdf-complete-any-form-in-your-browser-no-uploads-no-server-460o</guid>
      <description>&lt;p&gt;Professionals fill PDF forms every day — tax documents, contracts, applications. Most tools force you to upload sensitive documents to a server. That's unacceptable for legal and financial paperwork.&lt;/p&gt;

&lt;p&gt;So I built Fill &amp;amp; Sign PDF: a tool you open in your browser, fill in any PDF form, add a signature, and download — all 100% client-side. No uploads. No accounts. No subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Adobe Fill &amp;amp; Sign costs $12.99/month. Smallpdf charges $12/month. Both upload your documents to their servers. For tax forms, lease agreements, or medical documents, that's a privacy risk you shouldn't have to accept.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution: 100% in-browser
&lt;/h2&gt;

&lt;p&gt;The entire app is a single HTML file. It uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Hopding/pdf-lib" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt; for reading PDFs, extracting form fields, and embedding signatures&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mozilla.github.io/pdf.js/" rel="noopener noreferrer"&gt;pdf.js&lt;/a&gt; for rendering the PDF preview in the browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No server. No API. No data ever leaves your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fill any PDF form field (text, checkboxes, dropdowns)&lt;/li&gt;
&lt;li&gt;Draw or type a signature and place it on the PDF&lt;/li&gt;
&lt;li&gt;Preview the filled PDF before downloading&lt;/li&gt;
&lt;li&gt;Works offline in any modern browser&lt;/li&gt;
&lt;li&gt;Dark mode support&lt;/li&gt;
&lt;li&gt;No sign-up, no account, no tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;$9 one-time.&lt;/strong&gt; No subscription. No recurring charge. Compare that to Adobe's $12.99/month ($156/year) or Smallpdf's $12/month.&lt;/p&gt;

&lt;p&gt;Free demo available at: &lt;a href="https://fill.jackgreen.top/" rel="noopener noreferrer"&gt;https://fill.jackgreen.top/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built the same way as &lt;a href="https://resume.jackgreen.top/" rel="noopener noreferrer"&gt;Resume PDF Builder&lt;/a&gt; and &lt;a href="https://pdf.jackgreen.top/" rel="noopener noreferrer"&gt;PDF Tool&lt;/a&gt; — all client-side, all privacy-first.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Built a Free QR Code Generator ($9 One-Time vs $15/Month Subscription)</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 13:27:46 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/i-built-a-free-qr-code-generator-9-one-time-vs-15month-subscription-578n</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/i-built-a-free-qr-code-generator-9-one-time-vs-15month-subscription-578n</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Free QR Code Generator (Because Subscriptions Are Over)
&lt;/h1&gt;

&lt;p&gt;If you've ever needed to generate a QR code — say, for a café menu, a business card, or a WiFi password — you probably Googled "QR code generator" and landed on one of those sites that ask you to create an account, upload your content to their server, and then either watermarks your result or demands $15/month for "pro features."&lt;/p&gt;

&lt;p&gt;I got tired of that. So I built something better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet QR Generator
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qr.jackgreen.top/" rel="noopener noreferrer"&gt;QR Generator&lt;/a&gt; is a &lt;strong&gt;browser-based QR code creator&lt;/strong&gt; that does one thing and does it well — and it works entirely on your device:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate QR codes for &lt;strong&gt;URLs, text, contacts, WiFi credentials&lt;/strong&gt;, and more&lt;/li&gt;
&lt;li&gt;Everything runs &lt;strong&gt;100% client-side&lt;/strong&gt; — your data never leaves your browser&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No account, no signup, no tracking, no cookies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline capable&lt;/strong&gt; — works with WiFi turned off&lt;/li&gt;
&lt;li&gt;Custom colors, sizes, logo embedding (Pro upgrade)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Exists
&lt;/h2&gt;

&lt;p&gt;The incumbents in this space are built around subscriptions and data collection:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;QR Tiger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$12–$16/month&lt;/td&gt;
&lt;td&gt;Monthly fees add up fast. Watermarked free tier. Cloud upload required.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;QR Code Generator Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$15/month&lt;/td&gt;
&lt;td&gt;Subscription trap. Your designs live on their servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free online generators&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Uploads your content to unknown servers. Privacy nightmare.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;QR Generator is different: &lt;strong&gt;$9 one-time&lt;/strong&gt; for pro features. Not per month. Not per year. Once. You own it forever, including all future updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Zero build step. Zero dependencies to install. The entire app loads as a single HTML file with the &lt;a href="https://github.com/davidshimjs/qrcodejs" rel="noopener noreferrer"&gt;&lt;code&gt;qrcodejs&lt;/code&gt;&lt;/a&gt; library from a CDN. Your browser generates the QR code using canvas rendering — no server round-trips, no API calls, no data exfiltration.&lt;/p&gt;

&lt;p&gt;For the Pro upgrade, SVG export, higher resolution output, logo embedding, and bulk generation are unlocked with a single payment through &lt;a href="https://creem.io" rel="noopener noreferrer"&gt;Creem.io&lt;/a&gt;, our payment processor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy-First by Design
&lt;/h2&gt;

&lt;p&gt;Here's what QR Generator &lt;em&gt;doesn't&lt;/em&gt; do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Doesn't send your QR code content to any server&lt;/li&gt;
&lt;li&gt;Doesn't set cookies or track analytics&lt;/li&gt;
&lt;li&gt;Doesn't require an email address or account&lt;/li&gt;
&lt;li&gt;Doesn't watermark your output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it &lt;em&gt;does&lt;/em&gt; do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generates QR codes directly in your browser using JavaScript and Canvas&lt;/li&gt;
&lt;li&gt;Respects your dark mode preference&lt;/li&gt;
&lt;li&gt;Has a terms page and a privacy policy (seriously, some apps don't even have those)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Free
&lt;/h2&gt;

&lt;p&gt;Head over to &lt;a href="https://qr.jackgreen.top/" rel="noopener noreferrer"&gt;qr.jackgreen.top&lt;/a&gt; and generate your first QR code. No account needed. Works on desktop, tablet, and phone.&lt;/p&gt;

&lt;p&gt;And if you want the pro features? &lt;strong&gt;$9. One time.&lt;/strong&gt; Not $180/year like the subscription tools. Compare that to QR Tiger's $144+/year or QR Code Generator Pro's $180+/year. That's 20× savings for life.&lt;/p&gt;

&lt;p&gt;Built because I believe software should be simple, private, and yours — not a subscription you're forced to keep paying.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a 100% Client-Side PDF Merge &amp; Split Tool (No Backend, No Sign-Up)</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 13:27:42 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/building-a-100-client-side-pdf-merge-split-tool-no-backend-no-sign-up-623</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/building-a-100-client-side-pdf-merge-split-tool-no-backend-no-sign-up-623</guid>
      <description>&lt;p&gt;People merge and split PDFs all the time — extract a signature page, combine receipts, pull one diagram out of a 200-page report. Every online tool I found either uploads your files to a server (fine for public docs, bad for NDAs) or locks basic features behind a subscription.&lt;/p&gt;

&lt;p&gt;So I built a tool that runs entirely in the browser. No backend. No sign-up. Your PDF never leaves your machine.&lt;/p&gt;

&lt;p&gt;Here's how it works, and what it took to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraint that shaped everything: no backend
&lt;/h2&gt;

&lt;p&gt;The entire app is static files: one HTML page, some CSS, and JavaScript loaded from CDNs. All PDF manipulation happens client-side using &lt;a href="https://github.com/pieterrobles/pdf-lib" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt;, a WebAssembly-compiled library that loads directly in the browser.&lt;/p&gt;

&lt;p&gt;That constraint buys three things for free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; — your documents never touch a server. Not even logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline&lt;/strong&gt; — works with WiFi off; useful on trains, planes, secure facilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero hosting cost&lt;/strong&gt; — it's static HTML, so nginx serves it for free.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Merging PDFs
&lt;/h2&gt;

&lt;p&gt;The core merge logic is about eight lines of code:&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="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="k"&gt;for &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;file&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;files&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;doc&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;file&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;pages&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;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc&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;pages&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;p&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;p&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;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="nf"&gt;downloadBlob&lt;/span&gt;&lt;span class="p"&gt;(&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;merged.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;file.arrayBuffer()&lt;/code&gt; reads the uploaded file directly from the user's filesystem — no &lt;code&gt;fetch&lt;/code&gt;, no &lt;code&gt;XMLHttpRequest&lt;/code&gt;. Then &lt;code&gt;copyPages&lt;/code&gt; + &lt;code&gt;addPage&lt;/code&gt; stitches them together. pdf-lib handles the PDF structure, cross-references, and object streams under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Splitting PDFs
&lt;/h2&gt;

&lt;p&gt;Splitting is the inverse: load one PDF, let users pick page ranges, write out new PDFs with just those pages:&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="nx"&gt;doc&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="nx"&gt;fileBytes&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;rangeText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;split-range&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&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;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseRanges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rangeText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPageCount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Group consecutive pages into separate downloads&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groups&lt;/span&gt; &lt;span class="o"&gt;=&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;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for &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;p&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&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="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;groups&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="nx"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for &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;g&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;groups&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;out&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;indices&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="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;i&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;srcPages&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;out&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;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;srcPages&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;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;out&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;p&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;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;out&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="nf"&gt;downloadBlob&lt;/span&gt;&lt;span class="p"&gt;(&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="s2"&gt;`pages-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&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;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.pdf`&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;h2&gt;
  
  
  The tricky bits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Password-protected PDFs&lt;/strong&gt; — pdf-lib can &lt;em&gt;read&lt;/em&gt; encrypted PDFs if you pass &lt;code&gt;userPassword&lt;/code&gt;, but stripping passwords requires knowing the password first. This is the #1 Pro feature request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large PDFs in memory&lt;/strong&gt; — the browser has limits. A 50MB PDF can spike memory usage to 200MB+ during operations. Acceptable for most use cases, but worth documenting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF.js for thumbnails&lt;/strong&gt; — rendering page previews requires the much larger PDF.js library (~700KB gzipped). For v1, we show numbered blocks instead to keep load times snappy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Design decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Browser over Electron
&lt;/h3&gt;

&lt;p&gt;Most "desktop" PDF tools are really Electron apps wrapped around the same web tech. For privacy-focused users, a browser-based tool has better guarantees: no OS-level access, no sandbox escapes, no auto-updater you didn't approve. The user gets the same functionality with stronger privacy boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  $19 one-time, not subscription
&lt;/h3&gt;

&lt;p&gt;Smallpdf charges ~$15/month (~$180/year). We charge $19 once. The math is simple: if you use this more than two weeks, you've already beaten the subscription. And since it runs in your browser, "updates" are just new HTML/CSS/JS — free forever after purchase.&lt;/p&gt;

&lt;h3&gt;
  
  
  CDN-loaded libraries
&lt;/h3&gt;

&lt;p&gt;pdf-lib loads from &lt;code&gt;cdn.jsdelivr.net&lt;/code&gt;. That's one HTTP request, ~300KB gzipped. Caches well, no server processing needed. Trade-off: requires internet on first load. We accept that — the alternative is shipping a 10MB native app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source spirit
&lt;/h2&gt;

&lt;p&gt;The free tier does everything — merge unlimited PDFs, split by page range, download instantly. The Pro tier ($19 one-time) adds advanced splitting: single-page extraction, rotation within splits, password-protected PDF support, batch rename. But the core tool is genuinely usable without paying.&lt;/p&gt;

&lt;p&gt;Try it here: &lt;a href="https://pdfmerge.jackgreen.top/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=pdfmerge-launch" rel="noopener noreferrer"&gt;https://pdfmerge.jackgreen.top/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=pdfmerge-launch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're building something similar, &lt;a href="https://pdf-lib.js.guide/" rel="noopener noreferrer"&gt;pdf-lib's docs&lt;/a&gt; are excellent. The &lt;code&gt;copyPages&lt;/code&gt; API is the workhorse — everything from merge to split to rotation boils down to copying pages between documents.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Was Paying $30/Month for QuickBooks Just to Track 5 Receipts a Month</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 07:06:59 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/i-was-paying-30month-for-quickbooks-just-to-track-5-receipts-a-month-5h80</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/i-was-paying-30month-for-quickbooks-just-to-track-5-receipts-a-month-5h80</guid>
      <description>&lt;h1&gt;
  
  
  I Was Paying $30/Month for QuickBooks Just to Track 5 Receipts a Month
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;A client-side receipt tracker for freelancers who hate subscriptions.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;I was paying $30/month for QuickBooks Self-Employed. Just to track about 5 receipts a month.&lt;/p&gt;

&lt;p&gt;My annual bill: $360. My actual usage: a fraction of what I was paying for.&lt;/p&gt;

&lt;p&gt;Sound familiar? If you're a freelancer, consultant, or solopreneur who only does a handful of invoices and expense receipts per quarter, you've probably felt the same subscription fatigue.&lt;/p&gt;

&lt;p&gt;So I built something better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Receipt Tracker
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://receipt-tracker.jackgreen.top/" rel="noopener noreferrer"&gt;Receipt Tracker&lt;/a&gt; is a &lt;strong&gt;completely client-side&lt;/strong&gt; receipt and expense tracker for freelancers. No signup. No account. No data ever leaves your browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$9 one-time. Free tier available.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upload or snap a receipt photo&lt;/strong&gt; — drag and drop, or use your phone camera&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categorize expenses&lt;/strong&gt; — travel, meals, office supplies, software, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly summaries&lt;/strong&gt; — see where your money goes with visual breakdowns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to PDF&lt;/strong&gt; — clean, organized receipt summaries for tax season&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to CSV&lt;/strong&gt; — standard format, no vendor lock-in&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Client-Side Matters
&lt;/h2&gt;

&lt;p&gt;Every other receipt app — QuickBooks, Xero, even the "free" ones — stores your financial data on their servers. You're trusting them with your income, your expenses, your business secrets.&lt;/p&gt;

&lt;p&gt;Receipt Tracker runs entirely in your browser. Your data never touches a server. Not even once.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-first&lt;/strong&gt; — your financial data stays yours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline&lt;/strong&gt; — after the first load, you don't even need internet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account&lt;/strong&gt; — no email, no password, no verification. Just open and use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in&lt;/strong&gt; — export to standard PDF or CSV. Switch tools anytime.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Pricing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;QuickBooks&lt;/th&gt;
&lt;th&gt;Xero&lt;/th&gt;
&lt;th&gt;Receipt Tracker&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$30/month&lt;/td&gt;
&lt;td&gt;$50/month&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$9 one-time&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annual cost&lt;/td&gt;
&lt;td&gt;$360&lt;/td&gt;
&lt;td&gt;$600&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$9&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data stored on servers&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Never&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signup required&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's 2.5% of QuickBooks' annual price. Or 1.5% of Xero's.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Freelancers who track 1–50 receipts per year&lt;/li&gt;
&lt;li&gt;Consultants who need simple expense logging&lt;/li&gt;
&lt;li&gt;Anyone tired of monthly subscriptions for simple tools&lt;/li&gt;
&lt;li&gt;People who care about privacy and want their data in their browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;This is built as a single HTML file with inline CSS and JavaScript. Zero build step. Zero dependencies (except jsPDF for PDF generation). Just a static server serving one file.&lt;/p&gt;

&lt;p&gt;The philosophy: the best code is the code never written. If you can solve a problem with one HTML file, why add a framework, a bundler, and a CI pipeline?&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://receipt-tracker.jackgreen.top/?utm_source=devto" rel="noopener noreferrer"&gt;Start tracking receipts for free →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or compare against your current tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://receipt-tracker.jackgreen.top/vs/quickbooks.html" rel="noopener noreferrer"&gt;vs QuickBooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://receipt-tracker.jackgreen.top/vs/xero.html" rel="noopener noreferrer"&gt;vs Xero&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;30-day money-back guarantee.&lt;/strong&gt; If it doesn't save you from subscription hell, I'll refund you. No questions asked.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ by &lt;a href="https://www.jackgreen.top" rel="noopener noreferrer"&gt;jackgreen.top&lt;/a&gt;. Also built &lt;a href="https://screenshot.jackgreen.top/" rel="noopener noreferrer"&gt;Screenshot Beautifier&lt;/a&gt; — beautiful screenshots, zero uploads.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Tired of $288/Year PDF Subscriptions? Try $19 Forever (Zero Uploads)</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 07:06:53 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/tired-of-288year-pdf-subscriptions-try-19-forever-zero-uploads-3dh9</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/tired-of-288year-pdf-subscriptions-try-19-forever-zero-uploads-3dh9</guid>
      <description>&lt;h1&gt;
  
  
  Tired of $288/Year PDF Subscriptions? Try $19 Forever (Zero Uploads)
&lt;/h1&gt;

&lt;p&gt;You open a cloud PDF editor, sign in, upload a tax return, wait thirty seconds, then wonder if someone's indexing your receipts. Stop it. In 2026 you should be able to merge two PDFs without handing over your document.&lt;/p&gt;

&lt;p&gt;It's 2026 and we're still handing our sensitive documents over to cloud services just to merge two files or compress a PDF.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Cloud PDF editors are convenient until you need privacy. Legal docs, tax returns, medical records — these aren't things you want floating around some startup's database. And the pricing is absurd: Adobe charges ~$20/month ($240/year), Smallpdf runs $15/month, most free tools cap you at 2–5 documents per day, and &lt;strong&gt;all of them&lt;/strong&gt; want you to create an account first.&lt;/p&gt;

&lt;p&gt;Subscriptions for PDF tools make zero sense when the operations themselves are simple: combine pages, split pages out, re-compress images. These are &lt;strong&gt;existing file format&lt;/strong&gt; operations. They don't require servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;PDF Tool&lt;/strong&gt; — a lightweight browser-based app that does everything you need and nothing you don't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; multiple PDFs into one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split&lt;/strong&gt; PDFs by page range&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compress&lt;/strong&gt; PDFs to reduce file size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% client-side&lt;/strong&gt; — your files never leave your device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline&lt;/strong&gt; — no internet needed after loading&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No sign-up, no account, no tracking&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the price? &lt;strong&gt;$19, once.&lt;/strong&gt; No subscription, no limits, no hidden catches — just $19 and free updates forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Everything runs on your machine using modern browser APIs. No upload step, no server processing — just open the URL and start working.&lt;/p&gt;

&lt;p&gt;Built with Python (stdlib only), vanilla HTML/CSS/JS, and deployed behind Nginx. Zero external dependencies on the server side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pdf.jackgreen.top/" rel="noopener noreferrer"&gt;&lt;strong&gt;Try the free demo at pdf.jackgreen.top&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://pdf.jackgreen.top/buy" rel="noopener noreferrer"&gt;&lt;strong&gt;Buy Pro — $19, one-time&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Philosophy
&lt;/h2&gt;

&lt;p&gt;The server code is open. The core PDF operations use well-documented specs (PDF Reference 1.7). No vendor lock-in, no "just works until the API changes" black boxes.&lt;/p&gt;

&lt;p&gt;Because privacy shouldn't cost $240 a year.&lt;/p&gt;




&lt;p&gt;Built by &lt;a href="https://www.jackgreen.top" rel="noopener noreferrer"&gt;jackgreen.top&lt;/a&gt; — shipping simple tools that respect your time and your data.&lt;/p&gt;

&lt;h1&gt;
  
  
  pdf #opensource #privacy #webdev #nodocs
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Built a Free Markdown-to-HTML Converter (Because Bear Costs $50/Year)</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 06:38:11 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/i-built-a-free-markdown-to-html-converter-because-bear-costs-50year-2mcj</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/i-built-a-free-markdown-to-html-converter-because-bear-costs-50year-2mcj</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Free Markdown-to-HTML Converter (Because Bear Costs $50/Year)
&lt;/h1&gt;

&lt;p&gt;If you've ever needed to convert Markdown to HTML, you probably did one of three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Opened a terminal and ran &lt;code&gt;pandoc input.md -o output.html&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pasted your Markdown into Notion and exported it&lt;/li&gt;
&lt;li&gt;Paid $50/year for Bear and hoped the export feature would work&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of those are great. So I built something better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet md-to-html
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://md.jackgreen.top/" rel="noopener noreferrer"&gt;md-to-html&lt;/a&gt; is a &lt;strong&gt;browser-based Markdown to HTML converter&lt;/strong&gt; that does one thing and does it well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paste or type&lt;/strong&gt; Markdown on the left&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See live HTML preview&lt;/strong&gt; on the right (debounced at 150ms)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy HTML&lt;/strong&gt; to clipboard with one click&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download&lt;/strong&gt; as a standalone &lt;code&gt;.html&lt;/code&gt; file with embedded CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drag &amp;amp; drop&lt;/strong&gt; &lt;code&gt;.md&lt;/code&gt; files directly into the editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark mode&lt;/strong&gt; that respects your system preference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs client-side. Your content never touches a server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Exists
&lt;/h2&gt;

&lt;p&gt;The incumbents in this space are expensive or bloated:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bear&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$50/year&lt;/td&gt;
&lt;td&gt;Overkill for conversion. macOS/iOS only. Apple ID required.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$8-10/month&lt;/td&gt;
&lt;td&gt;You're paying for a wiki to paste Markdown. Telemetry-heavy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$15 one-time&lt;/td&gt;
&lt;td&gt;Desktop app. Good, but why install anything for a simple conversion?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Online converters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Upload your content to someone else's server. Privacy nightmare.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;md-to-html is free at its core. No signup. No install. No telemetry. If you want premium features (custom CSS themes, template save/load, batch convert), it's $9 one-time — not $50/year, not $10/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Zero build step. Zero dependencies to install. The entire app is a single &lt;code&gt;index.html&lt;/code&gt; file that loads &lt;a href="https://github.com/markedjs/marked" rel="noopener noreferrer"&gt;&lt;code&gt;marked&lt;/code&gt;&lt;/a&gt; from a CDN and goes.&lt;/p&gt;

&lt;p&gt;The editor uses a textarea with monospace font. The preview renders GFM-flavored Markdown with sensible default styles. The download wraps your HTML in a complete document with embedded CSS.&lt;/p&gt;

&lt;p&gt;That's it. The best code is the code never written — and the best converter is the one that runs in your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Premium Features ($9 One-Time)
&lt;/h2&gt;

&lt;p&gt;The core conversion is free forever. Premium unlocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom CSS themes&lt;/strong&gt; — swap the default stylesheet for something that matches your brand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template save/load&lt;/strong&gt; — save your favorite configurations and come back to them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch convert&lt;/strong&gt; — drop a folder of &lt;code&gt;.md&lt;/code&gt; files and get HTMLs for all of them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No watermark&lt;/strong&gt; — exported HTMLs won't have the "Made with md-to-html" footer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare that to Bear's $50/year for... tagging and a nice UI. Your call.&lt;/p&gt;

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

&lt;p&gt;Head over to &lt;a href="https://md.jackgreen.top/" rel="noopener noreferrer"&gt;md.jackgreen.top&lt;/a&gt; and paste some Markdown. No account needed. Works on any device with a browser.&lt;/p&gt;

&lt;p&gt;And if you like it and want the premium features, grab them for $9. One time. Not a subscription.&lt;/p&gt;

&lt;p&gt;Built with love (and a healthy dose of frustration at $50/year markdown editors).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Stop uploading CSVs to the cloud</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Sat, 25 Jul 2026 06:35:32 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/stop-uploading-csvs-to-the-cloud-2912</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/stop-uploading-csvs-to-the-cloud-2912</guid>
      <description>&lt;h1&gt;
  
  
  Stop uploading CSVs to the cloud
&lt;/h1&gt;

&lt;p&gt;Stop uploading sensitive CSV files to cloud conversion services. CSV to JSON Converter runs 100% in your browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you get:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant CSV to JSON conversion&lt;/li&gt;
&lt;li&gt;No uploads, no servers, no subscriptions&lt;/li&gt;
&lt;li&gt;Works offline&lt;/li&gt;
&lt;li&gt;No signup required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Price: $12 one-time.&lt;/strong&gt; Free updates forever.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://csv.jackgreen.top/" rel="noopener noreferrer"&gt;&lt;strong&gt;Try the free demo&lt;/strong&gt;&lt;/a&gt; · &lt;a href="https://csv.jackgreen.top/buy" rel="noopener noreferrer"&gt;&lt;strong&gt;Buy now — $12&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for privacy-conscious professionals, by a developer who's tired of subscription traps.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>PDF Tool — Free, Private, Browser-Only PDF Merge &amp; Split</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Fri, 24 Jul 2026 21:42:21 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/pdf-tool-free-private-browser-only-pdf-merge-split-4hl7</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/pdf-tool-free-private-browser-only-pdf-merge-split-4hl7</guid>
      <description>&lt;h1&gt;
  
  
  PDF Tool — Merge, Split &amp;amp; Optimize in Your Browser. No Uploads. No Signup. $0.
&lt;/h1&gt;

&lt;p&gt;Every PDF task you'll ever need: &lt;strong&gt;Merge&lt;/strong&gt;, &lt;strong&gt;Split&lt;/strong&gt;, and &lt;strong&gt;Optimize&lt;/strong&gt; — all running client-side in your browser. Your files never leave your machine. Not even once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://pdf.jackgreen.top/?utm_source=devto" rel="noopener noreferrer"&gt;https://pdf.jackgreen.top/?utm_source=devto&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The cloud PDF trap
&lt;/h2&gt;

&lt;p&gt;Smallpdf charges $15/month. iLovePDF locks 2-of-3 core tools behind signup walls. Adobe Acrobat starts at $18/year just to merge two files.&lt;/p&gt;

&lt;p&gt;PDF Tool does everything for free. Right now. In your browser.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;PDF Tool&lt;/th&gt;
&lt;th&gt;Smallpdf&lt;/th&gt;
&lt;th&gt;iLovePDF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Merge PDFs&lt;/td&gt;
&lt;td&gt;✅ Free, unlimited&lt;/td&gt;
&lt;td&gt;✅ $15/mo after 1 trial&lt;/td&gt;
&lt;td&gt;✅ After signup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Split PDFs&lt;/td&gt;
&lt;td&gt;✅ Free, unlimited&lt;/td&gt;
&lt;td&gt;❌ Paywall&lt;/td&gt;
&lt;td&gt;✅ After signup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimize (reduce size)&lt;/td&gt;
&lt;td&gt;✅ Free, unlimited&lt;/td&gt;
&lt;td&gt;❌ Paywall&lt;/td&gt;
&lt;td&gt;❌ Premium only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files uploaded to server&lt;/td&gt;
&lt;td&gt;❌ Client-side only&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account required&lt;/td&gt;
&lt;td&gt;❌ Never&lt;/td&gt;
&lt;td&gt;✅ Always&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Privacy that actually means something
&lt;/h2&gt;

&lt;p&gt;When you upload a contract to Smallpdf, &lt;em&gt;their&lt;/em&gt; server touches it. When you use Adobe online, &lt;em&gt;Adobe's&lt;/em&gt; cloud processes it. Even if they don't store it, it traversed someone else's wire.&lt;/p&gt;

&lt;p&gt;PDF Tool uses &lt;a href="https://pdf-lib.js.org/" rel="noopener noreferrer"&gt;pdf-lib&lt;/a&gt; — the entire PDF engine runs as JavaScript on your machine. Zero network requests for file data. After the page loads, you can even go offline and keep working.&lt;/p&gt;

&lt;p&gt;This matters when your PDFs contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HR documents with salary bands&lt;/li&gt;
&lt;li&gt;Legal agreements with NDAs&lt;/li&gt;
&lt;li&gt;Financial statements&lt;/li&gt;
&lt;li&gt;Anything you wouldn't want a third-party server to see, even briefly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build vs buy math
&lt;/h2&gt;

&lt;p&gt;Let's be real about the $19 one-time option. If you're a freelancer, consultant, or small team who touches PDFs more than three times a month:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smallpdf annual cost:&lt;/strong&gt; $15 × 12 = &lt;strong&gt;$180/year&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;PDF Tool Pro (one-time):&lt;/strong&gt; &lt;strong&gt;$19&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's a &lt;strong&gt;$161 savings every year&lt;/strong&gt;, forever. And the free tier already covers 95% of use cases indefinitely.&lt;/p&gt;

&lt;h2&gt;
  
  
  New: Side-by-side comparison pages
&lt;/h2&gt;

&lt;p&gt;We recently built dedicated &lt;code&gt;/vs/&lt;/code&gt; pages so you can see exactly what you're trading off before you commit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pdf.jackgreen.top/vs/smallpdf.html" rel="noopener noreferrer"&gt;PDF Tool vs Smallpdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pdf.jackgreen.top/vs/ilovepdf.html" rel="noopener noreferrer"&gt;PDF Tool vs iLovePDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pdf.jackgreen.top/vs/adobe-acrobat.html" rel="noopener noreferrer"&gt;PDF Tool vs Adobe Acrobat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pdf.jackgreen.top/vs/sejdpdf.html" rel="noopener noreferrer"&gt;PDF Tool vs Sejda PDF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each breaks down features, pricing, and privacy trade-offs so you can make an informed call.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The tool ships as a single-page app. Load &lt;code&gt;https://pdf.jackgreen.top&lt;/code&gt;, pick your operation (merge, split, or optimize), drop your files in — that's it. No buttons to click, no accounts to create, no captchas to solve.&lt;/p&gt;

&lt;p&gt;Everything happens in-memory via pdf-lib. There is no backend to scale, no database to manage, no secrets to rotate. This is the kind of architecture that stays fast because it has nothing to talk to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to support the project?
&lt;/h2&gt;

&lt;p&gt;The free tools will always be free and browser-only. If you need pro features (watermarking, OCR) or want to fund continued development:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://pdf.jackgreen.top/buy?src=devto-pdftool" rel="noopener noreferrer"&gt;Get PDF Tool Pro — $19 one-time&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for developers who hate cloud dependencies. Share freely.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Favicon Generator — Free, 100% Client-Side, No Upload</title>
      <dc:creator>Jack Green</dc:creator>
      <pubDate>Tue, 21 Jul 2026 03:10:32 +0000</pubDate>
      <link>https://dev.to/jack_green_7b74cb2cdf9e23/favicon-generator-free-100-client-side-no-upload-3f43</link>
      <guid>https://dev.to/jack_green_7b74cb2cdf9e23/favicon-generator-free-100-client-side-no-upload-3f43</guid>
      <description>&lt;p&gt;I wasted 20 minutes uploading images to Favicon.io just to get a 16x16 pixel icon. Then I realized I had to create an account for it. And the free tier is basically useless — the Pro plan is $29/month.&lt;/p&gt;

&lt;p&gt;So I built a free alternative that runs entirely in your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with favicon generators
&lt;/h2&gt;

&lt;p&gt;Most online favicon tools share the same flaws:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upload required&lt;/strong&gt; — your image goes to someone else's server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account wall&lt;/strong&gt; — create an account just to download a 32x32 PNG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription pricing&lt;/strong&gt; — $29/month for a tool that does pixel-perfect resizing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No offline support&lt;/strong&gt; — you need internet just to generate a tiny icon&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://favicon.jackgreen.top/" rel="noopener noreferrer"&gt;Favicon Generator&lt;/a&gt; generates favicons in every format you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ICO&lt;/strong&gt; (16/32/48px) — multi-resolution, single file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PNG&lt;/strong&gt; (16/32/48/180/192/512px) — every size you'd ever need&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVG&lt;/strong&gt; — scalable vector wrapper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Touch Icon&lt;/strong&gt; (180x180) — iOS home screen&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Graph&lt;/strong&gt; (1200x630) — social media sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero JavaScript libraries. Zero dependencies. One HTML file.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;When you drop an image, it uses the Canvas API to resize to your selected formats. Everything happens locally — no network requests, no server calls. Your images never leave your machine.&lt;/p&gt;

&lt;p&gt;The ICO encoder is a ~40-line inline function that packs multiple PNG sizes into a single .ico file with proper headers. No library needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Favicon generation is a utility, not a product. You shouldn't pay monthly for it, and you definitely shouldn't need to upload your brand assets to a third-party server.&lt;/p&gt;

&lt;p&gt;This tool proves that simple utilities should be simple: free, fast, private, and offline-ready.&lt;/p&gt;

&lt;p&gt;Try it at &lt;a href="https://favicon.jackgreen.top/" rel="noopener noreferrer"&gt;favicon.jackgreen.top&lt;/a&gt; — no signup, no upload, no cost.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>tools</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
