Skip to content

v0.9.0

Choose a tag to compare

@danmolitor danmolitor released this 04 Apr 22:08
· 548 commits to main since this release

Forme 0.9.0

Released April 4, 2026

The biggest release since launch. 0.9.0 adds PDF operations
(redact, merge, certify, rasterize), a Documents archive,
audit trail, certificate storage, and text-search redaction
— transforming Forme from a PDF generation library into a
full PDF operations platform.


⚠️ Breaking Changes

sign → certify rename

All signing API surfaces renamed to better reflect the
cryptographic nature of the operation:

Old New
signPdf() certifyPdf()
SignatureConfig CertificationConfig
signature prop certification prop
POST /v1/sign POST /v1/certify
certificatePem field certificate field
privateKeyPem field privateKey field
Sign() (Go) Certify() (Go)
sign_pdf() (Python) certify_pdf() (Python)

Old names continue to work via deprecation shims and serde
aliases. /v1/sign is removed from the self-hosted server.

See the migration guide.


New Features

True PDF Redaction

Content-stream text removal — not just a visual overlay.
Text operators are removed from the PDF byte stream,
metadata is scrubbed automatically on every redaction
(author, creator, edit history), and a black rectangle
is drawn over the redacted area.

65% of "redacted" PDFs produced by other tools still
expose the underlying text. Forme removes it entirely.

Available via POST /v1/redact or engine functions
redact_pdf(), redact_text(), find_text_regions().

curl -X POST https://api.formepdf.com/v1/redact \
  -H "Authorization: Bearer $FORME_API_KEY" \
  -d '{ "pdf": "...", "presets": ["ssn", "email"] }'

Docs →

Text-Search Redaction

Redact by literal string, regex pattern, or built-in preset
— no coordinate boxes required. Patterns can be scoped to
specific pages.

Built-in presets: ssn, email, phone, date-of-birth,
credit-card

{
  "pdf": "...",
  "patterns": [
    { "pattern": "John Smith", "pattern_type": "Literal" },
    { "pattern": "\\d{3}-\\d{2}-\\d{4}", "pattern_type": "Regex" }
  ],
  "presets": ["email"]
}

Redaction Templates

Save named pattern sets on the hosted API and reference
them by slug:

POST /v1/redact
{ "pdf": "...", "template": "hipaa-patient-record" }

Create and manage templates in the dashboard under Redaction.
Docs →

PDF Merging

Combine up to 20 PDFs into one via POST /v1/merge or
the merge_pdfs() engine function. PDFs merged in array order.

curl -X POST https://api.formepdf.com/v1/merge \
  -H "Authorization: Bearer $FORME_API_KEY" \
  -d '{ "pdfs": ["", ""] }'

Docs →

PDF Rasterization

Convert PDF pages to high-quality PNG images. Powered by
PDFium — the same engine Chrome uses. Configurable DPI (72–300).

curl -X POST https://api.formepdf.com/v1/rasterize \
  -H "Authorization: Bearer $FORME_API_KEY" \
  -d '{ "pdf": "...", "dpi": 150 }'

Returns { "pages": ["<base64 PNG>", ...] } — one per page.
Docs →

Documents Archive

Every hosted API render is saved automatically to your
Documents archive. Upload existing PDFs, redact them,
merge them, certify them — all from the dashboard or API.

  • Source tracking: generated, uploaded, redacted,
    merged, certified
  • Retention: Free 30d · Pro 90d · Team 1yr · Business unlimited
  • Storage: Cloudflare R2
  • Opt out with save: false on any render

Tag documents with developer metadata for filtering:

{ "metadata": { "customerId": "cust_123", "department": "legal" } }

GET /v1/documents?metadata.customerId=cust_123

Docs →

Certificate Storage

Save X.509 certificates in the dashboard, reference by ID
at certify time. Private keys encrypted at rest (AES-256-GCM).
The plaintext key is never returned after saving.

POST /v1/certify
{ "pdf": "...", "certificateId": "cert_abc123" }

Plan limits: Free 1 · Pro 5 · Team/Business unlimited
Docs →

Audit Trail

Full operation history on every document — who did what
and when, whether via dashboard or API key. Events logged:
uploaded, generated, redacted, merged, certified,
downloaded, deleted. Events survive document deletion.

