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
13 changes: 13 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,19 @@ jobs:
output/reference-env/bin/python -I tools/verify_quickstarts.py
- name: Verify the downloadable Node invoice and guide
run: python tools/verify_node_examples.py
- name: Build and exercise the downloadable Next.js starter
run: python tools/verify_nextjs_starter.py
- uses: actions/upload-artifact@v4
if: always()
with:
name: nextjs-download-verification
path: |
output/nextjs-verification/*.json
output/nextjs-verification/*.txt
output/nextjs-verification/*.log
output/nextjs-verification/*.pdf
output/nextjs-verification/*.png
retention-days: 14
- uses: actions/upload-artifact@v4
if: always()
with:
Expand Down
Binary file added docs/assets/nextjs/invoice.pdf
Binary file not shown.
Binary file added docs/assets/nextjs/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/nextjs/project.zip
Binary file not shown.
22 changes: 22 additions & 0 deletions docs/assets/nextjs/source.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"sourceRepository": "https://github.com/fullbleed-engine/fullbleed-node",
"sourceCommit": "b78f643836bc724a1b2f678df442f08ed38f7b58",
"files": 18,
"assets": [
{
"file": "project.zip",
"sha256": "75f58804ce6a28889cb3b621e9b6e5ecd9ed6a5607477f0c784bf5842c747a6f",
"bytes": 104396
},
{
"file": "invoice.pdf",
"sha256": "e09514ad458c62f9f9ef5df76168717b78b20ed365e892118f7aff6a4492e34b",
"bytes": 91590
},
{
"file": "invoice.png",
"sha256": "b76f6db748fb47b928c93c12fe788de94a0f5d8da4bb350f644a58705c163cf7",
"bytes": 107399
}
]
}
240 changes: 240 additions & 0 deletions docs/assets/nextjs/verification.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,240 @@
{
"checkedAt": "2026-10-03T11:34:10.884039+00:00",
"sourceRepository": "https://github.com/fullbleed-engine/fullbleed-node",
"sourceCommit": "b78f643836bc724a1b2f678df442f08ed38f7b58",
"mergedCommit": "6bce33c576bf8ff9150995e4f0c60b7e416eecda",
"pullRequest": "https://github.com/fullbleed-engine/fullbleed-node/pull/2",
"ciRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37119598863",
"standaloneChecks": [
{
"name": "standalone artifact is isolated from the source application",
"passed": true
},
{
"name": "standalone tracing retains the verified engine and all bundled fonts",
"passed": true
},
{
"name": "isolated production server starts on loopback",
"passed": true
},
{
"name": "app exposes the sample download without a prefetched render",
"passed": true
},
{
"name": "standalone server includes the actual PDF preview asset",
"passed": true
},
{
"name": "production route returns complete private PDF bytes with a useful filename",
"passed": true
},
{
"name": "unknown invoice IDs return a private JSON error",
"passed": true
},
{
"name": "unsupported writes are rejected by the route",
"passed": true
},
{
"name": "a concurrent burst receives explicit capacity errors instead of an unbounded queue",
"passed": true
},
{
"name": "normal PDF downloads recover after a capacity burst",
"passed": true
},
{
"name": "a real missing-glyph failure returns a generic non-PDF error",
"passed": true
},
{
"name": "a valid document renders after an engine failure",
"passed": true
},
{
"name": "the route enforces its page cap against a real multipage document",
"passed": true
},
{
"name": "a valid document renders after the page limit rejects a job",
"passed": true
},
{
"name": "client JavaScript excludes the server PDF engine and worker",
"passed": true
}
],
"ciResults": [
{
"artifact": "nextjs-ubuntu-latest-22",
"checkedAt": "2026-10-03T11:25:44.154Z",
"node": "v22.23.3",
"platform": "linux",
"next": "16.3.8",
"nodePackage": "0.1.1",
"engineVersion": "2.5.5",
"packageLockSha256": "e064ee3d318cd0926b589e41bf91341c9b6643ed661e7de8cf610bf6f12f56bc",
"pages": 1,
"pdfSha256": "e09514ad458c62f9f9ef5df76168717b78b20ed365e892118f7aff6a4492e34b",
"burst": [
200,
503,
503,
503,
503,
503,
503,
503,
503,
503,
503,
503
],
"checksPassed": 15
},
{
"artifact": "nextjs-ubuntu-latest-24",
"checkedAt": "2026-10-03T11:25:43.587Z",
"node": "v24.21.0",
"platform": "linux",
"next": "16.3.8",
"nodePackage": "0.1.1",
"engineVersion": "2.5.5",
"packageLockSha256": "e064ee3d318cd0926b589e41bf91341c9b6643ed661e7de8cf610bf6f12f56bc",
"pages": 1,
"pdfSha256": "e09514ad458c62f9f9ef5df76168717b78b20ed365e892118f7aff6a4492e34b",
"burst": [
200,
503,
503,
503,
503,
503,
503,
503,
503,
503,
503,
503
],
"checksPassed": 15
},
{
"artifact": "nextjs-windows-latest-24",
"checkedAt": "2026-10-03T11:26:05.604Z",
"node": "v24.21.0",
"platform": "win32",
"next": "16.3.8",
"nodePackage": "0.1.1",
"engineVersion": "2.5.5",
"packageLockSha256": "e064ee3d318cd0926b589e41bf91341c9b6643ed661e7de8cf610bf6f12f56bc",
"pages": 1,
"pdfSha256": "e09514ad458c62f9f9ef5df76168717b78b20ed365e892118f7aff6a4492e34b",
"burst": [
200,
503,
503,
503,
503,
503,
503,
503,
503,
503,
503,
503
],
"checksPassed": 15
}
],
"packageChecks": {
"run": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37119598893",
"jobsPassed": 10,
"conclusion": "success"
},
"browser": {
"checkedAt": "2026-10-03T11:21:13.905423+00:00",
"browser": "154.0.8037.93",
"checks": [
{
"name": "starter shows its real PDF preview",
"passed": true
},
{
"name": "browser downloads the exact standalone route PDF",
"passed": true
},
{
"name": "PDF retains the designed one-page invoice and recorded amount",
"passed": true
},
{
"name": "the native PDF download leaves the starter page usable",
"passed": true
},
{
"name": "the starter fits a narrow viewport",
"passed": true
},
{
"name": "keyboard activation downloads the same PDF",
"passed": true
},
{
"name": "the journey makes no third-party requests",
"passed": true
},
{
"name": "the browser reports no uncaught JavaScript errors",
"passed": true
}
],
"pdfSha256": "e09514ad458c62f9f9ef5df76168717b78b20ed365e892118f7aff6a4492e34b",
"pageErrors": [],
"screenshots": [
{
"file": "desktop.png",
"sha256": "ce67ee655422570b9e5aa5e932eb3ce5d49ca46f869daf92845cf2280a471082"
},
{
"file": "mobile.png",
"sha256": "3b3085d91dcb0abed1487f55b1eb853f70757cc0f2ef10b2f6f7a126a389973f"
}
],
"scope": "Local Windows Chrome; owned test context, desktop 1440 px and mobile 390 px viewports; synthetic sample only."
},
"scope": "Released Fullbleed tarball in a Next.js standalone example. Byte equality applies to this retained synthetic invoice. Does not establish application authorization, hosting-provider support, or PDF standards compliance.",
"downloadVerification": {
"checkedAt": "2026-10-03T11:33:55.093911+00:00",
"sourceCommit": "b78f643836bc724a1b2f678df442f08ed38f7b58",
"downloadFiles": 18,
"projectZipSha256": "75f58804ce6a28889cb3b621e9b6e5ecd9ed6a5607477f0c784bf5842c747a6f",
"node": "v24.21.0",
"platform": "win32",
"commands": [
{
"name": "install",
"exitCode": 0
},
{
"name": "preview",
"exitCode": 0
},
{
"name": "build",
"exitCode": 0
},
{
"name": "verify",
"exitCode": 0
}
],
"pdfSha256": "e09514ad458c62f9f9ef5df76168717b78b20ed365e892118f7aff6a4492e34b",
"previewSha256": "b76f6db748fb47b928c93c12fe788de94a0f5d8da4bb350f644a58705c163cf7",
"scope": "Fresh public ZIP installation, production build, isolated standalone HTTP server, and exact sample-asset comparison. No application authentication or hosted-provider claim.",
"standaloneChecksPassed": 15
}
}
4 changes: 4 additions & 0 deletions docs/getting-started/node.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ includes a complete font and asset example.

## Use it in an application

For a working web-app integration, use the [Next.js PDF download starter](../guides/nextjs-pdf.md).
It includes an App Router handler, designed invoice, bundled-asset configuration
and an isolated check of the production standalone server.

Rendering runs in a worker, with separate document state for concurrent calls.
Use `timeoutMs`, `maxPages`, and an `AbortSignal` to bound a job. Limit concurrent
calls to fit your server's memory; each worker's WebAssembly memory ceiling is
Expand Down
Loading
Loading