Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,10 @@ docs/assets/styling-notebook-alpha11/*.pdf binary

# React starter baselines are verified by exact PDF bytes.
docs/assets/react-starter/baseline/*.pdf binary

# Keep the locked Workers download reproducible and preserve exact PDF/PNG bytes.
examples/cloudflare-pdf/** text eol=lf
docs/assets/cloudflare-starter/** -text
docs/assets/cloudflare-starter/*.pdf binary
docs/assets/cloudflare-starter/*.png binary
docs/assets/cloudflare-starter/*.zip binary
16 changes: 16 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -872,6 +872,22 @@ jobs:
retention-days: 14
- name: Build and exercise the downloadable Next.js starter
run: python tools/verify_nextjs_starter.py
- name: Verify the locked Workers invoice download in local workerd
run: |
python -m pip install pypdf==6.19.0 pillow==12.3.0
python tools/build_cloudflare_starter.py
git diff --exit-code -- docs/assets/cloudflare-starter/project.zip docs/assets/cloudflare-starter/source.json
python tools/verify_cloudflare_starter.py
- uses: actions/upload-artifact@v4
if: always()
with:
name: cloudflare-starter-verification
path: |
output/cloudflare-starter-verification/*.json
output/cloudflare-starter-verification/*.log
output/cloudflare-starter-verification/*.pdf
output/cloudflare-starter-verification/*.png
retention-days: 14
- uses: actions/upload-artifact@v4
if: always()
with:
Expand Down
Binary file added docs/assets/cloudflare-starter/invoice.pdf
Binary file not shown.
Binary file added docs/assets/cloudflare-starter/invoice.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/cloudflare-starter/long-invoice.pdf
Binary file not shown.
Binary file added docs/assets/cloudflare-starter/project.zip
Binary file not shown.
113 changes: 113 additions & 0 deletions docs/assets/cloudflare-starter/source.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
{
"schema": "fullbleed.cloudflare-starter.v1",
"prefix": "fullbleed-cloudflare-invoice/",
"packageVersion": "0.8.0",
"engineVersion": "2.5.29",
"wrangler": "4.151.3",
"sourceCommit": "e9582e417e8cbe49e41aabd0c695524920a1840d",
"sourceRepository": "https://github.com/fullbleed-engine/fullbleed-node",
"release": "https://github.com/fullbleed-engine/fullbleed-node/releases/tag/v0.8.0",
"packageIntegrity": "sha512-olEU8ARb8i5ASStXX7uGAZ2RaGaKj2uL8cL81su+M46xo3AdxcGL3j8SCcaXEmTJUzKE0o5E6djykPTbC0u2FA==",
"packageSha256": "86af460db1f29c94e65daff3563f9f64f0f52e0af47f02adf3ff39cb2ece1691",
"wasmSha256": "bbcf9b09a60a38d9a884f227fd7f7d31e17e4d611c91027775059f05e2bb46f2",
"localOnly": true,
"hostedVerified": false,
"freePlanVerified": false,
"sourceNote": "SDK examples/cloudflare source; npm lockfile and this release record added for the downloadable project.",
"files": [
{
"path": ".gitignore",
"bytes": 55,
"sha256": "7a1f0472a0d8ee63343cb58345d9af19d1e71310d9c696d9d1578e7bc743262b"
},
{
"path": "LICENSE",
"bytes": 1079,
"sha256": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9"
},
{
"path": "README.md",
"bytes": 2919,
"sha256": "503a8caf5cd39a4f310badcf417b006cdfc874f71be42fde5943aef3d57db34c"
},
{
"path": "package-lock.json",
"bytes": 50461,
"sha256": "07818436d4e5486c1694bc38652a792e0093448cd12baf63bd718f4c01a8308b"
},
{
"path": "package.json",
"bytes": 499,
"sha256": "fe2c82d9f68ba4fe91f69ba3f32a3dd21cb455f72ca8820929e889924490795c"
},
{
"path": "release.json",
"bytes": 804,
"sha256": "57521c01fcbcc6eed69c6e7ad8838e0e1b4f44a4d6be304c8229084d1d9d92ae"
},
{
"path": "sample.json",
"bytes": 733,
"sha256": "82a94cc4f15bd26d7060bc201a6b3f7ff36307875158b9b0a7e8aeb5ab2cbfb9"
},
{
"path": "src/document.mjs",
"bytes": 3509,
"sha256": "72153fd3fbc3ca1183e801fdc53a2a9ddf7a9f4c046f7b6c5bea8bff63bf7b06"
},
{
"path": "src/handler.mjs",
"bytes": 5997,
"sha256": "8b2de5cbddb531481baaf5adcd6865f11e9d69fbff5b95c7f294cfed95f15e4e"
},
{
"path": "src/index.mjs",
"bytes": 173,
"sha256": "a955aabac33e5524ac96c55213264ecf338d53486d45362b58253ae67177727e"
},
{
"path": "src/styles.mjs",
"bytes": 3219,
"sha256": "1cd818aec8cf2e9def15b51ce043bfdfcfc06626fd9df63372f34f9a43160a59"
},
{
"path": "test/fixtures.mjs",
"bytes": 2628,
"sha256": "2292c21a378d8afc466c2c9c8cd541322f71dcf8cfdd9b8bdabafa9d71fe17f0"
},
{
"path": "test/request.test.mjs",
"bytes": 4179,
"sha256": "7f180dd62aa03231d8fd2d97a72cb9f14b5ddbc97e97165c31562f6256c3d951"
},
{
"path": "test/worker.mjs",
"bytes": 3156,
"sha256": "e2355fc855877fc66e35554be2e72bc29412141fa53b4aeb59313c388146f1dc"
},
{
"path": "wrangler.json",
"bytes": 251,
"sha256": "ddf7b4df5ae09c70ab9d3be8b1a8026b6f8951971ee9602b2dce88614200c3bf"
}
],
"zipBytes": 25246,
"zipSha256": "1aa32c075f65844fba69bb0909985c60d35e40ef488c2f889bbae2e9303d9ccd",
"assets": [
{
"file": "invoice.pdf",
"bytes": 103212,
"sha256": "17437a93f960b80d16bbbe92f573c7c62a9d9d39eca6899fb9b642ebfb9feca3"
},
{
"file": "invoice.png",
"bytes": 100558,
"sha256": "4714cda69ce852490602986efc07793de605bd6ca92172e21ab91243268bfb13"
},
{
"file": "long-invoice.pdf",
"bytes": 114406,
"sha256": "2a36293e76043cb65cb2a208c28f43c526299ed17e0972ba0e0ccbff1ff071a5"
}
]
}
185 changes: 185 additions & 0 deletions docs/assets/cloudflare-starter/verification.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
{
"ok": true,
"checkedAt": "2026-10-21T00:20:10.418993+00:00",
"packageVersion": "0.8.0",
"engineVersion": "2.5.29",
"sourceCommit": "e9582e417e8cbe49e41aabd0c695524920a1840d",
"zipSha256": "1aa32c075f65844fba69bb0909985c60d35e40ef488c2f889bbae2e9303d9ccd",
"packageIntegrity": "sha512-olEU8ARb8i5ASStXX7uGAZ2RaGaKj2uL8cL81su+M46xo3AdxcGL3j8SCcaXEmTJUzKE0o5E6djykPTbC0u2FA==",
"platform": "win32",
"wrangler": "4.151.3",
"workerd": "1.20261019.1",
"commands": [
{
"name": "install",
"exitCode": 0
},
{
"name": "input-tests",
"exitCode": 0
},
{
"name": "bundle",
"exitCode": 0
},
{
"name": "http-tests",
"exitCode": 0
},
{
"name": "node-preview",
"exitCode": 0
}
],
"records": [
{
"name": "sample",
"pdf": "17437a93f960b80d16bbbe92f573c7c62a9d9d39eca6899fb9b642ebfb9feca3",
"bytes": 103212,
"minPages": 1,
"maxPages": 1,
"text": [
"Maple & Finch",
"$8,100.00",
"01 October 2026"
],
"trackedText": [
"NS-1042"
],
"pages": 1
},
{
"name": "minimum",
"pdf": "825a084cd377f4ed6b3cfe7e378be636e2cca2675b8f1bab467966e4418ec4c8",
"bytes": 105334,
"minPages": 1,
"maxPages": 1,
"text": [
"$0.00",
"This invoice has been settled."
],
"trackedText": [
"NS-1043"
],
"pages": 1
},
{
"name": "maximum-total",
"pdf": "63c2bdd3d78a0656cff4b6919c302a4ce0385621ea28acc6fbb96426324b36ff",
"bytes": 102597,
"minPages": 1,
"maxPages": 1,
"text": [
"$999,999.99"
],
"trackedText": [
"NS-1044"
],
"pages": 1
},
{
"name": "long",
"pdf": "2a36293e76043cb65cb2a208c28f43c526299ed17e0972ba0e0ccbff1ff071a5",
"bytes": 114406,
"minPages": 3,
"maxPages": 10,
"text": [
"Work package 30:",
"$9,000.00"
],
"trackedText": [
"NS-1045"
],
"pages": 5
},
{
"name": "escaped",
"pdf": "6f1191f16e4f4023cc35d9426cd26ebb7ee1e37a2da6209df3105bcfd19b2fbf",
"bytes": 103773,
"minPages": 1,
"maxPages": 2,
"text": [
"<script>alert(1)</script> & Partners",
"$8,100.00"
],
"trackedText": [
"NS-1046"
],
"pages": 1
},
{
"name": "after-errors",
"pdf": "17437a93f960b80d16bbbe92f573c7c62a9d9d39eca6899fb9b642ebfb9feca3",
"bytes": 103212,
"minPages": 1,
"maxPages": 1,
"text": [
"Maple & Finch",
"$8,100.00",
"01 October 2026"
],
"trackedText": [
"NS-1042"
],
"pages": 1
}
],
"errors": [
{
"name": "json",
"status": 400,
"code": "INVALID_JSON"
},
{
"name": "content-type",
"status": 415,
"code": "JSON_REQUIRED"
},
{
"name": "body-limit",
"status": 413,
"code": "BODY_TOO_LARGE"
},
{
"name": "number",
"status": 400,
"code": "INVALID_INVOICE"
},
{
"name": "date",
"status": 400,
"code": "INVALID_INVOICE"
},
{
"name": "money",
"status": 400,
"code": "INVALID_INVOICE"
},
{
"name": "total",
"status": 400,
"code": "INVALID_INVOICE"
},
{
"name": "row-limit",
"status": 400,
"code": "INVALID_INVOICE"
},
{
"name": "unknown",
"status": 400,
"code": "INVALID_INVOICE"
},
{
"name": "glyph",
"status": 422,
"code": "MISSING_GLYPHS"
}
],
"recovery": true,
"serverStopped": true,
"previewMatches": true,
"localOnly": true,
"hostedVerified": false,
"freePlanVerified": false
}
1 change: 1 addition & 0 deletions docs/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ Start with the [invoice guide](guides/invoices.md), or
The Python starter also includes a [tested Docker image](guides/python-docker.md).
For Node applications, download the [six-invoice queue project](guides/node-render-queue.md)
with editable HTML/CSS and limits on active and waiting renders.
For Cloudflare Workers, try the [invoice endpoint with local runtime checks](guides/cloudflare-pdf.md).
For C# web applications, try the [ASP.NET Core download starter](guides/aspnet-pdf.md).
For Rust applications, use the [Axum PDF download starter](guides/axum-pdf.md)
with an editable invoice template and bounded rendering work.
Expand Down
2 changes: 2 additions & 0 deletions docs/getting-started/node.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ for an explicit face. Review appearance and line breaks when upgrading; the
[font-family guide](../engine/font-registration.md) explains font selection.

For rendering inside a web page, [use the browser entry and starter](../guides/browser-pdf.md).
For Cloudflare Workers, [use the Workers adapter and invoice endpoint](../guides/cloudflare-pdf.md)
introduced in package 0.8.0. This guide's invoice download remains pinned to 0.7.1.

## Create your first PDF

Expand Down
Loading
Loading