惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Generating a PDF is easy. Proving it's the original is th...
Renderly · 2026-06-24 · via DEV Community

I write a lot of code that spits out PDFs. Invoices, lab-style reports, a certificate thing for a side project. And honestly that part is solved. You pick a lib, throw data at it, a file comes out. Done in an afternoon.

Then someone forwards you a PDF and goes "is this the one we actually sent, or did somebody edit a number in it?" and you just don't have an answer. You're staring at a file. It looks fine. It's always going to look fine. A tampered PDF looks exactly as legit as the real one, that's the whole problem.

So I went looking. Digital signatures (PAdES, the cert stuff) exist, but try telling the person on the receiving end to install a cert chain and validate it in some desktop reader. Not happening. The recipient is usually not a dev. They got an email with an attachment, that's it.

What I actually wanted was dumber: whoever receives the file should be able to confirm, with zero setup, that nothing in it changed since it left my server.

So I built Renderly

You make the PDF one of two ways. Draw it in a visual editor (Figma-ish, drag stuff around), or hit an API with JSON. The editor's handy when a non-dev needs to tweak a template, the API's there when it's all automated. Whichever fits.

The render engine is native PDFKit, not headless Chrome. I went back and forth on this and I'm glad I skipped the browser. Spinning up Chromium to print-to-PDF means you're suddenly fighting print CSS at 2am, page-break weirdness, fonts that render slightly different across machines, plus a cold-start tax on every doc. Native means the bytes are deterministic. Same input, same output, down to the byte. Which matters a lot for the next bit.

Every PDF comes out sealed. I take the SHA-256 of the actual bytes and stamp a QR onto the doc. There's a public page at /verify. No login, no account, nothing. The recipient drops the file in (or scans the QR) and it tells them who issued it and whether a single byte moved since it was generated. Somebody opened it in a PDF editor and bumped an amount? Hash won't match, verify says so.

Now, I want to be precise here, because it's easy to oversell and a dev will (rightly) call you on it. This does not stop anyone from faking a PDF. Anybody can fake a PDF, that's trivial. What changes is the fake becomes detectable, and the person holding the real file can prove theirs is the original. Falsification doesn't become impossible. It becomes catchable. That's the honest version and it's still useful in practice.

Where it actually comes up:

  • A landlord forwards a "signed" agreement with one clause quietly reworded. Verify the original, the edited one fails.
  • An invoice gets intercepted and the bank details swapped before it hits the client. Real scam, happens constantly. Client checks against verify, the swapped one doesn't match.
  • A discount voucher where the number's been bumped. Same deal.

None of those need the recipient to have an account or trust me. They check the file against a public page and either it matches or it doesn't.

Solo thing, still beta, I'm a Brazilian dev building it nights and weekends. Free up to 500 docs a month, no card.

Site: https://getrenderly.vercel.app

And the verifier you can poke without signing up for anything, which is honestly the part I'm proudest of: https://getrenderly.vercel.app/verify

If you've solved "prove this file is the original" some other way that a normal recipient can actually use, I want to hear it. I looked for a while before building this and came up mostly empty.