Visible in the History panel in DocumentEditor and
queryable via API.
Docs →

Resource Listing Endpoints

List and retrieve your resources programmatically via API key:
GET /v1/templates
GET /v1/templates/:slug
GET /v1/documents
GET /v1/documents/:id
GET /v1/redaction-templates
GET /v1/redaction-templates/:slug
GET /v1/certificates

Async AI Template Generation

AI template generation no longer blocks the UI. The modal
closes immediately, the template appears in the list with
a shimmer while generating, and the thumbnail populates
automatically when complete. Powered by BullMQ + Redis.

Dashboard — DocumentEditor Redesign

Tools moved from a crowded top bar to a left sidebar panel:

  • Redact — Draw mode (click and drag) + Search mode
    (text patterns, presets, load template)
  • Merge — add PDFs, merge in order
  • Certify — select saved certificate or paste PEM
  • Organize — coming soon

History panel slides out from the right — full audit
trail per document without leaving the editor.


Self-Hosted Server Parity

The formepdf/forme Docker image is updated to 0.9.0
with improved parity on all operation endpoints:

  • POST /v1/certify (renamed from /v1/sign)
  • POST /v1/redact — coordinate regions + text patterns + presets
  • POST /v1/merge
  • POST /v1/rasterize — PDFium sidecar included
  • flattenForms=true query parameter on render endpoints
  • Content-Disposition header on slug renders
  • Consistent { "error": "...", "code": "NOT_IMPLEMENTED" }
    shape on hosted-only feature stubs
  • Preset name validation, max 20 presets, regex compilation
    validation on /v1/redact

Self-hosted intentionally excludes: Documents archive,
certificateId, redaction template slugs, save/saveName.
Pass credentials and patterns directly.

docker pull formepdf/forme:0.9.0

Python SDK (0.9.1)

  • New API client methods: certify(), redact(),
    merge(), rasterize()
  • Local WASM rendering via wasmtime with full component DSL
  • sign() removed, certify_pdf() replaces sign_pdf()
  • Full docs at docs.formepdf.com/python-sdk

Go SDK (0.9.1)

  • New API methods: Redact(), Rasterize()
  • Sign() deprecated shim removed — use Certify()
  • Full docs at docs.formepdf.com/go-sdk

Docs Restructure

  • Per-endpoint API reference pages (render, certify,
    redact, merge, rasterize)
  • New concepts section (documents, credentials, redaction,
    redaction templates, digital certification, audit trail)
  • Migration guide for 0.8 → 0.9
  • Bring Your Own UI guide

Bug Fixes

  • WASM time panic — certify and redact previously
    panicked in browser WASM with "time not implemented on
    this platform". Fixed with #[cfg] conditional using
    js_sys::Date::now() for WASM targets,
    SystemTime::now() for WASI targets (Python/Go SDKs)
  • PKCS#1 auto-conversion — certify_pdf() now accepts
    both PKCS#8 (BEGIN PRIVATE KEY) and PKCS#1
    (BEGIN RSA PRIVATE KEY) formats automatically
  • __formeType version guard — prevents misleading
    "Top-level element must be <Document>" errors when
    @formepdf/core and @formepdf/react are on different versions
  • SVG children — JSX children inside <Svg> now
    correctly serialized
  • SVG opacity — opacity, fill-opacity,
    stroke-opacity now work correctly via ExtGState
  • Page style inheritance — <Page style={{ fontFamily }}>
    now correctly resolves to child nodes

Packages

Package Version
@formepdf/core 0.9.0
@formepdf/react 0.9.0
@formepdf/cli 0.9.0
@formepdf/renderer 0.9.0
@formepdf/hono 0.9.0
@formepdf/next 0.9.0
@formepdf/resend 0.9.0
@formepdf/mcp 0.9.0
@formepdf/sdk 0.9.0
@formepdf/tailwind 0.9.0
@formepdf/templates 0.9.0
forme-pdf (VS Code) 0.9.0
formepdf (PyPI) 0.9.1
forme-go (Go SDK) v0.9.1
forme-pdf (crates.io) 0.9.0
formepdf/forme (Docker) 0.9.0
formepdf/rasterizer (Docker) 0.9.0