<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>PDFops blog</title>
    <link>https://pdfops.dev/blog</link>
    <description>Posts about PDFops — the edge-native PDF fill &amp; merge API: how to use it, why it exists, and what&apos;s coming next.</description>
    <language>en</language>
    <lastBuildDate>Fri, 07 Aug 2026 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://pdfops.dev/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Filling encrypted government PDFs: what actually works, measured</title>
      <link>https://pdfops.dev/blog/filling-encrypted-government-pdfs</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/filling-encrypted-government-pdfs</guid>
      <description>Some government blanks open fine in any viewer but crash every PDF library at load. Why an empty user password does that, and a measured matrix of what fills CA FL-100 and CRA TD1: pdftk-java natively, qpdf --decrypt for everything else.</description>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Merging PDFs in a Bun server: page order, quota, and the 429 you&apos;ll eventually hit</title>
      <link>https://pdfops.dev/blog/merge-pdfs-bun-server</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/merge-pdfs-bun-server</guid>
      <description>A Bun.serve() endpoint that merges uploaded PDFs in order via PDFops, checks quota before it burns the last request, and handles the 429 that shows up the day traffic actually arrives.</description>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>PDFops v0.10: fill a PDF by email, make any PDF fillable</title>
      <link>https://pdfops.dev/blog/pdfops-v0-10</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/pdfops-v0-10</guid>
      <description>Release notes for PDFops v0.10 — fill@pdfops.dev turns email into an API call, /tools/make-fillable turns flat PDFs into AcroForm templates in the browser, and every fill is now byte-deterministic with an optional flatten step.</description>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Snapshot-testing generated PDFs in CI with a hash instead of a diff</title>
      <link>https://pdfops.dev/blog/snapshot-testing-pdfs-in-ci</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/snapshot-testing-pdfs-in-ci</guid>
      <description>A headless-browser PDF renderer stamps a new timestamp and reorders internal objects every run, so byte-diffing its output in CI always fails. A deterministic fill API fixes that, with a worked GitHub Actions example.</description>
      <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Migrating off wkhtmltopdf on AWS Lambda — the unpatched CVE and the form-fill swap</title>
      <link>https://pdfops.dev/blog/migrating-off-wkhtmltopdf-on-lambda</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/migrating-off-wkhtmltopdf-on-lambda</guid>
      <description>wkhtmltopdf is archived, its last release carries an unpatched CVSS 9.8 SSRF, and it still ships as a Lambda Layer binary. If what you render is form-shaped — invoice, receipt, statement — here&apos;s the fill-form swap that drops the binary entirely.</description>
      <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Assembling a KYC packet on Deno Deploy — inspect, fill, and merge with the pdfops-sdk</title>
      <link>https://pdfops.dev/blog/kyc-packet-on-deno-deploy</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/kyc-packet-on-deno-deploy</guid>
      <description>Discover a template&apos;s fields at request time, fill it, and merge in the applicant&apos;s ID scan — one PDF packet, chaining PDFops&apos; three primitives with the new pdfops-sdk on Deno Deploy.</description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Fill a PDF form inside a Cloudflare Worker — no Chromium, no Lambda</title>
      <link>https://pdfops.dev/blog/fill-pdf-in-a-cloudflare-worker</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/fill-pdf-in-a-cloudflare-worker</guid>
      <description>Headless Chrome doesn&apos;t run on Cloudflare Workers and a PDF render layer doesn&apos;t belong on Lambda. Here&apos;s the minimal Worker that fills an AcroForm PDF with one fetch — and why the substrate is the whole point.</description>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The case for deterministic PDF filling — PDFops</title>
      <link>https://pdfops.dev/blog/deterministic-pdf-filling</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/deterministic-pdf-filling</guid>
      <description>AI can read almost any document now. But the write step — filling an official PDF — can&apos;t be a language model if an auditor might ever look at it. Why the AI-extraction wave needs a deterministic fill step.</description>
      <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Fill and merge PDFs in your browser — free, no signup</title>
      <link>https://pdfops.dev/blog/fill-and-merge-pdfs-in-your-browser</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/fill-and-merge-pdfs-in-your-browser</guid>
      <description>Fill a PDF form or merge several PDFs into one, right in your browser — free, no signup, no install. The same is one HTTP call away when you automate it.</description>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Signed contracts from a Tally webhook on Cloudflare Workers</title>
      <link>https://pdfops.dev/blog/signed-contracts-from-tally-on-workers</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/signed-contracts-from-tally-on-workers</guid>
      <description>Fill a contract template from a Tally form&apos;s answers and email back a counter-signed PDF — webhook, PDFops fill-form, R2, and email on one Cloudflare Worker.</description>
      <pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Generating audit-trail PDFs from a Next.js Server Action — PDFops</title>
      <link>https://pdfops.dev/blog/audit-trail-pdfs-nextjs</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/audit-trail-pdfs-nextjs</guid>
      <description>Chain PDFops /fill-form and /merge in one Next.js Server Action to add a who/when/where cover page to any signed document — a built-in audit trail.</description>
      <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Auto-fill a W-9 from an onboarding webhook on Vercel Edge</title>
      <link>https://pdfops.dev/blog/fill-w9-from-webhook</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/fill-w9-from-webhook</guid>
      <description>When a contractor finishes onboarding, auto-fill their W-9 from the answers they already gave — webhook, PDFops fill-form, and Vercel Blob on Vercel Edge.</description>
      <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Monthly PDF bundles on a Cloudflare Cron Trigger — PDFops</title>
      <link>https://pdfops.dev/blog/monthly-pdf-bundles-on-cron</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/monthly-pdf-bundles-on-cron</guid>
      <description>Build monthly per-customer statement bundles — sections from templates, merged into one PDF, stored and emailed — on a Cloudflare Worker fired by Cron.</description>
      <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Invoice PDFs from Stripe webhooks on Cloudflare Workers</title>
      <link>https://pdfops.dev/blog/stripe-invoice-pdf-workers</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/stripe-invoice-pdf-workers</guid>
      <description>When a Stripe payment succeeds, generate an invoice PDF from a template and store it — webhook handler, PDFops fill-form, and R2 on one Cloudflare Worker.</description>
      <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Getting started with PDFops — PDFops</title>
      <link>https://pdfops.dev/blog/getting-started</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/getting-started</guid>
      <description>30 seconds to a working PDF API call. Two curl commands for fill-form and merge, the per-IP rate limit, and what&apos;s coming next.</description>
      <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Why I built PDFops — PDFops</title>
      <link>https://pdfops.dev/blog/why-pdfops</link>
      <guid isPermaLink="true">https://pdfops.dev/blog/why-pdfops</guid>
      <description>An operator&apos;s account of why a hosted PDF API for edge runtimes exists — and why DocRaptor, PDFShift, and self-hosting don&apos;t fit modern edge-deployed stacks.</description>
      <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
