Freeze exactly what both parties agreed to

A contract is a snapshot with a date on it. Render it once, watermark it, keep the checksum, and make sure the same file still renders identically in five years.

A rendered contract PDF: a service agreement watermarked DRAFT, with two signature rules and a SHA-256 checksum.

Can you reproduce it?

Pin the engine version per project. A Chromium upgrade will not silently reflow clause 14 onto the next page.

Can you prove it is unchanged?

Every render returns a SHA-256 of the bytes. Store it with the agreement row and compare whenever you need to.

Where did the data go?

Pin rendering and storage to the EU, or keep nothing at all and stream the bytes straight into your own vault.

Is the draft distinguishable?

Watermark unsigned versions with DRAFT and the counterparty name, so an unexecuted copy never circulates as final.

01

Send the HTML instead of a URL, so the exact agreed markup is the input — nothing can change underneath it.

02

Watermark drafts, and drop the watermark on the executed version.

03

Keep the checksum and store the file yourself. We can forget it immediately.

const pdf = await client.render({ html: agreement.renderedHtml, format: "A4", engine_version: "2026.04", region: "eu", watermark: agreement.signed ? null : { text: `DRAFT · ${agreement.counterparty}`, opacity: 0.08, angle: -30 }, password: agreement.password, pdf_metadata: { title: agreement.title, author: "Acme, Inc." }, store: false }); archive.put(agreement.id, pdf.bytes, pdf.checksum);