From daf3430fcb09e7f6f717298ff69dfbe1c90a7731 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 17:24:43 +0100 Subject: [PATCH 01/70] `@remotion/vercel`: Create package for Vercel Sandbox rendering Co-Authored-By: Claude Opus 4.6 --- bun.lock | 33 ++++-- packages/cli/src/list-of-remotion-packages.ts | 1 + .../src/list-of-remotion-packages.ts | 1 + .../docs/components/TableOfContents/api.tsx | 6 +- packages/docs/docs/vercel-sandbox.mdx | 5 + packages/docs/docs/vercel/create-sandbox.mdx | 56 +++++++++ packages/docs/docs/vercel/create-snapshot.mdx | 46 +++++++ .../docs/vercel/get-or-create-sandbox.mdx | 50 ++++++++ packages/docs/docs/vercel/get-snapshot.mdx | 38 ++++++ packages/docs/docs/vercel/index.mdx | 28 +++++ .../docs/vercel/render-still-on-vercel.mdx | 75 ++++++++++++ .../docs/vercel/render-video-on-vercel.mdx | 82 +++++++++++++ packages/docs/docs/vercel/save-snapshot.mdx | 37 ++++++ .../docs/docs/vercel/table-of-contents.tsx | 44 +++++++ .../docs/vercel/upload-to-blob-storage.mdx | 70 +++++++++++ packages/docs/sidebars.ts | 18 +++ packages/docs/src/data/articles.ts | 81 +++++++++++++ .../articles-docs-vercel-create-sandbox.png | Bin 0 -> 46232 bytes .../articles-docs-vercel-create-snapshot.png | Bin 0 -> 46664 bytes ...cles-docs-vercel-get-or-create-sandbox.png | Bin 0 -> 50129 bytes .../articles-docs-vercel-get-snapshot.png | Bin 0 -> 45637 bytes .../generated/articles-docs-vercel-index.png | Bin 0 -> 39983 bytes ...les-docs-vercel-render-still-on-vercel.png | Bin 0 -> 46109 bytes ...les-docs-vercel-render-video-on-vercel.png | Bin 0 -> 45326 bytes .../articles-docs-vercel-save-snapshot.png | Bin 0 -> 45857 bytes ...les-docs-vercel-upload-to-blob-storage.png | Bin 0 -> 48787 bytes packages/studio-shared/src/package-info.ts | 4 + packages/template-vercel/create-snapshot.ts | 21 ++-- packages/template-vercel/package.json | 1 + packages/template-vercel/render.ts | 65 ---------- .../src/app/api/render/helpers.ts | 20 ---- .../src/app/api/render/render.ts | 86 -------------- .../src/app/api/render/route.ts | 65 +++++++--- .../src/app/api/render/sandbox/add-bundle.ts | 78 ------------ .../app/api/render/sandbox/create-sandbox.ts | 107 ----------------- .../app/api/render/sandbox/install-browser.ts | 51 -------- .../render/sandbox/install-js-dependencies.ts | 28 ----- .../sandbox/install-system-dependencies.ts | 54 --------- .../render/sandbox/reuse-or-create-sandbox.ts | 32 ----- .../src/app/api/render/sandbox/snapshots.ts | 35 ------ packages/template-vercel/tsconfig.json | 3 +- packages/vercel/.npmignore | 10 ++ packages/vercel/bundle.ts | 34 ++++++ packages/vercel/eslint.config.mjs | 7 ++ packages/vercel/package.json | 57 +++++++++ packages/vercel/src/create-sandbox.ts | 96 +++++++++++++++ packages/vercel/src/create-snapshot.ts | 10 ++ packages/vercel/src/get-or-create-sandbox.ts | 32 +++++ packages/vercel/src/get-snapshot.ts | 24 ++++ packages/vercel/src/index.ts | 9 ++ packages/vercel/src/internals/add-bundle.ts | 79 ++++++++++++ packages/vercel/src/internals/disposable.ts | 13 ++ .../src/internals/ensure-browser-script.ts} | 5 +- .../vercel/src/internals/install-browser.ts | 45 +++++++ .../src/internals/install-js-dependencies.ts | 28 +++++ .../internals/install-system-dependencies.ts | 53 +++++++++ .../src/internals}/patch-compositor.ts | 46 +++---- .../src/internals/render-still-script.ts | 48 ++++++++ .../src/internals/render-video-script.ts | 51 ++++++++ packages/vercel/src/render-still.ts | 67 +++++++++++ packages/vercel/src/render-video.ts | 72 +++++++++++ packages/vercel/src/save-snapshot.ts | 24 ++++ packages/vercel/src/types.ts | 12 ++ packages/vercel/src/upload-to-blob-storage.ts | 112 ++++++++++++++++++ packages/vercel/tsconfig.json | 14 +++ tsconfig.json | 3 + 66 files changed, 1648 insertions(+), 624 deletions(-) create mode 100644 packages/docs/docs/vercel/create-sandbox.mdx create mode 100644 packages/docs/docs/vercel/create-snapshot.mdx create mode 100644 packages/docs/docs/vercel/get-or-create-sandbox.mdx create mode 100644 packages/docs/docs/vercel/get-snapshot.mdx create mode 100644 packages/docs/docs/vercel/index.mdx create mode 100644 packages/docs/docs/vercel/render-still-on-vercel.mdx create mode 100644 packages/docs/docs/vercel/render-video-on-vercel.mdx create mode 100644 packages/docs/docs/vercel/save-snapshot.mdx create mode 100644 packages/docs/docs/vercel/table-of-contents.tsx create mode 100644 packages/docs/docs/vercel/upload-to-blob-storage.mdx create mode 100644 packages/docs/static/generated/articles-docs-vercel-create-sandbox.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-create-snapshot.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-get-or-create-sandbox.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-get-snapshot.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-index.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-render-still-on-vercel.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-render-video-on-vercel.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-save-snapshot.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-upload-to-blob-storage.png delete mode 100644 packages/template-vercel/render.ts delete mode 100644 packages/template-vercel/src/app/api/render/render.ts delete mode 100644 packages/template-vercel/src/app/api/render/sandbox/add-bundle.ts delete mode 100644 packages/template-vercel/src/app/api/render/sandbox/create-sandbox.ts delete mode 100644 packages/template-vercel/src/app/api/render/sandbox/install-browser.ts delete mode 100644 packages/template-vercel/src/app/api/render/sandbox/install-js-dependencies.ts delete mode 100644 packages/template-vercel/src/app/api/render/sandbox/install-system-dependencies.ts delete mode 100644 packages/template-vercel/src/app/api/render/sandbox/reuse-or-create-sandbox.ts delete mode 100644 packages/template-vercel/src/app/api/render/sandbox/snapshots.ts create mode 100644 packages/vercel/.npmignore create mode 100644 packages/vercel/bundle.ts create mode 100644 packages/vercel/eslint.config.mjs create mode 100644 packages/vercel/package.json create mode 100644 packages/vercel/src/create-sandbox.ts create mode 100644 packages/vercel/src/create-snapshot.ts create mode 100644 packages/vercel/src/get-or-create-sandbox.ts create mode 100644 packages/vercel/src/get-snapshot.ts create mode 100644 packages/vercel/src/index.ts create mode 100644 packages/vercel/src/internals/add-bundle.ts create mode 100644 packages/vercel/src/internals/disposable.ts rename packages/{template-vercel/ensure-browser.ts => vercel/src/internals/ensure-browser-script.ts} (74%) create mode 100644 packages/vercel/src/internals/install-browser.ts create mode 100644 packages/vercel/src/internals/install-js-dependencies.ts create mode 100644 packages/vercel/src/internals/install-system-dependencies.ts rename packages/{template-vercel/src/app/api/render/sandbox => vercel/src/internals}/patch-compositor.ts (79%) create mode 100644 packages/vercel/src/internals/render-still-script.ts create mode 100644 packages/vercel/src/internals/render-video-script.ts create mode 100644 packages/vercel/src/render-still.ts create mode 100644 packages/vercel/src/render-video.ts create mode 100644 packages/vercel/src/save-snapshot.ts create mode 100644 packages/vercel/src/types.ts create mode 100644 packages/vercel/src/upload-to-blob-storage.ts create mode 100644 packages/vercel/tsconfig.json diff --git a/bun.lock b/bun.lock index a79121a28d3..cb5adf45514 100644 --- a/bun.lock +++ b/bun.lock @@ -2174,6 +2174,7 @@ "@remotion/player": "workspace:*", "@remotion/shapes": "workspace:*", "@remotion/tailwind-v4": "workspace:*", + "@remotion/vercel": "workspace:*", "@types/bun": "1.3.3", "@vercel/blob": "2.0.1", "@vercel/functions": "^3.4.1", @@ -2274,6 +2275,24 @@ "react-dom": ">=16.8.0", }, }, + "packages/vercel": { + "name": "@remotion/vercel", + "version": "4.0.424", + "dependencies": { + "remotion": "workspace:*", + }, + "devDependencies": { + "@remotion/eslint-config-internal": "workspace:*", + "@typescript/native-preview": "catalog:", + "@vercel/blob": "2.0.1", + "@vercel/sandbox": "1.6.0", + "eslint": "catalog:", + }, + "peerDependencies": { + "@vercel/blob": ">=2.0.0", + "@vercel/sandbox": ">=1.0.0", + }, + }, "packages/web-renderer": { "name": "@remotion/web-renderer", "version": "4.0.424", @@ -3746,6 +3765,8 @@ "@remotion/transitions": ["@remotion/transitions@workspace:packages/transitions"], + "@remotion/vercel": ["@remotion/vercel@workspace:packages/vercel"], + "@remotion/web-renderer": ["@remotion/web-renderer@workspace:packages/web-renderer"], "@remotion/webcodecs": ["@remotion/webcodecs@workspace:packages/webcodecs"], @@ -5864,7 +5885,7 @@ "is-boolean-object": ["is-boolean-object@1.2.1", "", { "dependencies": { "call-bound": "1.0.3", "has-tostringtag": "1.0.2" } }, "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng=="], - "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + "is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="], "is-bun-module": ["is-bun-module@1.2.1", "", { "dependencies": { "semver": "7.6.3" } }, "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q=="], @@ -9382,8 +9403,6 @@ "@vanilla-extract/integration/vite": ["vite@5.4.20", "", { "dependencies": { "esbuild": "0.21.5", "postcss": "8.5.1", "rollup": "4.40.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@types/node": "20.12.14" }, "optionalPeers": ["@types/node"], "bin": { "vite": "bin/vite.js" } }, "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g=="], - "@vercel/blob/is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="], - "@vercel/blob/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], "@vercel/config/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -9858,6 +9877,8 @@ "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "md5/is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + "mdast-util-definitions/@types/unist": ["@types/unist@3.0.2", "", {}, "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="], "mdast-util-directive/@types/unist": ["@types/unist@3.0.2", "", {}, "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="], @@ -11754,8 +11775,6 @@ "@mdx-js/mdx/unified/@types/unist": ["@types/unist@2.0.6", "", {}, "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="], - "@mdx-js/mdx/unified/is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="], - "@mdx-js/mdx/unist-util-visit/@types/unist": ["@types/unist@2.0.6", "", {}, "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="], "@mdx-js/mdx/unist-util-visit/unist-util-is": ["unist-util-is@5.2.0", "", {}, "sha512-Glt17jWwZeyqrFqOK0pF1Ded5U3yzJnFr8CG1GMjCWTp9zDo2p+cmD6pWbZU8AgM5WU3IzRv6+rBwhzsGh6hBQ=="], @@ -11764,8 +11783,6 @@ "@mdx-js/mdx/vfile/@types/unist": ["@types/unist@2.0.6", "", {}, "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="], - "@mdx-js/mdx/vfile/is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="], - "@mdx-js/mdx/vfile/vfile-message": ["vfile-message@3.1.4", "", { "dependencies": { "@types/unist": "2.0.6", "unist-util-stringify-position": "3.0.3" } }, "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw=="], "@mdx-js/react/@types/react/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], @@ -13292,8 +13309,6 @@ "remark-frontmatter/unified/@types/unist": ["@types/unist@2.0.6", "", {}, "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ=="], - "remark-frontmatter/unified/is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="], - "remark-frontmatter/unified/vfile": ["vfile@5.3.7", "", { "dependencies": { "@types/unist": "2.0.6", "is-buffer": "2.0.5", "unist-util-stringify-position": "3.0.3", "vfile-message": "3.1.4" } }, "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g=="], "remark-mdx/mdast-util-mdx/mdast-util-from-markdown": ["mdast-util-from-markdown@1.3.0", "", { "dependencies": { "@types/mdast": "3.0.10", "@types/unist": "2.0.6", "decode-named-character-reference": "1.0.2", "mdast-util-to-string": "3.1.1", "micromark": "3.1.0", "micromark-util-decode-numeric-character-reference": "1.0.0", "micromark-util-decode-string": "1.0.2", "micromark-util-normalize-identifier": "1.0.0", "micromark-util-symbol": "1.0.1", "micromark-util-types": "1.0.2", "unist-util-stringify-position": "3.0.3", "uvu": "0.5.6" } }, "sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g=="], diff --git a/packages/cli/src/list-of-remotion-packages.ts b/packages/cli/src/list-of-remotion-packages.ts index 2402bce3835..aff614a75ac 100644 --- a/packages/cli/src/list-of-remotion-packages.ts +++ b/packages/cli/src/list-of-remotion-packages.ts @@ -83,4 +83,5 @@ export const listOfRemotionPackages = [ '@remotion/web-renderer', '@remotion/design', '@remotion/light-leaks', + '@remotion/vercel', ]; diff --git a/packages/create-video/src/list-of-remotion-packages.ts b/packages/create-video/src/list-of-remotion-packages.ts index 2402bce3835..aff614a75ac 100644 --- a/packages/create-video/src/list-of-remotion-packages.ts +++ b/packages/create-video/src/list-of-remotion-packages.ts @@ -83,4 +83,5 @@ export const listOfRemotionPackages = [ '@remotion/web-renderer', '@remotion/design', '@remotion/light-leaks', + '@remotion/vercel', ]; diff --git a/packages/docs/components/TableOfContents/api.tsx b/packages/docs/components/TableOfContents/api.tsx index 872fc0c65de..6590ebc4665 100644 --- a/packages/docs/components/TableOfContents/api.tsx +++ b/packages/docs/components/TableOfContents/api.tsx @@ -11,8 +11,8 @@ import {TableOfContents as GoogleFontsTableOfContents} from '../../docs/google-f import {TableOfContents as InstallWhisperCppTableOfContents} from '../../docs/install-whisper-cpp/install-whisper-cpp'; import {TableOfContents as LambdaTableOfContents} from '../../docs/lambda/table-of-contents'; import {TableOfContents as LayoutUtilsTableOfContents} from '../../docs/layout-utils/table-of-contents'; -import {TableOfContents as LightLeaksTableOfContents} from '../../docs/light-leaks/table-of-contents'; import {TableOfContents as LicensingTableOfContents} from '../../docs/licensing/TableOfContents'; +import {TableOfContents as LightLeaksTableOfContents} from '../../docs/light-leaks/table-of-contents'; import {TableOfContents as LottieTableOfContents} from '../../docs/lottie/table-of-contents'; import {TableOfContents as MediaParserTableOfContents} from '../../docs/media-parser/TableOfContents'; import {TableOfContents as MediaUtilsTableOfContents} from '../../docs/media-utils/table-of-contents'; @@ -33,6 +33,7 @@ import {TableOfContents as TailwindV4TableOfContents} from '../../docs/tailwind- import {TableOfContents as TailwindTableOfContents} from '../../docs/tailwind/TableOfContents'; import {TableOfContents as ThreeTableOfContents} from '../../docs/three/TableOfContents'; import {TableOfContents as TransitionsTableOfContents} from '../../docs/transitions/table-of-contents'; +import {TableOfContents as VercelTableOfContents} from '../../docs/vercel/table-of-contents'; import {TableOfContents as WebcodecsTableOfContents} from '../../docs/webcodecs/TableOfContents'; import {ZodTypesTableOfContents} from '../../docs/zod-types/TableOfContents'; import {Grid} from './Grid'; @@ -154,6 +155,9 @@ export const TableOfContents: React.FC = () => {

@remotion/light-leaks

Light leak effects

+

@remotion/vercel

+

Render videos on Vercel Sandbox

+

@remotion/motion-blur

Apply motion blur effects to components

diff --git a/packages/docs/docs/vercel-sandbox.mdx b/packages/docs/docs/vercel-sandbox.mdx index 7622aa4656a..48822922949 100644 --- a/packages/docs/docs/vercel-sandbox.mdx +++ b/packages/docs/docs/vercel-sandbox.mdx @@ -52,12 +52,17 @@ For concurrency, the limit is 10 simultaneous renders on Hobby, and 2000 on Pro For more details, see: [Vercel Sandbox pricing](https://vercel.com/docs/vercel-sandbox/pricing) +## `@remotion/vercel` package + +The [`@remotion/vercel`](/docs/vercel/api) package provides a programmatic API for rendering Remotion videos on Vercel Sandbox. The template uses this package under the hood. + ## Source Code See the [template source code](https://github.com/remotion-dev/remotion/tree/main/packages/template-vercel) for implementation details. ## See also +- [`@remotion/vercel` API Reference](/docs/vercel/api) - [Deploying Remotion on Vercel](/docs/vercel) - [Server-side rendering](/docs/ssr) - [Lambda](/docs/lambda) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx new file mode 100644 index 00000000000..08a9fc8e748 --- /dev/null +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -0,0 +1,56 @@ +--- +image: /generated/articles-docs-vercel-create-sandbox.png +title: createSandbox() +crumb: '@remotion/vercel' +--- + +# createSandbox() + +Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, a browser, and your Remotion bundle. + +This is a lower-level API. For most use cases, prefer [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) which handles dev/prod routing automatically. + +## Example + +```ts twoslash title="create-snapshot.ts" +// @module: es2022 +// @target: es2022 +import type {OnProgress, VercelSandbox} from '@remotion/vercel'; +const createSandbox: (options: {bundleDir: string; onProgress?: OnProgress}) => Promise = null as unknown as (options: {bundleDir: string; onProgress?: OnProgress}) => Promise; +// ---cut--- +const sandbox = await createSandbox({ + bundleDir: '.remotion', + onProgress: ({progress, message}) => { + console.log(`${message} (${Math.round(progress * 100)}%)`); + }, +}); +``` + +## Arguments + +An object with the following properties: + +### `bundleDir` + +The path to your Remotion bundle directory, relative to the current working directory. This is the output of [`npx remotion bundle`](/docs/cli/bundle). + +### `onProgress?` + +A callback that receives progress updates during sandbox creation. + +```ts +type OnProgress = (update: { + progress: number; // 0 to 1 + message: string; // Human-readable phase description +}) => void; +``` + +## Return value + +A `VercelSandbox` object (a `Sandbox` with `AsyncDisposable` support). You can use `await using` to automatically clean up the sandbox when it goes out of scope. + +## See also + +- [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) +- [`createSnapshot()`](/docs/vercel/create-snapshot) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/create-sandbox.ts) diff --git a/packages/docs/docs/vercel/create-snapshot.mdx b/packages/docs/docs/vercel/create-snapshot.mdx new file mode 100644 index 00000000000..ccb4133b481 --- /dev/null +++ b/packages/docs/docs/vercel/create-snapshot.mdx @@ -0,0 +1,46 @@ +--- +image: /generated/articles-docs-vercel-create-snapshot.png +title: createSnapshot() +crumb: '@remotion/vercel' +--- + +# createSnapshot() + +Takes a snapshot of a sandbox. Snapshots allow you to skip the sandbox setup time in production by restoring from a pre-built state. + +Typically called during the build step (e.g. in `create-snapshot.ts`) to cache the sandbox for production use. + +## Example + +```ts twoslash title="create-snapshot.ts" +// @module: es2022 +// @target: es2022 +import type {VercelSandbox} from '@remotion/vercel'; +const createSnapshot: (options: {sandbox: VercelSandbox}) => Promise<{snapshotId: string}> = null as unknown as (options: {sandbox: VercelSandbox}) => Promise<{snapshotId: string}>; +declare const sandbox: VercelSandbox; +// ---cut--- +const {snapshotId} = await createSnapshot({sandbox}); +console.log(`Snapshot created: ${snapshotId}`); +``` + +## Arguments + +An object with the following properties: + +### `sandbox` + +A `VercelSandbox` instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). + +## Return value + +An object containing: + +### `snapshotId` + +A `string` identifier for the snapshot. Pass this to [`saveSnapshot()`](/docs/vercel/save-snapshot) to cache it for production use. + +## See also + +- [`saveSnapshot()`](/docs/vercel/save-snapshot) +- [`createSandbox()`](/docs/vercel/create-sandbox) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/create-snapshot.ts) diff --git a/packages/docs/docs/vercel/get-or-create-sandbox.mdx b/packages/docs/docs/vercel/get-or-create-sandbox.mdx new file mode 100644 index 00000000000..66ab91a0b44 --- /dev/null +++ b/packages/docs/docs/vercel/get-or-create-sandbox.mdx @@ -0,0 +1,50 @@ +--- +image: /generated/articles-docs-vercel-get-or-create-sandbox.png +title: getOrCreateSandbox() +crumb: '@remotion/vercel' +--- + +# getOrCreateSandbox() + +The primary entry point for getting a sandbox. Automatically handles the dev/prod routing: + +- **Development** (no `VERCEL` env var): Creates a fresh sandbox from scratch using [`createSandbox()`](/docs/vercel/create-sandbox). +- **Production** (on Vercel): Restores a sandbox from a cached snapshot. Throws an error if no snapshot is found. + +## Example + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +import type {OnProgress, VercelSandbox} from '@remotion/vercel'; +const getOrCreateSandbox: (options: {bundleDir: string; onProgress?: OnProgress}) => Promise = null as unknown as (options: {bundleDir: string; onProgress?: OnProgress}) => Promise; +// ---cut--- +await using sandbox = await getOrCreateSandbox({ + bundleDir: '.remotion', + onProgress: ({progress, message}) => { + console.log(`${message} (${Math.round(progress * 100)}%)`); + }, +}); +``` + +## Arguments + +An object with the following properties: + +### `bundleDir` + +The path to your Remotion bundle directory, relative to the current working directory. + +### `onProgress?` + +A callback that receives progress updates. Only called during development when a fresh sandbox is created. + +## Return value + +A `VercelSandbox` object. + +## See also + +- [`createSandbox()`](/docs/vercel/create-sandbox) +- [`getSnapshot()`](/docs/vercel/get-snapshot) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/get-or-create-sandbox.ts) diff --git a/packages/docs/docs/vercel/get-snapshot.mdx b/packages/docs/docs/vercel/get-snapshot.mdx new file mode 100644 index 00000000000..604665bffc9 --- /dev/null +++ b/packages/docs/docs/vercel/get-snapshot.mdx @@ -0,0 +1,38 @@ +--- +image: /generated/articles-docs-vercel-get-snapshot.png +title: getSnapshot() +crumb: '@remotion/vercel' +--- + +# getSnapshot() + +Retrieves a cached snapshot ID from Vercel Blob storage. Returns `null` if no snapshot is found or if not running on Vercel. + +Used internally by [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) to check for a cached sandbox. + +## Example + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +const getSnapshot: () => Promise = null as unknown as () => Promise; +// ---cut--- +const snapshotId = await getSnapshot(); +if (snapshotId) { + console.log(`Found cached snapshot: ${snapshotId}`); +} +``` + +## Arguments + +None. + +## Return value + +`string | null` - The cached snapshot ID, or `null` if not found. + +## See also + +- [`saveSnapshot()`](/docs/vercel/save-snapshot) +- [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/get-snapshot.ts) diff --git a/packages/docs/docs/vercel/index.mdx b/packages/docs/docs/vercel/index.mdx new file mode 100644 index 00000000000..db8b708d7d4 --- /dev/null +++ b/packages/docs/docs/vercel/index.mdx @@ -0,0 +1,28 @@ +--- +image: /generated/articles-docs-vercel-index.png +id: vercel-api +slug: /vercel/api +title: '@remotion/vercel' +--- + +import {TableOfContents} from './table-of-contents'; + +# @remotion/vercel + +Render Remotion videos on [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox). + + + +This package requires `@vercel/sandbox` and `@vercel/blob` as peer dependencies: + +```bash +npm i @vercel/sandbox @vercel/blob +``` + +## APIs + + + +## License + +[Remotion License](/docs/license) diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx new file mode 100644 index 00000000000..6e9da633c34 --- /dev/null +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -0,0 +1,75 @@ +--- +image: /generated/articles-docs-vercel-render-still-on-vercel.png +title: renderStillOnVercel() +crumb: '@remotion/vercel' +--- + +# renderStillOnVercel() + +Renders a still image inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. + +The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) to upload it to Vercel Blob. + +## Example + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +import type {RenderOnVercelProgress, VercelSandbox} from '@remotion/vercel'; +const renderStillOnVercel: (options: {sandbox: VercelSandbox; compositionId: string; inputProps: Record; imageFormat?: 'png' | 'jpeg' | 'webp'; outputFile?: string; onProgress?: (progress: RenderOnVercelProgress) => void; bundleDir?: string}) => Promise<{file: string}> = + null as unknown as any; +declare const sandbox: VercelSandbox; +// ---cut--- +const {file} = await renderStillOnVercel({ + sandbox, + compositionId: 'MyComp', + inputProps: {title: 'Hello World'}, + imageFormat: 'png', +}); +``` + +## Arguments + +An object with the following properties: + +### `sandbox` + +A `VercelSandbox` instance. + +### `compositionId` + +The ID of the Remotion composition to render. + +### `inputProps` + +Props to pass to the composition. + +### `imageFormat?` + +The output image format. Default: `"png"`. Can be `"png"`, `"jpeg"`, or `"webp"`. + +### `outputFile?` + +The output file path inside the sandbox. Default: `"/tmp/still.png"`. + +### `onProgress?` + +A callback that receives render progress updates. See [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) for the type definition. + +### `bundleDir?` + +The bundle directory name in the sandbox. Default: `".remotion"`. + +## Return value + +An object containing: + +### `file` + +The path to the rendered still image inside the sandbox. + +## See also + +- [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) +- [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-still.ts) diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx new file mode 100644 index 00000000000..52fff415055 --- /dev/null +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -0,0 +1,82 @@ +--- +image: /generated/articles-docs-vercel-render-video-on-vercel.png +title: renderVideoOnVercel() +crumb: '@remotion/vercel' +--- + +# renderVideoOnVercel() + +Renders a video inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. + +The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) to upload it to Vercel Blob. + +## Example + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +import type {RenderOnVercelProgress, VercelSandbox} from '@remotion/vercel'; +const renderVideoOnVercel: (options: {sandbox: VercelSandbox; compositionId: string; inputProps: Record; codec?: string; outputFile?: string; onProgress?: (progress: RenderOnVercelProgress) => void; bundleDir?: string}) => Promise<{file: string}> = null as unknown as any; +declare const sandbox: VercelSandbox; +// ---cut--- +const {file} = await renderVideoOnVercel({ + sandbox, + compositionId: 'MyComp', + inputProps: {title: 'Hello World'}, + onProgress: (update) => { + if (update.type === 'render-progress') { + console.log(`Rendering: ${Math.round(update.progress * 100)}%`); + } + }, +}); +``` + +## Arguments + +An object with the following properties: + +### `sandbox` + +A `VercelSandbox` instance. + +### `compositionId` + +The ID of the Remotion composition to render. + +### `inputProps` + +Props to pass to the composition. + +### `codec?` + +The video codec to use. Default: `"h264"`. + +### `outputFile?` + +The output file path inside the sandbox. Default: `"/tmp/video.mp4"`. + +### `onProgress?` + +A callback that receives render progress updates. + +```ts +type RenderOnVercelProgress = {type: 'opening-browser'} | {type: 'selecting-composition'} | {type: 'render-progress'; progress: number} | {type: 'uploading'} | {type: 'done'; url: string; size: number}; +``` + +### `bundleDir?` + +The bundle directory name in the sandbox. Default: `".remotion"`. + +## Return value + +An object containing: + +### `file` + +The path to the rendered video inside the sandbox. + +## See also + +- [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) +- [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-video.ts) diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx new file mode 100644 index 00000000000..44822dad5cc --- /dev/null +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -0,0 +1,37 @@ +--- +image: /generated/articles-docs-vercel-save-snapshot.png +title: saveSnapshot() +crumb: '@remotion/vercel' +--- + +# saveSnapshot() + +Saves a snapshot ID to Vercel Blob storage, keyed by the current `VERCEL_DEPLOYMENT_ID`. This allows [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) to restore the sandbox in production without re-creating it. + +## Example + +```ts twoslash title="create-snapshot.ts" +// @module: es2022 +// @target: es2022 +const saveSnapshot: (options: {snapshotId: string}) => Promise = null as unknown as (options: {snapshotId: string}) => Promise; +// ---cut--- +await saveSnapshot({snapshotId: 'snap_abc123'}); +``` + +## Arguments + +An object with the following properties: + +### `snapshotId` + +The snapshot ID returned by [`createSnapshot()`](/docs/vercel/create-snapshot). + +## Return value + +`void`. Throws if the upload to Vercel Blob fails. + +## See also + +- [`createSnapshot()`](/docs/vercel/create-snapshot) +- [`getSnapshot()`](/docs/vercel/get-snapshot) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/save-snapshot.ts) diff --git a/packages/docs/docs/vercel/table-of-contents.tsx b/packages/docs/docs/vercel/table-of-contents.tsx new file mode 100644 index 00000000000..36f68d85f07 --- /dev/null +++ b/packages/docs/docs/vercel/table-of-contents.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import {Grid} from '../../components/TableOfContents/Grid'; +import {TOCItem} from '../../components/TableOfContents/TOCItem'; + +export const TableOfContents: React.FC = () => { + return ( +
+ + + createSandbox() +
Create a sandbox with Remotion installed
+
+ + getOrCreateSandbox() +
Get a cached sandbox or create a new one
+
+ + createSnapshot() +
Take a snapshot of a sandbox
+
+ + saveSnapshot() +
Save a snapshot ID to Vercel Blob
+
+ + getSnapshot() +
Get a cached snapshot ID from Vercel Blob
+
+ + renderVideoOnVercel() +
Render a video in a sandbox
+
+ + renderStillOnVercel() +
Render a still image in a sandbox
+
+ + uploadToBlobStorage() +
Upload a file from the sandbox to Vercel Blob
+
+
+
+ ); +}; diff --git a/packages/docs/docs/vercel/upload-to-blob-storage.mdx b/packages/docs/docs/vercel/upload-to-blob-storage.mdx new file mode 100644 index 00000000000..d7e49826bfd --- /dev/null +++ b/packages/docs/docs/vercel/upload-to-blob-storage.mdx @@ -0,0 +1,70 @@ +--- +image: /generated/articles-docs-vercel-upload-to-blob-storage.png +title: uploadToBlobStorage() +crumb: '@remotion/vercel' +--- + +# uploadToBlobStorage() + +Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage. Typically used after [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) or [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) to make the output publicly accessible. + +## Example + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +import type {VercelSandbox} from '@remotion/vercel'; +const uploadToBlobStorage: (options: {sandbox: VercelSandbox; sandboxFilePath: string; blobPath?: string; contentType: string; blobToken: string}) => Promise<{url: string; size: number}> = null as unknown as any; +declare const sandbox: VercelSandbox; +// ---cut--- +const {url, size} = await uploadToBlobStorage({ + sandbox, + sandboxFilePath: '/tmp/video.mp4', + contentType: 'video/mp4', + blobToken: process.env.BLOB_READ_WRITE_TOKEN!, +}); + +console.log(`Uploaded ${size} bytes to ${url}`); +``` + +## Arguments + +An object with the following properties: + +### `sandbox` + +A `VercelSandbox` instance. + +### `sandboxFilePath` + +The path to the file inside the sandbox to upload, e.g. `"/tmp/video.mp4"`. + +### `blobPath?` + +The destination path in Vercel Blob, e.g. `"renders/abc.mp4"`. If omitted, a random path is generated. + +### `contentType` + +The MIME type of the file, e.g. `"video/mp4"` or `"image/png"`. + +### `blobToken` + +Your Vercel Blob read/write token. Typically `process.env.BLOB_READ_WRITE_TOKEN`. + +## Return value + +An object containing: + +### `url` + +The public download URL of the uploaded file. + +### `size` + +The size of the uploaded file in bytes. + +## See also + +- [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) +- [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/upload-to-blob-storage.ts) diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index da0ed817656..f4b4ab6600a 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -460,6 +460,24 @@ const sidebars: SidebarsConfig = { }, items: ['light-leaks/light-leak'], }, + { + type: 'category', + label: '@remotion/vercel', + link: { + type: 'doc', + id: 'vercel/vercel-api', + }, + items: [ + 'vercel/create-sandbox', + 'vercel/get-or-create-sandbox', + 'vercel/create-snapshot', + 'vercel/save-snapshot', + 'vercel/get-snapshot', + 'vercel/render-video-on-vercel', + 'vercel/render-still-on-vercel', + 'vercel/upload-to-blob-storage', + ], + }, { type: 'category', label: '@remotion/openai-whisper', diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 12cc0c068ea..fd193b3b7d2 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6538,6 +6538,87 @@ export const articles = [ noAi: false, slug: 'vercel', }, + { + id: 'vercel/create-sandbox', + title: 'createSandbox()', + relativePath: 'docs/vercel/create-sandbox.mdx', + compId: 'articles-docs-vercel-create-sandbox', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/create-sandbox', + }, + { + id: 'vercel/create-snapshot', + title: 'createSnapshot()', + relativePath: 'docs/vercel/create-snapshot.mdx', + compId: 'articles-docs-vercel-create-snapshot', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/create-snapshot', + }, + { + id: 'vercel/get-or-create-sandbox', + title: 'getOrCreateSandbox()', + relativePath: 'docs/vercel/get-or-create-sandbox.mdx', + compId: 'articles-docs-vercel-get-or-create-sandbox', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/get-or-create-sandbox', + }, + { + id: 'vercel/get-snapshot', + title: 'getSnapshot()', + relativePath: 'docs/vercel/get-snapshot.mdx', + compId: 'articles-docs-vercel-get-snapshot', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/get-snapshot', + }, + { + id: 'vercel-api', + title: '@remotion/vercel', + relativePath: 'docs/vercel/index.mdx', + compId: 'articles-docs-vercel-index', + crumb: null, + noAi: false, + slug: 'vercel/api', + }, + { + id: 'vercel/render-still-on-vercel', + title: 'renderStillOnVercel()', + relativePath: 'docs/vercel/render-still-on-vercel.mdx', + compId: 'articles-docs-vercel-render-still-on-vercel', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/render-still-on-vercel', + }, + { + id: 'vercel/render-video-on-vercel', + title: 'renderVideoOnVercel()', + relativePath: 'docs/vercel/render-video-on-vercel.mdx', + compId: 'articles-docs-vercel-render-video-on-vercel', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/render-video-on-vercel', + }, + { + id: 'vercel/save-snapshot', + title: 'saveSnapshot()', + relativePath: 'docs/vercel/save-snapshot.mdx', + compId: 'articles-docs-vercel-save-snapshot', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/save-snapshot', + }, + { + id: 'vercel/upload-to-blob-storage', + title: 'uploadToBlobStorage()', + relativePath: 'docs/vercel/upload-to-blob-storage.mdx', + compId: 'articles-docs-vercel-upload-to-blob-storage', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/upload-to-blob-storage', + }, { id: 'version-mismatch', title: 'Version mismatch', diff --git a/packages/docs/static/generated/articles-docs-vercel-create-sandbox.png b/packages/docs/static/generated/articles-docs-vercel-create-sandbox.png new file mode 100644 index 0000000000000000000000000000000000000000..c9251c83374a2cec06c5541e0183c1e47a953738 GIT binary patch literal 46232 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 literal 0 HcmV?d00001 diff --git a/packages/docs/static/generated/articles-docs-vercel-create-snapshot.png b/packages/docs/static/generated/articles-docs-vercel-create-snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae4bb19d272d80d24f28daa7f18b33dd709c424 GIT binary patch literal 46664 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 OLsU7ToOR67_x}L6D?1_p literal 0 HcmV?d00001 diff --git a/packages/docs/static/generated/articles-docs-vercel-get-snapshot.png b/packages/docs/static/generated/articles-docs-vercel-get-snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..359aeea7705bdd5279d81129303e56fcf91b4f6c GIT binary patch literal 45637 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�PD{owfi30e7rS-%x&ik9lXZycdHw^aFG!*G*U$1Wd*sMwboul<$>(XquD}7BuJ<}! zb1>!hAzjpNrI&RT0caXZPP3>xY^1w+1IIJZ(a(76IA!$~zvwdQr*2j9x$eFUTKRJB z>gI7edw9isa)9GhCbb%*dcoVTo;Lp7U2)0_7uQh-IXr9LD++lgbeAUkcl{i#n(WoB zt%NZeKv+!WcE!to2RDQl@EibIaD}+|s^x)t`OBojrB9878woO6z$$(9nGN;G1_&n@ zxB4#Nhd8;#ZQ? zWm#%i)b7o~>{g35z`EI$E=>i_Gq@8#8P0!g*M-al+Q1LMY&t_6)E9T7{bn%tlfuMg zY12X=2L#FMm2&h%90Qs)4W3s3ISX2veONm&)_rK+(z3UJ$N^P#Izz%uVDw z_MvYp)5-eGOBi)I$=}O{i_DX}+y;&TxVT;O7;iHEai1|$N^x*_#U<$FA|{6{X8EU{ z|EYb4U6jkz&H47QWv;({AQ<0JF)VziEXr9d2_D>Rl)l+=M>N|U&?i`!nM-G=Vj(e; z6?VTLgWhXT4{fK!HXkXs>P~&?k7v#*w8Is_gFKq#tfi#V` zRFa7bpe4ni9F|iLA=bXJ4?u+6@El2h)q;vy%2@A5vfLAAQc_1z*dDT3O^GA<`oBCp|6o>bN_+oAfJSmrz-pWW@eBAr5g#phbi@&i$s@t`H3zh|Hlm4P zTQd$dt{Ohl24jOhjpm31pn@@pC7exZkQ`>-8Xrc|O&wWTtu_X|gE9gL&tD|M)$cTn z`CZF_XMF9EiHTOeYQ02CFjP*hPj_h;sZ@Dz)uZW7e~j&=9KIVvY+JUZx4~J zo=e@CC=~(`c&~XV%!#5nX-o_Pf7e^A$mHf(ed{-&q+pDA3LVV^8MK`+=pW zhRW8|8`&P*Takhfwn`z-k0?D-3g|3b<^nYJLFv^En+MrWnxZ>E$zhK+nm295bJPiT z(V2&wlCb3nCNSA?sK2+iFUb}|vc7ZnNu=9`J5e^FQcp~xZC$Qb#e?jL!pdnINPVhK zn+@B+0w1={jTNJ|dTpn;aLVJfkc&5>`YI_blg;2Kd404HkfNp2IOr}&{$-_&JNyb44 zj;I>4ZkLuubL{L>k+KeJ|oNNENOg(cHp6 z1eC3qW)L7ICs1w1zMTiM*e3q9nq?NHvw=v4TK7PNl{)Y@drIGz0FiUlbpr|H%F^TK zhK90n+=WnbLc7MJ!H|8AxoqIvRZ-`Bm8%`YVd; zq=Rc7koN*l?g33M>7Hd;v?1U5 zp1GYGtu zhpKII1;x3(+4VxUFB$J?F8XgSfB^SsR)u0X`7nUFay~mJU!h?jEnDd=+KW+@5u(N+ zNWZ&*7kd?)H*_m(C3%#^BqSuZ%R^fbt0tnM&YP{{4e<3)>-O0XSt33qm{i$RUte=) zk`NV#Nvi9G$Km6)J<{NsDh9L`GPkY`o>NY1s(vp2BvzyMDvdkvh=>NaHz2uf+@saI z2??vbS{jEDE77OGLIUAS<`$7Dg(Zy-pU5n_Q{O%)apW>&5~cJC#W5q_%x-yjO=%XA zEhWLdpLM^y0(2sJJ6dpS8nOpH&p(!szF;ux9Ezc^-iKP0g4XkgS_RjgpF*mt1L_Un zY6L@}s(P)N3eZXD_Z^jVy-ske<}Ju>DSQ~Vs653KZOukiTmbz|Vg|51MV3@dnZfSqX(!kW%|oy> zmCf#Wo*Vmw#)n|&m&ZoQ}1>2v%$BQ_YW)(z&AQB1bu zMR8_57jSLI$0Y=Sem68+)_zt!-$6+K3Jwf{lJ< zA3PN0??9Em^3fV68eoMpP-6sipa5J2s**YH@iTk#$q+G_XPF>3kAZR~-^&AsMSn|} z37}?at@1XN`|^7F@_I}V8*BsW+qT3C77}9;rV>!lda$`*17({9LTA981+HtHoA=J{ z{tU&=>?ksv#G&5g$HqOLeFhNXm1Kc35Y%HxOOhXNEhqWWUW!*MZc~F)BMELbXTkKC z+YZ8KP!#I;un#M76>t6=?D_UQNbosMwfC7}_77cJsbd`3vzrX5kvBC5vVQ4KH292l z`B>Y&>GJ#4ALI2CQs*cvgBLIC<~x%hr4~cGIoO#j5`d{7Bvw6($WrB5l~tw8yZW*o zYq5F@XXG0fdSecys$`IQvz(cUsgJQ5bvgCE=Hnlb4y=YKW#3Fbq1p0Aq6>zX;E4Nr z;0~7Fo0rtSFrr1^V&;7U5-kmE|QcmZI#yxzcl+9V&R33 znu;u8d;8KY&Z1eorM{dDSN*Qr-`sXa4M|>(pPN$C&kJ}0KyjqBQz>9>zp?lGCv)s& zAv=eWiW33FP<(!0*@j#+h65lpog-m+PZG!X=XdYUnuR-BGE6HX zA&pR{{oKr@MDk)A)Z=saT6^Qvz8Z$YiQ)s6v6NEI<#?588^{MZ&$aN2an-%z==!+= zo*ivkzB>jf3B)WJ6}c_U##tcwcxP!wDdvK~jh}aezgRk!9m_8*}b2u7|vh9!aN0Kks4!TEcXpE5#3uPRq^x z2^D+AGGzPJ(xWS}{`cWtJGh@3uIXG$bH=ptQuhI ztk|?kH?*N-U)2;qPPHd$?%zjhNXav%Q>`~$BznyiYf15YCeqcB3TSq&u9UIYbGM{0 zRPUP8k~Qn|Ss4Q;m5j=yrU;5KBnD;Y5Zs&JHe@R%$|4+gbSj}Oy(ZuYB57yy9Ul5Q zgc^@?c+axH2B|X7MV;fFx)VO&YOmzvt zs#u?1o(3%$vndhTTb2jQ$FS~_t~x4Wd|U} zNki@x0!Nkp2YVxD)7|W8Om>~ZhLzC+(oDWYSI3|`0n;M^xj?|m6;BFI4N3Os_}jD# zedy#szrCA~8E`r+Xa*9O0$`t@+$N&0*yAhOprvDjg7qSgw6?8r2ev8WmscR&vU#dVIVa;?f=a1W)Ah02<}VJ-7e&LN=mBNZ zQO?id^1*Q2;GBD_{4IS(>MuyJaZ4QmH!ipEf|op8sNeGK7?dwWPm@PM#{twX7LGC~ zYeM#?-^&6-?*8hvk*eoWJpOp+2&w0fKCR`eAfS_>2Q1%gO#n6cZGT;hhka-G4}S^i zi~CpA?k_UltO3q66`p>cIU|s%b%(Wr$q{w6F0IZ==UekGr za89xmJ868%*x9=#N^isTzs9W`=u(sFn!9@^QU^YJ*A?hRh7<81P+XJEpj}SaveyHX zIaugv5jU-VtVKc9@=3J5#1mCwEM+(%Qau*7m50ycHR#8 z7=2M`A>1>U?mxMfA`IJSSf{x=7&g1Ny0?nasS)UAXbvO285SRJeyf<7p1#X@e{(^@ zR6c%IY|A!&4O}0Fo=P=F)njR{(Oy7m7m-S1)Ah_vx{d0Ru!Ues!;yaFtKKEniN-~2 z*1y!RDVQ7MH)ZPdE6>h7QLYI4PKi||c&pTnKdF6~5lv>>w94jO9KqV{yw(*I$g1CL zWUc8SYgRxcO5wwfN$>vBHH$IzG1O>Bo_gDtqdNX`YpQ7Om_dGE4^X0uO^d)V#bf~6 zTW!VCp^58m+{*^2QW5KZgTh#b)0^mDgJ@V@Mr8Ld`M<7_#77R8=I8A!n9YzT!wXqj z9xhuQsn{s#*EXe1?r@mzoB-!ib@Xp9ZHHWe0rEh+NEZ#2L%7VAOQf=CE zD^Gp%yunike}Swhda$L`End7rKJf=HFE8*yJb}}~I5-@7osv6u%81|T;JVj#LO9BR zH9<+?yCJ_U+YNioxK{dia6l1j5TZjyUY_48f`427VqA|~Kd)plE?lSdidEIxS3ZkX#;p9}cnRPi3RwV+?6y36{%hOiI z;G69SHNq%pw*>_IeZ(K&pB9)Jt_*)j;&f3^|+DD1gM5Bws(asrURer z;D@Kr3qHHgIC=qWulwNidF}eI-zX_gM|2O``b-OPF%2tg0T1{?VPGaDgdwe{`U8@jD@`|Z?ufs&X?;J$<=ySvYo)g2W_ZFYNMCGGp5K-D_O8#$ zl^d!@QL@_IG>8Q5rS^4SpPB9;_o8m$=^1t<$RWQr^$W8?>uk@`=-=JjcG-G=B znb$Qe)<1BZtXbHy4KBorX;k$OxBh82O7Z*HIQ&WBVutRh_er{Vw`e+`c_uWlGyI^I-Bjz| zJXrGyZ_O@8u53v3dlmM6;m6dPs=3y1TH6k8m4Zj$!F+4jay_$P*=0~gAJ3ES8KH3{ zUjEIV4*yl{tz^@q_$^rrw=WF2vv>R8=8S?Mjhdz*@XNO5*!Z`a4;FNub#m-4(-|~- zNk*;fU4m6`LN2>znkS!ivFz~|#w_<3h)w%1Uf2}8lX)95cE>}`+cV3`&ZT=3q3exn zI~Qc8gH7y(_)l{)*iS|3VWnG&PepbWfyVW|s)9G)BGd)z6_6Q(0c^_K0m%rcC`*in5>z=y%Ha|wk8<&3}=45INO&chl zvnxSSzWe?_x0)3xX9@`4$2LgVP*_|K8HY=Qgn_kJPie;~FL|HCZC?y)7$L;^btYCK zFB%H$fn3FZ?zCAhv~w>~hxFyERWo{P^7bBL`CfvBN?*7;8v<3SPk;kB}I_T)g zdO6peMgyPb*5`0gSP*|mv(V{?_M#;2;M4dZ-5~$E*v~aETW_(O_Au%668^t?9`AtI z)ZwdR{|&+hqY38+DB_o>`ES0#R92Sd2=iiBZLXR=Qy&iK*A5RntO=n%dN@ST}$?mcUQgBPkh1*=Yu z^uB&6vdef^!sr$MS&5leIIulAkK)IfknNKgp)nc8sZ-9+ym6%G@10|1k91T+k{;?$ zB{2=jCx~-+;$24G8gxDn$OUJjGFxzo9_pkih#)jCLlh*Smp7PjoLO=x6rYzyq2{O2 zzrA1+X(ao#6@7hu4FyZNZ(?ed@ljxpak=G2aNF&jl%c}q79bc!YAB4tXsgrosptxm z-EjQafPpX9hkMGT{L-ZW(-Rh|uOrI1%a>=EnKNKWC1|>BJW{ZYL))$V9`6!i5B7i- z9?mwbf%TAlVFD#AIfvI!+urV@JKTZi=@3QcGf%s7lJlc|uKtLVG4ff1MKo|1Oo;k!I#Qrabr9s-~+joBz5rd@2b8R9^oNhMl+C&t~ zds;SNWX-)L;1iL9K#Bw6Tt43k$WpQa@=qU%-u76VRjIQ|l|7CClm;rH0DMQDskB#D zU|AhsjDUAgocN^J7A@)*%1B&uQoxo}of?h}Av}w`Cu}Tj9S+Fgz1S95RRY08{!*UX z(ebXJ3N5ip>vW#Uvi2$w7D&=nz2iV>r);|QL^$I0l~DWe>#F1Lu@q_2Xz(}S%HSVK zWjHPb0-DoU2ZNkI_v05;Ek%QAT;-FGZsaFE3l`#-4osH*Efybr;& zQ53K@{<8tFsgP((a?iJu1CoM0|Y#alwvr9DI?4XDFS2+w2xzDk1h z6A|wE3N~D2|Dk)rFNhC%~pg8e*t7(b?;!z>hscn-K8Tk+gdAjp|Frg!Mo(Ob9go+#xDmY^C(>?6WQ(1u1+5mxotREah4eL@ z08&tjTGN%OWywUlgV zvBadzs;1P*G$CtJ0E`?ZEj7`kID7CiMTB#WhwgMbG^I$8!`b))WJC&!fxVe0Vv?kG zqYy47g_N#iFy68A=z3Mjh(V6^>%(WjdrjU0>CZ{EDJ&r(X^F+L>Hn8)o=$^S4fA|f zugAk_vP#py09kK6SO7K~SrTa@k^=guRj?%J7DuxEN)Q1wl(qX}D7l#e8_<1m{-=7OiWViyK46$eb{?0RrTNEi3WU|J?0O>Z_*$=GJG0LoFnCKEmY7oGJgqM&1(VqoAL_?;0MfVjS+uR9Ua zod8_tUgMzj@Z&a@tqQ$d`mxmPq{x0qzVWM&Mao**LO{;AARZjYi3+jn;P)NhM&`#N z#>L|-BXMtIz{wnYC{;2YHP0o+$N@fq_chT1rj*7+sAAh}mju@hBObIMY7ba!8%WrAmbUk2GTmn@}-B}GoQ`1OzM_>37s%PMhP=8y{)~`QnrB9 zmgJnpQoy+?8MLe|kw^&nZGtT!%;ejC6qRuTMk;akhe<0CDzuqFOLS8pU9z{2vP`Ro z)bi|c0llLq2n$f!A_S%D2#M(>zKno{tZ?J*_ zM{J6eeUV&@g)kRz*rb6fK5}7mi!MIebV|1wDfLmed*7O~3%A!!;$y_a>sxMgzhKR1)rP zXyDrRr--n(=pz^nmK`<*=4y1xwVmUAfhWRP5m#qWL)egJaZ*uipcA zyREzx`PZ3w{xUTsY6Cgtw05Jp8*bi_QjgsZOKs$c zLMocWucP((j$!HWK~6VdDbx5k1MEWu!|AtiS%86=`Q7_v*?J8MF&c*2(!3 zvRVGGrpJd|3h)605p&W)vyYhl#em2MV}1(eNKZAhvDO`$FDOb0UX;4AG8=2IiK(&t zuj?Z5ZSJ{H5SOR32_8Irrr`}=Z7j6;8N6u8TmDH53+ZUo$fEGiVy|bBzr*E~sQirq zLLKtI3%L6tR2rX!VbAcJU}?w-duY^O^$1@5ULJ8t@EWcK5I4iOq~<8BXVB#@dK){F zNZZ}A{k(|d4MFW+>B1>OQOl?XwlBd}dUZdW x!nem}>5Hp)$q-T~l(Dhp7-KU$$RQ3)qJ$Va?f2=icY`;S#T*akvrelL{s;GBX^{W` literal 0 HcmV?d00001 diff --git a/packages/docs/static/generated/articles-docs-vercel-index.png b/packages/docs/static/generated/articles-docs-vercel-index.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd1a6af5770cc8e2cc1b0145c97fc021a787b6a GIT binary patch literal 39983 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≤=HkC+H;@Y2M&N}3m%Kq`z5H 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 Ss;L53C^nY%7T3(ShW{TEw6f6v literal 0 HcmV?d00001 diff --git a/packages/docs/static/generated/articles-docs-vercel-upload-to-blob-storage.png b/packages/docs/static/generated/articles-docs-vercel-upload-to-blob-storage.png new file mode 100644 index 0000000000000000000000000000000000000000..cf3b5ed4e4c0f7702a4d0bc892541d37d799a1ec GIT binary patch literal 48787 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 { - if (progress.type === "phase") { - const pct = Math.round((progress.progress ?? 0) * 100); - console.log(`[create-snapshot] ${progress.phase} (${pct}%)`); - } + bundleDir: ".remotion", + onProgress: ({ progress, message }) => { + const pct = Math.round(progress * 100); + console.log(`[create-snapshot] ${message} (${pct}%)`); }, }); console.log("[create-snapshot] Taking snapshot..."); -const snapshot = await sandbox.snapshot({ expiration: 0 }); +const { snapshotId } = await createSnapshot({ sandbox }); +await saveSnapshot({ snapshotId }); -await saveSnapshotCache(snapshot.snapshotId); - -console.log( - `[create-snapshot] Snapshot saved: ${snapshot.snapshotId} (never expires)`, -); +console.log(`[create-snapshot] Snapshot saved: ${snapshotId} (never expires)`); diff --git a/packages/template-vercel/package.json b/packages/template-vercel/package.json index 8a18e87e9d3..00d9c74dd10 100644 --- a/packages/template-vercel/package.json +++ b/packages/template-vercel/package.json @@ -19,6 +19,7 @@ "@remotion/player": "workspace:*", "@remotion/shapes": "workspace:*", "@remotion/tailwind-v4": "workspace:*", + "@remotion/vercel": "workspace:*", "@types/bun": "1.3.3", "@vercel/blob": "2.0.1", "@vercel/functions": "^3.4.1", diff --git a/packages/template-vercel/render.ts b/packages/template-vercel/render.ts deleted file mode 100644 index 6a2f25aae37..00000000000 --- a/packages/template-vercel/render.ts +++ /dev/null @@ -1,65 +0,0 @@ -// This file is copied into the Vercel sandbox and executed with `node --strip-types` -import { - openBrowser, - renderMedia, - selectComposition, -} from "@remotion/renderer"; -import { put } from "@vercel/blob"; -import { readFileSync, statSync } from "fs"; - -export type RenderConfig = { - serveUrl: string; - compositionId: string; - inputProps: Record; - blobToken: string; - blobPath: string; -}; - -const config: RenderConfig = JSON.parse(process.argv[2]); - -try { - console.log(JSON.stringify({ type: "opening-browser" })); - const browser = await openBrowser("chrome"); - console.log(JSON.stringify({ type: "selecting-composition" })); - const composition = await selectComposition({ - serveUrl: config.serveUrl, - id: config.compositionId, - inputProps: config.inputProps, - puppeteerInstance: browser, - }); - - await renderMedia({ - composition, - serveUrl: config.serveUrl, - codec: "h264", - outputLocation: "/tmp/video.mp4", - inputProps: config.inputProps, - onProgress: ({ progress }) => { - console.log(JSON.stringify({ type: "progress", progress })); - }, - puppeteerInstance: browser, - }); - - console.log(JSON.stringify({ type: "uploading" })); - const closePromise = browser.close({ silent: false }); - - const videoBuffer = readFileSync("/tmp/video.mp4"); - const blob = await put(config.blobPath, videoBuffer, { - access: "public", - contentType: "video/mp4", - token: config.blobToken, - }); - - console.log( - JSON.stringify({ - type: "done", - url: blob.downloadUrl, - size: statSync("/tmp/video.mp4").size, - }), - ); - await closePromise; -} catch (err) { - // This prints to stderr, not stdout - console.error((err as Error).message); - process.exit(1); -} diff --git a/packages/template-vercel/src/app/api/render/helpers.ts b/packages/template-vercel/src/app/api/render/helpers.ts index 09f6a1a6709..e4a10154237 100644 --- a/packages/template-vercel/src/app/api/render/helpers.ts +++ b/packages/template-vercel/src/app/api/render/helpers.ts @@ -1,18 +1,3 @@ -import { Sandbox } from "@vercel/sandbox"; -import { readFile } from "fs/promises"; -import path from "path"; - -export const createDisposableSandbox = async ( - options: Parameters[0], -): Promise => { - const sandbox = await Sandbox.create(options); - return Object.assign(sandbox, { - [Symbol.asyncDispose]: async () => { - await sandbox.stop().catch(() => {}); - }, - }); -}; - export const createDisposableWriter = ( writer: WritableStreamDefaultWriter, ): WritableStreamDefaultWriter & AsyncDisposable => { @@ -33,8 +18,3 @@ export type OnProgressFn = (message: RenderProgress) => Promise; export function formatSSE(message: RenderProgress): string { return `data: ${JSON.stringify(message)}\n\n`; } - -export async function getRenderScript(): Promise { - const renderScriptPath = path.join(process.cwd(), "render.ts"); - return readFile(renderScriptPath); -} diff --git a/packages/template-vercel/src/app/api/render/render.ts b/packages/template-vercel/src/app/api/render/render.ts deleted file mode 100644 index fcabcb1fa31..00000000000 --- a/packages/template-vercel/src/app/api/render/render.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Sandbox } from "@vercel/sandbox"; -import { BUILD_DIR } from "../../../../build-dir.mjs"; -import type { RenderConfig } from "../../../../render"; -import { COMP_NAME } from "../../../../types/constants"; - -export type RenderInSandboxProgress = - | { type: "opening-browser" } - | { type: "selecting-composition" } - | { type: "render-progress"; progress: number } - | { type: "uploading" } - | { type: "done"; url: string; size: number }; - -export async function renderInSandbox({ - sandbox, - inputProps, - onProgress, -}: { - sandbox: Sandbox & AsyncDisposable; - inputProps: Record; - onProgress: (progress: RenderInSandboxProgress) => Promise; -}): Promise { - // Use the local bundle copied to the sandbox - const serveUrl = `/vercel/sandbox/${BUILD_DIR}`; - - const renderId = crypto.randomUUID(); - const blobToken = process.env.BLOB_READ_WRITE_TOKEN; - if (!blobToken) { - throw new Error("BLOB_READ_WRITE_TOKEN is not set"); - } - - const renderConfig: RenderConfig = { - serveUrl, - compositionId: COMP_NAME, - inputProps, - blobToken, - blobPath: `renders/${renderId}.mp4`, - }; - - // Run the render script - const renderCmd = await sandbox.runCommand({ - cmd: "node", - args: ["--strip-types", "render.ts", JSON.stringify(renderConfig)], - detached: true, - }); - - let doneUrl: string | null = null; - let doneSize: number | null = null; - - for await (const log of renderCmd.logs()) { - if (log.stream === "stdout") { - try { - const message = JSON.parse(log.data); - if (message.type === "opening-browser") { - await onProgress({ type: "opening-browser" }); - } else if (message.type === "selecting-composition") { - await onProgress({ type: "selecting-composition" }); - } else if (message.type === "progress") { - await onProgress({ - type: "render-progress", - progress: message.progress, - }); - } else if (message.type === "uploading") { - await onProgress({ type: "uploading" }); - } else if (message.type === "done") { - doneUrl = message.url; - doneSize = message.size; - } - } catch { - // Not JSON, ignore - } - } - } - - const renderResult = await renderCmd.wait(); - if (renderResult.exitCode !== 0) { - const stderr = await renderResult.stderr(); - const stdout = await renderResult.stdout(); - throw new Error(`Render failed: ${stderr} ${stdout}`); - } - - if (!doneUrl || doneSize === null) { - throw new Error("Render script did not return upload result"); - } - - await onProgress({ type: "done", url: doneUrl, size: doneSize }); -} diff --git a/packages/template-vercel/src/app/api/render/route.ts b/packages/template-vercel/src/app/api/render/route.ts index ec4a9f26ad7..bc484c5e4b1 100644 --- a/packages/template-vercel/src/app/api/render/route.ts +++ b/packages/template-vercel/src/app/api/render/route.ts @@ -1,12 +1,16 @@ +import { + getOrCreateSandbox, + renderVideoOnVercel, + uploadToBlobStorage, +} from "@remotion/vercel"; import { waitUntil } from "@vercel/functions"; +import { COMP_NAME } from "../../../../types/constants"; import { RenderRequest } from "../../../../types/schema"; import { createDisposableWriter, formatSSE, type RenderProgress, } from "./helpers"; -import { renderInSandbox } from "./render"; -import { reuseOrCreateSandbox } from "./sandbox/reuse-or-create-sandbox"; export async function POST(req: Request) { const encoder = new TextEncoder(); @@ -26,49 +30,72 @@ export async function POST(req: Request) { const body = RenderRequest.parse(payload); await send({ type: "phase", phase: "Creating sandbox...", progress: 0 }); - await using sandbox = await reuseOrCreateSandbox(send); - await renderInSandbox({ + + await using sandbox = await getOrCreateSandbox({ + bundleDir: ".remotion", + onProgress: ({ progress, message }) => { + send({ + type: "phase", + phase: message, + progress, + subtitle: "This is only needed during development.", + }); + }, + }); + + const { file } = await renderVideoOnVercel({ sandbox, + compositionId: COMP_NAME, inputProps: body.inputProps, - onProgress: async (update) => { + bundleDir: ".remotion", + onProgress: (update) => { switch (update.type) { case "opening-browser": - await send({ + send({ type: "phase", phase: "Opening browser...", progress: 0, }); break; case "selecting-composition": - await send({ + send({ type: "phase", phase: "Selecting composition...", progress: 0, }); break; case "render-progress": - await send({ + send({ type: "phase", phase: "Rendering video...", progress: update.progress, }); break; - case "uploading": - await send({ - type: "phase", - phase: "Uploading video...", - progress: 1, - }); - break; - case "done": - await send({ type: "done", url: update.url, size: update.size }); - break; default: - update satisfies never; break; } }, }); + + await send({ + type: "phase", + phase: "Uploading video...", + progress: 1, + }); + + const blobToken = process.env.BLOB_READ_WRITE_TOKEN; + if (!blobToken) { + throw new Error("BLOB_READ_WRITE_TOKEN is not set"); + } + + const { url, size } = await uploadToBlobStorage({ + sandbox, + sandboxFilePath: file, + contentType: "video/mp4", + blobToken, + }); + + await send({ type: "done", url, size }); } catch (err) { console.log(err); await send({ type: "error", message: (err as Error).message }); diff --git a/packages/template-vercel/src/app/api/render/sandbox/add-bundle.ts b/packages/template-vercel/src/app/api/render/sandbox/add-bundle.ts deleted file mode 100644 index 963fe1cbe9a..00000000000 --- a/packages/template-vercel/src/app/api/render/sandbox/add-bundle.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Sandbox } from "@vercel/sandbox"; -import { execSync } from "child_process"; -import { existsSync } from "fs"; -import { readdir, readFile } from "fs/promises"; -import path from "path"; -import { BUILD_DIR } from "../../../../../build-dir.mjs"; - -export const addBundleToSandbox = async ( - sandbox: Sandbox & AsyncDisposable, -) => { - await ensureLocalBundle(); - const bundleFiles = await getRemotionBundleFiles(); - - const dirs = new Set(); - for (const file of bundleFiles) { - const dir = path.dirname(file.path); - if (dir && dir !== ".") { - dirs.add(dir); - } - } - - for (const dir of Array.from(dirs).sort()) { - await sandbox.mkDir(BUILD_DIR + "/" + dir); - } - - await sandbox.writeFiles( - bundleFiles.map((file) => ({ - path: BUILD_DIR + "/" + file.path, - content: file.content, - })), - ); -}; - -async function getRemotionBundleFiles(): Promise< - { path: string; content: Buffer }[] -> { - const bundleDir = path.join(process.cwd(), BUILD_DIR); - - const remotionDir = bundleDir; - - const files: { path: string; content: Buffer }[] = []; - - async function readDirRecursive(dir: string, basePath: string = "") { - const entries = await readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - const relativePath = path.join(basePath, entry.name); - if (entry.isDirectory()) { - await readDirRecursive(fullPath, relativePath); - } else { - const content = await readFile(fullPath); - files.push({ path: relativePath, content }); - } - } - } - - await readDirRecursive(remotionDir); - return files; -} - -async function ensureLocalBundle(): Promise { - if (process.env.VERCEL) { - return; - } - - const bundleDir = path.join(process.cwd(), BUILD_DIR); - if (!existsSync(bundleDir)) { - try { - execSync(`node_modules/.bin/remotion bundle --out-dir ./${BUILD_DIR}`, { - cwd: process.cwd(), - stdio: "pipe", - }); - } catch (e) { - const stderr = (e as { stderr?: Buffer }).stderr?.toString() ?? ""; - throw new Error(`Remotion bundle failed: ${stderr}`); - } - } -} diff --git a/packages/template-vercel/src/app/api/render/sandbox/create-sandbox.ts b/packages/template-vercel/src/app/api/render/sandbox/create-sandbox.ts deleted file mode 100644 index 017eb6b9984..00000000000 --- a/packages/template-vercel/src/app/api/render/sandbox/create-sandbox.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Sandbox } from "@vercel/sandbox"; -import { - createDisposableSandbox, - getRenderScript, - OnProgressFn, -} from "../helpers"; -import { addBundleToSandbox } from "./add-bundle"; -import { installBrowser } from "./install-browser"; -import { installJsDependencies } from "./install-js-dependencies"; -import { installSystemDependencies } from "./install-system-dependencies"; -import { patchCompositor } from "./patch-compositor"; - -export const SANDBOX_CREATING_TIMEOUT = 5 * 60 * 1000; - -export async function createSandbox({ - onProgress, -}: { - onProgress: OnProgressFn; -}): Promise { - const sandbox = await createDisposableSandbox({ - runtime: "node24", - resources: { vcpus: 4 }, - timeout: SANDBOX_CREATING_TIMEOUT, - }); - - const preparingPhase = "Preparing..."; - const preparingSubtitle = "This is only needed during development."; - - // Preparation has 3 stages with weights: - // - System dependencies: 60% - // - Copying bundle: 20% - // - Downloading browser: 20% - const WEIGHT_SYS_DEPS = 0.6; - const WEIGHT_BUNDLE = 0.2; - const WEIGHT_BROWSER = 0.2; - - await onProgress({ - type: "phase", - phase: preparingPhase, - subtitle: preparingSubtitle, - progress: 0, - }); - - // Stage 1: Install system dependencies (60%) - await installSystemDependencies({ - sandbox, - onProgress: async (stageProgress: number) => { - await onProgress({ - type: "phase", - phase: preparingPhase, - subtitle: preparingSubtitle, - progress: stageProgress * WEIGHT_SYS_DEPS, - }); - }, - }); - - await onProgress({ - type: "phase", - phase: "Adding Remotion video to Sandbox...", - progress: 0, - subtitle: preparingSubtitle, - }); - - // Stage 2: Copy Remotion bundle (20%) - await addBundleToSandbox(sandbox); - - await onProgress({ - type: "phase", - phase: preparingPhase, - subtitle: preparingSubtitle, - progress: WEIGHT_SYS_DEPS + WEIGHT_BUNDLE, - }); - - // Install renderer and blob SDK - await installJsDependencies({ sandbox }); - - // Patch compositor binary for glibc 2.34 compatibility (Amazon Linux 2023) - await patchCompositor({ sandbox }); - - // Stage 3: Download browser (20%) - await installBrowser({ - sandbox, - onProgress: async (browserProgress: number) => { - await onProgress({ - type: "phase", - phase: preparingPhase, - subtitle: preparingSubtitle, - progress: - WEIGHT_SYS_DEPS + WEIGHT_BUNDLE + browserProgress * WEIGHT_BROWSER, - }); - }, - }); - - const renderScript = await getRenderScript(); - await sandbox.writeFiles([ - { - path: "render.ts", - content: renderScript, - }, - { - path: "package.json", - content: Buffer.from(JSON.stringify({ type: "module" })), - }, - ]); - - return sandbox; -} diff --git a/packages/template-vercel/src/app/api/render/sandbox/install-browser.ts b/packages/template-vercel/src/app/api/render/sandbox/install-browser.ts deleted file mode 100644 index 233a50fcccf..00000000000 --- a/packages/template-vercel/src/app/api/render/sandbox/install-browser.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Sandbox } from "@vercel/sandbox"; -import { readFile } from "fs/promises"; -import path from "path"; - -async function getEnsureBrowserScript(): Promise { - const scriptPath = path.join(process.cwd(), "ensure-browser.ts"); - return readFile(scriptPath); -} - -export async function installBrowser({ - sandbox, - onProgress, -}: { - sandbox: Sandbox; - onProgress: (progress: number) => Promise; -}): Promise { - const ensureBrowserScript = await getEnsureBrowserScript(); - await sandbox.writeFiles([ - { - path: "ensure-browser.ts", - content: ensureBrowserScript, - }, - ]); - - const ensureBrowserCmd = await sandbox.runCommand({ - cmd: "node", - args: ["--strip-types", "ensure-browser.ts"], - detached: true, - }); - - for await (const log of ensureBrowserCmd.logs()) { - if (log.stream === "stdout") { - try { - const message = JSON.parse(log.data); - if (message.type === "browser-progress") { - await onProgress(message.percent ?? 0); - continue; - } - } catch { - // Not JSON, ignore - } - } - } - - const ensureBrowserResult = await ensureBrowserCmd.wait(); - if (ensureBrowserResult.exitCode !== 0) { - throw new Error( - `ensure-browser failed: ${await ensureBrowserResult.stderr()} ${await ensureBrowserResult.stdout()}`, - ); - } -} diff --git a/packages/template-vercel/src/app/api/render/sandbox/install-js-dependencies.ts b/packages/template-vercel/src/app/api/render/sandbox/install-js-dependencies.ts deleted file mode 100644 index d7a0d66918d..00000000000 --- a/packages/template-vercel/src/app/api/render/sandbox/install-js-dependencies.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Sandbox } from "@vercel/sandbox"; -import { VERSION } from "remotion/version"; - -export async function installJsDependencies({ - sandbox, -}: { - sandbox: Sandbox; -}): Promise { - const installCmd = await sandbox.runCommand({ - cmd: "pnpm", - args: [ - `i`, - `@remotion/renderer@${VERSION}`, - `@remotion/compositor-linux-x64-gnu@${VERSION}`, - `@vercel/blob`, - ], - detached: true, - }); - - for await (const _log of installCmd.logs()) { - console.log(_log.data); - } - - const installResult = await installCmd.wait(); - if (installResult.exitCode !== 0) { - throw new Error(`pnpm install failed: ${await installResult.stderr()}`); - } -} diff --git a/packages/template-vercel/src/app/api/render/sandbox/install-system-dependencies.ts b/packages/template-vercel/src/app/api/render/sandbox/install-system-dependencies.ts deleted file mode 100644 index 06c12a5b88c..00000000000 --- a/packages/template-vercel/src/app/api/render/sandbox/install-system-dependencies.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Sandbox } from "@vercel/sandbox"; - -export async function installSystemDependencies({ - sandbox, - onProgress, -}: { - sandbox: Sandbox; - onProgress: (progress: number) => Promise; -}): Promise { - const sysInstallCmd = await sandbox.runCommand({ - cmd: "sudo", - args: [ - "dnf", - "install", - "-y", - "nss", - "atk", - "at-spi2-atk", - "cups-libs", - "libdrm", - "libXcomposite", - "libXdamage", - "libXrandr", - "mesa-libgbm", - "alsa-lib", - "pango", - "gtk3", - "patchelf", - "zstd", - "binutils", - ], - detached: true, - }); - - // We empirically tested how many lines are printed to stdout when installing the system dependencies: - const EXPECTED_SYS_INSTALL_LINES = 272; - let sysInstallLineCount = 0; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - for await (const _log of sysInstallCmd.logs()) { - sysInstallLineCount++; - const stageProgress = Math.min( - sysInstallLineCount / EXPECTED_SYS_INSTALL_LINES, - 1, - ); - await onProgress(stageProgress); - } - - const sysInstallResult = await sysInstallCmd.wait(); - if (sysInstallResult.exitCode !== 0) { - throw new Error( - `System dependencies install failed: ${await sysInstallResult.stderr()}`, - ); - } -} diff --git a/packages/template-vercel/src/app/api/render/sandbox/reuse-or-create-sandbox.ts b/packages/template-vercel/src/app/api/render/sandbox/reuse-or-create-sandbox.ts deleted file mode 100644 index adc5a766fc3..00000000000 --- a/packages/template-vercel/src/app/api/render/sandbox/reuse-or-create-sandbox.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Sandbox } from "@vercel/sandbox"; -import { createDisposableSandbox, OnProgressFn } from "../helpers"; -import { createSandbox, SANDBOX_CREATING_TIMEOUT } from "./create-sandbox"; -import { getCachedSnapshot } from "./snapshots"; - -export async function reuseOrCreateSandbox( - onProgress: OnProgressFn, -): Promise { - // During local development, a new sandbox is created from scratch always (no snapshotting) - if (!process.env.VERCEL) { - await onProgress({ - type: "phase", - phase: "Creating sandbox...", - progress: 0, - }); - return await createSandbox({ onProgress }); - } - - // In production, the snapshot is created at build time via `create-snapshot` - const cachedSnapshotId = await getCachedSnapshot(); - - if (!cachedSnapshotId) { - throw new Error( - "No sandbox snapshot found. Run `bun run create-snapshot` as part of the build process.", - ); - } - - return await createDisposableSandbox({ - source: { type: "snapshot", snapshotId: cachedSnapshotId }, - timeout: SANDBOX_CREATING_TIMEOUT, - }); -} diff --git a/packages/template-vercel/src/app/api/render/sandbox/snapshots.ts b/packages/template-vercel/src/app/api/render/sandbox/snapshots.ts deleted file mode 100644 index 31b9b158e03..00000000000 --- a/packages/template-vercel/src/app/api/render/sandbox/snapshots.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { head, put } from "@vercel/blob"; - -type SnapshotCache = { - snapshotId: string; -}; - -const SNAPSHOT_BLOB_KEY = `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? "local"}.json`; - -export async function getCachedSnapshot(): Promise { - if (!process.env.VERCEL) { - return null; - } - - try { - const metadata = await head(SNAPSHOT_BLOB_KEY); - const response = await fetch(metadata.url); - const cache: SnapshotCache = await response.json(); - - return cache.snapshotId; - } catch { - return null; - } -} - -export async function saveSnapshotCache(snapshotId: string): Promise { - const cache: SnapshotCache = { - snapshotId, - }; - - await put(SNAPSHOT_BLOB_KEY, JSON.stringify(cache), { - access: "public", - contentType: "application/json", - addRandomSuffix: false, - }); -} diff --git a/packages/template-vercel/tsconfig.json b/packages/template-vercel/tsconfig.json index 3a1b9112de9..e7c84fb1c94 100644 --- a/packages/template-vercel/tsconfig.json +++ b/packages/template-vercel/tsconfig.json @@ -26,8 +26,7 @@ "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", - ".next/dev/types/**/*.ts", - "render.ts" + ".next/dev/types/**/*.ts" ], "exclude": ["node_modules", "remotion.config.ts"] } diff --git a/packages/vercel/.npmignore b/packages/vercel/.npmignore new file mode 100644 index 00000000000..eb76a5ae811 --- /dev/null +++ b/packages/vercel/.npmignore @@ -0,0 +1,10 @@ +dist/test/** +src +eslint.config.mjs +tsconfig.tsbuildinfo +*.tgz +.turbo +tsconfig.json +.prettierrc.js +bundle.ts +dist/cjs/test diff --git a/packages/vercel/bundle.ts b/packages/vercel/bundle.ts new file mode 100644 index 00000000000..2880da8ae6e --- /dev/null +++ b/packages/vercel/bundle.ts @@ -0,0 +1,34 @@ +import {build} from 'bun'; +import path from 'path'; + +if (process.env.NODE_ENV !== 'production') { + throw new Error('This script must be run using NODE_ENV=production'); +} + +console.time('Generated.'); +const output = await build({ + entrypoints: ['src/index.ts'], + naming: '[name].mjs', + target: 'node', + external: [ + 'remotion', + 'remotion/no-react', + 'remotion/version', + '@vercel/sandbox', + '@vercel/blob', + ], +}); + +if (!output.success) { + console.log(output.logs.join('\n')); + process.exit(1); +} + +for (const file of output.outputs) { + const str = await file.text(); + const out = path.join('dist', 'esm', file.path); + + await Bun.write(out, str); +} + +console.timeEnd('Generated.'); diff --git a/packages/vercel/eslint.config.mjs b/packages/vercel/eslint.config.mjs new file mode 100644 index 00000000000..04fd4fac110 --- /dev/null +++ b/packages/vercel/eslint.config.mjs @@ -0,0 +1,7 @@ +import {remotionFlatConfig} from '@remotion/eslint-config-internal'; + +const config = remotionFlatConfig({react: false}); + +export default { + ...config, +}; diff --git a/packages/vercel/package.json b/packages/vercel/package.json new file mode 100644 index 00000000000..6fd42628812 --- /dev/null +++ b/packages/vercel/package.json @@ -0,0 +1,57 @@ +{ + "name": "@remotion/vercel", + "version": "4.0.424", + "description": "Render Remotion videos on Vercel Sandbox", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "module": "dist/esm/index.mjs", + "repository": { + "url": "https://github.com/remotion-dev/remotion/tree/main/packages/vercel" + }, + "sideEffects": false, + "type": "module", + "scripts": { + "formatting": "prettier src --check", + "lint": "eslint src", + "watch": "tsgo -w", + "make": "tsgo && bun --env-file=../.env.bundle bundle.ts" + }, + "author": "Jonny Burger ", + "contributors": [], + "license": "Remotion License", + "bugs": { + "url": "https://github.com/remotion-dev/remotion/issues" + }, + "dependencies": { + "remotion": "workspace:*" + }, + "peerDependencies": { + "@vercel/blob": ">=2.0.0", + "@vercel/sandbox": ">=1.0.0" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.mjs", + "import": "./dist/esm/index.mjs" + }, + "./package.json": "./package.json" + }, + "devDependencies": { + "@remotion/eslint-config-internal": "workspace:*", + "@vercel/blob": "2.0.1", + "@vercel/sandbox": "1.6.0", + "eslint": "catalog:", + "@typescript/native-preview": "catalog:" + }, + "keywords": [ + "remotion", + "vercel", + "sandbox", + "video" + ], + "publishConfig": { + "access": "public" + }, + "homepage": "https://www.remotion.dev/docs/vercel" +} diff --git a/packages/vercel/src/create-sandbox.ts b/packages/vercel/src/create-sandbox.ts new file mode 100644 index 00000000000..0afd48b65b0 --- /dev/null +++ b/packages/vercel/src/create-sandbox.ts @@ -0,0 +1,96 @@ +import {addBundleToSandbox} from './internals/add-bundle'; +import {createDisposableSandbox} from './internals/disposable'; +import {installBrowser} from './internals/install-browser'; +import {installJsDependencies} from './internals/install-js-dependencies'; +import {installSystemDependencies} from './internals/install-system-dependencies'; +import {patchCompositor} from './internals/patch-compositor'; +import {getRenderVideoScript} from './internals/render-video-script'; +import type {OnProgress, VercelSandbox} from './types'; + +export const SANDBOX_CREATING_TIMEOUT = 5 * 60 * 1000; + +export async function createSandbox({ + bundleDir, + onProgress, +}: { + bundleDir: string; + onProgress?: OnProgress; +}): Promise { + const report = (progress: number, message: string) => { + onProgress?.({progress, message}); + }; + + const sandbox = await createDisposableSandbox({ + runtime: 'node24', + resources: {vcpus: 4}, + timeout: SANDBOX_CREATING_TIMEOUT, + }); + + // Preparation has 3 stages with weights: + // - System dependencies: 60% + // - Copying bundle: 20% + // - Downloading browser: 20% + const WEIGHT_SYS_DEPS = 0.6; + const WEIGHT_BUNDLE = 0.2; + const WEIGHT_BROWSER = 0.2; + + report(0, 'Installing system dependencies...'); + + // Stage 1: Install system dependencies (60%) + await installSystemDependencies({ + sandbox, + onProgress: (stageProgress: number) => { + report( + stageProgress * WEIGHT_SYS_DEPS, + 'Installing system dependencies...', + ); + return Promise.resolve(); + }, + }); + + report(WEIGHT_SYS_DEPS, 'Adding Remotion bundle to sandbox...'); + + // Stage 2: Copy Remotion bundle (20%) + await addBundleToSandbox({sandbox, bundleDir}); + + report(WEIGHT_SYS_DEPS + WEIGHT_BUNDLE, 'Installing JS dependencies...'); + + // Install renderer and blob SDK + await installJsDependencies({sandbox}); + + // Patch compositor binary for glibc 2.34 compatibility (Amazon Linux 2023) + await patchCompositor({sandbox}); + + // Stage 3: Download browser (20%) + report(WEIGHT_SYS_DEPS + WEIGHT_BUNDLE, 'Downloading browser...'); + await installBrowser({ + sandbox, + onProgress: (browserProgress: number) => { + report( + WEIGHT_SYS_DEPS + WEIGHT_BUNDLE + browserProgress * WEIGHT_BROWSER, + 'Downloading browser...', + ); + return Promise.resolve(); + }, + }); + + // Write a default render script and package.json (module type) + const renderScript = getRenderVideoScript({ + codec: 'h264', + outputFile: '/tmp/video.mp4', + }); + await sandbox.writeFiles([ + { + path: 'render.ts', + content: Buffer.from(renderScript), + }, + { + path: 'package.json', + content: Buffer.from(JSON.stringify({type: 'module'})), + }, + ]); + + report(1, 'Sandbox ready'); + + return sandbox; +} diff --git a/packages/vercel/src/create-snapshot.ts b/packages/vercel/src/create-snapshot.ts new file mode 100644 index 00000000000..019110c5060 --- /dev/null +++ b/packages/vercel/src/create-snapshot.ts @@ -0,0 +1,10 @@ +import type {VercelSandbox} from './types'; + +export async function createSnapshot({ + sandbox, +}: { + sandbox: VercelSandbox; +}): Promise<{snapshotId: string}> { + const snapshot = await sandbox.snapshot({expiration: 0}); + return {snapshotId: snapshot.snapshotId}; +} diff --git a/packages/vercel/src/get-or-create-sandbox.ts b/packages/vercel/src/get-or-create-sandbox.ts new file mode 100644 index 00000000000..c6b8e8795f4 --- /dev/null +++ b/packages/vercel/src/get-or-create-sandbox.ts @@ -0,0 +1,32 @@ +import {createSandbox, SANDBOX_CREATING_TIMEOUT} from './create-sandbox'; +import {getSnapshot} from './get-snapshot'; +import {createDisposableSandbox} from './internals/disposable'; +import type {OnProgress, VercelSandbox} from './types'; + +export async function getOrCreateSandbox({ + bundleDir, + onProgress, +}: { + bundleDir: string; + onProgress?: OnProgress; +}): Promise { + // During local development, a new sandbox is created from scratch always (no snapshotting) + if (!process.env.VERCEL) { + onProgress?.({progress: 0, message: 'Creating sandbox...'}); + return createSandbox({bundleDir, onProgress}); + } + + // In production, the snapshot is created at build time via `create-snapshot` + const cachedSnapshotId = await getSnapshot(); + + if (!cachedSnapshotId) { + throw new Error( + 'No sandbox snapshot found. Run `bun run create-snapshot` as part of the build process.', + ); + } + + return createDisposableSandbox({ + source: {type: 'snapshot', snapshotId: cachedSnapshotId}, + timeout: SANDBOX_CREATING_TIMEOUT, + }); +} diff --git a/packages/vercel/src/get-snapshot.ts b/packages/vercel/src/get-snapshot.ts new file mode 100644 index 00000000000..c130369f11f --- /dev/null +++ b/packages/vercel/src/get-snapshot.ts @@ -0,0 +1,24 @@ +import {head} from '@vercel/blob'; + +type SnapshotCache = { + snapshotId: string; +}; + +const getSnapshotBlobKey = () => + `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? 'local'}.json`; + +export async function getSnapshot(): Promise { + if (!process.env.VERCEL) { + return null; + } + + try { + const metadata = await head(getSnapshotBlobKey()); + const response = await fetch(metadata.url); + const cache: SnapshotCache = await response.json(); + + return cache.snapshotId; + } catch { + return null; + } +} diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts new file mode 100644 index 00000000000..00b15e03433 --- /dev/null +++ b/packages/vercel/src/index.ts @@ -0,0 +1,9 @@ +export {createSandbox} from './create-sandbox'; +export {createSnapshot} from './create-snapshot'; +export {getOrCreateSandbox} from './get-or-create-sandbox'; +export {getSnapshot} from './get-snapshot'; +export {renderStillOnVercel} from './render-still'; +export {renderVideoOnVercel} from './render-video'; +export {saveSnapshot} from './save-snapshot'; +export type {OnProgress, RenderOnVercelProgress, VercelSandbox} from './types'; +export {uploadToBlobStorage} from './upload-to-blob-storage'; diff --git a/packages/vercel/src/internals/add-bundle.ts b/packages/vercel/src/internals/add-bundle.ts new file mode 100644 index 00000000000..0c77a182a9b --- /dev/null +++ b/packages/vercel/src/internals/add-bundle.ts @@ -0,0 +1,79 @@ +import type {Sandbox} from '@vercel/sandbox'; +import {execSync} from 'child_process'; +import {existsSync} from 'fs'; +import {readdir, readFile} from 'fs/promises'; +import path from 'path'; + +function ensureLocalBundle(bundleDir: string): void { + if (process.env.VERCEL) { + return; + } + + const fullBundleDir = path.join(process.cwd(), bundleDir); + if (!existsSync(fullBundleDir)) { + try { + execSync(`node_modules/.bin/remotion bundle --out-dir ./${bundleDir}`, { + cwd: process.cwd(), + stdio: 'pipe', + }); + } catch (e) { + const stderr = (e as {stderr?: Buffer}).stderr?.toString() ?? ''; + throw new Error(`Remotion bundle failed: ${stderr}`); + } + } +} + +async function getRemotionBundleFiles( + bundleDir: string, +): Promise<{path: string; content: Buffer}[]> { + const fullBundleDir = path.join(process.cwd(), bundleDir); + + const files: {path: string; content: Buffer}[] = []; + + async function readDirRecursive(dir: string, basePath: string = '') { + const entries = await readdir(dir, {withFileTypes: true}); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + const relativePath = path.join(basePath, entry.name); + if (entry.isDirectory()) { + await readDirRecursive(fullPath, relativePath); + } else { + const content = await readFile(fullPath); + files.push({path: relativePath, content}); + } + } + } + + await readDirRecursive(fullBundleDir); + return files; +} + +export const addBundleToSandbox = async ({ + sandbox, + bundleDir, +}: { + sandbox: Sandbox & AsyncDisposable; + bundleDir: string; +}) => { + ensureLocalBundle(bundleDir); + const bundleFiles = await getRemotionBundleFiles(bundleDir); + + const dirs = new Set(); + for (const file of bundleFiles) { + const dir = path.dirname(file.path); + if (dir && dir !== '.') { + dirs.add(dir); + } + } + + for (const dir of Array.from(dirs).sort()) { + await sandbox.mkDir(bundleDir + '/' + dir); + } + + await sandbox.writeFiles( + bundleFiles.map((file) => ({ + path: bundleDir + '/' + file.path, + content: file.content, + })), + ); +}; diff --git a/packages/vercel/src/internals/disposable.ts b/packages/vercel/src/internals/disposable.ts new file mode 100644 index 00000000000..1c1de81feca --- /dev/null +++ b/packages/vercel/src/internals/disposable.ts @@ -0,0 +1,13 @@ +import {Sandbox} from '@vercel/sandbox'; +import type {VercelSandbox} from '../types'; + +export const createDisposableSandbox = async ( + options: Parameters[0], +): Promise => { + const sandbox = await Sandbox.create(options); + return Object.assign(sandbox, { + [Symbol.asyncDispose]: async () => { + await sandbox.stop().catch(() => {}); + }, + }); +}; diff --git a/packages/template-vercel/ensure-browser.ts b/packages/vercel/src/internals/ensure-browser-script.ts similarity index 74% rename from packages/template-vercel/ensure-browser.ts rename to packages/vercel/src/internals/ensure-browser-script.ts index 8e082c3230a..9f806b53587 100644 --- a/packages/template-vercel/ensure-browser.ts +++ b/packages/vercel/src/internals/ensure-browser-script.ts @@ -1,4 +1,5 @@ -// This file is copied into the Vercel sandbox and executed with `node --strip-types` +export const getEnsureBrowserScript = (): string => { + return `\ import { ensureBrowser } from "@remotion/renderer"; await ensureBrowser({ @@ -11,3 +12,5 @@ await ensureBrowser({ }; }, }); +`; +}; diff --git a/packages/vercel/src/internals/install-browser.ts b/packages/vercel/src/internals/install-browser.ts new file mode 100644 index 00000000000..cebd7c22411 --- /dev/null +++ b/packages/vercel/src/internals/install-browser.ts @@ -0,0 +1,45 @@ +import type {Sandbox} from '@vercel/sandbox'; +import {getEnsureBrowserScript} from './ensure-browser-script'; + +export async function installBrowser({ + sandbox, + onProgress, +}: { + sandbox: Sandbox; + onProgress: (progress: number) => Promise; +}): Promise { + const ensureBrowserScript = getEnsureBrowserScript(); + await sandbox.writeFiles([ + { + path: 'ensure-browser.ts', + content: Buffer.from(ensureBrowserScript), + }, + ]); + + const ensureBrowserCmd = await sandbox.runCommand({ + cmd: 'node', + args: ['--strip-types', 'ensure-browser.ts'], + detached: true, + }); + + for await (const log of ensureBrowserCmd.logs()) { + if (log.stream === 'stdout') { + try { + const message = JSON.parse(log.data); + if (message.type === 'browser-progress') { + await onProgress(message.percent ?? 0); + continue; + } + } catch { + // Not JSON, ignore + } + } + } + + const ensureBrowserResult = await ensureBrowserCmd.wait(); + if (ensureBrowserResult.exitCode !== 0) { + throw new Error( + `ensure-browser failed: ${await ensureBrowserResult.stderr()} ${await ensureBrowserResult.stdout()}`, + ); + } +} diff --git a/packages/vercel/src/internals/install-js-dependencies.ts b/packages/vercel/src/internals/install-js-dependencies.ts new file mode 100644 index 00000000000..f53b25704a3 --- /dev/null +++ b/packages/vercel/src/internals/install-js-dependencies.ts @@ -0,0 +1,28 @@ +import type {Sandbox} from '@vercel/sandbox'; +import {VERSION} from 'remotion/version'; + +export async function installJsDependencies({ + sandbox, +}: { + sandbox: Sandbox; +}): Promise { + const installCmd = await sandbox.runCommand({ + cmd: 'pnpm', + args: [ + 'i', + `@remotion/renderer@${VERSION}`, + `@remotion/compositor-linux-x64-gnu@${VERSION}`, + `@vercel/blob`, + ], + detached: true, + }); + + for await (const _log of installCmd.logs()) { + // consume logs + } + + const installResult = await installCmd.wait(); + if (installResult.exitCode !== 0) { + throw new Error(`pnpm install failed: ${await installResult.stderr()}`); + } +} diff --git a/packages/vercel/src/internals/install-system-dependencies.ts b/packages/vercel/src/internals/install-system-dependencies.ts new file mode 100644 index 00000000000..6762644de59 --- /dev/null +++ b/packages/vercel/src/internals/install-system-dependencies.ts @@ -0,0 +1,53 @@ +import type {Sandbox} from '@vercel/sandbox'; + +export async function installSystemDependencies({ + sandbox, + onProgress, +}: { + sandbox: Sandbox; + onProgress: (progress: number) => Promise; +}): Promise { + const sysInstallCmd = await sandbox.runCommand({ + cmd: 'sudo', + args: [ + 'dnf', + 'install', + '-y', + 'nss', + 'atk', + 'at-spi2-atk', + 'cups-libs', + 'libdrm', + 'libXcomposite', + 'libXdamage', + 'libXrandr', + 'mesa-libgbm', + 'alsa-lib', + 'pango', + 'gtk3', + 'patchelf', + 'zstd', + 'binutils', + ], + detached: true, + }); + + // We empirically tested how many lines are printed to stdout when installing the system dependencies: + const EXPECTED_SYS_INSTALL_LINES = 272; + let sysInstallLineCount = 0; + for await (const _log of sysInstallCmd.logs()) { + sysInstallLineCount++; + const stageProgress = Math.min( + sysInstallLineCount / EXPECTED_SYS_INSTALL_LINES, + 1, + ); + await onProgress(stageProgress); + } + + const sysInstallResult = await sysInstallCmd.wait(); + if (sysInstallResult.exitCode !== 0) { + throw new Error( + `System dependencies install failed: ${await sysInstallResult.stderr()}`, + ); + } +} diff --git a/packages/template-vercel/src/app/api/render/sandbox/patch-compositor.ts b/packages/vercel/src/internals/patch-compositor.ts similarity index 79% rename from packages/template-vercel/src/app/api/render/sandbox/patch-compositor.ts rename to packages/vercel/src/internals/patch-compositor.ts index cc621a25fd7..95c81aecf9a 100644 --- a/packages/template-vercel/src/app/api/render/sandbox/patch-compositor.ts +++ b/packages/vercel/src/internals/patch-compositor.ts @@ -1,8 +1,8 @@ -import { Sandbox } from "@vercel/sandbox"; +import type {Sandbox} from '@vercel/sandbox'; -const GLIBC_DIR = "/tmp/glibc235"; +const GLIBC_DIR = '/tmp/glibc235'; const LIBC6_DEB_URL = - "https://launchpadlibrarian.net/612471225/libc6_2.35-0ubuntu3.1_amd64.deb"; + 'https://launchpadlibrarian.net/612471225/libc6_2.35-0ubuntu3.1_amd64.deb'; /** * Remotion does not officially support glibc 2.34, but it can be patched. @@ -12,14 +12,14 @@ const LIBC6_DEB_URL = * We download Ubuntu 22.04's libc6 package and use patchelf to * point the compositor at the bundled glibc. * - * Only the `remotion` binary needs patching — ffmpeg/ffprobe work fine on glibc 2.34. + * Only the `remotion` binary needs patching - ffmpeg/ffprobe work fine on glibc 2.34. */ export async function patchCompositor({ - sandbox, + sandbox, }: { - sandbox: Sandbox; + sandbox: Sandbox; }): Promise { - const script = ` + const script = ` set -euo pipefail echo "[patch-compositor] Listing node_modules/@remotion/:" @@ -87,20 +87,20 @@ patchelf \\ echo "[patch-compositor] Compositor patched successfully" `; - const cmd = await sandbox.runCommand({ - cmd: "bash", - args: ["-c", script], - detached: true, - }); - - for await (const _log of cmd.logs()) { - console.log(_log.data); - } - - const result = await cmd.wait(); - if (result.exitCode !== 0) { - throw new Error( - `Failed to patch compositor: ${await result.stderr()} ${await result.stdout()}`, - ); - } + const cmd = await sandbox.runCommand({ + cmd: 'bash', + args: ['-c', script], + detached: true, + }); + + for await (const _log of cmd.logs()) { + // consume logs + } + + const result = await cmd.wait(); + if (result.exitCode !== 0) { + throw new Error( + `Failed to patch compositor: ${await result.stderr()} ${await result.stdout()}`, + ); + } } diff --git a/packages/vercel/src/internals/render-still-script.ts b/packages/vercel/src/internals/render-still-script.ts new file mode 100644 index 00000000000..88f0d8ec19e --- /dev/null +++ b/packages/vercel/src/internals/render-still-script.ts @@ -0,0 +1,48 @@ +export const getRenderStillScript = ({ + imageFormat, + outputFile, +}: { + imageFormat: string; + outputFile: string; +}): string => { + return `\ +import { + openBrowser, + renderStill, + selectComposition, +} from "@remotion/renderer"; +import { statSync } from "fs"; + +const config = JSON.parse(process.argv[2]); + +try { + console.log(JSON.stringify({ type: "opening-browser" })); + const browser = await openBrowser("chrome"); + console.log(JSON.stringify({ type: "selecting-composition" })); + const composition = await selectComposition({ + serveUrl: config.serveUrl, + id: config.compositionId, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); + + await renderStill({ + composition, + serveUrl: config.serveUrl, + imageFormat: ${JSON.stringify(imageFormat)}, + output: ${JSON.stringify(outputFile)}, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); + + console.log(JSON.stringify({ type: "render-complete" })); + await browser.close({ silent: false }); + + const size = statSync(${JSON.stringify(outputFile)}).size; + console.log(JSON.stringify({ type: "done", size })); +} catch (err) { + console.error(err.message); + process.exit(1); +} +`; +}; diff --git a/packages/vercel/src/internals/render-video-script.ts b/packages/vercel/src/internals/render-video-script.ts new file mode 100644 index 00000000000..de022dd9a6b --- /dev/null +++ b/packages/vercel/src/internals/render-video-script.ts @@ -0,0 +1,51 @@ +export const getRenderVideoScript = ({ + codec, + outputFile, +}: { + codec: string; + outputFile: string; +}): string => { + return `\ +import { + openBrowser, + renderMedia, + selectComposition, +} from "@remotion/renderer"; +import { readFileSync, statSync } from "fs"; + +const config = JSON.parse(process.argv[2]); + +try { + console.log(JSON.stringify({ type: "opening-browser" })); + const browser = await openBrowser("chrome"); + console.log(JSON.stringify({ type: "selecting-composition" })); + const composition = await selectComposition({ + serveUrl: config.serveUrl, + id: config.compositionId, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); + + await renderMedia({ + composition, + serveUrl: config.serveUrl, + codec: ${JSON.stringify(codec)}, + outputLocation: ${JSON.stringify(outputFile)}, + inputProps: config.inputProps, + onProgress: ({ progress }) => { + console.log(JSON.stringify({ type: "progress", progress })); + }, + puppeteerInstance: browser, + }); + + console.log(JSON.stringify({ type: "render-complete" })); + await browser.close({ silent: false }); + + const size = statSync(${JSON.stringify(outputFile)}).size; + console.log(JSON.stringify({ type: "done", size })); +} catch (err) { + console.error(err.message); + process.exit(1); +} +`; +}; diff --git a/packages/vercel/src/render-still.ts b/packages/vercel/src/render-still.ts new file mode 100644 index 00000000000..0f3c7b6a95b --- /dev/null +++ b/packages/vercel/src/render-still.ts @@ -0,0 +1,67 @@ +import {getRenderStillScript} from './internals/render-still-script'; +import type {RenderOnVercelProgress, VercelSandbox} from './types'; + +export async function renderStillOnVercel({ + sandbox, + compositionId, + inputProps, + imageFormat = 'png', + outputFile = '/tmp/still.png', + onProgress, + bundleDir = '.remotion', +}: { + sandbox: VercelSandbox; + compositionId: string; + inputProps: Record; + imageFormat?: 'png' | 'jpeg' | 'webp'; + outputFile?: string; + onProgress?: (progress: RenderOnVercelProgress) => void; + bundleDir?: string; +}): Promise<{file: string}> { + const serveUrl = `/vercel/sandbox/${bundleDir}`; + + const renderScript = getRenderStillScript({imageFormat, outputFile}); + + await sandbox.writeFiles([ + { + path: 'render-still.ts', + content: Buffer.from(renderScript), + }, + ]); + + const renderConfig = { + serveUrl, + compositionId, + inputProps, + }; + + const renderCmd = await sandbox.runCommand({ + cmd: 'node', + args: ['--strip-types', 'render-still.ts', JSON.stringify(renderConfig)], + detached: true, + }); + + for await (const log of renderCmd.logs()) { + if (log.stream === 'stdout') { + try { + const message = JSON.parse(log.data); + if (message.type === 'opening-browser') { + onProgress?.({type: 'opening-browser'}); + } else if (message.type === 'selecting-composition') { + onProgress?.({type: 'selecting-composition'}); + } + } catch { + // Not JSON, ignore + } + } + } + + const renderResult = await renderCmd.wait(); + if (renderResult.exitCode !== 0) { + const stderr = await renderResult.stderr(); + const stdout = await renderResult.stdout(); + throw new Error(`Render still failed: ${stderr} ${stdout}`); + } + + return {file: outputFile}; +} diff --git a/packages/vercel/src/render-video.ts b/packages/vercel/src/render-video.ts new file mode 100644 index 00000000000..9d073b0597a --- /dev/null +++ b/packages/vercel/src/render-video.ts @@ -0,0 +1,72 @@ +import {getRenderVideoScript} from './internals/render-video-script'; +import type {RenderOnVercelProgress, VercelSandbox} from './types'; + +export async function renderVideoOnVercel({ + sandbox, + compositionId, + inputProps, + codec = 'h264', + outputFile = '/tmp/video.mp4', + onProgress, + bundleDir = '.remotion', +}: { + sandbox: VercelSandbox; + compositionId: string; + inputProps: Record; + codec?: string; + outputFile?: string; + onProgress?: (progress: RenderOnVercelProgress) => void; + bundleDir?: string; +}): Promise<{file: string}> { + const serveUrl = `/vercel/sandbox/${bundleDir}`; + + const renderScript = getRenderVideoScript({codec, outputFile}); + + await sandbox.writeFiles([ + { + path: 'render-video.ts', + content: Buffer.from(renderScript), + }, + ]); + + const renderConfig = { + serveUrl, + compositionId, + inputProps, + }; + + const renderCmd = await sandbox.runCommand({ + cmd: 'node', + args: ['--strip-types', 'render-video.ts', JSON.stringify(renderConfig)], + detached: true, + }); + + for await (const log of renderCmd.logs()) { + if (log.stream === 'stdout') { + try { + const message = JSON.parse(log.data); + if (message.type === 'opening-browser') { + onProgress?.({type: 'opening-browser'}); + } else if (message.type === 'selecting-composition') { + onProgress?.({type: 'selecting-composition'}); + } else if (message.type === 'progress') { + onProgress?.({ + type: 'render-progress', + progress: message.progress, + }); + } + } catch { + // Not JSON, ignore + } + } + } + + const renderResult = await renderCmd.wait(); + if (renderResult.exitCode !== 0) { + const stderr = await renderResult.stderr(); + const stdout = await renderResult.stdout(); + throw new Error(`Render failed: ${stderr} ${stdout}`); + } + + return {file: outputFile}; +} diff --git a/packages/vercel/src/save-snapshot.ts b/packages/vercel/src/save-snapshot.ts new file mode 100644 index 00000000000..8e932a5b234 --- /dev/null +++ b/packages/vercel/src/save-snapshot.ts @@ -0,0 +1,24 @@ +import {put} from '@vercel/blob'; + +type SnapshotCache = { + snapshotId: string; +}; + +const getSnapshotBlobKey = () => + `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? 'local'}.json`; + +export async function saveSnapshot({ + snapshotId, +}: { + snapshotId: string; +}): Promise { + const cache: SnapshotCache = { + snapshotId, + }; + + await put(getSnapshotBlobKey(), JSON.stringify(cache), { + access: 'public', + contentType: 'application/json', + addRandomSuffix: false, + }); +} diff --git a/packages/vercel/src/types.ts b/packages/vercel/src/types.ts new file mode 100644 index 00000000000..49095bbf605 --- /dev/null +++ b/packages/vercel/src/types.ts @@ -0,0 +1,12 @@ +import type {Sandbox} from '@vercel/sandbox'; + +export type VercelSandbox = Sandbox & AsyncDisposable; + +export type OnProgress = (update: {progress: number; message: string}) => void; + +export type RenderOnVercelProgress = + | {type: 'opening-browser'} + | {type: 'selecting-composition'} + | {type: 'render-progress'; progress: number} + | {type: 'uploading'} + | {type: 'done'; url: string; size: number}; diff --git a/packages/vercel/src/upload-to-blob-storage.ts b/packages/vercel/src/upload-to-blob-storage.ts new file mode 100644 index 00000000000..1df1e3ced4e --- /dev/null +++ b/packages/vercel/src/upload-to-blob-storage.ts @@ -0,0 +1,112 @@ +import type {VercelSandbox} from './types'; + +function getExtension(filePath: string): string { + const lastDot = filePath.lastIndexOf('.'); + if (lastDot === -1) { + return ''; + } + + return filePath.slice(lastDot); +} + +function getUploadScript({ + sandboxFilePath, + blobPath, + contentType, + blobToken, +}: { + sandboxFilePath: string; + blobPath: string; + contentType: string; + blobToken: string; +}): string { + return `\ +import { put } from "@vercel/blob"; +import { readFileSync, statSync } from "fs"; + +try { + const fileBuffer = readFileSync(${JSON.stringify(sandboxFilePath)}); + const size = statSync(${JSON.stringify(sandboxFilePath)}).size; + const blob = await put(${JSON.stringify(blobPath)}, fileBuffer, { + access: "public", + contentType: ${JSON.stringify(contentType)}, + token: ${JSON.stringify(blobToken)}, + }); + + console.log(JSON.stringify({ + type: "done", + url: blob.downloadUrl, + size, + })); +} catch (err) { + console.error(err.message); + process.exit(1); +} +`; +} + +export async function uploadToBlobStorage({ + sandbox, + sandboxFilePath, + blobPath, + contentType, + blobToken, +}: { + sandbox: VercelSandbox; + sandboxFilePath: string; + blobPath?: string; + contentType: string; + blobToken: string; +}): Promise<{url: string; size: number}> { + const actualBlobPath = + blobPath ?? + `renders/${crypto.randomUUID()}${getExtension(sandboxFilePath)}`; + + const uploadScript = getUploadScript({ + sandboxFilePath, + blobPath: actualBlobPath, + contentType, + blobToken, + }); + + await sandbox.writeFiles([ + { + path: 'upload.ts', + content: Buffer.from(uploadScript), + }, + ]); + + const uploadCmd = await sandbox.runCommand({ + cmd: 'node', + args: ['--strip-types', 'upload.ts'], + detached: true, + }); + + let result: {url: string; size: number} | null = null; + + for await (const log of uploadCmd.logs()) { + if (log.stream === 'stdout') { + try { + const message = JSON.parse(log.data); + if (message.type === 'done') { + result = {url: message.url, size: message.size}; + } + } catch { + // Not JSON, ignore + } + } + } + + const uploadResult = await uploadCmd.wait(); + if (uploadResult.exitCode !== 0) { + const stderr = await uploadResult.stderr(); + const stdout = await uploadResult.stdout(); + throw new Error(`Upload failed: ${stderr} ${stdout}`); + } + + if (!result) { + throw new Error('Upload script did not return result'); + } + + return result; +} diff --git a/packages/vercel/tsconfig.json b/packages/vercel/tsconfig.json new file mode 100644 index 00000000000..e5c5f5163c6 --- /dev/null +++ b/packages/vercel/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "skipLibCheck": true, + "target": "ES2022", + "module": "es2020", + "moduleResolution": "bundler", + "declaration": true, + "emitDeclarationOnly": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json index 5869c92a939..2dbb2a4a2b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -254,6 +254,9 @@ }, { "path": "./packages/light-leaks" + }, + { + "path": "./packages/vercel" } ] } From 53fd613de1321a14ffd72b081024c4f0b37b681f Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 18:11:58 +0100 Subject: [PATCH 02/70] `@remotion/vercel`: Update version to 4.0.425 Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/create-sandbox.mdx | 2 +- packages/docs/docs/vercel/create-snapshot.mdx | 2 +- packages/docs/docs/vercel/get-or-create-sandbox.mdx | 2 +- packages/docs/docs/vercel/get-snapshot.mdx | 2 +- packages/docs/docs/vercel/index.mdx | 2 +- packages/docs/docs/vercel/render-still-on-vercel.mdx | 2 +- packages/docs/docs/vercel/render-video-on-vercel.mdx | 2 +- packages/docs/docs/vercel/save-snapshot.mdx | 2 +- packages/docs/docs/vercel/upload-to-blob-storage.mdx | 2 +- packages/vercel/package.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 08a9fc8e748..3efdd1debb1 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -4,7 +4,7 @@ title: createSandbox() crumb: '@remotion/vercel' --- -# createSandbox() +# createSandbox() Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, a browser, and your Remotion bundle. diff --git a/packages/docs/docs/vercel/create-snapshot.mdx b/packages/docs/docs/vercel/create-snapshot.mdx index ccb4133b481..d6939f3f939 100644 --- a/packages/docs/docs/vercel/create-snapshot.mdx +++ b/packages/docs/docs/vercel/create-snapshot.mdx @@ -4,7 +4,7 @@ title: createSnapshot() crumb: '@remotion/vercel' --- -# createSnapshot() +# createSnapshot() Takes a snapshot of a sandbox. Snapshots allow you to skip the sandbox setup time in production by restoring from a pre-built state. diff --git a/packages/docs/docs/vercel/get-or-create-sandbox.mdx b/packages/docs/docs/vercel/get-or-create-sandbox.mdx index 66ab91a0b44..ee398b8e91b 100644 --- a/packages/docs/docs/vercel/get-or-create-sandbox.mdx +++ b/packages/docs/docs/vercel/get-or-create-sandbox.mdx @@ -4,7 +4,7 @@ title: getOrCreateSandbox() crumb: '@remotion/vercel' --- -# getOrCreateSandbox() +# getOrCreateSandbox() The primary entry point for getting a sandbox. Automatically handles the dev/prod routing: diff --git a/packages/docs/docs/vercel/get-snapshot.mdx b/packages/docs/docs/vercel/get-snapshot.mdx index 604665bffc9..2967ecb60e0 100644 --- a/packages/docs/docs/vercel/get-snapshot.mdx +++ b/packages/docs/docs/vercel/get-snapshot.mdx @@ -4,7 +4,7 @@ title: getSnapshot() crumb: '@remotion/vercel' --- -# getSnapshot() +# getSnapshot() Retrieves a cached snapshot ID from Vercel Blob storage. Returns `null` if no snapshot is found or if not running on Vercel. diff --git a/packages/docs/docs/vercel/index.mdx b/packages/docs/docs/vercel/index.mdx index db8b708d7d4..7f910dc6a4c 100644 --- a/packages/docs/docs/vercel/index.mdx +++ b/packages/docs/docs/vercel/index.mdx @@ -7,7 +7,7 @@ title: '@remotion/vercel' import {TableOfContents} from './table-of-contents'; -# @remotion/vercel +# @remotion/vercel Render Remotion videos on [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox). diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index 6e9da633c34..fe7f63e40c3 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -4,7 +4,7 @@ title: renderStillOnVercel() crumb: '@remotion/vercel' --- -# renderStillOnVercel() +# renderStillOnVercel() Renders a still image inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index 52fff415055..b0b6411c95d 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -4,7 +4,7 @@ title: renderVideoOnVercel() crumb: '@remotion/vercel' --- -# renderVideoOnVercel() +# renderVideoOnVercel() Renders a video inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx index 44822dad5cc..819d5159fc8 100644 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -4,7 +4,7 @@ title: saveSnapshot() crumb: '@remotion/vercel' --- -# saveSnapshot() +# saveSnapshot() Saves a snapshot ID to Vercel Blob storage, keyed by the current `VERCEL_DEPLOYMENT_ID`. This allows [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) to restore the sandbox in production without re-creating it. diff --git a/packages/docs/docs/vercel/upload-to-blob-storage.mdx b/packages/docs/docs/vercel/upload-to-blob-storage.mdx index d7e49826bfd..4dd96906900 100644 --- a/packages/docs/docs/vercel/upload-to-blob-storage.mdx +++ b/packages/docs/docs/vercel/upload-to-blob-storage.mdx @@ -4,7 +4,7 @@ title: uploadToBlobStorage() crumb: '@remotion/vercel' --- -# uploadToBlobStorage() +# uploadToBlobStorage() Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage. Typically used after [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) or [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) to make the output publicly accessible. diff --git a/packages/vercel/package.json b/packages/vercel/package.json index 6fd42628812..39f0ab50d77 100644 --- a/packages/vercel/package.json +++ b/packages/vercel/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/vercel", - "version": "4.0.424", + "version": "4.0.425", "description": "Render Remotion videos on Vercel Sandbox", "main": "dist/index.js", "types": "dist/index.d.ts", From aaf3e3fed5ad5ce3bd7415d57f06a6022009e514 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 18:26:39 +0100 Subject: [PATCH 03/70] `@remotion/vercel`: Fix docs to use real imports instead of manual type declarations Co-Authored-By: Claude Opus 4.6 --- bun.lock | 4 +++- packages/docs/docs/vercel/create-sandbox.mdx | 3 +-- packages/docs/docs/vercel/create-snapshot.mdx | 5 ++--- packages/docs/docs/vercel/get-or-create-sandbox.mdx | 3 +-- packages/docs/docs/vercel/get-snapshot.mdx | 2 +- packages/docs/docs/vercel/render-still-on-vercel.mdx | 6 ++---- packages/docs/docs/vercel/render-video-on-vercel.mdx | 5 ++--- packages/docs/docs/vercel/save-snapshot.mdx | 2 +- packages/docs/docs/vercel/upload-to-blob-storage.mdx | 5 ++--- packages/docs/package.json | 2 ++ 10 files changed, 17 insertions(+), 20 deletions(-) diff --git a/bun.lock b/bun.lock index cb5adf45514..ddfc27d6edb 100644 --- a/bun.lock +++ b/bun.lock @@ -420,6 +420,7 @@ "@remotion/tailwind-v4": "workspace:*", "@remotion/three": "workspace:*", "@remotion/transitions": "workspace:*", + "@remotion/vercel": "workspace:*", "@remotion/web-renderer": "workspace:*", "@remotion/webcodecs": "workspace:*", "@remotion/whisper-web": "workspace:*", @@ -433,6 +434,7 @@ "@types/uuid": "^8.3.4", "@vercel/config": "^0.0.28", "@vercel/functions": "^3.1.4", + "@vercel/sandbox": "1.6.0", "chalk": "4.1.2", "clipboard": "^2.0.8", "clsx": "^1.1.1", @@ -2277,7 +2279,7 @@ }, "packages/vercel": { "name": "@remotion/vercel", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 3efdd1debb1..4b8a28fc1e1 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -15,8 +15,7 @@ This is a lower-level API. For most use cases, prefer [`getOrCreateSandbox()`](/ ```ts twoslash title="create-snapshot.ts" // @module: es2022 // @target: es2022 -import type {OnProgress, VercelSandbox} from '@remotion/vercel'; -const createSandbox: (options: {bundleDir: string; onProgress?: OnProgress}) => Promise = null as unknown as (options: {bundleDir: string; onProgress?: OnProgress}) => Promise; +import {createSandbox} from '@remotion/vercel'; // ---cut--- const sandbox = await createSandbox({ bundleDir: '.remotion', diff --git a/packages/docs/docs/vercel/create-snapshot.mdx b/packages/docs/docs/vercel/create-snapshot.mdx index d6939f3f939..8a5f6ac2adb 100644 --- a/packages/docs/docs/vercel/create-snapshot.mdx +++ b/packages/docs/docs/vercel/create-snapshot.mdx @@ -15,9 +15,8 @@ Typically called during the build step (e.g. in `create-snapshot.ts`) to cache t ```ts twoslash title="create-snapshot.ts" // @module: es2022 // @target: es2022 -import type {VercelSandbox} from '@remotion/vercel'; -const createSnapshot: (options: {sandbox: VercelSandbox}) => Promise<{snapshotId: string}> = null as unknown as (options: {sandbox: VercelSandbox}) => Promise<{snapshotId: string}>; -declare const sandbox: VercelSandbox; +import {createSnapshot, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox({bundleDir: '.remotion'}); // ---cut--- const {snapshotId} = await createSnapshot({sandbox}); console.log(`Snapshot created: ${snapshotId}`); diff --git a/packages/docs/docs/vercel/get-or-create-sandbox.mdx b/packages/docs/docs/vercel/get-or-create-sandbox.mdx index ee398b8e91b..adb60d55846 100644 --- a/packages/docs/docs/vercel/get-or-create-sandbox.mdx +++ b/packages/docs/docs/vercel/get-or-create-sandbox.mdx @@ -16,8 +16,7 @@ The primary entry point for getting a sandbox. Automatically handles the dev/pro ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import type {OnProgress, VercelSandbox} from '@remotion/vercel'; -const getOrCreateSandbox: (options: {bundleDir: string; onProgress?: OnProgress}) => Promise = null as unknown as (options: {bundleDir: string; onProgress?: OnProgress}) => Promise; +import {getOrCreateSandbox} from '@remotion/vercel'; // ---cut--- await using sandbox = await getOrCreateSandbox({ bundleDir: '.remotion', diff --git a/packages/docs/docs/vercel/get-snapshot.mdx b/packages/docs/docs/vercel/get-snapshot.mdx index 2967ecb60e0..d6ef33a1f0d 100644 --- a/packages/docs/docs/vercel/get-snapshot.mdx +++ b/packages/docs/docs/vercel/get-snapshot.mdx @@ -15,7 +15,7 @@ Used internally by [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -const getSnapshot: () => Promise = null as unknown as () => Promise; +import {getSnapshot} from '@remotion/vercel'; // ---cut--- const snapshotId = await getSnapshot(); if (snapshotId) { diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index fe7f63e40c3..a22254a8b40 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -15,10 +15,8 @@ The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/ ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import type {RenderOnVercelProgress, VercelSandbox} from '@remotion/vercel'; -const renderStillOnVercel: (options: {sandbox: VercelSandbox; compositionId: string; inputProps: Record; imageFormat?: 'png' | 'jpeg' | 'webp'; outputFile?: string; onProgress?: (progress: RenderOnVercelProgress) => void; bundleDir?: string}) => Promise<{file: string}> = - null as unknown as any; -declare const sandbox: VercelSandbox; +import {renderStillOnVercel, getOrCreateSandbox} from '@remotion/vercel'; +const sandbox = await getOrCreateSandbox({bundleDir: '.remotion'}); // ---cut--- const {file} = await renderStillOnVercel({ sandbox, diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index b0b6411c95d..06b39e9b41d 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -15,9 +15,8 @@ The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/ ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import type {RenderOnVercelProgress, VercelSandbox} from '@remotion/vercel'; -const renderVideoOnVercel: (options: {sandbox: VercelSandbox; compositionId: string; inputProps: Record; codec?: string; outputFile?: string; onProgress?: (progress: RenderOnVercelProgress) => void; bundleDir?: string}) => Promise<{file: string}> = null as unknown as any; -declare const sandbox: VercelSandbox; +import {renderVideoOnVercel, getOrCreateSandbox} from '@remotion/vercel'; +const sandbox = await getOrCreateSandbox({bundleDir: '.remotion'}); // ---cut--- const {file} = await renderVideoOnVercel({ sandbox, diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx index 819d5159fc8..8e0a8ae0e78 100644 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -13,7 +13,7 @@ Saves a snapshot ID to Vercel Blob storage, keyed by the current `VERCEL_DEPLOYM ```ts twoslash title="create-snapshot.ts" // @module: es2022 // @target: es2022 -const saveSnapshot: (options: {snapshotId: string}) => Promise = null as unknown as (options: {snapshotId: string}) => Promise; +import {saveSnapshot} from '@remotion/vercel'; // ---cut--- await saveSnapshot({snapshotId: 'snap_abc123'}); ``` diff --git a/packages/docs/docs/vercel/upload-to-blob-storage.mdx b/packages/docs/docs/vercel/upload-to-blob-storage.mdx index 4dd96906900..69189b5a37b 100644 --- a/packages/docs/docs/vercel/upload-to-blob-storage.mdx +++ b/packages/docs/docs/vercel/upload-to-blob-storage.mdx @@ -13,9 +13,8 @@ Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import type {VercelSandbox} from '@remotion/vercel'; -const uploadToBlobStorage: (options: {sandbox: VercelSandbox; sandboxFilePath: string; blobPath?: string; contentType: string; blobToken: string}) => Promise<{url: string; size: number}> = null as unknown as any; -declare const sandbox: VercelSandbox; +import {uploadToBlobStorage, getOrCreateSandbox} from '@remotion/vercel'; +const sandbox = await getOrCreateSandbox({bundleDir: '.remotion'}); // ---cut--- const {url, size} = await uploadToBlobStorage({ sandbox, diff --git a/packages/docs/package.json b/packages/docs/package.json index 0da9805daa7..1049ca0fcd7 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -79,6 +79,7 @@ "@remotion/tailwind-v4": "workspace:*", "@remotion/three": "workspace:*", "@remotion/transitions": "workspace:*", + "@remotion/vercel": "workspace:*", "@remotion/web-renderer": "workspace:*", "@remotion/webcodecs": "workspace:*", "@remotion/whisper-web": "workspace:*", @@ -91,6 +92,7 @@ "@types/uuid": "^8.3.4", "@vercel/config": "^0.0.28", "@vercel/functions": "^3.1.4", + "@vercel/sandbox": "1.6.0", "chalk": "4.1.2", "clipboard": "^2.0.8", "clsx": "^1.1.1", From c7fe64864c4490fa3b40748419f07d231922b6bb Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 18:30:17 +0100 Subject: [PATCH 04/70] `@remotion/vercel`: Rename OnProgress to CreateSandboxOnProgress and export it Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/create-sandbox.mdx | 7 ++++++- packages/docs/docs/vercel/get-or-create-sandbox.mdx | 2 +- packages/vercel/src/create-sandbox.ts | 4 ++-- packages/vercel/src/get-or-create-sandbox.ts | 4 ++-- packages/vercel/src/index.ts | 6 +++++- packages/vercel/src/types.ts | 5 ++++- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 4b8a28fc1e1..50d1bf31411 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -16,6 +16,7 @@ This is a lower-level API. For most use cases, prefer [`getOrCreateSandbox()`](/ // @module: es2022 // @target: es2022 import {createSandbox} from '@remotion/vercel'; +import type {CreateSandboxOnProgress} from '@remotion/vercel'; // ---cut--- const sandbox = await createSandbox({ bundleDir: '.remotion', @@ -37,8 +38,12 @@ The path to your Remotion bundle directory, relative to the current working dire A callback that receives progress updates during sandbox creation. +```ts twoslash +import type {CreateSandboxOnProgress} from '@remotion/vercel'; +``` + ```ts -type OnProgress = (update: { +type CreateSandboxOnProgress = (update: { progress: number; // 0 to 1 message: string; // Human-readable phase description }) => void; diff --git a/packages/docs/docs/vercel/get-or-create-sandbox.mdx b/packages/docs/docs/vercel/get-or-create-sandbox.mdx index adb60d55846..c6db54c71d9 100644 --- a/packages/docs/docs/vercel/get-or-create-sandbox.mdx +++ b/packages/docs/docs/vercel/get-or-create-sandbox.mdx @@ -36,7 +36,7 @@ The path to your Remotion bundle directory, relative to the current working dire ### `onProgress?` -A callback that receives progress updates. Only called during development when a fresh sandbox is created. +A callback of type [`CreateSandboxOnProgress`](/docs/vercel/create-sandbox#onprogress) that receives progress updates. Only called during development when a fresh sandbox is created. ## Return value diff --git a/packages/vercel/src/create-sandbox.ts b/packages/vercel/src/create-sandbox.ts index 0afd48b65b0..fabcb0d728d 100644 --- a/packages/vercel/src/create-sandbox.ts +++ b/packages/vercel/src/create-sandbox.ts @@ -5,7 +5,7 @@ import {installJsDependencies} from './internals/install-js-dependencies'; import {installSystemDependencies} from './internals/install-system-dependencies'; import {patchCompositor} from './internals/patch-compositor'; import {getRenderVideoScript} from './internals/render-video-script'; -import type {OnProgress, VercelSandbox} from './types'; +import type {CreateSandboxOnProgress, VercelSandbox} from './types'; export const SANDBOX_CREATING_TIMEOUT = 5 * 60 * 1000; @@ -14,7 +14,7 @@ export async function createSandbox({ onProgress, }: { bundleDir: string; - onProgress?: OnProgress; + onProgress?: CreateSandboxOnProgress; }): Promise { const report = (progress: number, message: string) => { onProgress?.({progress, message}); diff --git a/packages/vercel/src/get-or-create-sandbox.ts b/packages/vercel/src/get-or-create-sandbox.ts index c6b8e8795f4..cb30b8b1afb 100644 --- a/packages/vercel/src/get-or-create-sandbox.ts +++ b/packages/vercel/src/get-or-create-sandbox.ts @@ -1,14 +1,14 @@ import {createSandbox, SANDBOX_CREATING_TIMEOUT} from './create-sandbox'; import {getSnapshot} from './get-snapshot'; import {createDisposableSandbox} from './internals/disposable'; -import type {OnProgress, VercelSandbox} from './types'; +import type {CreateSandboxOnProgress, VercelSandbox} from './types'; export async function getOrCreateSandbox({ bundleDir, onProgress, }: { bundleDir: string; - onProgress?: OnProgress; + onProgress?: CreateSandboxOnProgress; }): Promise { // During local development, a new sandbox is created from scratch always (no snapshotting) if (!process.env.VERCEL) { diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index 00b15e03433..e8f11297668 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -5,5 +5,9 @@ export {getSnapshot} from './get-snapshot'; export {renderStillOnVercel} from './render-still'; export {renderVideoOnVercel} from './render-video'; export {saveSnapshot} from './save-snapshot'; -export type {OnProgress, RenderOnVercelProgress, VercelSandbox} from './types'; +export type { + CreateSandboxOnProgress, + RenderOnVercelProgress, + VercelSandbox, +} from './types'; export {uploadToBlobStorage} from './upload-to-blob-storage'; diff --git a/packages/vercel/src/types.ts b/packages/vercel/src/types.ts index 49095bbf605..f3d2d9f586f 100644 --- a/packages/vercel/src/types.ts +++ b/packages/vercel/src/types.ts @@ -2,7 +2,10 @@ import type {Sandbox} from '@vercel/sandbox'; export type VercelSandbox = Sandbox & AsyncDisposable; -export type OnProgress = (update: {progress: number; message: string}) => void; +export type CreateSandboxOnProgress = (update: { + progress: number; + message: string; +}) => void; export type RenderOnVercelProgress = | {type: 'opening-browser'} From 8b43d1821342786e737b28caadc3deb27eb26543 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 18:32:14 +0100 Subject: [PATCH 05/70] `@remotion/vercel`: Link Sandbox to Vercel SDK reference Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/create-sandbox.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 50d1bf31411..7e19a86c32f 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -51,7 +51,7 @@ type CreateSandboxOnProgress = (update: { ## Return value -A `VercelSandbox` object (a `Sandbox` with `AsyncDisposable` support). You can use `await using` to automatically clean up the sandbox when it goes out of scope. +A `VercelSandbox` object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support). You can use `await using` to automatically clean up the sandbox when it goes out of scope. ## See also From 7bb352b3cd948c31f308e873930277e5c7756b94 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 18:34:41 +0100 Subject: [PATCH 06/70] `@remotion/vercel`: Add TypeScript Types Reference page Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/types.mdx | 42 ++++++++++++++++++ packages/docs/sidebars.ts | 1 + packages/docs/src/data/articles.ts | 9 ++++ .../generated/articles-docs-vercel-types.png | Bin 0 -> 52040 bytes 4 files changed, 52 insertions(+) create mode 100644 packages/docs/docs/vercel/types.mdx create mode 100644 packages/docs/static/generated/articles-docs-vercel-types.png diff --git a/packages/docs/docs/vercel/types.mdx b/packages/docs/docs/vercel/types.mdx new file mode 100644 index 00000000000..d5b19e587ea --- /dev/null +++ b/packages/docs/docs/vercel/types.mdx @@ -0,0 +1,42 @@ +--- +image: /generated/articles-docs-vercel-types.png +id: vercel-types +sidebar_label: Types +title: TypeScript Types Reference +slug: /vercel/types +crumb: '@remotion/vercel' +--- + +The following types are part of the API of `@remotion/vercel`: + +## `VercelSandbox` + +```ts twoslash +import type {VercelSandbox} from '@remotion/vercel'; +// ^? +``` + +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support. Returned by [`createSandbox()`](/docs/vercel/create-sandbox) and [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox). + +## `CreateSandboxOnProgress` + +```ts twoslash +import type {CreateSandboxOnProgress} from '@remotion/vercel'; +// ^? +``` + +- `progress`: A number from `0` to `1` indicating overall progress +- `message`: A human-readable description of the current phase + +## `RenderOnVercelProgress` + +```ts twoslash +import type {RenderOnVercelProgress} from '@remotion/vercel'; +// ^? +``` + +- `{type: 'opening-browser'}`: The browser is being opened +- `{type: 'selecting-composition'}`: The composition is being selected +- `{type: 'render-progress', progress: number}`: Rendering is in progress (`0` to `1`) +- `{type: 'uploading'}`: The rendered file is being uploaded +- `{type: 'done', url: string, size: number}`: The render is complete diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index f4b4ab6600a..9615711bbd8 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -476,6 +476,7 @@ const sidebars: SidebarsConfig = { 'vercel/render-video-on-vercel', 'vercel/render-still-on-vercel', 'vercel/upload-to-blob-storage', + 'vercel/vercel-types', ], }, { diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index fd193b3b7d2..59e09f2012b 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6610,6 +6610,15 @@ export const articles = [ noAi: false, slug: 'vercel/save-snapshot', }, + { + id: 'vercel-types', + title: 'TypeScript Types Reference', + relativePath: 'docs/vercel/types.mdx', + compId: 'articles-docs-vercel-types', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/types', + }, { id: 'vercel/upload-to-blob-storage', title: 'uploadToBlobStorage()', diff --git a/packages/docs/static/generated/articles-docs-vercel-types.png b/packages/docs/static/generated/articles-docs-vercel-types.png new file mode 100644 index 0000000000000000000000000000000000000000..1933b4684a312e7ea5b90d214f050d83e70460fc GIT binary patch literal 52040 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 Date: Wed, 18 Feb 2026 18:42:04 +0100 Subject: [PATCH 07/70] `@remotion/vercel`: Add Types to table of contents Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/table-of-contents.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/docs/docs/vercel/table-of-contents.tsx b/packages/docs/docs/vercel/table-of-contents.tsx index 36f68d85f07..a4b581cafb8 100644 --- a/packages/docs/docs/vercel/table-of-contents.tsx +++ b/packages/docs/docs/vercel/table-of-contents.tsx @@ -38,6 +38,10 @@ export const TableOfContents: React.FC = () => { uploadToBlobStorage()

Upload a file from the sandbox to Vercel Blob
+ + Types +
TypeScript types reference
+
); From 8e35ec4ba5f007125f0487385300afb9a0880bed Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 18:50:51 +0100 Subject: [PATCH 08/70] `@remotion/vercel`: Simplify API - merge createSnapshot into saveSnapshot, replace getOrCreateSandbox/getSnapshot with restoreSnapshot Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/create-sandbox.mdx | 6 +-- packages/docs/docs/vercel/create-snapshot.mdx | 45 ---------------- .../docs/vercel/get-or-create-sandbox.mdx | 49 ------------------ packages/docs/docs/vercel/get-snapshot.mdx | 38 -------------- .../docs/vercel/render-still-on-vercel.mdx | 4 +- .../docs/vercel/render-video-on-vercel.mdx | 4 +- .../docs/docs/vercel/restore-snapshot.mdx | 37 +++++++++++++ packages/docs/docs/vercel/save-snapshot.mdx | 28 +++++++--- .../docs/docs/vercel/table-of-contents.tsx | 16 ++---- packages/docs/docs/vercel/types.mdx | 2 +- .../docs/vercel/upload-to-blob-storage.mdx | 4 +- packages/docs/sidebars.ts | 4 +- packages/docs/src/data/articles.ts | 36 ++++--------- .../articles-docs-vercel-restore-snapshot.png | Bin 0 -> 46064 bytes packages/template-vercel/create-snapshot.ts | 5 +- .../src/app/api/render/route.ts | 25 +++++---- packages/vercel/src/create-snapshot.ts | 10 ---- packages/vercel/src/get-or-create-sandbox.ts | 32 ------------ packages/vercel/src/get-snapshot.ts | 24 --------- packages/vercel/src/index.ts | 4 +- packages/vercel/src/restore-snapshot.ts | 35 +++++++++++++ packages/vercel/src/save-snapshot.ts | 14 +++-- 22 files changed, 144 insertions(+), 278 deletions(-) delete mode 100644 packages/docs/docs/vercel/create-snapshot.mdx delete mode 100644 packages/docs/docs/vercel/get-or-create-sandbox.mdx delete mode 100644 packages/docs/docs/vercel/get-snapshot.mdx create mode 100644 packages/docs/docs/vercel/restore-snapshot.mdx create mode 100644 packages/docs/static/generated/articles-docs-vercel-restore-snapshot.png delete mode 100644 packages/vercel/src/create-snapshot.ts delete mode 100644 packages/vercel/src/get-or-create-sandbox.ts delete mode 100644 packages/vercel/src/get-snapshot.ts create mode 100644 packages/vercel/src/restore-snapshot.ts diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 7e19a86c32f..4470666c4ef 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -8,7 +8,7 @@ crumb: '@remotion/vercel' Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, a browser, and your Remotion bundle. -This is a lower-level API. For most use cases, prefer [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) which handles dev/prod routing automatically. +Creates a sandbox from scratch. In production, prefer [`restoreSnapshot()`](/docs/vercel/restore-snapshot) to restore from a cached snapshot instead. ## Example @@ -55,6 +55,6 @@ A `VercelSandbox` object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/s ## See also -- [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) -- [`createSnapshot()`](/docs/vercel/create-snapshot) +- [`restoreSnapshot()`](/docs/vercel/restore-snapshot) +- [`saveSnapshot()`](/docs/vercel/save-snapshot) - [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/create-sandbox.ts) diff --git a/packages/docs/docs/vercel/create-snapshot.mdx b/packages/docs/docs/vercel/create-snapshot.mdx deleted file mode 100644 index 8a5f6ac2adb..00000000000 --- a/packages/docs/docs/vercel/create-snapshot.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -image: /generated/articles-docs-vercel-create-snapshot.png -title: createSnapshot() -crumb: '@remotion/vercel' ---- - -# createSnapshot() - -Takes a snapshot of a sandbox. Snapshots allow you to skip the sandbox setup time in production by restoring from a pre-built state. - -Typically called during the build step (e.g. in `create-snapshot.ts`) to cache the sandbox for production use. - -## Example - -```ts twoslash title="create-snapshot.ts" -// @module: es2022 -// @target: es2022 -import {createSnapshot, createSandbox} from '@remotion/vercel'; -const sandbox = await createSandbox({bundleDir: '.remotion'}); -// ---cut--- -const {snapshotId} = await createSnapshot({sandbox}); -console.log(`Snapshot created: ${snapshotId}`); -``` - -## Arguments - -An object with the following properties: - -### `sandbox` - -A `VercelSandbox` instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). - -## Return value - -An object containing: - -### `snapshotId` - -A `string` identifier for the snapshot. Pass this to [`saveSnapshot()`](/docs/vercel/save-snapshot) to cache it for production use. - -## See also - -- [`saveSnapshot()`](/docs/vercel/save-snapshot) -- [`createSandbox()`](/docs/vercel/create-sandbox) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/create-snapshot.ts) diff --git a/packages/docs/docs/vercel/get-or-create-sandbox.mdx b/packages/docs/docs/vercel/get-or-create-sandbox.mdx deleted file mode 100644 index c6db54c71d9..00000000000 --- a/packages/docs/docs/vercel/get-or-create-sandbox.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -image: /generated/articles-docs-vercel-get-or-create-sandbox.png -title: getOrCreateSandbox() -crumb: '@remotion/vercel' ---- - -# getOrCreateSandbox() - -The primary entry point for getting a sandbox. Automatically handles the dev/prod routing: - -- **Development** (no `VERCEL` env var): Creates a fresh sandbox from scratch using [`createSandbox()`](/docs/vercel/create-sandbox). -- **Production** (on Vercel): Restores a sandbox from a cached snapshot. Throws an error if no snapshot is found. - -## Example - -```ts twoslash title="route.ts" -// @module: es2022 -// @target: es2022 -import {getOrCreateSandbox} from '@remotion/vercel'; -// ---cut--- -await using sandbox = await getOrCreateSandbox({ - bundleDir: '.remotion', - onProgress: ({progress, message}) => { - console.log(`${message} (${Math.round(progress * 100)}%)`); - }, -}); -``` - -## Arguments - -An object with the following properties: - -### `bundleDir` - -The path to your Remotion bundle directory, relative to the current working directory. - -### `onProgress?` - -A callback of type [`CreateSandboxOnProgress`](/docs/vercel/create-sandbox#onprogress) that receives progress updates. Only called during development when a fresh sandbox is created. - -## Return value - -A `VercelSandbox` object. - -## See also - -- [`createSandbox()`](/docs/vercel/create-sandbox) -- [`getSnapshot()`](/docs/vercel/get-snapshot) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/get-or-create-sandbox.ts) diff --git a/packages/docs/docs/vercel/get-snapshot.mdx b/packages/docs/docs/vercel/get-snapshot.mdx deleted file mode 100644 index d6ef33a1f0d..00000000000 --- a/packages/docs/docs/vercel/get-snapshot.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -image: /generated/articles-docs-vercel-get-snapshot.png -title: getSnapshot() -crumb: '@remotion/vercel' ---- - -# getSnapshot() - -Retrieves a cached snapshot ID from Vercel Blob storage. Returns `null` if no snapshot is found or if not running on Vercel. - -Used internally by [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) to check for a cached sandbox. - -## Example - -```ts twoslash title="route.ts" -// @module: es2022 -// @target: es2022 -import {getSnapshot} from '@remotion/vercel'; -// ---cut--- -const snapshotId = await getSnapshot(); -if (snapshotId) { - console.log(`Found cached snapshot: ${snapshotId}`); -} -``` - -## Arguments - -None. - -## Return value - -`string | null` - The cached snapshot ID, or `null` if not found. - -## See also - -- [`saveSnapshot()`](/docs/vercel/save-snapshot) -- [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/get-snapshot.ts) diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index a22254a8b40..7391f8db77c 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -15,8 +15,8 @@ The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/ ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {renderStillOnVercel, getOrCreateSandbox} from '@remotion/vercel'; -const sandbox = await getOrCreateSandbox({bundleDir: '.remotion'}); +import {renderStillOnVercel, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox({bundleDir: '.remotion'}); // ---cut--- const {file} = await renderStillOnVercel({ sandbox, diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index 06b39e9b41d..abe1df65fed 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -15,8 +15,8 @@ The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/ ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {renderVideoOnVercel, getOrCreateSandbox} from '@remotion/vercel'; -const sandbox = await getOrCreateSandbox({bundleDir: '.remotion'}); +import {renderVideoOnVercel, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox({bundleDir: '.remotion'}); // ---cut--- const {file} = await renderVideoOnVercel({ sandbox, diff --git a/packages/docs/docs/vercel/restore-snapshot.mdx b/packages/docs/docs/vercel/restore-snapshot.mdx new file mode 100644 index 00000000000..f3214bc2b48 --- /dev/null +++ b/packages/docs/docs/vercel/restore-snapshot.mdx @@ -0,0 +1,37 @@ +--- +image: /generated/articles-docs-vercel-restore-snapshot.png +title: restoreSnapshot() +crumb: '@remotion/vercel' +--- + +# restoreSnapshot() + +Restores a sandbox from a cached snapshot. Reads the snapshot ID from Vercel Blob storage (keyed by `VERCEL_DEPLOYMENT_ID`) and creates a sandbox from it. + +This is the production counterpart to [`createSandbox()`](/docs/vercel/create-sandbox). Use `createSandbox()` during development and `restoreSnapshot()` in production. + +## Example + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +import {createSandbox, restoreSnapshot} from '@remotion/vercel'; +// ---cut--- +await using sandbox = process.env.VERCEL + ? await restoreSnapshot() + : await createSandbox({bundleDir: '.remotion'}); +``` + +## Arguments + +None. + +## Return value + +A [`VercelSandbox`](/docs/vercel/types#vercelsandbox) object restored from the cached snapshot. Throws if no snapshot is found. + +## See also + +- [`createSandbox()`](/docs/vercel/create-sandbox) +- [`saveSnapshot()`](/docs/vercel/save-snapshot) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/restore-snapshot.ts) diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx index 8e0a8ae0e78..5c311eb1cc2 100644 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -6,32 +6,44 @@ crumb: '@remotion/vercel' # saveSnapshot() -Saves a snapshot ID to Vercel Blob storage, keyed by the current `VERCEL_DEPLOYMENT_ID`. This allows [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox) to restore the sandbox in production without re-creating it. +Takes a snapshot of a sandbox and saves the snapshot ID to Vercel Blob storage, keyed by the current `VERCEL_DEPLOYMENT_ID`. This allows [`restoreSnapshot()`](/docs/vercel/restore-snapshot) to restore the sandbox in production without re-creating it. + +Typically called during the build step (e.g. in `create-snapshot.ts`) to cache the sandbox for production use. ## Example ```ts twoslash title="create-snapshot.ts" // @module: es2022 // @target: es2022 -import {saveSnapshot} from '@remotion/vercel'; +import {createSandbox, saveSnapshot} from '@remotion/vercel'; +const sandbox = await createSandbox({bundleDir: '.remotion'}); // ---cut--- -await saveSnapshot({snapshotId: 'snap_abc123'}); +const {snapshotId} = await saveSnapshot({sandbox}); +console.log(`Snapshot saved: ${snapshotId}`); ``` ## Arguments An object with the following properties: -### `snapshotId` +### `sandbox` + +A `VercelSandbox` instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). + +### `expiration?` -The snapshot ID returned by [`createSnapshot()`](/docs/vercel/create-snapshot). +The expiration time for the snapshot in seconds. Default: `0` (never expires). ## Return value -`void`. Throws if the upload to Vercel Blob fails. +An object containing: + +### `snapshotId` + +A `string` identifier for the snapshot. ## See also -- [`createSnapshot()`](/docs/vercel/create-snapshot) -- [`getSnapshot()`](/docs/vercel/get-snapshot) +- [`createSandbox()`](/docs/vercel/create-sandbox) +- [`restoreSnapshot()`](/docs/vercel/restore-snapshot) - [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/save-snapshot.ts) diff --git a/packages/docs/docs/vercel/table-of-contents.tsx b/packages/docs/docs/vercel/table-of-contents.tsx index a4b581cafb8..0838f245554 100644 --- a/packages/docs/docs/vercel/table-of-contents.tsx +++ b/packages/docs/docs/vercel/table-of-contents.tsx @@ -10,21 +10,13 @@ export const TableOfContents: React.FC = () => { createSandbox()
Create a sandbox with Remotion installed
- - getOrCreateSandbox() -
Get a cached sandbox or create a new one
-
- - createSnapshot() -
Take a snapshot of a sandbox
-
saveSnapshot() -
Save a snapshot ID to Vercel Blob
+
Snapshot a sandbox and save to Vercel Blob
- - getSnapshot() -
Get a cached snapshot ID from Vercel Blob
+ + restoreSnapshot() +
Restore a sandbox from a cached snapshot
renderVideoOnVercel() diff --git a/packages/docs/docs/vercel/types.mdx b/packages/docs/docs/vercel/types.mdx index d5b19e587ea..f79a5040910 100644 --- a/packages/docs/docs/vercel/types.mdx +++ b/packages/docs/docs/vercel/types.mdx @@ -16,7 +16,7 @@ import type {VercelSandbox} from '@remotion/vercel'; // ^? ``` -A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support. Returned by [`createSandbox()`](/docs/vercel/create-sandbox) and [`getOrCreateSandbox()`](/docs/vercel/get-or-create-sandbox). +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support. Returned by [`createSandbox()`](/docs/vercel/create-sandbox) and [`restoreSnapshot()`](/docs/vercel/restore-snapshot). ## `CreateSandboxOnProgress` diff --git a/packages/docs/docs/vercel/upload-to-blob-storage.mdx b/packages/docs/docs/vercel/upload-to-blob-storage.mdx index 69189b5a37b..2bf14e8ec8b 100644 --- a/packages/docs/docs/vercel/upload-to-blob-storage.mdx +++ b/packages/docs/docs/vercel/upload-to-blob-storage.mdx @@ -13,8 +13,8 @@ Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {uploadToBlobStorage, getOrCreateSandbox} from '@remotion/vercel'; -const sandbox = await getOrCreateSandbox({bundleDir: '.remotion'}); +import {uploadToBlobStorage, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox({bundleDir: '.remotion'}); // ---cut--- const {url, size} = await uploadToBlobStorage({ sandbox, diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index 9615711bbd8..1b3cc9137df 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -469,10 +469,8 @@ const sidebars: SidebarsConfig = { }, items: [ 'vercel/create-sandbox', - 'vercel/get-or-create-sandbox', - 'vercel/create-snapshot', 'vercel/save-snapshot', - 'vercel/get-snapshot', + 'vercel/restore-snapshot', 'vercel/render-video-on-vercel', 'vercel/render-still-on-vercel', 'vercel/upload-to-blob-storage', diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 59e09f2012b..b28336ae68f 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6547,33 +6547,6 @@ export const articles = [ noAi: false, slug: 'vercel/create-sandbox', }, - { - id: 'vercel/create-snapshot', - title: 'createSnapshot()', - relativePath: 'docs/vercel/create-snapshot.mdx', - compId: 'articles-docs-vercel-create-snapshot', - crumb: '@remotion/vercel', - noAi: false, - slug: 'vercel/create-snapshot', - }, - { - id: 'vercel/get-or-create-sandbox', - title: 'getOrCreateSandbox()', - relativePath: 'docs/vercel/get-or-create-sandbox.mdx', - compId: 'articles-docs-vercel-get-or-create-sandbox', - crumb: '@remotion/vercel', - noAi: false, - slug: 'vercel/get-or-create-sandbox', - }, - { - id: 'vercel/get-snapshot', - title: 'getSnapshot()', - relativePath: 'docs/vercel/get-snapshot.mdx', - compId: 'articles-docs-vercel-get-snapshot', - crumb: '@remotion/vercel', - noAi: false, - slug: 'vercel/get-snapshot', - }, { id: 'vercel-api', title: '@remotion/vercel', @@ -6601,6 +6574,15 @@ export const articles = [ noAi: false, slug: 'vercel/render-video-on-vercel', }, + { + id: 'vercel/restore-snapshot', + title: 'restoreSnapshot()', + relativePath: 'docs/vercel/restore-snapshot.mdx', + compId: 'articles-docs-vercel-restore-snapshot', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/restore-snapshot', + }, { id: 'vercel/save-snapshot', title: 'saveSnapshot()', diff --git a/packages/docs/static/generated/articles-docs-vercel-restore-snapshot.png b/packages/docs/static/generated/articles-docs-vercel-restore-snapshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6e52cd6c5c3a49f510472d6c0f2ad3fe02cfdc72 GIT binary patch literal 46064 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 literal 0 HcmV?d00001 diff --git a/packages/template-vercel/create-snapshot.ts b/packages/template-vercel/create-snapshot.ts index 908189a2af5..77952f9bf8d 100644 --- a/packages/template-vercel/create-snapshot.ts +++ b/packages/template-vercel/create-snapshot.ts @@ -1,4 +1,4 @@ -import { createSandbox, createSnapshot, saveSnapshot } from "@remotion/vercel"; +import { createSandbox, saveSnapshot } from "@remotion/vercel"; const sandbox = await createSandbox({ bundleDir: ".remotion", @@ -9,7 +9,6 @@ const sandbox = await createSandbox({ }); console.log("[create-snapshot] Taking snapshot..."); -const { snapshotId } = await createSnapshot({ sandbox }); -await saveSnapshot({ snapshotId }); +const { snapshotId } = await saveSnapshot({ sandbox }); console.log(`[create-snapshot] Snapshot saved: ${snapshotId} (never expires)`); diff --git a/packages/template-vercel/src/app/api/render/route.ts b/packages/template-vercel/src/app/api/render/route.ts index bc484c5e4b1..e7db876d4aa 100644 --- a/packages/template-vercel/src/app/api/render/route.ts +++ b/packages/template-vercel/src/app/api/render/route.ts @@ -1,6 +1,7 @@ import { - getOrCreateSandbox, + createSandbox, renderVideoOnVercel, + restoreSnapshot, uploadToBlobStorage, } from "@remotion/vercel"; import { waitUntil } from "@vercel/functions"; @@ -31,17 +32,19 @@ export async function POST(req: Request) { await send({ type: "phase", phase: "Creating sandbox...", progress: 0 }); - await using sandbox = await getOrCreateSandbox({ - bundleDir: ".remotion", - onProgress: ({ progress, message }) => { - send({ - type: "phase", - phase: message, - progress, - subtitle: "This is only needed during development.", + await using sandbox = process.env.VERCEL + ? await restoreSnapshot() + : await createSandbox({ + bundleDir: ".remotion", + onProgress: ({ progress, message }) => { + send({ + type: "phase", + phase: message, + progress, + subtitle: "This is only needed during development.", + }); + }, }); - }, - }); const { file } = await renderVideoOnVercel({ sandbox, diff --git a/packages/vercel/src/create-snapshot.ts b/packages/vercel/src/create-snapshot.ts deleted file mode 100644 index 019110c5060..00000000000 --- a/packages/vercel/src/create-snapshot.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type {VercelSandbox} from './types'; - -export async function createSnapshot({ - sandbox, -}: { - sandbox: VercelSandbox; -}): Promise<{snapshotId: string}> { - const snapshot = await sandbox.snapshot({expiration: 0}); - return {snapshotId: snapshot.snapshotId}; -} diff --git a/packages/vercel/src/get-or-create-sandbox.ts b/packages/vercel/src/get-or-create-sandbox.ts deleted file mode 100644 index cb30b8b1afb..00000000000 --- a/packages/vercel/src/get-or-create-sandbox.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {createSandbox, SANDBOX_CREATING_TIMEOUT} from './create-sandbox'; -import {getSnapshot} from './get-snapshot'; -import {createDisposableSandbox} from './internals/disposable'; -import type {CreateSandboxOnProgress, VercelSandbox} from './types'; - -export async function getOrCreateSandbox({ - bundleDir, - onProgress, -}: { - bundleDir: string; - onProgress?: CreateSandboxOnProgress; -}): Promise { - // During local development, a new sandbox is created from scratch always (no snapshotting) - if (!process.env.VERCEL) { - onProgress?.({progress: 0, message: 'Creating sandbox...'}); - return createSandbox({bundleDir, onProgress}); - } - - // In production, the snapshot is created at build time via `create-snapshot` - const cachedSnapshotId = await getSnapshot(); - - if (!cachedSnapshotId) { - throw new Error( - 'No sandbox snapshot found. Run `bun run create-snapshot` as part of the build process.', - ); - } - - return createDisposableSandbox({ - source: {type: 'snapshot', snapshotId: cachedSnapshotId}, - timeout: SANDBOX_CREATING_TIMEOUT, - }); -} diff --git a/packages/vercel/src/get-snapshot.ts b/packages/vercel/src/get-snapshot.ts deleted file mode 100644 index c130369f11f..00000000000 --- a/packages/vercel/src/get-snapshot.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {head} from '@vercel/blob'; - -type SnapshotCache = { - snapshotId: string; -}; - -const getSnapshotBlobKey = () => - `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? 'local'}.json`; - -export async function getSnapshot(): Promise { - if (!process.env.VERCEL) { - return null; - } - - try { - const metadata = await head(getSnapshotBlobKey()); - const response = await fetch(metadata.url); - const cache: SnapshotCache = await response.json(); - - return cache.snapshotId; - } catch { - return null; - } -} diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index e8f11297668..653d74f04ba 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -1,9 +1,7 @@ export {createSandbox} from './create-sandbox'; -export {createSnapshot} from './create-snapshot'; -export {getOrCreateSandbox} from './get-or-create-sandbox'; -export {getSnapshot} from './get-snapshot'; export {renderStillOnVercel} from './render-still'; export {renderVideoOnVercel} from './render-video'; +export {restoreSnapshot} from './restore-snapshot'; export {saveSnapshot} from './save-snapshot'; export type { CreateSandboxOnProgress, diff --git a/packages/vercel/src/restore-snapshot.ts b/packages/vercel/src/restore-snapshot.ts new file mode 100644 index 00000000000..7c5b7784086 --- /dev/null +++ b/packages/vercel/src/restore-snapshot.ts @@ -0,0 +1,35 @@ +import {head} from '@vercel/blob'; +import {SANDBOX_CREATING_TIMEOUT} from './create-sandbox'; +import {createDisposableSandbox} from './internals/disposable'; +import type {VercelSandbox} from './types'; + +type SnapshotCache = { + snapshotId: string; +}; + +const getSnapshotBlobKey = () => + `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? 'local'}.json`; + +export async function restoreSnapshot(): Promise { + let snapshotId: string | null = null; + + try { + const metadata = await head(getSnapshotBlobKey()); + const response = await fetch(metadata.url); + const cache: SnapshotCache = await response.json(); + snapshotId = cache.snapshotId; + } catch { + // ignore + } + + if (!snapshotId) { + throw new Error( + 'No sandbox snapshot found. Run `bun run create-snapshot` as part of the build process.', + ); + } + + return createDisposableSandbox({ + source: {type: 'snapshot', snapshotId}, + timeout: SANDBOX_CREATING_TIMEOUT, + }); +} diff --git a/packages/vercel/src/save-snapshot.ts b/packages/vercel/src/save-snapshot.ts index 8e932a5b234..2624b728c70 100644 --- a/packages/vercel/src/save-snapshot.ts +++ b/packages/vercel/src/save-snapshot.ts @@ -1,4 +1,5 @@ import {put} from '@vercel/blob'; +import type {VercelSandbox} from './types'; type SnapshotCache = { snapshotId: string; @@ -8,10 +9,15 @@ const getSnapshotBlobKey = () => `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? 'local'}.json`; export async function saveSnapshot({ - snapshotId, + sandbox, + expiration = 0, }: { - snapshotId: string; -}): Promise { + sandbox: VercelSandbox; + expiration?: number; +}): Promise<{snapshotId: string}> { + const snapshot = await sandbox.snapshot({expiration}); + const {snapshotId} = snapshot; + const cache: SnapshotCache = { snapshotId, }; @@ -21,4 +27,6 @@ export async function saveSnapshot({ contentType: 'application/json', addRandomSuffix: false, }); + + return {snapshotId}; } From 3a88fb92d90d484fcc899f4527b8f165c100b2d9 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 18:56:37 +0100 Subject: [PATCH 09/70] `@remotion/vercel`: Rename files to match export names and rename uploadToBlobStorage to uploadToVercelBlob Co-Authored-By: Claude Opus 4.6 --- .../docs/vercel/render-still-on-vercel.mdx | 6 +- .../docs/vercel/render-video-on-vercel.mdx | 6 +- .../docs/docs/vercel/table-of-contents.tsx | 4 +- .../docs/vercel/upload-to-vercel-blob.mdx | 69 ++++++++++++++++++ packages/docs/sidebars.ts | 2 +- packages/docs/src/data/articles.ts | 10 +-- ...cles-docs-vercel-upload-to-vercel-blob.png | Bin 0 -> 47816 bytes packages/vercel/src/index.ts | 6 +- ...der-still.ts => render-still-on-vercel.ts} | 0 ...der-video.ts => render-video-on-vercel.ts} | 0 ...ob-storage.ts => upload-to-vercel-blob.ts} | 2 +- 11 files changed, 87 insertions(+), 18 deletions(-) create mode 100644 packages/docs/docs/vercel/upload-to-vercel-blob.mdx create mode 100644 packages/docs/static/generated/articles-docs-vercel-upload-to-vercel-blob.png rename packages/vercel/src/{render-still.ts => render-still-on-vercel.ts} (100%) rename packages/vercel/src/{render-video.ts => render-video-on-vercel.ts} (100%) rename packages/vercel/src/{upload-to-blob-storage.ts => upload-to-vercel-blob.ts} (98%) diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index 7391f8db77c..e3039927636 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -8,7 +8,7 @@ crumb: '@remotion/vercel' Renders a still image inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. -The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) to upload it to Vercel Blob. +The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) to upload it to Vercel Blob. ## Example @@ -69,5 +69,5 @@ The path to the rendered still image inside the sandbox. ## See also - [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) -- [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-still.ts) +- [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-still-on-vercel.ts) diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index abe1df65fed..5ba593cf286 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -8,7 +8,7 @@ crumb: '@remotion/vercel' Renders a video inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. -The rendered file stays inside the sandbox. Use [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) to upload it to Vercel Blob. +The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) to upload it to Vercel Blob. ## Example @@ -77,5 +77,5 @@ The path to the rendered video inside the sandbox. ## See also - [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) -- [`uploadToBlobStorage()`](/docs/vercel/upload-to-blob-storage) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-video.ts) +- [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-video-on-vercel.ts) diff --git a/packages/docs/docs/vercel/table-of-contents.tsx b/packages/docs/docs/vercel/table-of-contents.tsx index 0838f245554..2ede6858f47 100644 --- a/packages/docs/docs/vercel/table-of-contents.tsx +++ b/packages/docs/docs/vercel/table-of-contents.tsx @@ -26,8 +26,8 @@ export const TableOfContents: React.FC = () => { renderStillOnVercel()
Render a still image in a sandbox
- - uploadToBlobStorage() + + uploadToVercelBlob()
Upload a file from the sandbox to Vercel Blob
diff --git a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx new file mode 100644 index 00000000000..50ee386fe1c --- /dev/null +++ b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx @@ -0,0 +1,69 @@ +--- +image: /generated/articles-docs-vercel-upload-to-vercel-blob.png +title: uploadToVercelBlob() +crumb: '@remotion/vercel' +--- + +# uploadToVercelBlob() + +Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage. Typically used after [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) or [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) to make the output publicly accessible. + +## Example + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +import {uploadToVercelBlob, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox({bundleDir: '.remotion'}); +// ---cut--- +const {url, size} = await uploadToVercelBlob({ + sandbox, + sandboxFilePath: '/tmp/video.mp4', + contentType: 'video/mp4', + blobToken: process.env.BLOB_READ_WRITE_TOKEN!, +}); + +console.log(`Uploaded ${size} bytes to ${url}`); +``` + +## Arguments + +An object with the following properties: + +### `sandbox` + +A `VercelSandbox` instance. + +### `sandboxFilePath` + +The path to the file inside the sandbox to upload, e.g. `"/tmp/video.mp4"`. + +### `blobPath?` + +The destination path in Vercel Blob, e.g. `"renders/abc.mp4"`. If omitted, a random path is generated. + +### `contentType` + +The MIME type of the file, e.g. `"video/mp4"` or `"image/png"`. + +### `blobToken` + +Your Vercel Blob read/write token. Typically `process.env.BLOB_READ_WRITE_TOKEN`. + +## Return value + +An object containing: + +### `url` + +The public download URL of the uploaded file. + +### `size` + +The size of the uploaded file in bytes. + +## See also + +- [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) +- [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/upload-to-vercel-blob.ts) diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index 1b3cc9137df..3d32302a6c2 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -473,7 +473,7 @@ const sidebars: SidebarsConfig = { 'vercel/restore-snapshot', 'vercel/render-video-on-vercel', 'vercel/render-still-on-vercel', - 'vercel/upload-to-blob-storage', + 'vercel/upload-to-vercel-blob', 'vercel/vercel-types', ], }, diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index b28336ae68f..8b7b70ff3e9 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6602,13 +6602,13 @@ export const articles = [ slug: 'vercel/types', }, { - id: 'vercel/upload-to-blob-storage', - title: 'uploadToBlobStorage()', - relativePath: 'docs/vercel/upload-to-blob-storage.mdx', - compId: 'articles-docs-vercel-upload-to-blob-storage', + id: 'vercel/upload-to-vercel-blob', + title: 'uploadToVercelBlob()', + relativePath: 'docs/vercel/upload-to-vercel-blob.mdx', + compId: 'articles-docs-vercel-upload-to-vercel-blob', crumb: '@remotion/vercel', noAi: false, - slug: 'vercel/upload-to-blob-storage', + slug: 'vercel/upload-to-vercel-blob', }, { id: 'version-mismatch', diff --git a/packages/docs/static/generated/articles-docs-vercel-upload-to-vercel-blob.png b/packages/docs/static/generated/articles-docs-vercel-upload-to-vercel-blob.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a2255d7276325af401504f02ea25bba69e15b5 GIT binary patch literal 47816 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 LHQrsU?GXGwi{n-N literal 0 HcmV?d00001 diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index 653d74f04ba..4e837ff51b0 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -1,6 +1,6 @@ export {createSandbox} from './create-sandbox'; -export {renderStillOnVercel} from './render-still'; -export {renderVideoOnVercel} from './render-video'; +export {renderStillOnVercel} from './render-still-on-vercel'; +export {renderVideoOnVercel} from './render-video-on-vercel'; export {restoreSnapshot} from './restore-snapshot'; export {saveSnapshot} from './save-snapshot'; export type { @@ -8,4 +8,4 @@ export type { RenderOnVercelProgress, VercelSandbox, } from './types'; -export {uploadToBlobStorage} from './upload-to-blob-storage'; +export {uploadToVercelBlob} from './upload-to-vercel-blob'; diff --git a/packages/vercel/src/render-still.ts b/packages/vercel/src/render-still-on-vercel.ts similarity index 100% rename from packages/vercel/src/render-still.ts rename to packages/vercel/src/render-still-on-vercel.ts diff --git a/packages/vercel/src/render-video.ts b/packages/vercel/src/render-video-on-vercel.ts similarity index 100% rename from packages/vercel/src/render-video.ts rename to packages/vercel/src/render-video-on-vercel.ts diff --git a/packages/vercel/src/upload-to-blob-storage.ts b/packages/vercel/src/upload-to-vercel-blob.ts similarity index 98% rename from packages/vercel/src/upload-to-blob-storage.ts rename to packages/vercel/src/upload-to-vercel-blob.ts index 1df1e3ced4e..8183eba68ac 100644 --- a/packages/vercel/src/upload-to-blob-storage.ts +++ b/packages/vercel/src/upload-to-vercel-blob.ts @@ -45,7 +45,7 @@ try { `; } -export async function uploadToBlobStorage({ +export async function uploadToVercelBlob({ sandbox, sandboxFilePath, blobPath, From 2a5bba0521f95fef4e35351fbf4e56c939761d1a Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 19:05:55 +0100 Subject: [PATCH 10/70] `@remotion/vercel`: Accept Sandbox instead of VercelSandbox in saveSnapshot, render, and upload APIs Co-Authored-By: Claude Opus 4.6 --- .../docs/vercel/render-still-on-vercel.mdx | 2 +- .../docs/vercel/render-video-on-vercel.mdx | 2 +- packages/docs/docs/vercel/save-snapshot.mdx | 2 +- .../docs/vercel/upload-to-blob-storage.mdx | 69 ------------------- .../docs/vercel/upload-to-vercel-blob.mdx | 2 +- packages/vercel/src/render-still-on-vercel.ts | 5 +- packages/vercel/src/render-video-on-vercel.ts | 5 +- packages/vercel/src/save-snapshot.ts | 4 +- packages/vercel/src/upload-to-vercel-blob.ts | 4 +- 9 files changed, 14 insertions(+), 81 deletions(-) delete mode 100644 packages/docs/docs/vercel/upload-to-blob-storage.mdx diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index e3039927636..9e86515d339 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -32,7 +32,7 @@ An object with the following properties: ### `sandbox` -A `VercelSandbox` instance. +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) instance. ### `compositionId` diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index 5ba593cf286..c0810f218ce 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -36,7 +36,7 @@ An object with the following properties: ### `sandbox` -A `VercelSandbox` instance. +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) instance. ### `compositionId` diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx index 5c311eb1cc2..c7400cae4ea 100644 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -28,7 +28,7 @@ An object with the following properties: ### `sandbox` -A `VercelSandbox` instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). ### `expiration?` diff --git a/packages/docs/docs/vercel/upload-to-blob-storage.mdx b/packages/docs/docs/vercel/upload-to-blob-storage.mdx deleted file mode 100644 index 2bf14e8ec8b..00000000000 --- a/packages/docs/docs/vercel/upload-to-blob-storage.mdx +++ /dev/null @@ -1,69 +0,0 @@ ---- -image: /generated/articles-docs-vercel-upload-to-blob-storage.png -title: uploadToBlobStorage() -crumb: '@remotion/vercel' ---- - -# uploadToBlobStorage() - -Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage. Typically used after [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) or [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) to make the output publicly accessible. - -## Example - -```ts twoslash title="route.ts" -// @module: es2022 -// @target: es2022 -import {uploadToBlobStorage, createSandbox} from '@remotion/vercel'; -const sandbox = await createSandbox({bundleDir: '.remotion'}); -// ---cut--- -const {url, size} = await uploadToBlobStorage({ - sandbox, - sandboxFilePath: '/tmp/video.mp4', - contentType: 'video/mp4', - blobToken: process.env.BLOB_READ_WRITE_TOKEN!, -}); - -console.log(`Uploaded ${size} bytes to ${url}`); -``` - -## Arguments - -An object with the following properties: - -### `sandbox` - -A `VercelSandbox` instance. - -### `sandboxFilePath` - -The path to the file inside the sandbox to upload, e.g. `"/tmp/video.mp4"`. - -### `blobPath?` - -The destination path in Vercel Blob, e.g. `"renders/abc.mp4"`. If omitted, a random path is generated. - -### `contentType` - -The MIME type of the file, e.g. `"video/mp4"` or `"image/png"`. - -### `blobToken` - -Your Vercel Blob read/write token. Typically `process.env.BLOB_READ_WRITE_TOKEN`. - -## Return value - -An object containing: - -### `url` - -The public download URL of the uploaded file. - -### `size` - -The size of the uploaded file in bytes. - -## See also - -- [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) -- [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/upload-to-blob-storage.ts) diff --git a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx index 50ee386fe1c..0a418a1a1d0 100644 --- a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx +++ b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx @@ -32,7 +32,7 @@ An object with the following properties: ### `sandbox` -A `VercelSandbox` instance. +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) instance. ### `sandboxFilePath` diff --git a/packages/vercel/src/render-still-on-vercel.ts b/packages/vercel/src/render-still-on-vercel.ts index 0f3c7b6a95b..adc7df8082e 100644 --- a/packages/vercel/src/render-still-on-vercel.ts +++ b/packages/vercel/src/render-still-on-vercel.ts @@ -1,5 +1,6 @@ +import type {Sandbox} from '@vercel/sandbox'; import {getRenderStillScript} from './internals/render-still-script'; -import type {RenderOnVercelProgress, VercelSandbox} from './types'; +import type {RenderOnVercelProgress} from './types'; export async function renderStillOnVercel({ sandbox, @@ -10,7 +11,7 @@ export async function renderStillOnVercel({ onProgress, bundleDir = '.remotion', }: { - sandbox: VercelSandbox; + sandbox: Sandbox; compositionId: string; inputProps: Record; imageFormat?: 'png' | 'jpeg' | 'webp'; diff --git a/packages/vercel/src/render-video-on-vercel.ts b/packages/vercel/src/render-video-on-vercel.ts index 9d073b0597a..cd9142fc0b6 100644 --- a/packages/vercel/src/render-video-on-vercel.ts +++ b/packages/vercel/src/render-video-on-vercel.ts @@ -1,5 +1,6 @@ +import type {Sandbox} from '@vercel/sandbox'; import {getRenderVideoScript} from './internals/render-video-script'; -import type {RenderOnVercelProgress, VercelSandbox} from './types'; +import type {RenderOnVercelProgress} from './types'; export async function renderVideoOnVercel({ sandbox, @@ -10,7 +11,7 @@ export async function renderVideoOnVercel({ onProgress, bundleDir = '.remotion', }: { - sandbox: VercelSandbox; + sandbox: Sandbox; compositionId: string; inputProps: Record; codec?: string; diff --git a/packages/vercel/src/save-snapshot.ts b/packages/vercel/src/save-snapshot.ts index 2624b728c70..3bdcd86f21c 100644 --- a/packages/vercel/src/save-snapshot.ts +++ b/packages/vercel/src/save-snapshot.ts @@ -1,5 +1,5 @@ import {put} from '@vercel/blob'; -import type {VercelSandbox} from './types'; +import type {Sandbox} from '@vercel/sandbox'; type SnapshotCache = { snapshotId: string; @@ -12,7 +12,7 @@ export async function saveSnapshot({ sandbox, expiration = 0, }: { - sandbox: VercelSandbox; + sandbox: Sandbox; expiration?: number; }): Promise<{snapshotId: string}> { const snapshot = await sandbox.snapshot({expiration}); diff --git a/packages/vercel/src/upload-to-vercel-blob.ts b/packages/vercel/src/upload-to-vercel-blob.ts index 8183eba68ac..d446a502468 100644 --- a/packages/vercel/src/upload-to-vercel-blob.ts +++ b/packages/vercel/src/upload-to-vercel-blob.ts @@ -1,4 +1,4 @@ -import type {VercelSandbox} from './types'; +import type {Sandbox} from '@vercel/sandbox'; function getExtension(filePath: string): string { const lastDot = filePath.lastIndexOf('.'); @@ -52,7 +52,7 @@ export async function uploadToVercelBlob({ contentType, blobToken, }: { - sandbox: VercelSandbox; + sandbox: Sandbox; sandboxFilePath: string; blobPath?: string; contentType: string; From 22598e302b2243c7c57625cd95d0c06d77ddcd0a Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 19:19:39 +0100 Subject: [PATCH 11/70] `@remotion/vercel`: Use sandbox.stop() in main examples, move await using to separate section Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/create-sandbox.mdx | 20 ++++++++++++++++++- .../docs/docs/vercel/restore-snapshot.mdx | 20 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 4470666c4ef..5d31357ec9a 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -24,6 +24,10 @@ const sandbox = await createSandbox({ console.log(`${message} (${Math.round(progress * 100)}%)`); }, }); + +// ... use the sandbox + +await sandbox.stop(); ``` ## Arguments @@ -51,7 +55,21 @@ type CreateSandboxOnProgress = (update: { ## Return value -A `VercelSandbox` object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support). You can use `await using` to automatically clean up the sandbox when it goes out of scope. +A `VercelSandbox` object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support). Call `sandbox.stop()` when you are done with the sandbox. + +## Using `await using` + +You can use `await using` to automatically clean up the sandbox when it goes out of scope: + +```ts twoslash title="create-snapshot.ts" +// @module: es2022 +// @target: es2022 +import {createSandbox} from '@remotion/vercel'; +// ---cut--- +await using sandbox = await createSandbox({ + bundleDir: '.remotion', +}); +``` ## See also diff --git a/packages/docs/docs/vercel/restore-snapshot.mdx b/packages/docs/docs/vercel/restore-snapshot.mdx index f3214bc2b48..147ae6be748 100644 --- a/packages/docs/docs/vercel/restore-snapshot.mdx +++ b/packages/docs/docs/vercel/restore-snapshot.mdx @@ -17,9 +17,13 @@ This is the production counterpart to [`createSandbox()`](/docs/vercel/create-sa // @target: es2022 import {createSandbox, restoreSnapshot} from '@remotion/vercel'; // ---cut--- -await using sandbox = process.env.VERCEL +const sandbox = process.env.VERCEL ? await restoreSnapshot() : await createSandbox({bundleDir: '.remotion'}); + +// ... use the sandbox + +await sandbox.stop(); ``` ## Arguments @@ -30,6 +34,20 @@ None. A [`VercelSandbox`](/docs/vercel/types#vercelsandbox) object restored from the cached snapshot. Throws if no snapshot is found. +## Using `await using` + +You can use `await using` to automatically clean up the sandbox when it goes out of scope: + +```ts twoslash title="route.ts" +// @module: es2022 +// @target: es2022 +import {createSandbox, restoreSnapshot} from '@remotion/vercel'; +// ---cut--- +await using sandbox = process.env.VERCEL + ? await restoreSnapshot() + : await createSandbox({bundleDir: '.remotion'}); +``` + ## See also - [`createSandbox()`](/docs/vercel/create-sandbox) From 6b61afab9fc61c2ac465cfe36e1e21d2bf883bb1 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 19:33:04 +0100 Subject: [PATCH 12/70] `@remotion/vercel`: Convert sandbox scripts to real TypeScript files Sandbox scripts (render-video, render-still, ensure-browser) are now real TypeScript files under src/scripts/ that are type-checked and linted. bundle.ts reads them at build time and generates string-exporting modules in src/internals/. Dynamic values (codec, outputFile, imageFormat) are passed via JSON config arg instead of being baked into template strings. Co-Authored-By: Claude Opus 4.6 --- bun.lock | 1 + .../src/app/api/render/route.ts | 4 +- packages/vercel/bundle.ts | 15 ++++ packages/vercel/eslint.config.mjs | 13 +++- packages/vercel/package.json | 1 + packages/vercel/src/create-sandbox.ts | 11 +-- .../src/internals/ensure-browser-script.ts | 10 ++- .../vercel/src/internals/install-browser.ts | 3 +- .../src/internals/render-still-script.ts | 64 +++++++---------- .../src/internals/render-video-script.ts | 70 ++++++++----------- packages/vercel/src/render-still-on-vercel.ts | 8 +-- packages/vercel/src/render-video-on-vercel.ts | 8 +-- packages/vercel/src/scripts/ensure-browser.ts | 12 ++++ packages/vercel/src/scripts/render-still.ts | 34 +++++++++ packages/vercel/src/scripts/render-video.ts | 37 ++++++++++ packages/vercel/tsconfig.json | 2 +- 16 files changed, 182 insertions(+), 111 deletions(-) create mode 100644 packages/vercel/src/scripts/ensure-browser.ts create mode 100644 packages/vercel/src/scripts/render-still.ts create mode 100644 packages/vercel/src/scripts/render-video.ts diff --git a/bun.lock b/bun.lock index ddfc27d6edb..86b24f56049 100644 --- a/bun.lock +++ b/bun.lock @@ -2285,6 +2285,7 @@ }, "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", + "@remotion/renderer": "workspace:*", "@typescript/native-preview": "catalog:", "@vercel/blob": "2.0.1", "@vercel/sandbox": "1.6.0", diff --git a/packages/template-vercel/src/app/api/render/route.ts b/packages/template-vercel/src/app/api/render/route.ts index e7db876d4aa..7a2188bc360 100644 --- a/packages/template-vercel/src/app/api/render/route.ts +++ b/packages/template-vercel/src/app/api/render/route.ts @@ -2,7 +2,7 @@ import { createSandbox, renderVideoOnVercel, restoreSnapshot, - uploadToBlobStorage, + uploadToVercelBlob, } from "@remotion/vercel"; import { waitUntil } from "@vercel/functions"; import { COMP_NAME } from "../../../../types/constants"; @@ -91,7 +91,7 @@ export async function POST(req: Request) { throw new Error("BLOB_READ_WRITE_TOKEN is not set"); } - const { url, size } = await uploadToBlobStorage({ + const { url, size } = await uploadToVercelBlob({ sandbox, sandboxFilePath: file, contentType: "video/mp4", diff --git a/packages/vercel/bundle.ts b/packages/vercel/bundle.ts index 2880da8ae6e..f6782cca641 100644 --- a/packages/vercel/bundle.ts +++ b/packages/vercel/bundle.ts @@ -6,6 +6,21 @@ if (process.env.NODE_ENV !== 'production') { } console.time('Generated.'); + +// Read sandbox scripts as text and generate modules that export them as strings +const scripts = [ + {name: 'render-video-script', file: 'src/scripts/render-video.ts'}, + {name: 'render-still-script', file: 'src/scripts/render-still.ts'}, + {name: 'ensure-browser-script', file: 'src/scripts/ensure-browser.ts'}, +]; + +for (const script of scripts) { + const content = await Bun.file(script.file).text(); + const escaped = content.replaceAll('\\', '\\\\').replaceAll('`', '\\`').replaceAll('$', '\\$'); + const moduleContent = `// Generated by bundle.ts - do not edit manually\nexport const script = \`${escaped}\`;\n`; + await Bun.write(`src/internals/${script.name}.ts`, moduleContent); +} + const output = await build({ entrypoints: ['src/index.ts'], naming: '[name].mjs', diff --git a/packages/vercel/eslint.config.mjs b/packages/vercel/eslint.config.mjs index 04fd4fac110..b43dcca8993 100644 --- a/packages/vercel/eslint.config.mjs +++ b/packages/vercel/eslint.config.mjs @@ -2,6 +2,13 @@ import {remotionFlatConfig} from '@remotion/eslint-config-internal'; const config = remotionFlatConfig({react: false}); -export default { - ...config, -}; +export default [ + config, + { + files: ['src/scripts/**'], + rules: { + 'no-console': 'off', + 'prefer-destructuring': 'off', + }, + }, +]; diff --git a/packages/vercel/package.json b/packages/vercel/package.json index 39f0ab50d77..e7dd9ae9f4d 100644 --- a/packages/vercel/package.json +++ b/packages/vercel/package.json @@ -39,6 +39,7 @@ }, "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", + "@remotion/renderer": "workspace:*", "@vercel/blob": "2.0.1", "@vercel/sandbox": "1.6.0", "eslint": "catalog:", diff --git a/packages/vercel/src/create-sandbox.ts b/packages/vercel/src/create-sandbox.ts index fabcb0d728d..e8ea27e1ddc 100644 --- a/packages/vercel/src/create-sandbox.ts +++ b/packages/vercel/src/create-sandbox.ts @@ -4,7 +4,6 @@ import {installBrowser} from './internals/install-browser'; import {installJsDependencies} from './internals/install-js-dependencies'; import {installSystemDependencies} from './internals/install-system-dependencies'; import {patchCompositor} from './internals/patch-compositor'; -import {getRenderVideoScript} from './internals/render-video-script'; import type {CreateSandboxOnProgress, VercelSandbox} from './types'; export const SANDBOX_CREATING_TIMEOUT = 5 * 60 * 1000; @@ -74,16 +73,8 @@ export async function createSandbox({ }, }); - // Write a default render script and package.json (module type) - const renderScript = getRenderVideoScript({ - codec: 'h264', - outputFile: '/tmp/video.mp4', - }); + // Write package.json (module type) so scripts can use ESM imports await sandbox.writeFiles([ - { - path: 'render.ts', - content: Buffer.from(renderScript), - }, { path: 'package.json', content: Buffer.from(JSON.stringify({type: 'module'})), diff --git a/packages/vercel/src/internals/ensure-browser-script.ts b/packages/vercel/src/internals/ensure-browser-script.ts index 9f806b53587..3ed1f2b3c50 100644 --- a/packages/vercel/src/internals/ensure-browser-script.ts +++ b/packages/vercel/src/internals/ensure-browser-script.ts @@ -1,16 +1,14 @@ -export const getEnsureBrowserScript = (): string => { - return `\ -import { ensureBrowser } from "@remotion/renderer"; +// Generated by bundle.ts - do not edit manually +export const script = `import {ensureBrowser} from '@remotion/renderer'; await ensureBrowser({ onBrowserDownload: () => { return { version: null, - onProgress: ({ percent }) => { - console.log(JSON.stringify({ type: "browser-progress", percent })); + onProgress: ({percent}) => { + console.log(JSON.stringify({type: 'browser-progress', percent})); }, }; }, }); `; -}; diff --git a/packages/vercel/src/internals/install-browser.ts b/packages/vercel/src/internals/install-browser.ts index cebd7c22411..2f1d902a392 100644 --- a/packages/vercel/src/internals/install-browser.ts +++ b/packages/vercel/src/internals/install-browser.ts @@ -1,5 +1,5 @@ import type {Sandbox} from '@vercel/sandbox'; -import {getEnsureBrowserScript} from './ensure-browser-script'; +import {script as ensureBrowserScript} from './ensure-browser-script'; export async function installBrowser({ sandbox, @@ -8,7 +8,6 @@ export async function installBrowser({ sandbox: Sandbox; onProgress: (progress: number) => Promise; }): Promise { - const ensureBrowserScript = getEnsureBrowserScript(); await sandbox.writeFiles([ { path: 'ensure-browser.ts', diff --git a/packages/vercel/src/internals/render-still-script.ts b/packages/vercel/src/internals/render-still-script.ts index 88f0d8ec19e..1f770426f7d 100644 --- a/packages/vercel/src/internals/render-still-script.ts +++ b/packages/vercel/src/internals/render-still-script.ts @@ -1,48 +1,36 @@ -export const getRenderStillScript = ({ - imageFormat, - outputFile, -}: { - imageFormat: string; - outputFile: string; -}): string => { - return `\ -import { - openBrowser, - renderStill, - selectComposition, -} from "@remotion/renderer"; -import { statSync } from "fs"; +// Generated by bundle.ts - do not edit manually +export const script = `import {openBrowser, renderStill, selectComposition} from '@remotion/renderer'; +import {statSync} from 'fs'; const config = JSON.parse(process.argv[2]); try { - console.log(JSON.stringify({ type: "opening-browser" })); - const browser = await openBrowser("chrome"); - console.log(JSON.stringify({ type: "selecting-composition" })); - const composition = await selectComposition({ - serveUrl: config.serveUrl, - id: config.compositionId, - inputProps: config.inputProps, - puppeteerInstance: browser, - }); + console.log(JSON.stringify({type: 'opening-browser'})); + const browser = await openBrowser('chrome'); + console.log(JSON.stringify({type: 'selecting-composition'})); + const composition = await selectComposition({ + serveUrl: config.serveUrl, + id: config.compositionId, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); - await renderStill({ - composition, - serveUrl: config.serveUrl, - imageFormat: ${JSON.stringify(imageFormat)}, - output: ${JSON.stringify(outputFile)}, - inputProps: config.inputProps, - puppeteerInstance: browser, - }); + await renderStill({ + composition, + serveUrl: config.serveUrl, + imageFormat: config.imageFormat, + output: config.outputFile, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); - console.log(JSON.stringify({ type: "render-complete" })); - await browser.close({ silent: false }); + console.log(JSON.stringify({type: 'render-complete'})); + await browser.close({silent: false}); - const size = statSync(${JSON.stringify(outputFile)}).size; - console.log(JSON.stringify({ type: "done", size })); + const size = statSync(config.outputFile).size; + console.log(JSON.stringify({type: 'done', size})); } catch (err) { - console.error(err.message); - process.exit(1); + console.error((err as Error).message); + process.exit(1); } `; -}; diff --git a/packages/vercel/src/internals/render-video-script.ts b/packages/vercel/src/internals/render-video-script.ts index de022dd9a6b..5ea1aa29a2d 100644 --- a/packages/vercel/src/internals/render-video-script.ts +++ b/packages/vercel/src/internals/render-video-script.ts @@ -1,51 +1,39 @@ -export const getRenderVideoScript = ({ - codec, - outputFile, -}: { - codec: string; - outputFile: string; -}): string => { - return `\ -import { - openBrowser, - renderMedia, - selectComposition, -} from "@remotion/renderer"; -import { readFileSync, statSync } from "fs"; +// Generated by bundle.ts - do not edit manually +export const script = `import {openBrowser, renderMedia, selectComposition} from '@remotion/renderer'; +import {statSync} from 'fs'; const config = JSON.parse(process.argv[2]); try { - console.log(JSON.stringify({ type: "opening-browser" })); - const browser = await openBrowser("chrome"); - console.log(JSON.stringify({ type: "selecting-composition" })); - const composition = await selectComposition({ - serveUrl: config.serveUrl, - id: config.compositionId, - inputProps: config.inputProps, - puppeteerInstance: browser, - }); + console.log(JSON.stringify({type: 'opening-browser'})); + const browser = await openBrowser('chrome'); + console.log(JSON.stringify({type: 'selecting-composition'})); + const composition = await selectComposition({ + serveUrl: config.serveUrl, + id: config.compositionId, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); - await renderMedia({ - composition, - serveUrl: config.serveUrl, - codec: ${JSON.stringify(codec)}, - outputLocation: ${JSON.stringify(outputFile)}, - inputProps: config.inputProps, - onProgress: ({ progress }) => { - console.log(JSON.stringify({ type: "progress", progress })); - }, - puppeteerInstance: browser, - }); + await renderMedia({ + composition, + serveUrl: config.serveUrl, + codec: config.codec, + outputLocation: config.outputFile, + inputProps: config.inputProps, + onProgress: ({progress}) => { + console.log(JSON.stringify({type: 'progress', progress})); + }, + puppeteerInstance: browser, + }); - console.log(JSON.stringify({ type: "render-complete" })); - await browser.close({ silent: false }); + console.log(JSON.stringify({type: 'render-complete'})); + await browser.close({silent: false}); - const size = statSync(${JSON.stringify(outputFile)}).size; - console.log(JSON.stringify({ type: "done", size })); + const size = statSync(config.outputFile).size; + console.log(JSON.stringify({type: 'done', size})); } catch (err) { - console.error(err.message); - process.exit(1); + console.error((err as Error).message); + process.exit(1); } `; -}; diff --git a/packages/vercel/src/render-still-on-vercel.ts b/packages/vercel/src/render-still-on-vercel.ts index adc7df8082e..c912bc84e76 100644 --- a/packages/vercel/src/render-still-on-vercel.ts +++ b/packages/vercel/src/render-still-on-vercel.ts @@ -1,5 +1,5 @@ import type {Sandbox} from '@vercel/sandbox'; -import {getRenderStillScript} from './internals/render-still-script'; +import {script as renderStillScript} from './internals/render-still-script'; import type {RenderOnVercelProgress} from './types'; export async function renderStillOnVercel({ @@ -21,12 +21,10 @@ export async function renderStillOnVercel({ }): Promise<{file: string}> { const serveUrl = `/vercel/sandbox/${bundleDir}`; - const renderScript = getRenderStillScript({imageFormat, outputFile}); - await sandbox.writeFiles([ { path: 'render-still.ts', - content: Buffer.from(renderScript), + content: Buffer.from(renderStillScript), }, ]); @@ -34,6 +32,8 @@ export async function renderStillOnVercel({ serveUrl, compositionId, inputProps, + imageFormat, + outputFile, }; const renderCmd = await sandbox.runCommand({ diff --git a/packages/vercel/src/render-video-on-vercel.ts b/packages/vercel/src/render-video-on-vercel.ts index cd9142fc0b6..4fb0072c956 100644 --- a/packages/vercel/src/render-video-on-vercel.ts +++ b/packages/vercel/src/render-video-on-vercel.ts @@ -1,5 +1,5 @@ import type {Sandbox} from '@vercel/sandbox'; -import {getRenderVideoScript} from './internals/render-video-script'; +import {script as renderVideoScript} from './internals/render-video-script'; import type {RenderOnVercelProgress} from './types'; export async function renderVideoOnVercel({ @@ -21,12 +21,10 @@ export async function renderVideoOnVercel({ }): Promise<{file: string}> { const serveUrl = `/vercel/sandbox/${bundleDir}`; - const renderScript = getRenderVideoScript({codec, outputFile}); - await sandbox.writeFiles([ { path: 'render-video.ts', - content: Buffer.from(renderScript), + content: Buffer.from(renderVideoScript), }, ]); @@ -34,6 +32,8 @@ export async function renderVideoOnVercel({ serveUrl, compositionId, inputProps, + codec, + outputFile, }; const renderCmd = await sandbox.runCommand({ diff --git a/packages/vercel/src/scripts/ensure-browser.ts b/packages/vercel/src/scripts/ensure-browser.ts new file mode 100644 index 00000000000..ecd14eb013b --- /dev/null +++ b/packages/vercel/src/scripts/ensure-browser.ts @@ -0,0 +1,12 @@ +import {ensureBrowser} from '@remotion/renderer'; + +await ensureBrowser({ + onBrowserDownload: () => { + return { + version: null, + onProgress: ({percent}) => { + console.log(JSON.stringify({type: 'browser-progress', percent})); + }, + }; + }, +}); diff --git a/packages/vercel/src/scripts/render-still.ts b/packages/vercel/src/scripts/render-still.ts new file mode 100644 index 00000000000..949e426640c --- /dev/null +++ b/packages/vercel/src/scripts/render-still.ts @@ -0,0 +1,34 @@ +import {openBrowser, renderStill, selectComposition} from '@remotion/renderer'; +import {statSync} from 'fs'; + +const config = JSON.parse(process.argv[2]); + +try { + console.log(JSON.stringify({type: 'opening-browser'})); + const browser = await openBrowser('chrome'); + console.log(JSON.stringify({type: 'selecting-composition'})); + const composition = await selectComposition({ + serveUrl: config.serveUrl, + id: config.compositionId, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); + + await renderStill({ + composition, + serveUrl: config.serveUrl, + imageFormat: config.imageFormat, + output: config.outputFile, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); + + console.log(JSON.stringify({type: 'render-complete'})); + await browser.close({silent: false}); + + const size = statSync(config.outputFile).size; + console.log(JSON.stringify({type: 'done', size})); +} catch (err) { + console.error((err as Error).message); + process.exit(1); +} diff --git a/packages/vercel/src/scripts/render-video.ts b/packages/vercel/src/scripts/render-video.ts new file mode 100644 index 00000000000..7e57d65fdac --- /dev/null +++ b/packages/vercel/src/scripts/render-video.ts @@ -0,0 +1,37 @@ +import {openBrowser, renderMedia, selectComposition} from '@remotion/renderer'; +import {statSync} from 'fs'; + +const config = JSON.parse(process.argv[2]); + +try { + console.log(JSON.stringify({type: 'opening-browser'})); + const browser = await openBrowser('chrome'); + console.log(JSON.stringify({type: 'selecting-composition'})); + const composition = await selectComposition({ + serveUrl: config.serveUrl, + id: config.compositionId, + inputProps: config.inputProps, + puppeteerInstance: browser, + }); + + await renderMedia({ + composition, + serveUrl: config.serveUrl, + codec: config.codec, + outputLocation: config.outputFile, + inputProps: config.inputProps, + onProgress: ({progress}) => { + console.log(JSON.stringify({type: 'progress', progress})); + }, + puppeteerInstance: browser, + }); + + console.log(JSON.stringify({type: 'render-complete'})); + await browser.close({silent: false}); + + const size = statSync(config.outputFile).size; + console.log(JSON.stringify({type: 'done', size})); +} catch (err) { + console.error((err as Error).message); + process.exit(1); +} diff --git a/packages/vercel/tsconfig.json b/packages/vercel/tsconfig.json index e5c5f5163c6..7401f3b1fd3 100644 --- a/packages/vercel/tsconfig.json +++ b/packages/vercel/tsconfig.json @@ -5,7 +5,7 @@ "outDir": "dist", "skipLibCheck": true, "target": "ES2022", - "module": "es2020", + "module": "es2022", "moduleResolution": "bundler", "declaration": true, "emitDeclarationOnly": true From f54a608e2a698a761e5ff6d9ce7f17ee7a639bcb Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Wed, 18 Feb 2026 20:12:57 +0100 Subject: [PATCH 13/70] `@remotion/vercel`: Switch to internalRenderMedia/internalRenderStill Use RenderInternals.internalRenderMedia and internalRenderStill in sandbox scripts, forcing explicit handling of every option. All serializable options from the internal APIs are now exposed in the public renderVideoOnVercel() and renderStillOnVercel() functions. Script config types use indexed access into InternalRenderMediaOptions for type safety - if the internal API adds a new required option, the scripts fail to compile. Non-serializable options (callbacks, class instances, ffmpegOverride) are handled with defaults inside the sandbox scripts. Co-Authored-By: Claude Opus 4.6 --- .../docs/vercel/render-still-on-vercel.mdx | 66 +++++- .../docs/vercel/render-video-on-vercel.mdx | 170 ++++++++++++++- packages/docs/docs/vercel/types.mdx | 2 +- packages/vercel/src/index.ts | 16 ++ .../src/internals/render-still-script.ts | 135 ++++++++++-- .../src/internals/render-video-script.ts | 201 ++++++++++++++++-- packages/vercel/src/render-still-on-vercel.ts | 77 +++++-- packages/vercel/src/render-video-on-vercel.ts | 161 ++++++++++++-- packages/vercel/src/scripts/render-still.ts | 135 ++++++++++-- packages/vercel/src/scripts/render-video.ts | 201 ++++++++++++++++-- packages/vercel/src/types.ts | 94 +++++++- 11 files changed, 1167 insertions(+), 91 deletions(-) diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index 9e86515d339..6fcc9c71bb8 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -6,7 +6,7 @@ crumb: '@remotion/vercel' # renderStillOnVercel() -Renders a still image inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. +Renders a still image inside a Vercel Sandbox using [`RenderInternals.internalRenderStill()`](/docs/renderer/render-still). Writes a render script to the sandbox, executes it, and returns the output file path. The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) to upload it to Vercel Blob. @@ -44,15 +44,75 @@ Props to pass to the composition. ### `imageFormat?` -The output image format. Default: `"png"`. Can be `"png"`, `"jpeg"`, or `"webp"`. +The output image format. `"png"`, `"jpeg"`, `"pdf"`, or `"webp"`. Default: `"png"`. ### `outputFile?` The output file path inside the sandbox. Default: `"/tmp/still.png"`. +### `frame?` + +The frame number to render. Default: `0`. + +### `jpegQuality?` + +JPEG quality (0–100). Only applicable when `imageFormat` is `"jpeg"`. Default: `80`. + +### `envVariables?` + +Environment variables to set during rendering. Default: `{}`. + +### `overwrite?` + +Whether to overwrite existing output files. Default: `true`. + +### `browserExecutable?` + +Custom path to a Chrome executable. Default: `null` (use installed browser). + +### `chromiumOptions?` + +Options for the headless Chrome instance. See [`renderStill() → chromiumOptions`](/docs/renderer/render-still#chromiumoptions). Default: `{}`. + +### `scale?` + +Scaling factor for the output. Default: `1`. + +### `logLevel?` + +Log level for the render process. `"trace"`, `"verbose"`, `"info"`, `"warn"`, or `"error"`. Default: `"info"`. + +### `timeoutInMilliseconds?` + +Timeout for delayRender() calls in milliseconds. Default: `30000`. + +### `chromeMode?` + +Chrome mode. `"headless-shell"` or `"chrome-for-testing"`. Default: `"headless-shell"`. + +### `offthreadVideoCacheSizeInBytes?` + +Cache size for `` in bytes. Default: `null`. + +### `mediaCacheSizeInBytes?` + +Cache size for media assets in bytes. Default: `null`. + +### `offthreadVideoThreads?` + +Number of threads for `` decoding. Default: `null`. + +### `binariesDirectory?` + +Custom directory for FFmpeg binaries. Default: `null`. + +### `licenseKey?` + +Remotion license key. Default: `null`. + ### `onProgress?` -A callback that receives render progress updates. See [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) for the type definition. +A callback that receives render progress updates. See [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel#onprogress) for the type definition. ### `bundleDir?` diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index c0810f218ce..ad6e69d0a16 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -6,7 +6,7 @@ crumb: '@remotion/vercel' # renderVideoOnVercel() -Renders a video inside a Vercel Sandbox. Writes a render script to the sandbox, executes it, and returns the output file path. +Renders a video inside a Vercel Sandbox using [`RenderInternals.internalRenderMedia()`](/docs/renderer/render-media). Writes a render script to the sandbox, executes it, and returns the output file path. The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) to upload it to Vercel Blob. @@ -54,12 +54,178 @@ The video codec to use. Default: `"h264"`. The output file path inside the sandbox. Default: `"/tmp/video.mp4"`. +### `crf?` + +The Constant Rate Factor, controlling quality. See [`renderMedia() → crf`](/docs/renderer/render-media#crf). Default: `null` (codec default). + +### `imageFormat?` + +The image format for intermediate frames. `"png"`, `"jpeg"`, or `"none"`. Default: `null` (codec default). + +### `pixelFormat?` + +The pixel format for the output video. Default: `null` (codec default). + +### `envVariables?` + +Environment variables to set during rendering. Default: `{}`. + +### `frameRange?` + +A specific frame range to render. Can be a single frame number, a `[start, end]` tuple, or `[start, null]` for open-ended. Default: `null` (render all frames). + +### `everyNthFrame?` + +Render only every nth frame. Default: `1`. + +### `overwrite?` + +Whether to overwrite existing output files. Default: `true`. + +### `proResProfile?` + +The ProRes profile to use when `codec` is `"prores"`. One of `"4444-xq"`, `"4444"`, `"hq"`, `"standard"`, `"light"`, `"proxy"`. + +### `chromiumOptions?` + +Options for the headless Chrome instance. See [`renderMedia() → chromiumOptions`](/docs/renderer/render-media#chromiumoptions). Default: `{}`. + +### `scale?` + +Scaling factor for the output. Default: `1`. + +### `browserExecutable?` + +Custom path to a Chrome executable. Default: `null` (use installed browser). + +### `preferLossless?` + +Prefer lossless audio encoding when possible. Default: `false`. + +### `enforceAudioTrack?` + +Enforce an audio track even if the video has no audio. Default: `false`. + +### `disallowParallelEncoding?` + +Disable parallel encoding. Default: `false`. + +### `concurrency?` + +Number of frames to render concurrently. Default: `null` (auto). + +### `metadata?` + +Key-value metadata to embed in the output file. Default: `null`. + +### `logLevel?` + +Log level for the render process. `"trace"`, `"verbose"`, `"info"`, `"warn"`, or `"error"`. Default: `"info"`. + +### `timeoutInMilliseconds?` + +Timeout for delayRender() calls in milliseconds. Default: `30000`. + +### `videoBitrate?` + +Target video bitrate, e.g. `"1000k"` or `"10M"`. Default: `null`. + +### `audioBitrate?` + +Target audio bitrate, e.g. `"128k"`. Default: `null`. + +### `audioCodec?` + +The audio codec. `"pcm-16"`, `"aac"`, `"mp3"`, or `"opus"`. Default: `null` (derived from video codec). + +### `encodingMaxRate?` + +Maximum encoding bitrate for VBR encoding. Default: `null`. + +### `encodingBufferSize?` + +Encoding buffer size for VBR encoding. Default: `null`. + +### `muted?` + +Render without audio. Default: `false`. + +### `numberOfGifLoops?` + +Number of loops for GIF output. Default: `null`. + +### `x264Preset?` + +The x264 preset when using H.264 codec. Default: `null`. + +### `colorSpace?` + +The color space. `"default"`, `"bt601"`, `"bt709"`, or `"bt2020-ncl"`. Default: `"default"`. + +### `jpegQuality?` + +JPEG quality for intermediate frames (0–100). Default: `80`. + +### `forSeamlessAacConcatenation?` + +Optimize AAC audio for seamless concatenation. Default: `false`. + +### `separateAudioTo?` + +Write the audio track to a separate file. Default: `null`. + +### `hardwareAcceleration?` + +Hardware acceleration mode. `"disable"`, `"if-possible"`, or `"required"`. Default: `"disable"`. + +### `chromeMode?` + +Chrome mode. `"headless-shell"` or `"chrome-for-testing"`. Default: `"headless-shell"`. + +### `offthreadVideoCacheSizeInBytes?` + +Cache size for `` in bytes. Default: `null`. + +### `mediaCacheSizeInBytes?` + +Cache size for media assets in bytes. Default: `null`. + +### `offthreadVideoThreads?` + +Number of threads for `` decoding. Default: `null`. + +### `repro?` + +Enable repro mode for debugging. Default: `false`. + +### `binariesDirectory?` + +Custom directory for FFmpeg binaries. Default: `null`. + +### `licenseKey?` + +Remotion license key. Default: `null`. + ### `onProgress?` A callback that receives render progress updates. ```ts -type RenderOnVercelProgress = {type: 'opening-browser'} | {type: 'selecting-composition'} | {type: 'render-progress'; progress: number} | {type: 'uploading'} | {type: 'done'; url: string; size: number}; +type RenderOnVercelProgress = + | {type: 'opening-browser'} + | {type: 'selecting-composition'} + | { + type: 'render-progress'; + renderedFrames: number; + encodedFrames: number; + encodedDoneIn: number | null; + renderedDoneIn: number | null; + renderEstimatedTime: number; + progress: number; + stitchStage: 'encoding' | 'muxing'; + } + | {type: 'uploading'} + | {type: 'done'; url: string; size: number}; ``` ### `bundleDir?` diff --git a/packages/docs/docs/vercel/types.mdx b/packages/docs/docs/vercel/types.mdx index f79a5040910..8379afcddd9 100644 --- a/packages/docs/docs/vercel/types.mdx +++ b/packages/docs/docs/vercel/types.mdx @@ -37,6 +37,6 @@ import type {RenderOnVercelProgress} from '@remotion/vercel'; - `{type: 'opening-browser'}`: The browser is being opened - `{type: 'selecting-composition'}`: The composition is being selected -- `{type: 'render-progress', progress: number}`: Rendering is in progress (`0` to `1`) +- `{type: 'render-progress', ...}`: Rendering is in progress. Includes `progress` (`0` to `1`), `renderedFrames`, `encodedFrames`, `encodedDoneIn`, `renderedDoneIn`, `renderEstimatedTime`, and `stitchStage` (`'encoding'` or `'muxing'`) - `{type: 'uploading'}`: The rendered file is being uploaded - `{type: 'done', url: string, size: number}`: The render is complete diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index 4e837ff51b0..9ef1a5a6f76 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -4,8 +4,24 @@ export {renderVideoOnVercel} from './render-video-on-vercel'; export {restoreSnapshot} from './restore-snapshot'; export {saveSnapshot} from './save-snapshot'; export type { + AudioCodec, + Bitrate, + ChromeMode, + ChromiumOptions, + Codec, + ColorSpace, CreateSandboxOnProgress, + FrameRange, + HardwareAccelerationOption, + LogLevel, + OpenGlRenderer, + PixelFormat, + ProResProfile, RenderOnVercelProgress, + StillImageFormat, + StitchingState, VercelSandbox, + VideoImageFormat, + X264Preset, } from './types'; export {uploadToVercelBlob} from './upload-to-vercel-blob'; diff --git a/packages/vercel/src/internals/render-still-script.ts b/packages/vercel/src/internals/render-still-script.ts index 1f770426f7d..e7c34d5f137 100644 --- a/packages/vercel/src/internals/render-still-script.ts +++ b/packages/vercel/src/internals/render-still-script.ts @@ -1,33 +1,142 @@ // Generated by bundle.ts - do not edit manually -export const script = `import {openBrowser, renderStill, selectComposition} from '@remotion/renderer'; +export const script = `import {RenderInternals} from '@remotion/renderer'; import {statSync} from 'fs'; +import {NoReactInternals} from 'remotion/no-react'; -const config = JSON.parse(process.argv[2]); +type InternalStillOptions = Parameters< + typeof RenderInternals.internalRenderStill +>[0]; + +type RenderStillConfig = { + compositionId: string; + inputProps: Record; + output: InternalStillOptions['output']; + serveUrl: InternalStillOptions['serveUrl']; + frame: InternalStillOptions['frame']; + imageFormat: InternalStillOptions['imageFormat']; + jpegQuality: InternalStillOptions['jpegQuality']; + envVariables: InternalStillOptions['envVariables']; + overwrite: InternalStillOptions['overwrite']; + browserExecutable: InternalStillOptions['browserExecutable']; + chromiumOptions: InternalStillOptions['chromiumOptions']; + scale: InternalStillOptions['scale']; + logLevel: InternalStillOptions['logLevel']; + timeoutInMilliseconds: InternalStillOptions['timeoutInMilliseconds']; + binariesDirectory: InternalStillOptions['binariesDirectory']; + chromeMode: InternalStillOptions['chromeMode']; + offthreadVideoCacheSizeInBytes: InternalStillOptions['offthreadVideoCacheSizeInBytes']; + mediaCacheSizeInBytes: InternalStillOptions['mediaCacheSizeInBytes']; + offthreadVideoThreads: InternalStillOptions['offthreadVideoThreads']; + licenseKey: InternalStillOptions['licenseKey']; +}; + +const config: RenderStillConfig = JSON.parse(process.argv[2]); + +const noop = () => undefined; try { + const serializedInputProps = NoReactInternals.serializeJSONWithSpecialTypes({ + data: config.inputProps, + indent: undefined, + staticBase: null, + }).serializedString; + console.log(JSON.stringify({type: 'opening-browser'})); - const browser = await openBrowser('chrome'); - console.log(JSON.stringify({type: 'selecting-composition'})); - const composition = await selectComposition({ - serveUrl: config.serveUrl, - id: config.compositionId, - inputProps: config.inputProps, - puppeteerInstance: browser, + + const browser = await RenderInternals.internalOpenBrowser({ + browser: 'chrome', + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + forceDeviceScaleFactor: undefined, + viewport: null, + indent: false, + logLevel: config.logLevel, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, }); - await renderStill({ + console.log(JSON.stringify({type: 'selecting-composition'})); + + const {metadata: composition} = + await RenderInternals.internalSelectComposition({ + serializedInputPropsWithCustomSchema: serializedInputProps, + envVariables: config.envVariables, + puppeteerInstance: browser, + onBrowserLog: null, + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + port: null, + indent: false, + server: undefined, + serveUrl: config.serveUrl, + id: config.compositionId, + onServeUrlVisited: noop, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + binariesDirectory: config.binariesDirectory, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + }); + + const serializedResolvedProps = + NoReactInternals.serializeJSONWithSpecialTypes({ + data: composition.props, + indent: undefined, + staticBase: null, + }).serializedString; + + await RenderInternals.internalRenderStill({ + output: config.output, composition, + serializedInputPropsWithCustomSchema: serializedInputProps, + serializedResolvedPropsWithCustomSchema: serializedResolvedProps, serveUrl: config.serveUrl, + frame: config.frame, imageFormat: config.imageFormat, - output: config.outputFile, - inputProps: config.inputProps, + jpegQuality: config.jpegQuality, + envVariables: config.envVariables, + overwrite: config.overwrite, + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + scale: config.scale, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + binariesDirectory: config.binariesDirectory, + chromeMode: config.chromeMode, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + licenseKey: config.licenseKey, + // Non-serializable fields with defaults puppeteerInstance: browser, + onBrowserLog: null, + onDownload: null, + cancelSignal: null, + indent: false, + server: undefined, + port: null, + onArtifact: null, + onLog: RenderInternals.defaultOnLog, + isProduction: true, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), }); console.log(JSON.stringify({type: 'render-complete'})); await browser.close({silent: false}); - const size = statSync(config.outputFile).size; + const {size} = statSync(config.output ?? '/tmp/still.png'); console.log(JSON.stringify({type: 'done', size})); } catch (err) { console.error((err as Error).message); diff --git a/packages/vercel/src/internals/render-video-script.ts b/packages/vercel/src/internals/render-video-script.ts index 5ea1aa29a2d..73262d20798 100644 --- a/packages/vercel/src/internals/render-video-script.ts +++ b/packages/vercel/src/internals/render-video-script.ts @@ -1,36 +1,205 @@ // Generated by bundle.ts - do not edit manually -export const script = `import {openBrowser, renderMedia, selectComposition} from '@remotion/renderer'; +export const script = `import type {InternalRenderMediaOptions} from '@remotion/renderer'; +import {RenderInternals} from '@remotion/renderer'; import {statSync} from 'fs'; +import {NoReactInternals} from 'remotion/no-react'; -const config = JSON.parse(process.argv[2]); +type RenderVideoConfig = { + compositionId: string; + inputProps: Record; + outputLocation: InternalRenderMediaOptions['outputLocation']; + serveUrl: InternalRenderMediaOptions['serveUrl']; + crf: InternalRenderMediaOptions['crf']; + imageFormat: InternalRenderMediaOptions['imageFormat']; + pixelFormat: InternalRenderMediaOptions['pixelFormat']; + envVariables: InternalRenderMediaOptions['envVariables']; + frameRange: InternalRenderMediaOptions['frameRange']; + everyNthFrame: InternalRenderMediaOptions['everyNthFrame']; + overwrite: InternalRenderMediaOptions['overwrite']; + proResProfile: NonNullable< + InternalRenderMediaOptions['proResProfile'] + > | null; + chromiumOptions: InternalRenderMediaOptions['chromiumOptions']; + scale: InternalRenderMediaOptions['scale']; + browserExecutable: InternalRenderMediaOptions['browserExecutable']; + preferLossless: InternalRenderMediaOptions['preferLossless']; + enforceAudioTrack: InternalRenderMediaOptions['enforceAudioTrack']; + disallowParallelEncoding: InternalRenderMediaOptions['disallowParallelEncoding']; + concurrency: InternalRenderMediaOptions['concurrency']; + binariesDirectory: InternalRenderMediaOptions['binariesDirectory']; + metadata: InternalRenderMediaOptions['metadata']; + licenseKey: InternalRenderMediaOptions['licenseKey']; + codec: InternalRenderMediaOptions['codec']; + videoBitrate: InternalRenderMediaOptions['videoBitrate']; + audioBitrate: InternalRenderMediaOptions['audioBitrate']; + encodingMaxRate: InternalRenderMediaOptions['encodingMaxRate']; + encodingBufferSize: InternalRenderMediaOptions['encodingBufferSize']; + muted: InternalRenderMediaOptions['muted']; + numberOfGifLoops: InternalRenderMediaOptions['numberOfGifLoops']; + x264Preset: InternalRenderMediaOptions['x264Preset']; + colorSpace: InternalRenderMediaOptions['colorSpace']; + jpegQuality: InternalRenderMediaOptions['jpegQuality']; + audioCodec: InternalRenderMediaOptions['audioCodec']; + logLevel: InternalRenderMediaOptions['logLevel']; + timeoutInMilliseconds: InternalRenderMediaOptions['timeoutInMilliseconds']; + forSeamlessAacConcatenation: InternalRenderMediaOptions['forSeamlessAacConcatenation']; + separateAudioTo: InternalRenderMediaOptions['separateAudioTo']; + hardwareAcceleration: InternalRenderMediaOptions['hardwareAcceleration']; + chromeMode: InternalRenderMediaOptions['chromeMode']; + offthreadVideoCacheSizeInBytes: InternalRenderMediaOptions['offthreadVideoCacheSizeInBytes']; + mediaCacheSizeInBytes: InternalRenderMediaOptions['mediaCacheSizeInBytes']; + offthreadVideoThreads: InternalRenderMediaOptions['offthreadVideoThreads']; + repro: InternalRenderMediaOptions['repro']; +}; + +const config: RenderVideoConfig = JSON.parse(process.argv[2]); + +const noop = () => undefined; try { + const serializedInputProps = NoReactInternals.serializeJSONWithSpecialTypes({ + data: config.inputProps, + indent: undefined, + staticBase: null, + }).serializedString; + console.log(JSON.stringify({type: 'opening-browser'})); - const browser = await openBrowser('chrome'); - console.log(JSON.stringify({type: 'selecting-composition'})); - const composition = await selectComposition({ - serveUrl: config.serveUrl, - id: config.compositionId, - inputProps: config.inputProps, - puppeteerInstance: browser, + + const browser = await RenderInternals.internalOpenBrowser({ + browser: 'chrome', + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + forceDeviceScaleFactor: undefined, + viewport: null, + indent: false, + logLevel: config.logLevel, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, }); - await renderMedia({ + console.log(JSON.stringify({type: 'selecting-composition'})); + + const {metadata: composition} = + await RenderInternals.internalSelectComposition({ + serializedInputPropsWithCustomSchema: serializedInputProps, + envVariables: config.envVariables, + puppeteerInstance: browser, + onBrowserLog: null, + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + port: null, + indent: false, + server: undefined, + serveUrl: config.serveUrl, + id: config.compositionId, + onServeUrlVisited: noop, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + binariesDirectory: config.binariesDirectory, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + }); + + const serializedResolvedProps = + NoReactInternals.serializeJSONWithSpecialTypes({ + data: composition.props, + indent: undefined, + staticBase: null, + }).serializedString; + + await RenderInternals.internalRenderMedia({ + outputLocation: config.outputLocation, composition, + serializedInputPropsWithCustomSchema: serializedInputProps, + serializedResolvedPropsWithCustomSchema: serializedResolvedProps, serveUrl: config.serveUrl, codec: config.codec, - outputLocation: config.outputFile, - inputProps: config.inputProps, - onProgress: ({progress}) => { - console.log(JSON.stringify({type: 'progress', progress})); - }, + crf: config.crf, + imageFormat: config.imageFormat, + pixelFormat: config.pixelFormat, + envVariables: config.envVariables, + frameRange: config.frameRange, + everyNthFrame: config.everyNthFrame, + overwrite: config.overwrite, + proResProfile: config.proResProfile ?? undefined, + chromiumOptions: config.chromiumOptions, + scale: config.scale, + browserExecutable: config.browserExecutable, + preferLossless: config.preferLossless, + enforceAudioTrack: config.enforceAudioTrack, + disallowParallelEncoding: config.disallowParallelEncoding, + concurrency: config.concurrency, + binariesDirectory: config.binariesDirectory, + metadata: config.metadata, + licenseKey: config.licenseKey, + videoBitrate: config.videoBitrate, + audioBitrate: config.audioBitrate, + encodingMaxRate: config.encodingMaxRate, + encodingBufferSize: config.encodingBufferSize, + muted: config.muted, + numberOfGifLoops: config.numberOfGifLoops, + x264Preset: config.x264Preset, + colorSpace: config.colorSpace, + jpegQuality: config.jpegQuality, + audioCodec: config.audioCodec, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + forSeamlessAacConcatenation: config.forSeamlessAacConcatenation, + separateAudioTo: config.separateAudioTo, + hardwareAcceleration: config.hardwareAcceleration, + chromeMode: config.chromeMode, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + repro: config.repro, + // Non-serializable fields with defaults puppeteerInstance: browser, + onProgress: (progress) => { + console.log( + JSON.stringify({ + type: 'progress', + renderedFrames: progress.renderedFrames, + encodedFrames: progress.encodedFrames, + encodedDoneIn: progress.encodedDoneIn, + renderedDoneIn: progress.renderedDoneIn, + renderEstimatedTime: progress.renderEstimatedTime, + progress: progress.progress, + stitchStage: progress.stitchStage, + }), + ); + }, + onDownload: () => undefined, + onBrowserLog: null, + onStart: noop, + port: null, + cancelSignal: undefined, + onCtrlCExit: noop, + indent: false, + server: undefined, + ffmpegOverride: undefined, + compositionStart: 0, + onArtifact: null, + onLog: RenderInternals.defaultOnLog, + isProduction: true, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), }); console.log(JSON.stringify({type: 'render-complete'})); await browser.close({silent: false}); - const size = statSync(config.outputFile).size; + const {size} = statSync(config.outputLocation ?? '/tmp/video.mp4'); console.log(JSON.stringify({type: 'done', size})); } catch (err) { console.error((err as Error).message); diff --git a/packages/vercel/src/render-still-on-vercel.ts b/packages/vercel/src/render-still-on-vercel.ts index c912bc84e76..edd02590a3e 100644 --- a/packages/vercel/src/render-still-on-vercel.ts +++ b/packages/vercel/src/render-still-on-vercel.ts @@ -1,41 +1,92 @@ import type {Sandbox} from '@vercel/sandbox'; import {script as renderStillScript} from './internals/render-still-script'; -import type {RenderOnVercelProgress} from './types'; +import type { + ChromeMode, + ChromiumOptions, + LogLevel, + RenderOnVercelProgress, + StillImageFormat, +} from './types'; export async function renderStillOnVercel({ sandbox, compositionId, inputProps, - imageFormat = 'png', - outputFile = '/tmp/still.png', onProgress, bundleDir = '.remotion', + outputFile = '/tmp/still.png', + frame = 0, + imageFormat = 'png', + jpegQuality = 80, + envVariables = {}, + overwrite = true, + browserExecutable, + chromiumOptions = {}, + scale = 1, + logLevel = 'info', + timeoutInMilliseconds = 30000, + binariesDirectory, + chromeMode = 'headless-shell', + offthreadVideoCacheSizeInBytes, + mediaCacheSizeInBytes, + offthreadVideoThreads, + licenseKey, }: { sandbox: Sandbox; compositionId: string; inputProps: Record; - imageFormat?: 'png' | 'jpeg' | 'webp'; - outputFile?: string; onProgress?: (progress: RenderOnVercelProgress) => void; bundleDir?: string; + outputFile?: string; + frame?: number; + imageFormat?: StillImageFormat; + jpegQuality?: number; + envVariables?: Record; + overwrite?: boolean; + browserExecutable?: string | null; + chromiumOptions?: ChromiumOptions; + scale?: number; + logLevel?: LogLevel; + timeoutInMilliseconds?: number; + binariesDirectory?: string | null; + chromeMode?: ChromeMode; + offthreadVideoCacheSizeInBytes?: number | null; + mediaCacheSizeInBytes?: number | null; + offthreadVideoThreads?: number | null; + licenseKey?: string | null; }): Promise<{file: string}> { const serveUrl = `/vercel/sandbox/${bundleDir}`; - await sandbox.writeFiles([ - { - path: 'render-still.ts', - content: Buffer.from(renderStillScript), - }, - ]); - const renderConfig = { serveUrl, compositionId, inputProps, + output: outputFile, + frame, imageFormat, - outputFile, + jpegQuality, + envVariables, + overwrite, + browserExecutable: browserExecutable ?? null, + chromiumOptions, + scale, + logLevel, + timeoutInMilliseconds, + binariesDirectory: binariesDirectory ?? null, + chromeMode, + offthreadVideoCacheSizeInBytes: offthreadVideoCacheSizeInBytes ?? null, + mediaCacheSizeInBytes: mediaCacheSizeInBytes ?? null, + offthreadVideoThreads: offthreadVideoThreads ?? null, + licenseKey: licenseKey ?? null, }; + await sandbox.writeFiles([ + { + path: 'render-still.ts', + content: Buffer.from(renderStillScript), + }, + ]); + const renderCmd = await sandbox.runCommand({ cmd: 'node', args: ['--strip-types', 'render-still.ts', JSON.stringify(renderConfig)], diff --git a/packages/vercel/src/render-video-on-vercel.ts b/packages/vercel/src/render-video-on-vercel.ts index 4fb0072c956..75a84680b90 100644 --- a/packages/vercel/src/render-video-on-vercel.ts +++ b/packages/vercel/src/render-video-on-vercel.ts @@ -1,41 +1,170 @@ import type {Sandbox} from '@vercel/sandbox'; import {script as renderVideoScript} from './internals/render-video-script'; -import type {RenderOnVercelProgress} from './types'; +import type { + AudioCodec, + Bitrate, + ChromeMode, + ChromiumOptions, + Codec, + ColorSpace, + FrameRange, + HardwareAccelerationOption, + LogLevel, + PixelFormat, + ProResProfile, + RenderOnVercelProgress, + VideoImageFormat, + X264Preset, +} from './types'; export async function renderVideoOnVercel({ sandbox, compositionId, inputProps, - codec = 'h264', - outputFile = '/tmp/video.mp4', onProgress, bundleDir = '.remotion', + outputFile = '/tmp/video.mp4', + codec = 'h264', + crf, + imageFormat, + pixelFormat, + envVariables = {}, + frameRange, + everyNthFrame = 1, + overwrite = true, + proResProfile, + chromiumOptions = {}, + scale = 1, + browserExecutable, + preferLossless = false, + enforceAudioTrack = false, + disallowParallelEncoding = false, + concurrency, + binariesDirectory, + metadata, + licenseKey, + videoBitrate, + audioBitrate, + encodingMaxRate, + encodingBufferSize, + muted = false, + numberOfGifLoops, + x264Preset, + colorSpace = 'default', + jpegQuality = 80, + audioCodec, + logLevel = 'info', + timeoutInMilliseconds = 30000, + forSeamlessAacConcatenation = false, + separateAudioTo, + hardwareAcceleration = 'disable', + chromeMode = 'headless-shell', + offthreadVideoCacheSizeInBytes, + mediaCacheSizeInBytes, + offthreadVideoThreads, + repro = false, }: { sandbox: Sandbox; compositionId: string; inputProps: Record; - codec?: string; - outputFile?: string; onProgress?: (progress: RenderOnVercelProgress) => void; bundleDir?: string; + outputFile?: string; + codec?: Codec; + crf?: number | null; + imageFormat?: VideoImageFormat | null; + pixelFormat?: PixelFormat | null; + envVariables?: Record; + frameRange?: FrameRange | null; + everyNthFrame?: number; + overwrite?: boolean; + proResProfile?: ProResProfile; + chromiumOptions?: ChromiumOptions; + scale?: number; + browserExecutable?: string | null; + preferLossless?: boolean; + enforceAudioTrack?: boolean; + disallowParallelEncoding?: boolean; + concurrency?: number | string | null; + binariesDirectory?: string | null; + metadata?: Record | null; + licenseKey?: string | null; + videoBitrate?: Bitrate | null; + audioBitrate?: Bitrate | null; + encodingMaxRate?: Bitrate | null; + encodingBufferSize?: Bitrate | null; + muted?: boolean; + numberOfGifLoops?: number | null; + x264Preset?: X264Preset | null; + colorSpace?: ColorSpace; + jpegQuality?: number; + audioCodec?: AudioCodec | null; + logLevel?: LogLevel; + timeoutInMilliseconds?: number; + forSeamlessAacConcatenation?: boolean; + separateAudioTo?: string | null; + hardwareAcceleration?: HardwareAccelerationOption; + chromeMode?: ChromeMode; + offthreadVideoCacheSizeInBytes?: number | null; + mediaCacheSizeInBytes?: number | null; + offthreadVideoThreads?: number | null; + repro?: boolean; }): Promise<{file: string}> { const serveUrl = `/vercel/sandbox/${bundleDir}`; - await sandbox.writeFiles([ - { - path: 'render-video.ts', - content: Buffer.from(renderVideoScript), - }, - ]); - const renderConfig = { serveUrl, compositionId, inputProps, + outputLocation: outputFile, codec, - outputFile, + crf: crf ?? null, + imageFormat: imageFormat ?? null, + pixelFormat: pixelFormat ?? null, + envVariables, + frameRange: frameRange ?? null, + everyNthFrame, + overwrite, + proResProfile: proResProfile ?? null, + chromiumOptions, + scale, + browserExecutable: browserExecutable ?? null, + preferLossless, + enforceAudioTrack, + disallowParallelEncoding, + concurrency: concurrency ?? null, + binariesDirectory: binariesDirectory ?? null, + metadata: metadata ?? null, + licenseKey: licenseKey ?? null, + videoBitrate: videoBitrate ?? null, + audioBitrate: audioBitrate ?? null, + encodingMaxRate: encodingMaxRate ?? null, + encodingBufferSize: encodingBufferSize ?? null, + muted, + numberOfGifLoops: numberOfGifLoops ?? null, + x264Preset: x264Preset ?? null, + colorSpace, + jpegQuality, + audioCodec: audioCodec ?? null, + logLevel, + timeoutInMilliseconds, + forSeamlessAacConcatenation, + separateAudioTo: separateAudioTo ?? null, + hardwareAcceleration, + chromeMode, + offthreadVideoCacheSizeInBytes: offthreadVideoCacheSizeInBytes ?? null, + mediaCacheSizeInBytes: mediaCacheSizeInBytes ?? null, + offthreadVideoThreads: offthreadVideoThreads ?? null, + repro, }; + await sandbox.writeFiles([ + { + path: 'render-video.ts', + content: Buffer.from(renderVideoScript), + }, + ]); + const renderCmd = await sandbox.runCommand({ cmd: 'node', args: ['--strip-types', 'render-video.ts', JSON.stringify(renderConfig)], @@ -53,7 +182,13 @@ export async function renderVideoOnVercel({ } else if (message.type === 'progress') { onProgress?.({ type: 'render-progress', + renderedFrames: message.renderedFrames, + encodedFrames: message.encodedFrames, + encodedDoneIn: message.encodedDoneIn, + renderedDoneIn: message.renderedDoneIn, + renderEstimatedTime: message.renderEstimatedTime, progress: message.progress, + stitchStage: message.stitchStage, }); } } catch { diff --git a/packages/vercel/src/scripts/render-still.ts b/packages/vercel/src/scripts/render-still.ts index 949e426640c..bdaa0b9b7a5 100644 --- a/packages/vercel/src/scripts/render-still.ts +++ b/packages/vercel/src/scripts/render-still.ts @@ -1,32 +1,141 @@ -import {openBrowser, renderStill, selectComposition} from '@remotion/renderer'; +import {RenderInternals} from '@remotion/renderer'; import {statSync} from 'fs'; +import {NoReactInternals} from 'remotion/no-react'; -const config = JSON.parse(process.argv[2]); +type InternalStillOptions = Parameters< + typeof RenderInternals.internalRenderStill +>[0]; + +type RenderStillConfig = { + compositionId: string; + inputProps: Record; + output: InternalStillOptions['output']; + serveUrl: InternalStillOptions['serveUrl']; + frame: InternalStillOptions['frame']; + imageFormat: InternalStillOptions['imageFormat']; + jpegQuality: InternalStillOptions['jpegQuality']; + envVariables: InternalStillOptions['envVariables']; + overwrite: InternalStillOptions['overwrite']; + browserExecutable: InternalStillOptions['browserExecutable']; + chromiumOptions: InternalStillOptions['chromiumOptions']; + scale: InternalStillOptions['scale']; + logLevel: InternalStillOptions['logLevel']; + timeoutInMilliseconds: InternalStillOptions['timeoutInMilliseconds']; + binariesDirectory: InternalStillOptions['binariesDirectory']; + chromeMode: InternalStillOptions['chromeMode']; + offthreadVideoCacheSizeInBytes: InternalStillOptions['offthreadVideoCacheSizeInBytes']; + mediaCacheSizeInBytes: InternalStillOptions['mediaCacheSizeInBytes']; + offthreadVideoThreads: InternalStillOptions['offthreadVideoThreads']; + licenseKey: InternalStillOptions['licenseKey']; +}; + +const config: RenderStillConfig = JSON.parse(process.argv[2]); + +const noop = () => undefined; try { + const serializedInputProps = NoReactInternals.serializeJSONWithSpecialTypes({ + data: config.inputProps, + indent: undefined, + staticBase: null, + }).serializedString; + console.log(JSON.stringify({type: 'opening-browser'})); - const browser = await openBrowser('chrome'); - console.log(JSON.stringify({type: 'selecting-composition'})); - const composition = await selectComposition({ - serveUrl: config.serveUrl, - id: config.compositionId, - inputProps: config.inputProps, - puppeteerInstance: browser, + + const browser = await RenderInternals.internalOpenBrowser({ + browser: 'chrome', + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + forceDeviceScaleFactor: undefined, + viewport: null, + indent: false, + logLevel: config.logLevel, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, }); - await renderStill({ + console.log(JSON.stringify({type: 'selecting-composition'})); + + const {metadata: composition} = + await RenderInternals.internalSelectComposition({ + serializedInputPropsWithCustomSchema: serializedInputProps, + envVariables: config.envVariables, + puppeteerInstance: browser, + onBrowserLog: null, + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + port: null, + indent: false, + server: undefined, + serveUrl: config.serveUrl, + id: config.compositionId, + onServeUrlVisited: noop, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + binariesDirectory: config.binariesDirectory, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + }); + + const serializedResolvedProps = + NoReactInternals.serializeJSONWithSpecialTypes({ + data: composition.props, + indent: undefined, + staticBase: null, + }).serializedString; + + await RenderInternals.internalRenderStill({ + output: config.output, composition, + serializedInputPropsWithCustomSchema: serializedInputProps, + serializedResolvedPropsWithCustomSchema: serializedResolvedProps, serveUrl: config.serveUrl, + frame: config.frame, imageFormat: config.imageFormat, - output: config.outputFile, - inputProps: config.inputProps, + jpegQuality: config.jpegQuality, + envVariables: config.envVariables, + overwrite: config.overwrite, + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + scale: config.scale, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + binariesDirectory: config.binariesDirectory, + chromeMode: config.chromeMode, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + licenseKey: config.licenseKey, + // Non-serializable fields with defaults puppeteerInstance: browser, + onBrowserLog: null, + onDownload: null, + cancelSignal: null, + indent: false, + server: undefined, + port: null, + onArtifact: null, + onLog: RenderInternals.defaultOnLog, + isProduction: true, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), }); console.log(JSON.stringify({type: 'render-complete'})); await browser.close({silent: false}); - const size = statSync(config.outputFile).size; + const {size} = statSync(config.output ?? '/tmp/still.png'); console.log(JSON.stringify({type: 'done', size})); } catch (err) { console.error((err as Error).message); diff --git a/packages/vercel/src/scripts/render-video.ts b/packages/vercel/src/scripts/render-video.ts index 7e57d65fdac..a8e9b86cf92 100644 --- a/packages/vercel/src/scripts/render-video.ts +++ b/packages/vercel/src/scripts/render-video.ts @@ -1,35 +1,204 @@ -import {openBrowser, renderMedia, selectComposition} from '@remotion/renderer'; +import type {InternalRenderMediaOptions} from '@remotion/renderer'; +import {RenderInternals} from '@remotion/renderer'; import {statSync} from 'fs'; +import {NoReactInternals} from 'remotion/no-react'; -const config = JSON.parse(process.argv[2]); +type RenderVideoConfig = { + compositionId: string; + inputProps: Record; + outputLocation: InternalRenderMediaOptions['outputLocation']; + serveUrl: InternalRenderMediaOptions['serveUrl']; + crf: InternalRenderMediaOptions['crf']; + imageFormat: InternalRenderMediaOptions['imageFormat']; + pixelFormat: InternalRenderMediaOptions['pixelFormat']; + envVariables: InternalRenderMediaOptions['envVariables']; + frameRange: InternalRenderMediaOptions['frameRange']; + everyNthFrame: InternalRenderMediaOptions['everyNthFrame']; + overwrite: InternalRenderMediaOptions['overwrite']; + proResProfile: NonNullable< + InternalRenderMediaOptions['proResProfile'] + > | null; + chromiumOptions: InternalRenderMediaOptions['chromiumOptions']; + scale: InternalRenderMediaOptions['scale']; + browserExecutable: InternalRenderMediaOptions['browserExecutable']; + preferLossless: InternalRenderMediaOptions['preferLossless']; + enforceAudioTrack: InternalRenderMediaOptions['enforceAudioTrack']; + disallowParallelEncoding: InternalRenderMediaOptions['disallowParallelEncoding']; + concurrency: InternalRenderMediaOptions['concurrency']; + binariesDirectory: InternalRenderMediaOptions['binariesDirectory']; + metadata: InternalRenderMediaOptions['metadata']; + licenseKey: InternalRenderMediaOptions['licenseKey']; + codec: InternalRenderMediaOptions['codec']; + videoBitrate: InternalRenderMediaOptions['videoBitrate']; + audioBitrate: InternalRenderMediaOptions['audioBitrate']; + encodingMaxRate: InternalRenderMediaOptions['encodingMaxRate']; + encodingBufferSize: InternalRenderMediaOptions['encodingBufferSize']; + muted: InternalRenderMediaOptions['muted']; + numberOfGifLoops: InternalRenderMediaOptions['numberOfGifLoops']; + x264Preset: InternalRenderMediaOptions['x264Preset']; + colorSpace: InternalRenderMediaOptions['colorSpace']; + jpegQuality: InternalRenderMediaOptions['jpegQuality']; + audioCodec: InternalRenderMediaOptions['audioCodec']; + logLevel: InternalRenderMediaOptions['logLevel']; + timeoutInMilliseconds: InternalRenderMediaOptions['timeoutInMilliseconds']; + forSeamlessAacConcatenation: InternalRenderMediaOptions['forSeamlessAacConcatenation']; + separateAudioTo: InternalRenderMediaOptions['separateAudioTo']; + hardwareAcceleration: InternalRenderMediaOptions['hardwareAcceleration']; + chromeMode: InternalRenderMediaOptions['chromeMode']; + offthreadVideoCacheSizeInBytes: InternalRenderMediaOptions['offthreadVideoCacheSizeInBytes']; + mediaCacheSizeInBytes: InternalRenderMediaOptions['mediaCacheSizeInBytes']; + offthreadVideoThreads: InternalRenderMediaOptions['offthreadVideoThreads']; + repro: InternalRenderMediaOptions['repro']; +}; + +const config: RenderVideoConfig = JSON.parse(process.argv[2]); + +const noop = () => undefined; try { + const serializedInputProps = NoReactInternals.serializeJSONWithSpecialTypes({ + data: config.inputProps, + indent: undefined, + staticBase: null, + }).serializedString; + console.log(JSON.stringify({type: 'opening-browser'})); - const browser = await openBrowser('chrome'); - console.log(JSON.stringify({type: 'selecting-composition'})); - const composition = await selectComposition({ - serveUrl: config.serveUrl, - id: config.compositionId, - inputProps: config.inputProps, - puppeteerInstance: browser, + + const browser = await RenderInternals.internalOpenBrowser({ + browser: 'chrome', + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + forceDeviceScaleFactor: undefined, + viewport: null, + indent: false, + logLevel: config.logLevel, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, }); - await renderMedia({ + console.log(JSON.stringify({type: 'selecting-composition'})); + + const {metadata: composition} = + await RenderInternals.internalSelectComposition({ + serializedInputPropsWithCustomSchema: serializedInputProps, + envVariables: config.envVariables, + puppeteerInstance: browser, + onBrowserLog: null, + browserExecutable: config.browserExecutable, + chromiumOptions: config.chromiumOptions, + port: null, + indent: false, + server: undefined, + serveUrl: config.serveUrl, + id: config.compositionId, + onServeUrlVisited: noop, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + binariesDirectory: config.binariesDirectory, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), + chromeMode: config.chromeMode, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + }); + + const serializedResolvedProps = + NoReactInternals.serializeJSONWithSpecialTypes({ + data: composition.props, + indent: undefined, + staticBase: null, + }).serializedString; + + await RenderInternals.internalRenderMedia({ + outputLocation: config.outputLocation, composition, + serializedInputPropsWithCustomSchema: serializedInputProps, + serializedResolvedPropsWithCustomSchema: serializedResolvedProps, serveUrl: config.serveUrl, codec: config.codec, - outputLocation: config.outputFile, - inputProps: config.inputProps, - onProgress: ({progress}) => { - console.log(JSON.stringify({type: 'progress', progress})); - }, + crf: config.crf, + imageFormat: config.imageFormat, + pixelFormat: config.pixelFormat, + envVariables: config.envVariables, + frameRange: config.frameRange, + everyNthFrame: config.everyNthFrame, + overwrite: config.overwrite, + proResProfile: config.proResProfile ?? undefined, + chromiumOptions: config.chromiumOptions, + scale: config.scale, + browserExecutable: config.browserExecutable, + preferLossless: config.preferLossless, + enforceAudioTrack: config.enforceAudioTrack, + disallowParallelEncoding: config.disallowParallelEncoding, + concurrency: config.concurrency, + binariesDirectory: config.binariesDirectory, + metadata: config.metadata, + licenseKey: config.licenseKey, + videoBitrate: config.videoBitrate, + audioBitrate: config.audioBitrate, + encodingMaxRate: config.encodingMaxRate, + encodingBufferSize: config.encodingBufferSize, + muted: config.muted, + numberOfGifLoops: config.numberOfGifLoops, + x264Preset: config.x264Preset, + colorSpace: config.colorSpace, + jpegQuality: config.jpegQuality, + audioCodec: config.audioCodec, + logLevel: config.logLevel, + timeoutInMilliseconds: config.timeoutInMilliseconds, + forSeamlessAacConcatenation: config.forSeamlessAacConcatenation, + separateAudioTo: config.separateAudioTo, + hardwareAcceleration: config.hardwareAcceleration, + chromeMode: config.chromeMode, + offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, + mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, + offthreadVideoThreads: config.offthreadVideoThreads, + repro: config.repro, + // Non-serializable fields with defaults puppeteerInstance: browser, + onProgress: (progress) => { + console.log( + JSON.stringify({ + type: 'progress', + renderedFrames: progress.renderedFrames, + encodedFrames: progress.encodedFrames, + encodedDoneIn: progress.encodedDoneIn, + renderedDoneIn: progress.renderedDoneIn, + renderEstimatedTime: progress.renderEstimatedTime, + progress: progress.progress, + stitchStage: progress.stitchStage, + }), + ); + }, + onDownload: () => undefined, + onBrowserLog: null, + onStart: noop, + port: null, + cancelSignal: undefined, + onCtrlCExit: noop, + indent: false, + server: undefined, + ffmpegOverride: undefined, + compositionStart: 0, + onArtifact: null, + onLog: RenderInternals.defaultOnLog, + isProduction: true, + onBrowserDownload: () => ({ + version: null, + onProgress: noop, + }), }); console.log(JSON.stringify({type: 'render-complete'})); await browser.close({silent: false}); - const size = statSync(config.outputFile).size; + const {size} = statSync(config.outputLocation ?? '/tmp/video.mp4'); console.log(JSON.stringify({type: 'done', size})); } catch (err) { console.error((err as Error).message); diff --git a/packages/vercel/src/types.ts b/packages/vercel/src/types.ts index f3d2d9f586f..eb828c53514 100644 --- a/packages/vercel/src/types.ts +++ b/packages/vercel/src/types.ts @@ -7,9 +7,101 @@ export type CreateSandboxOnProgress = (update: { message: string; }) => void; +// Render option types (compatible with @remotion/renderer) + +export type Codec = + | 'h264' + | 'h265' + | 'vp8' + | 'vp9' + | 'mp3' + | 'aac' + | 'wav' + | 'prores' + | 'h264-mkv' + | 'h264-ts' + | 'gif'; + +export type VideoImageFormat = 'png' | 'jpeg' | 'none'; + +export type StillImageFormat = 'png' | 'jpeg' | 'pdf' | 'webp'; + +export type PixelFormat = + | 'yuv420p' + | 'yuva420p' + | 'yuv422p' + | 'yuv444p' + | 'yuv420p10le' + | 'yuv422p10le' + | 'yuv444p10le' + | 'yuva444p10le'; + +export type ColorSpace = 'default' | 'bt601' | 'bt709' | 'bt2020-ncl'; + +export type AudioCodec = 'pcm-16' | 'aac' | 'mp3' | 'opus'; + +export type LogLevel = 'trace' | 'verbose' | 'info' | 'warn' | 'error'; + +export type ProResProfile = + | '4444-xq' + | '4444' + | 'hq' + | 'standard' + | 'light' + | 'proxy'; + +export type ChromeMode = 'headless-shell' | 'chrome-for-testing'; + +export type HardwareAccelerationOption = 'disable' | 'if-possible' | 'required'; + +export type X264Preset = + | 'ultrafast' + | 'superfast' + | 'veryfast' + | 'faster' + | 'fast' + | 'medium' + | 'slow' + | 'slower' + | 'veryslow' + | 'placebo'; + +export type OpenGlRenderer = + | 'swangle' + | 'angle' + | 'egl' + | 'swiftshader' + | 'vulkan' + | 'angle-egl'; + +export type FrameRange = number | [number, number] | [number, null]; + +type BitrateUnit = 'k' | 'K' | 'M'; +export type Bitrate = `${number}${BitrateUnit}`; + +export type ChromiumOptions = { + ignoreCertificateErrors?: boolean; + disableWebSecurity?: boolean; + gl?: OpenGlRenderer | null; + userAgent?: string | null; + enableMultiProcessOnLinux?: boolean; + darkMode?: boolean; +}; + +export type StitchingState = 'encoding' | 'muxing'; + export type RenderOnVercelProgress = | {type: 'opening-browser'} | {type: 'selecting-composition'} - | {type: 'render-progress'; progress: number} + | { + type: 'render-progress'; + renderedFrames: number; + encodedFrames: number; + encodedDoneIn: number | null; + renderedDoneIn: number | null; + renderEstimatedTime: number; + progress: number; + stitchStage: StitchingState; + } | {type: 'uploading'} | {type: 'done'; url: string; size: number}; From c859b59b0222bc3291f13e732c3229f51ca2a5c5 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 09:23:18 +0100 Subject: [PATCH 14/70] `@remotion/vercel`: Move generated script type stubs to gitignored src/generated/ folder Bundle.ts now generates .d.ts stubs in src/generated/ instead of committing them in src/internals/. Reordered make script to run bun before tsgo so stubs exist for type-checking. Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/create-sandbox.mdx | 2 +- packages/docs/docs/vercel/index.mdx | 2 +- .../docs/vercel/render-still-on-vercel.mdx | 2 +- .../docs/vercel/render-video-on-vercel.mdx | 2 +- .../docs/docs/vercel/restore-snapshot.mdx | 2 +- packages/docs/docs/vercel/save-snapshot.mdx | 2 +- .../docs/vercel/upload-to-vercel-blob.mdx | 2 +- packages/vercel/.gitignore | 1 + packages/vercel/bundle.ts | 60 ++++- packages/vercel/package.json | 4 +- .../src/internals/ensure-browser-script.ts | 14 -- .../vercel/src/internals/install-browser.ts | 2 +- .../src/internals/render-still-script.ts | 145 ------------ .../src/internals/render-video-script.ts | 208 ------------------ packages/vercel/src/render-still-on-vercel.ts | 2 +- packages/vercel/src/render-video-on-vercel.ts | 2 +- 16 files changed, 61 insertions(+), 391 deletions(-) create mode 100644 packages/vercel/.gitignore delete mode 100644 packages/vercel/src/internals/ensure-browser-script.ts delete mode 100644 packages/vercel/src/internals/render-still-script.ts delete mode 100644 packages/vercel/src/internals/render-video-script.ts diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 5d31357ec9a..5d4cd286427 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -4,7 +4,7 @@ title: createSandbox() crumb: '@remotion/vercel' --- -# createSandbox() +# createSandbox() Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, a browser, and your Remotion bundle. diff --git a/packages/docs/docs/vercel/index.mdx b/packages/docs/docs/vercel/index.mdx index 7f910dc6a4c..95564689b36 100644 --- a/packages/docs/docs/vercel/index.mdx +++ b/packages/docs/docs/vercel/index.mdx @@ -7,7 +7,7 @@ title: '@remotion/vercel' import {TableOfContents} from './table-of-contents'; -# @remotion/vercel +# @remotion/vercel Render Remotion videos on [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox). diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index 6fcc9c71bb8..ef84bebfdd9 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -4,7 +4,7 @@ title: renderStillOnVercel() crumb: '@remotion/vercel' --- -# renderStillOnVercel() +# renderStillOnVercel() Renders a still image inside a Vercel Sandbox using [`RenderInternals.internalRenderStill()`](/docs/renderer/render-still). Writes a render script to the sandbox, executes it, and returns the output file path. diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index ad6e69d0a16..8d8c0a61f31 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -4,7 +4,7 @@ title: renderVideoOnVercel() crumb: '@remotion/vercel' --- -# renderVideoOnVercel() +# renderVideoOnVercel() Renders a video inside a Vercel Sandbox using [`RenderInternals.internalRenderMedia()`](/docs/renderer/render-media). Writes a render script to the sandbox, executes it, and returns the output file path. diff --git a/packages/docs/docs/vercel/restore-snapshot.mdx b/packages/docs/docs/vercel/restore-snapshot.mdx index 147ae6be748..5eb2512da95 100644 --- a/packages/docs/docs/vercel/restore-snapshot.mdx +++ b/packages/docs/docs/vercel/restore-snapshot.mdx @@ -4,7 +4,7 @@ title: restoreSnapshot() crumb: '@remotion/vercel' --- -# restoreSnapshot() +# restoreSnapshot() Restores a sandbox from a cached snapshot. Reads the snapshot ID from Vercel Blob storage (keyed by `VERCEL_DEPLOYMENT_ID`) and creates a sandbox from it. diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx index c7400cae4ea..b256765238d 100644 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -4,7 +4,7 @@ title: saveSnapshot() crumb: '@remotion/vercel' --- -# saveSnapshot() +# saveSnapshot() Takes a snapshot of a sandbox and saves the snapshot ID to Vercel Blob storage, keyed by the current `VERCEL_DEPLOYMENT_ID`. This allows [`restoreSnapshot()`](/docs/vercel/restore-snapshot) to restore the sandbox in production without re-creating it. diff --git a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx index 0a418a1a1d0..6b5e28ac9db 100644 --- a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx +++ b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx @@ -4,7 +4,7 @@ title: uploadToVercelBlob() crumb: '@remotion/vercel' --- -# uploadToVercelBlob() +# uploadToVercelBlob() Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage. Typically used after [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) or [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) to make the output publicly accessible. diff --git a/packages/vercel/.gitignore b/packages/vercel/.gitignore new file mode 100644 index 00000000000..c83f90a2b01 --- /dev/null +++ b/packages/vercel/.gitignore @@ -0,0 +1 @@ +src/generated diff --git a/packages/vercel/bundle.ts b/packages/vercel/bundle.ts index f6782cca641..9bf4d120a99 100644 --- a/packages/vercel/bundle.ts +++ b/packages/vercel/bundle.ts @@ -1,4 +1,5 @@ import {build} from 'bun'; +import {mkdirSync, writeFileSync} from 'fs'; import path from 'path'; if (process.env.NODE_ENV !== 'production') { @@ -7,18 +8,19 @@ if (process.env.NODE_ENV !== 'production') { console.time('Generated.'); -// Read sandbox scripts as text and generate modules that export them as strings -const scripts = [ - {name: 'render-video-script', file: 'src/scripts/render-video.ts'}, - {name: 'render-still-script', file: 'src/scripts/render-still.ts'}, - {name: 'ensure-browser-script', file: 'src/scripts/ensure-browser.ts'}, -]; - -for (const script of scripts) { - const content = await Bun.file(script.file).text(); - const escaped = content.replaceAll('\\', '\\\\').replaceAll('`', '\\`').replaceAll('$', '\\$'); - const moduleContent = `// Generated by bundle.ts - do not edit manually\nexport const script = \`${escaped}\`;\n`; - await Bun.write(`src/internals/${script.name}.ts`, moduleContent); +const scriptMap: Record = { + 'render-video-script': 'src/scripts/render-video.ts', + 'render-still-script': 'src/scripts/render-still.ts', + 'ensure-browser-script': 'src/scripts/ensure-browser.ts', +}; + +const generatedDir = path.join('src', 'generated'); +mkdirSync(generatedDir, {recursive: true}); +for (const name of Object.keys(scriptMap)) { + writeFileSync( + path.join(generatedDir, `${name}.d.ts`), + 'export declare const script: string;\n', + ); } const output = await build({ @@ -32,6 +34,40 @@ const output = await build({ '@vercel/sandbox', '@vercel/blob', ], + plugins: [ + { + name: 'script-embed', + setup(build) { + build.onResolve( + { + filter: + /(render-video-script|render-still-script|ensure-browser-script)$/, + }, + (args) => { + const name = args.path.match( + /(render-video-script|render-still-script|ensure-browser-script)$/, + )?.[1]; + return { + path: name!, + namespace: 'script-embed', + }; + }, + ); + + build.onLoad( + {namespace: 'script-embed', filter: /.*/}, + async (args) => { + const file = scriptMap[args.path]; + const content = await Bun.file(file).text(); + return { + contents: `export const script = ${JSON.stringify(content)};`, + loader: 'ts', + }; + }, + ); + }, + }, + ], }); if (!output.success) { diff --git a/packages/vercel/package.json b/packages/vercel/package.json index e7dd9ae9f4d..708e5895238 100644 --- a/packages/vercel/package.json +++ b/packages/vercel/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/vercel", - "version": "4.0.425", + "version": "4.0.426", "description": "Render Remotion videos on Vercel Sandbox", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -14,7 +14,7 @@ "formatting": "prettier src --check", "lint": "eslint src", "watch": "tsgo -w", - "make": "tsgo && bun --env-file=../.env.bundle bundle.ts" + "make": "bun --env-file=../.env.bundle bundle.ts && tsgo" }, "author": "Jonny Burger ", "contributors": [], diff --git a/packages/vercel/src/internals/ensure-browser-script.ts b/packages/vercel/src/internals/ensure-browser-script.ts deleted file mode 100644 index 3ed1f2b3c50..00000000000 --- a/packages/vercel/src/internals/ensure-browser-script.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Generated by bundle.ts - do not edit manually -export const script = `import {ensureBrowser} from '@remotion/renderer'; - -await ensureBrowser({ - onBrowserDownload: () => { - return { - version: null, - onProgress: ({percent}) => { - console.log(JSON.stringify({type: 'browser-progress', percent})); - }, - }; - }, -}); -`; diff --git a/packages/vercel/src/internals/install-browser.ts b/packages/vercel/src/internals/install-browser.ts index 2f1d902a392..3fe9eabab1b 100644 --- a/packages/vercel/src/internals/install-browser.ts +++ b/packages/vercel/src/internals/install-browser.ts @@ -1,5 +1,5 @@ import type {Sandbox} from '@vercel/sandbox'; -import {script as ensureBrowserScript} from './ensure-browser-script'; +import {script as ensureBrowserScript} from '../generated/ensure-browser-script'; export async function installBrowser({ sandbox, diff --git a/packages/vercel/src/internals/render-still-script.ts b/packages/vercel/src/internals/render-still-script.ts deleted file mode 100644 index e7c34d5f137..00000000000 --- a/packages/vercel/src/internals/render-still-script.ts +++ /dev/null @@ -1,145 +0,0 @@ -// Generated by bundle.ts - do not edit manually -export const script = `import {RenderInternals} from '@remotion/renderer'; -import {statSync} from 'fs'; -import {NoReactInternals} from 'remotion/no-react'; - -type InternalStillOptions = Parameters< - typeof RenderInternals.internalRenderStill ->[0]; - -type RenderStillConfig = { - compositionId: string; - inputProps: Record; - output: InternalStillOptions['output']; - serveUrl: InternalStillOptions['serveUrl']; - frame: InternalStillOptions['frame']; - imageFormat: InternalStillOptions['imageFormat']; - jpegQuality: InternalStillOptions['jpegQuality']; - envVariables: InternalStillOptions['envVariables']; - overwrite: InternalStillOptions['overwrite']; - browserExecutable: InternalStillOptions['browserExecutable']; - chromiumOptions: InternalStillOptions['chromiumOptions']; - scale: InternalStillOptions['scale']; - logLevel: InternalStillOptions['logLevel']; - timeoutInMilliseconds: InternalStillOptions['timeoutInMilliseconds']; - binariesDirectory: InternalStillOptions['binariesDirectory']; - chromeMode: InternalStillOptions['chromeMode']; - offthreadVideoCacheSizeInBytes: InternalStillOptions['offthreadVideoCacheSizeInBytes']; - mediaCacheSizeInBytes: InternalStillOptions['mediaCacheSizeInBytes']; - offthreadVideoThreads: InternalStillOptions['offthreadVideoThreads']; - licenseKey: InternalStillOptions['licenseKey']; -}; - -const config: RenderStillConfig = JSON.parse(process.argv[2]); - -const noop = () => undefined; - -try { - const serializedInputProps = NoReactInternals.serializeJSONWithSpecialTypes({ - data: config.inputProps, - indent: undefined, - staticBase: null, - }).serializedString; - - console.log(JSON.stringify({type: 'opening-browser'})); - - const browser = await RenderInternals.internalOpenBrowser({ - browser: 'chrome', - browserExecutable: config.browserExecutable, - chromiumOptions: config.chromiumOptions, - forceDeviceScaleFactor: undefined, - viewport: null, - indent: false, - logLevel: config.logLevel, - onBrowserDownload: () => ({ - version: null, - onProgress: noop, - }), - chromeMode: config.chromeMode, - }); - - console.log(JSON.stringify({type: 'selecting-composition'})); - - const {metadata: composition} = - await RenderInternals.internalSelectComposition({ - serializedInputPropsWithCustomSchema: serializedInputProps, - envVariables: config.envVariables, - puppeteerInstance: browser, - onBrowserLog: null, - browserExecutable: config.browserExecutable, - chromiumOptions: config.chromiumOptions, - port: null, - indent: false, - server: undefined, - serveUrl: config.serveUrl, - id: config.compositionId, - onServeUrlVisited: noop, - logLevel: config.logLevel, - timeoutInMilliseconds: config.timeoutInMilliseconds, - binariesDirectory: config.binariesDirectory, - onBrowserDownload: () => ({ - version: null, - onProgress: noop, - }), - chromeMode: config.chromeMode, - mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, - offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, - offthreadVideoThreads: config.offthreadVideoThreads, - }); - - const serializedResolvedProps = - NoReactInternals.serializeJSONWithSpecialTypes({ - data: composition.props, - indent: undefined, - staticBase: null, - }).serializedString; - - await RenderInternals.internalRenderStill({ - output: config.output, - composition, - serializedInputPropsWithCustomSchema: serializedInputProps, - serializedResolvedPropsWithCustomSchema: serializedResolvedProps, - serveUrl: config.serveUrl, - frame: config.frame, - imageFormat: config.imageFormat, - jpegQuality: config.jpegQuality, - envVariables: config.envVariables, - overwrite: config.overwrite, - browserExecutable: config.browserExecutable, - chromiumOptions: config.chromiumOptions, - scale: config.scale, - logLevel: config.logLevel, - timeoutInMilliseconds: config.timeoutInMilliseconds, - binariesDirectory: config.binariesDirectory, - chromeMode: config.chromeMode, - offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, - mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, - offthreadVideoThreads: config.offthreadVideoThreads, - licenseKey: config.licenseKey, - // Non-serializable fields with defaults - puppeteerInstance: browser, - onBrowserLog: null, - onDownload: null, - cancelSignal: null, - indent: false, - server: undefined, - port: null, - onArtifact: null, - onLog: RenderInternals.defaultOnLog, - isProduction: true, - onBrowserDownload: () => ({ - version: null, - onProgress: noop, - }), - }); - - console.log(JSON.stringify({type: 'render-complete'})); - await browser.close({silent: false}); - - const {size} = statSync(config.output ?? '/tmp/still.png'); - console.log(JSON.stringify({type: 'done', size})); -} catch (err) { - console.error((err as Error).message); - process.exit(1); -} -`; diff --git a/packages/vercel/src/internals/render-video-script.ts b/packages/vercel/src/internals/render-video-script.ts deleted file mode 100644 index 73262d20798..00000000000 --- a/packages/vercel/src/internals/render-video-script.ts +++ /dev/null @@ -1,208 +0,0 @@ -// Generated by bundle.ts - do not edit manually -export const script = `import type {InternalRenderMediaOptions} from '@remotion/renderer'; -import {RenderInternals} from '@remotion/renderer'; -import {statSync} from 'fs'; -import {NoReactInternals} from 'remotion/no-react'; - -type RenderVideoConfig = { - compositionId: string; - inputProps: Record; - outputLocation: InternalRenderMediaOptions['outputLocation']; - serveUrl: InternalRenderMediaOptions['serveUrl']; - crf: InternalRenderMediaOptions['crf']; - imageFormat: InternalRenderMediaOptions['imageFormat']; - pixelFormat: InternalRenderMediaOptions['pixelFormat']; - envVariables: InternalRenderMediaOptions['envVariables']; - frameRange: InternalRenderMediaOptions['frameRange']; - everyNthFrame: InternalRenderMediaOptions['everyNthFrame']; - overwrite: InternalRenderMediaOptions['overwrite']; - proResProfile: NonNullable< - InternalRenderMediaOptions['proResProfile'] - > | null; - chromiumOptions: InternalRenderMediaOptions['chromiumOptions']; - scale: InternalRenderMediaOptions['scale']; - browserExecutable: InternalRenderMediaOptions['browserExecutable']; - preferLossless: InternalRenderMediaOptions['preferLossless']; - enforceAudioTrack: InternalRenderMediaOptions['enforceAudioTrack']; - disallowParallelEncoding: InternalRenderMediaOptions['disallowParallelEncoding']; - concurrency: InternalRenderMediaOptions['concurrency']; - binariesDirectory: InternalRenderMediaOptions['binariesDirectory']; - metadata: InternalRenderMediaOptions['metadata']; - licenseKey: InternalRenderMediaOptions['licenseKey']; - codec: InternalRenderMediaOptions['codec']; - videoBitrate: InternalRenderMediaOptions['videoBitrate']; - audioBitrate: InternalRenderMediaOptions['audioBitrate']; - encodingMaxRate: InternalRenderMediaOptions['encodingMaxRate']; - encodingBufferSize: InternalRenderMediaOptions['encodingBufferSize']; - muted: InternalRenderMediaOptions['muted']; - numberOfGifLoops: InternalRenderMediaOptions['numberOfGifLoops']; - x264Preset: InternalRenderMediaOptions['x264Preset']; - colorSpace: InternalRenderMediaOptions['colorSpace']; - jpegQuality: InternalRenderMediaOptions['jpegQuality']; - audioCodec: InternalRenderMediaOptions['audioCodec']; - logLevel: InternalRenderMediaOptions['logLevel']; - timeoutInMilliseconds: InternalRenderMediaOptions['timeoutInMilliseconds']; - forSeamlessAacConcatenation: InternalRenderMediaOptions['forSeamlessAacConcatenation']; - separateAudioTo: InternalRenderMediaOptions['separateAudioTo']; - hardwareAcceleration: InternalRenderMediaOptions['hardwareAcceleration']; - chromeMode: InternalRenderMediaOptions['chromeMode']; - offthreadVideoCacheSizeInBytes: InternalRenderMediaOptions['offthreadVideoCacheSizeInBytes']; - mediaCacheSizeInBytes: InternalRenderMediaOptions['mediaCacheSizeInBytes']; - offthreadVideoThreads: InternalRenderMediaOptions['offthreadVideoThreads']; - repro: InternalRenderMediaOptions['repro']; -}; - -const config: RenderVideoConfig = JSON.parse(process.argv[2]); - -const noop = () => undefined; - -try { - const serializedInputProps = NoReactInternals.serializeJSONWithSpecialTypes({ - data: config.inputProps, - indent: undefined, - staticBase: null, - }).serializedString; - - console.log(JSON.stringify({type: 'opening-browser'})); - - const browser = await RenderInternals.internalOpenBrowser({ - browser: 'chrome', - browserExecutable: config.browserExecutable, - chromiumOptions: config.chromiumOptions, - forceDeviceScaleFactor: undefined, - viewport: null, - indent: false, - logLevel: config.logLevel, - onBrowserDownload: () => ({ - version: null, - onProgress: noop, - }), - chromeMode: config.chromeMode, - }); - - console.log(JSON.stringify({type: 'selecting-composition'})); - - const {metadata: composition} = - await RenderInternals.internalSelectComposition({ - serializedInputPropsWithCustomSchema: serializedInputProps, - envVariables: config.envVariables, - puppeteerInstance: browser, - onBrowserLog: null, - browserExecutable: config.browserExecutable, - chromiumOptions: config.chromiumOptions, - port: null, - indent: false, - server: undefined, - serveUrl: config.serveUrl, - id: config.compositionId, - onServeUrlVisited: noop, - logLevel: config.logLevel, - timeoutInMilliseconds: config.timeoutInMilliseconds, - binariesDirectory: config.binariesDirectory, - onBrowserDownload: () => ({ - version: null, - onProgress: noop, - }), - chromeMode: config.chromeMode, - mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, - offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, - offthreadVideoThreads: config.offthreadVideoThreads, - }); - - const serializedResolvedProps = - NoReactInternals.serializeJSONWithSpecialTypes({ - data: composition.props, - indent: undefined, - staticBase: null, - }).serializedString; - - await RenderInternals.internalRenderMedia({ - outputLocation: config.outputLocation, - composition, - serializedInputPropsWithCustomSchema: serializedInputProps, - serializedResolvedPropsWithCustomSchema: serializedResolvedProps, - serveUrl: config.serveUrl, - codec: config.codec, - crf: config.crf, - imageFormat: config.imageFormat, - pixelFormat: config.pixelFormat, - envVariables: config.envVariables, - frameRange: config.frameRange, - everyNthFrame: config.everyNthFrame, - overwrite: config.overwrite, - proResProfile: config.proResProfile ?? undefined, - chromiumOptions: config.chromiumOptions, - scale: config.scale, - browserExecutable: config.browserExecutable, - preferLossless: config.preferLossless, - enforceAudioTrack: config.enforceAudioTrack, - disallowParallelEncoding: config.disallowParallelEncoding, - concurrency: config.concurrency, - binariesDirectory: config.binariesDirectory, - metadata: config.metadata, - licenseKey: config.licenseKey, - videoBitrate: config.videoBitrate, - audioBitrate: config.audioBitrate, - encodingMaxRate: config.encodingMaxRate, - encodingBufferSize: config.encodingBufferSize, - muted: config.muted, - numberOfGifLoops: config.numberOfGifLoops, - x264Preset: config.x264Preset, - colorSpace: config.colorSpace, - jpegQuality: config.jpegQuality, - audioCodec: config.audioCodec, - logLevel: config.logLevel, - timeoutInMilliseconds: config.timeoutInMilliseconds, - forSeamlessAacConcatenation: config.forSeamlessAacConcatenation, - separateAudioTo: config.separateAudioTo, - hardwareAcceleration: config.hardwareAcceleration, - chromeMode: config.chromeMode, - offthreadVideoCacheSizeInBytes: config.offthreadVideoCacheSizeInBytes, - mediaCacheSizeInBytes: config.mediaCacheSizeInBytes, - offthreadVideoThreads: config.offthreadVideoThreads, - repro: config.repro, - // Non-serializable fields with defaults - puppeteerInstance: browser, - onProgress: (progress) => { - console.log( - JSON.stringify({ - type: 'progress', - renderedFrames: progress.renderedFrames, - encodedFrames: progress.encodedFrames, - encodedDoneIn: progress.encodedDoneIn, - renderedDoneIn: progress.renderedDoneIn, - renderEstimatedTime: progress.renderEstimatedTime, - progress: progress.progress, - stitchStage: progress.stitchStage, - }), - ); - }, - onDownload: () => undefined, - onBrowserLog: null, - onStart: noop, - port: null, - cancelSignal: undefined, - onCtrlCExit: noop, - indent: false, - server: undefined, - ffmpegOverride: undefined, - compositionStart: 0, - onArtifact: null, - onLog: RenderInternals.defaultOnLog, - isProduction: true, - onBrowserDownload: () => ({ - version: null, - onProgress: noop, - }), - }); - - console.log(JSON.stringify({type: 'render-complete'})); - await browser.close({silent: false}); - - const {size} = statSync(config.outputLocation ?? '/tmp/video.mp4'); - console.log(JSON.stringify({type: 'done', size})); -} catch (err) { - console.error((err as Error).message); - process.exit(1); -} -`; diff --git a/packages/vercel/src/render-still-on-vercel.ts b/packages/vercel/src/render-still-on-vercel.ts index edd02590a3e..f61454657fb 100644 --- a/packages/vercel/src/render-still-on-vercel.ts +++ b/packages/vercel/src/render-still-on-vercel.ts @@ -1,5 +1,5 @@ import type {Sandbox} from '@vercel/sandbox'; -import {script as renderStillScript} from './internals/render-still-script'; +import {script as renderStillScript} from './generated/render-still-script'; import type { ChromeMode, ChromiumOptions, diff --git a/packages/vercel/src/render-video-on-vercel.ts b/packages/vercel/src/render-video-on-vercel.ts index 75a84680b90..789ac19af86 100644 --- a/packages/vercel/src/render-video-on-vercel.ts +++ b/packages/vercel/src/render-video-on-vercel.ts @@ -1,5 +1,5 @@ import type {Sandbox} from '@vercel/sandbox'; -import {script as renderVideoScript} from './internals/render-video-script'; +import {script as renderVideoScript} from './generated/render-video-script'; import type { AudioCodec, Bitrate, From c1a3f81e8e9f6e2c16c2c607953824e2ccfd149f Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 09:43:07 +0100 Subject: [PATCH 15/70] `@remotion/vercel`: Extract `addBundleToSandbox()` as a public API Co-Authored-By: Claude Opus 4.6 --- .../docs/vercel/add-bundle-to-sandbox.mdx | 52 +++++++++++++++++++ packages/docs/docs/vercel/create-sandbox.mdx | 21 ++++---- .../docs/vercel/render-still-on-vercel.mdx | 5 +- .../docs/vercel/render-video-on-vercel.mdx | 5 +- .../docs/docs/vercel/restore-snapshot.mdx | 16 ++++-- packages/docs/docs/vercel/save-snapshot.mdx | 5 +- .../docs/docs/vercel/table-of-contents.tsx | 4 ++ .../docs/vercel/upload-to-vercel-blob.mdx | 5 +- packages/docs/sidebars.ts | 1 + packages/docs/src/data/articles.ts | 9 ++++ packages/template-vercel/create-snapshot.ts | 6 ++- .../src/app/api/render/route.ts | 6 ++- packages/vercel/src/add-bundle-to-sandbox.ts | 12 +++++ packages/vercel/src/create-sandbox.ts | 32 ++++-------- packages/vercel/src/index.ts | 1 + 15 files changed, 134 insertions(+), 46 deletions(-) create mode 100644 packages/docs/docs/vercel/add-bundle-to-sandbox.mdx create mode 100644 packages/vercel/src/add-bundle-to-sandbox.ts diff --git a/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx new file mode 100644 index 00000000000..e1a09cf88df --- /dev/null +++ b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx @@ -0,0 +1,52 @@ +--- +image: /generated/articles-docs-vercel-add-bundle-to-sandbox.png +title: addBundleToSandbox() +crumb: '@remotion/vercel' +--- + +# addBundleToSandbox() + +Copies your Remotion bundle into a sandbox. Call this after [`createSandbox()`](/docs/vercel/create-sandbox) during development to add your bundle files. + +In production, prefer [`restoreSnapshot()`](/docs/vercel/restore-snapshot) which already includes the bundle. + +## Example + +```ts twoslash title="create-snapshot.ts" +// @module: es2022 +// @target: es2022 +import {addBundleToSandbox, createSandbox} from '@remotion/vercel'; +// ---cut--- +const sandbox = await createSandbox(); + +await addBundleToSandbox({ + sandbox, + bundleDir: '.remotion', +}); + +// ... use the sandbox + +await sandbox.stop(); +``` + +## Arguments + +An object with the following properties: + +### `sandbox` + +A [`VercelSandbox`](/docs/vercel/types#vercelsandbox) instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). + +### `bundleDir` + +The path to your Remotion bundle directory, relative to the current working directory. This is the output of [`npx remotion bundle`](/docs/cli/bundle). + +## Return value + +`Promise` — resolves when the bundle has been copied into the sandbox. + +## See also + +- [`createSandbox()`](/docs/vercel/create-sandbox) +- [`restoreSnapshot()`](/docs/vercel/restore-snapshot) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/add-bundle-to-sandbox.ts) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 5d4cd286427..ae9e1bc6ba7 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -6,7 +6,9 @@ crumb: '@remotion/vercel' # createSandbox() -Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, a browser, and your Remotion bundle. +Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, and a browser. + +After creating the sandbox, call [`addBundleToSandbox()`](/docs/vercel/add-bundle-to-sandbox) to copy your Remotion bundle into it. Creates a sandbox from scratch. In production, prefer [`restoreSnapshot()`](/docs/vercel/restore-snapshot) to restore from a cached snapshot instead. @@ -15,16 +17,20 @@ Creates a sandbox from scratch. In production, prefer [`restoreSnapshot()`](/doc ```ts twoslash title="create-snapshot.ts" // @module: es2022 // @target: es2022 -import {createSandbox} from '@remotion/vercel'; +import {addBundleToSandbox, createSandbox} from '@remotion/vercel'; import type {CreateSandboxOnProgress} from '@remotion/vercel'; // ---cut--- const sandbox = await createSandbox({ - bundleDir: '.remotion', onProgress: ({progress, message}) => { console.log(`${message} (${Math.round(progress * 100)}%)`); }, }); +await addBundleToSandbox({ + sandbox, + bundleDir: '.remotion', +}); + // ... use the sandbox await sandbox.stop(); @@ -34,10 +40,6 @@ await sandbox.stop(); An object with the following properties: -### `bundleDir` - -The path to your Remotion bundle directory, relative to the current working directory. This is the output of [`npx remotion bundle`](/docs/cli/bundle). - ### `onProgress?` A callback that receives progress updates during sandbox creation. @@ -66,13 +68,12 @@ You can use `await using` to automatically clean up the sandbox when it goes out // @target: es2022 import {createSandbox} from '@remotion/vercel'; // ---cut--- -await using sandbox = await createSandbox({ - bundleDir: '.remotion', -}); +await using sandbox = await createSandbox(); ``` ## See also +- [`addBundleToSandbox()`](/docs/vercel/add-bundle-to-sandbox) - [`restoreSnapshot()`](/docs/vercel/restore-snapshot) - [`saveSnapshot()`](/docs/vercel/save-snapshot) - [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/create-sandbox.ts) diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index ef84bebfdd9..1783d6d17d5 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -15,8 +15,9 @@ The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/v ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {renderStillOnVercel, createSandbox} from '@remotion/vercel'; -const sandbox = await createSandbox({bundleDir: '.remotion'}); +import {renderStillOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox(); +await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); // ---cut--- const {file} = await renderStillOnVercel({ sandbox, diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index 8d8c0a61f31..f001abfe56f 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -15,8 +15,9 @@ The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/v ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {renderVideoOnVercel, createSandbox} from '@remotion/vercel'; -const sandbox = await createSandbox({bundleDir: '.remotion'}); +import {renderVideoOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox(); +await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); // ---cut--- const {file} = await renderVideoOnVercel({ sandbox, diff --git a/packages/docs/docs/vercel/restore-snapshot.mdx b/packages/docs/docs/vercel/restore-snapshot.mdx index 5eb2512da95..d8c02ae7efc 100644 --- a/packages/docs/docs/vercel/restore-snapshot.mdx +++ b/packages/docs/docs/vercel/restore-snapshot.mdx @@ -15,11 +15,15 @@ This is the production counterpart to [`createSandbox()`](/docs/vercel/create-sa ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {createSandbox, restoreSnapshot} from '@remotion/vercel'; +import {addBundleToSandbox, createSandbox, restoreSnapshot} from '@remotion/vercel'; // ---cut--- const sandbox = process.env.VERCEL ? await restoreSnapshot() - : await createSandbox({bundleDir: '.remotion'}); + : await createSandbox(); + +if (!process.env.VERCEL) { + await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); +} // ... use the sandbox @@ -41,11 +45,15 @@ You can use `await using` to automatically clean up the sandbox when it goes out ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {createSandbox, restoreSnapshot} from '@remotion/vercel'; +import {addBundleToSandbox, createSandbox, restoreSnapshot} from '@remotion/vercel'; // ---cut--- await using sandbox = process.env.VERCEL ? await restoreSnapshot() - : await createSandbox({bundleDir: '.remotion'}); + : await createSandbox(); + +if (!process.env.VERCEL) { + await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); +} ``` ## See also diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx index b256765238d..3dd2e82566d 100644 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -15,8 +15,9 @@ Typically called during the build step (e.g. in `create-snapshot.ts`) to cache t ```ts twoslash title="create-snapshot.ts" // @module: es2022 // @target: es2022 -import {createSandbox, saveSnapshot} from '@remotion/vercel'; -const sandbox = await createSandbox({bundleDir: '.remotion'}); +import {addBundleToSandbox, createSandbox, saveSnapshot} from '@remotion/vercel'; +const sandbox = await createSandbox(); +await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); // ---cut--- const {snapshotId} = await saveSnapshot({sandbox}); console.log(`Snapshot saved: ${snapshotId}`); diff --git a/packages/docs/docs/vercel/table-of-contents.tsx b/packages/docs/docs/vercel/table-of-contents.tsx index 2ede6858f47..79ffb66b370 100644 --- a/packages/docs/docs/vercel/table-of-contents.tsx +++ b/packages/docs/docs/vercel/table-of-contents.tsx @@ -10,6 +10,10 @@ export const TableOfContents: React.FC = () => { createSandbox()

+ + addBundleToSandbox() +
Copy a Remotion bundle into a sandbox
+
saveSnapshot()
Snapshot a sandbox and save to Vercel Blob
diff --git a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx index 6b5e28ac9db..9774c0a95b5 100644 --- a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx +++ b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx @@ -13,8 +13,9 @@ Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {uploadToVercelBlob, createSandbox} from '@remotion/vercel'; -const sandbox = await createSandbox({bundleDir: '.remotion'}); +import {uploadToVercelBlob, addBundleToSandbox, createSandbox} from '@remotion/vercel'; +const sandbox = await createSandbox(); +await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); // ---cut--- const {url, size} = await uploadToVercelBlob({ sandbox, diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index 3d32302a6c2..4d1ab55537e 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -469,6 +469,7 @@ const sidebars: SidebarsConfig = { }, items: [ 'vercel/create-sandbox', + 'vercel/add-bundle-to-sandbox', 'vercel/save-snapshot', 'vercel/restore-snapshot', 'vercel/render-video-on-vercel', diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 8b7b70ff3e9..e760b99e003 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6538,6 +6538,15 @@ export const articles = [ noAi: false, slug: 'vercel', }, + { + id: 'vercel/add-bundle-to-sandbox', + title: 'addBundleToSandbox()', + relativePath: 'docs/vercel/add-bundle-to-sandbox.mdx', + compId: 'articles-docs-vercel-add-bundle-to-sandbox', + crumb: '@remotion/vercel', + noAi: false, + slug: 'vercel/add-bundle-to-sandbox', + }, { id: 'vercel/create-sandbox', title: 'createSandbox()', diff --git a/packages/template-vercel/create-snapshot.ts b/packages/template-vercel/create-snapshot.ts index 77952f9bf8d..b349dd0ac2b 100644 --- a/packages/template-vercel/create-snapshot.ts +++ b/packages/template-vercel/create-snapshot.ts @@ -1,13 +1,15 @@ -import { createSandbox, saveSnapshot } from "@remotion/vercel"; +import { addBundleToSandbox, createSandbox, saveSnapshot } from "@remotion/vercel"; const sandbox = await createSandbox({ - bundleDir: ".remotion", onProgress: ({ progress, message }) => { const pct = Math.round(progress * 100); console.log(`[create-snapshot] ${message} (${pct}%)`); }, }); +console.log("[create-snapshot] Adding Remotion bundle..."); +await addBundleToSandbox({ sandbox, bundleDir: ".remotion" }); + console.log("[create-snapshot] Taking snapshot..."); const { snapshotId } = await saveSnapshot({ sandbox }); diff --git a/packages/template-vercel/src/app/api/render/route.ts b/packages/template-vercel/src/app/api/render/route.ts index 7a2188bc360..f0740384974 100644 --- a/packages/template-vercel/src/app/api/render/route.ts +++ b/packages/template-vercel/src/app/api/render/route.ts @@ -1,4 +1,5 @@ import { + addBundleToSandbox, createSandbox, renderVideoOnVercel, restoreSnapshot, @@ -35,7 +36,6 @@ export async function POST(req: Request) { await using sandbox = process.env.VERCEL ? await restoreSnapshot() : await createSandbox({ - bundleDir: ".remotion", onProgress: ({ progress, message }) => { send({ type: "phase", @@ -46,6 +46,10 @@ export async function POST(req: Request) { }, }); + if (!process.env.VERCEL) { + await addBundleToSandbox({ sandbox, bundleDir: ".remotion" }); + } + const { file } = await renderVideoOnVercel({ sandbox, compositionId: COMP_NAME, diff --git a/packages/vercel/src/add-bundle-to-sandbox.ts b/packages/vercel/src/add-bundle-to-sandbox.ts new file mode 100644 index 00000000000..c45888eceaa --- /dev/null +++ b/packages/vercel/src/add-bundle-to-sandbox.ts @@ -0,0 +1,12 @@ +import {addBundleToSandbox as addBundleInternal} from './internals/add-bundle'; +import type {VercelSandbox} from './types'; + +export async function addBundleToSandbox({ + sandbox, + bundleDir, +}: { + sandbox: VercelSandbox; + bundleDir: string; +}): Promise { + await addBundleInternal({sandbox, bundleDir}); +} diff --git a/packages/vercel/src/create-sandbox.ts b/packages/vercel/src/create-sandbox.ts index e8ea27e1ddc..ac8d8f23319 100644 --- a/packages/vercel/src/create-sandbox.ts +++ b/packages/vercel/src/create-sandbox.ts @@ -1,4 +1,3 @@ -import {addBundleToSandbox} from './internals/add-bundle'; import {createDisposableSandbox} from './internals/disposable'; import {installBrowser} from './internals/install-browser'; import {installJsDependencies} from './internals/install-js-dependencies'; @@ -9,12 +8,10 @@ import type {CreateSandboxOnProgress, VercelSandbox} from './types'; export const SANDBOX_CREATING_TIMEOUT = 5 * 60 * 1000; export async function createSandbox({ - bundleDir, onProgress, }: { - bundleDir: string; onProgress?: CreateSandboxOnProgress; -}): Promise { +} = {}): Promise { const report = (progress: number, message: string) => { onProgress?.({progress, message}); }; @@ -25,17 +22,15 @@ export async function createSandbox({ timeout: SANDBOX_CREATING_TIMEOUT, }); - // Preparation has 3 stages with weights: - // - System dependencies: 60% - // - Copying bundle: 20% - // - Downloading browser: 20% - const WEIGHT_SYS_DEPS = 0.6; - const WEIGHT_BUNDLE = 0.2; - const WEIGHT_BROWSER = 0.2; + // Preparation has 2 stages with weights: + // - System dependencies: 75% + // - Downloading browser: 25% + const WEIGHT_SYS_DEPS = 0.75; + const WEIGHT_BROWSER = 0.25; report(0, 'Installing system dependencies...'); - // Stage 1: Install system dependencies (60%) + // Stage 1: Install system dependencies (75%) await installSystemDependencies({ sandbox, onProgress: (stageProgress: number) => { @@ -47,12 +42,7 @@ export async function createSandbox({ }, }); - report(WEIGHT_SYS_DEPS, 'Adding Remotion bundle to sandbox...'); - - // Stage 2: Copy Remotion bundle (20%) - await addBundleToSandbox({sandbox, bundleDir}); - - report(WEIGHT_SYS_DEPS + WEIGHT_BUNDLE, 'Installing JS dependencies...'); + report(WEIGHT_SYS_DEPS, 'Installing JS dependencies...'); // Install renderer and blob SDK await installJsDependencies({sandbox}); @@ -60,13 +50,13 @@ export async function createSandbox({ // Patch compositor binary for glibc 2.34 compatibility (Amazon Linux 2023) await patchCompositor({sandbox}); - // Stage 3: Download browser (20%) - report(WEIGHT_SYS_DEPS + WEIGHT_BUNDLE, 'Downloading browser...'); + // Stage 2: Download browser (25%) + report(WEIGHT_SYS_DEPS, 'Downloading browser...'); await installBrowser({ sandbox, onProgress: (browserProgress: number) => { report( - WEIGHT_SYS_DEPS + WEIGHT_BUNDLE + browserProgress * WEIGHT_BROWSER, + WEIGHT_SYS_DEPS + browserProgress * WEIGHT_BROWSER, 'Downloading browser...', ); return Promise.resolve(); diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index 9ef1a5a6f76..b5717cb26e3 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -1,3 +1,4 @@ +export {addBundleToSandbox} from './add-bundle-to-sandbox'; export {createSandbox} from './create-sandbox'; export {renderStillOnVercel} from './render-still-on-vercel'; export {renderVideoOnVercel} from './render-video-on-vercel'; From b53c943572ee14c8720d5f5fa0b429c3cabe8954 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 10:30:36 +0100 Subject: [PATCH 16/70] Update bun.lock --- bun.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lock b/bun.lock index 86b24f56049..d58761ab0f1 100644 --- a/bun.lock +++ b/bun.lock @@ -2279,7 +2279,7 @@ }, "packages/vercel": { "name": "@remotion/vercel", - "version": "4.0.425", + "version": "4.0.426", "dependencies": { "remotion": "workspace:*", }, From dc7dd5b5bdffa3280c3a593e466175216298616c Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 10:42:00 +0100 Subject: [PATCH 17/70] make a page make sense --- packages/docs/docs/vercel/create-sandbox.mdx | 47 +++++++++++++------- packages/docs/docs/vercel/index.mdx | 11 +---- packages/docs/sidebars.ts | 36 +++++++-------- 3 files changed, 52 insertions(+), 42 deletions(-) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index ae9e1bc6ba7..30a6318753f 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -6,12 +6,9 @@ crumb: '@remotion/vercel' # createSandbox() -Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, and a browser. - +Creates a new [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) with all Remotion dependencies installed, including system libraries, the compositor, and a browser. After creating the sandbox, call [`addBundleToSandbox()`](/docs/vercel/add-bundle-to-sandbox) to copy your Remotion bundle into it. -Creates a sandbox from scratch. In production, prefer [`restoreSnapshot()`](/docs/vercel/restore-snapshot) to restore from a cached snapshot instead. - ## Example ```ts twoslash title="create-snapshot.ts" @@ -46,29 +43,49 @@ A callback that receives progress updates during sandbox creation. ```ts twoslash import type {CreateSandboxOnProgress} from '@remotion/vercel'; -``` - -```ts -type CreateSandboxOnProgress = (update: { - progress: number; // 0 to 1 - message: string; // Human-readable phase description -}) => void; +// ---cut--- +const onProgress: CreateSandboxOnProgress = ({progress, message}) => { + console.log(`${message} (${Math.round(progress * 100)}%)`); +}; ``` ## Return value -A `VercelSandbox` object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support). Call `sandbox.stop()` when you are done with the sandbox. +A [`VercelSandbox`](/docs/vercel/vercel-types#vercelsandbox) object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support). -## Using `await using` +## Stopping the sandbox -You can use `await using` to automatically clean up the sandbox when it goes out of scope: +When you are done with the sandbox, you need to stop it to free resources. There are two ways to do this: -```ts twoslash title="create-snapshot.ts" +### Using `sandbox.stop()` + +Manually call `sandbox.stop()` when you are done: + +```ts twoslash title="manual-cleanup.ts" +// @module: es2022 +// @target: es2022 +import {createSandbox} from '@remotion/vercel'; +// ---cut--- +const sandbox = await createSandbox(); + +// ... use the sandbox + +await sandbox.stop(); +``` + +### Using `await using` + +Use `await using` to automatically stop the sandbox when it goes out of scope: + +```ts twoslash title="auto-cleanup.ts" // @module: es2022 // @target: es2022 import {createSandbox} from '@remotion/vercel'; // ---cut--- await using sandbox = await createSandbox(); + +// ... use the sandbox +// sandbox.stop() is called automatically ``` ## See also diff --git a/packages/docs/docs/vercel/index.mdx b/packages/docs/docs/vercel/index.mdx index 95564689b36..2cc3e777ba8 100644 --- a/packages/docs/docs/vercel/index.mdx +++ b/packages/docs/docs/vercel/index.mdx @@ -9,15 +9,8 @@ import {TableOfContents} from './table-of-contents'; # @remotion/vercel -Render Remotion videos on [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox). - - - -This package requires `@vercel/sandbox` and `@vercel/blob` as peer dependencies: - -```bash -npm i @vercel/sandbox @vercel/blob -``` +Render Remotion videos on [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox). +This package requires `@vercel/sandbox` and `@vercel/blob` as peer dependencies. ## APIs diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index 4d1ab55537e..7ad5acba1a5 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -460,24 +460,6 @@ const sidebars: SidebarsConfig = { }, items: ['light-leaks/light-leak'], }, - { - type: 'category', - label: '@remotion/vercel', - link: { - type: 'doc', - id: 'vercel/vercel-api', - }, - items: [ - 'vercel/create-sandbox', - 'vercel/add-bundle-to-sandbox', - 'vercel/save-snapshot', - 'vercel/restore-snapshot', - 'vercel/render-video-on-vercel', - 'vercel/render-still-on-vercel', - 'vercel/upload-to-vercel-blob', - 'vercel/vercel-types', - ], - }, { type: 'category', label: '@remotion/openai-whisper', @@ -735,6 +717,24 @@ const sidebars: SidebarsConfig = { ], }, + { + type: 'category', + label: '@remotion/vercel', + link: { + type: 'doc', + id: 'vercel/vercel-api', + }, + items: [ + 'vercel/create-sandbox', + 'vercel/add-bundle-to-sandbox', + 'vercel/save-snapshot', + 'vercel/restore-snapshot', + 'vercel/render-video-on-vercel', + 'vercel/render-still-on-vercel', + 'vercel/upload-to-vercel-blob', + 'vercel/vercel-types', + ], + }, { type: 'category', label: '@remotion/web-renderer', From 8a14879be12148415bb1741e0e693947e44a2364 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 10:47:23 +0100 Subject: [PATCH 18/70] remove unnecessary option --- packages/docs/docs/vercel/add-bundle-to-sandbox.mdx | 2 +- packages/docs/docs/vercel/create-sandbox.mdx | 2 +- packages/docs/docs/vercel/render-still-on-vercel.mdx | 6 +----- packages/docs/docs/vercel/render-video-on-vercel.mdx | 6 +----- packages/docs/docs/vercel/restore-snapshot.mdx | 4 ++-- packages/docs/docs/vercel/save-snapshot.mdx | 2 +- packages/docs/docs/vercel/upload-to-vercel-blob.mdx | 2 +- packages/vercel/src/internals/add-bundle.ts | 6 ++++-- packages/vercel/src/render-still-on-vercel.ts | 5 ++--- packages/vercel/src/render-video-on-vercel.ts | 5 ++--- 10 files changed, 16 insertions(+), 24 deletions(-) diff --git a/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx index e1a09cf88df..beb536b36ee 100644 --- a/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx +++ b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx @@ -21,7 +21,7 @@ const sandbox = await createSandbox(); await addBundleToSandbox({ sandbox, - bundleDir: '.remotion', + bundleDir: '/path/to/bundle', }); // ... use the sandbox diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 30a6318753f..0375299004f 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -25,7 +25,7 @@ const sandbox = await createSandbox({ await addBundleToSandbox({ sandbox, - bundleDir: '.remotion', + bundleDir: '/path/to/bundle', }); // ... use the sandbox diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index 1783d6d17d5..8fa4715f8e8 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -17,7 +17,7 @@ The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/v // @target: es2022 import {renderStillOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; const sandbox = await createSandbox(); -await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); +await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); // ---cut--- const {file} = await renderStillOnVercel({ sandbox, @@ -115,10 +115,6 @@ Remotion license key. Default: `null`. A callback that receives render progress updates. See [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel#onprogress) for the type definition. -### `bundleDir?` - -The bundle directory name in the sandbox. Default: `".remotion"`. - ## Return value An object containing: diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index f001abfe56f..8a7e063284d 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -17,7 +17,7 @@ The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/v // @target: es2022 import {renderVideoOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; const sandbox = await createSandbox(); -await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); +await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); // ---cut--- const {file} = await renderVideoOnVercel({ sandbox, @@ -229,10 +229,6 @@ type RenderOnVercelProgress = | {type: 'done'; url: string; size: number}; ``` -### `bundleDir?` - -The bundle directory name in the sandbox. Default: `".remotion"`. - ## Return value An object containing: diff --git a/packages/docs/docs/vercel/restore-snapshot.mdx b/packages/docs/docs/vercel/restore-snapshot.mdx index d8c02ae7efc..8ab3782bbcb 100644 --- a/packages/docs/docs/vercel/restore-snapshot.mdx +++ b/packages/docs/docs/vercel/restore-snapshot.mdx @@ -22,7 +22,7 @@ const sandbox = process.env.VERCEL : await createSandbox(); if (!process.env.VERCEL) { - await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); + await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); } // ... use the sandbox @@ -52,7 +52,7 @@ await using sandbox = process.env.VERCEL : await createSandbox(); if (!process.env.VERCEL) { - await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); + await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); } ``` diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx index 3dd2e82566d..df619d1aa98 100644 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ b/packages/docs/docs/vercel/save-snapshot.mdx @@ -17,7 +17,7 @@ Typically called during the build step (e.g. in `create-snapshot.ts`) to cache t // @target: es2022 import {addBundleToSandbox, createSandbox, saveSnapshot} from '@remotion/vercel'; const sandbox = await createSandbox(); -await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); +await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); // ---cut--- const {snapshotId} = await saveSnapshot({sandbox}); console.log(`Snapshot saved: ${snapshotId}`); diff --git a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx index 9774c0a95b5..62293bbd65f 100644 --- a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx +++ b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx @@ -15,7 +15,7 @@ Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage // @target: es2022 import {uploadToVercelBlob, addBundleToSandbox, createSandbox} from '@remotion/vercel'; const sandbox = await createSandbox(); -await addBundleToSandbox({sandbox, bundleDir: '.remotion'}); +await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); // ---cut--- const {url, size} = await uploadToVercelBlob({ sandbox, diff --git a/packages/vercel/src/internals/add-bundle.ts b/packages/vercel/src/internals/add-bundle.ts index 0c77a182a9b..f0163e5164e 100644 --- a/packages/vercel/src/internals/add-bundle.ts +++ b/packages/vercel/src/internals/add-bundle.ts @@ -4,6 +4,8 @@ import {existsSync} from 'fs'; import {readdir, readFile} from 'fs/promises'; import path from 'path'; +export const REMOTION_SANDBOX_BUNDLE_DIR = 'remotion-bundle'; + function ensureLocalBundle(bundleDir: string): void { if (process.env.VERCEL) { return; @@ -67,12 +69,12 @@ export const addBundleToSandbox = async ({ } for (const dir of Array.from(dirs).sort()) { - await sandbox.mkDir(bundleDir + '/' + dir); + await sandbox.mkDir(REMOTION_SANDBOX_BUNDLE_DIR + '/' + dir); } await sandbox.writeFiles( bundleFiles.map((file) => ({ - path: bundleDir + '/' + file.path, + path: REMOTION_SANDBOX_BUNDLE_DIR + '/' + file.path, content: file.content, })), ); diff --git a/packages/vercel/src/render-still-on-vercel.ts b/packages/vercel/src/render-still-on-vercel.ts index f61454657fb..f52320410e6 100644 --- a/packages/vercel/src/render-still-on-vercel.ts +++ b/packages/vercel/src/render-still-on-vercel.ts @@ -1,5 +1,6 @@ import type {Sandbox} from '@vercel/sandbox'; import {script as renderStillScript} from './generated/render-still-script'; +import {REMOTION_SANDBOX_BUNDLE_DIR} from './internals/add-bundle'; import type { ChromeMode, ChromiumOptions, @@ -13,7 +14,6 @@ export async function renderStillOnVercel({ compositionId, inputProps, onProgress, - bundleDir = '.remotion', outputFile = '/tmp/still.png', frame = 0, imageFormat = 'png', @@ -36,7 +36,6 @@ export async function renderStillOnVercel({ compositionId: string; inputProps: Record; onProgress?: (progress: RenderOnVercelProgress) => void; - bundleDir?: string; outputFile?: string; frame?: number; imageFormat?: StillImageFormat; @@ -55,7 +54,7 @@ export async function renderStillOnVercel({ offthreadVideoThreads?: number | null; licenseKey?: string | null; }): Promise<{file: string}> { - const serveUrl = `/vercel/sandbox/${bundleDir}`; + const serveUrl = `/vercel/sandbox/${REMOTION_SANDBOX_BUNDLE_DIR}`; const renderConfig = { serveUrl, diff --git a/packages/vercel/src/render-video-on-vercel.ts b/packages/vercel/src/render-video-on-vercel.ts index 789ac19af86..7becbe4fd7d 100644 --- a/packages/vercel/src/render-video-on-vercel.ts +++ b/packages/vercel/src/render-video-on-vercel.ts @@ -1,5 +1,6 @@ import type {Sandbox} from '@vercel/sandbox'; import {script as renderVideoScript} from './generated/render-video-script'; +import {REMOTION_SANDBOX_BUNDLE_DIR} from './internals/add-bundle'; import type { AudioCodec, Bitrate, @@ -22,7 +23,6 @@ export async function renderVideoOnVercel({ compositionId, inputProps, onProgress, - bundleDir = '.remotion', outputFile = '/tmp/video.mp4', codec = 'h264', crf, @@ -68,7 +68,6 @@ export async function renderVideoOnVercel({ compositionId: string; inputProps: Record; onProgress?: (progress: RenderOnVercelProgress) => void; - bundleDir?: string; outputFile?: string; codec?: Codec; crf?: number | null; @@ -110,7 +109,7 @@ export async function renderVideoOnVercel({ offthreadVideoThreads?: number | null; repro?: boolean; }): Promise<{file: string}> { - const serveUrl = `/vercel/sandbox/${bundleDir}`; + const serveUrl = `/vercel/sandbox/${REMOTION_SANDBOX_BUNDLE_DIR}`; const renderConfig = { serveUrl, From c9371ad95e7a6b328068ce7f0a7a8806ef35be1e Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 10:49:58 +0100 Subject: [PATCH 19/70] alright --- packages/docs/docs/vercel/add-bundle-to-sandbox.mdx | 5 +++-- packages/vercel/src/add-bundle-to-sandbox.ts | 4 ++-- packages/vercel/src/internals/add-bundle.ts | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx index beb536b36ee..a6c4161af90 100644 --- a/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx +++ b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx @@ -35,11 +35,12 @@ An object with the following properties: ### `sandbox` -A [`VercelSandbox`](/docs/vercel/types#vercelsandbox) instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). ### `bundleDir` -The path to your Remotion bundle directory, relative to the current working directory. This is the output of [`npx remotion bundle`](/docs/cli/bundle). +The path to your Remotion bundle directory, relative to the current working directory. +A bundle can be created using the [`npx remotion bundle`](/docs/cli/bundle) command, or using the [`bundle()`](/docs/bundle) API. ## Return value diff --git a/packages/vercel/src/add-bundle-to-sandbox.ts b/packages/vercel/src/add-bundle-to-sandbox.ts index c45888eceaa..9a1b4936eff 100644 --- a/packages/vercel/src/add-bundle-to-sandbox.ts +++ b/packages/vercel/src/add-bundle-to-sandbox.ts @@ -1,11 +1,11 @@ +import type {Sandbox} from '@vercel/sandbox'; import {addBundleToSandbox as addBundleInternal} from './internals/add-bundle'; -import type {VercelSandbox} from './types'; export async function addBundleToSandbox({ sandbox, bundleDir, }: { - sandbox: VercelSandbox; + sandbox: Sandbox; bundleDir: string; }): Promise { await addBundleInternal({sandbox, bundleDir}); diff --git a/packages/vercel/src/internals/add-bundle.ts b/packages/vercel/src/internals/add-bundle.ts index f0163e5164e..7f03f6f5aa9 100644 --- a/packages/vercel/src/internals/add-bundle.ts +++ b/packages/vercel/src/internals/add-bundle.ts @@ -54,7 +54,7 @@ export const addBundleToSandbox = async ({ sandbox, bundleDir, }: { - sandbox: Sandbox & AsyncDisposable; + sandbox: Sandbox; bundleDir: string; }) => { ensureLocalBundle(bundleDir); From 450a9a8cd94b3cb00ffa208874f78e2261c3fa47 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 10:56:32 +0100 Subject: [PATCH 20/70] Remove saveSnapshot/restoreSnapshot APIs, inline into template-vercel These don't need to be part of the public @remotion/vercel API. The snapshot logic is now inlined directly in the template. Co-Authored-By: Claude Opus 4.6 --- .../docs/vercel/add-bundle-to-sandbox.mdx | 5 +- packages/docs/docs/vercel/create-sandbox.mdx | 2 - .../docs/docs/vercel/restore-snapshot.mdx | 63 ------------------- packages/docs/docs/vercel/save-snapshot.mdx | 50 --------------- .../docs/docs/vercel/table-of-contents.tsx | 8 --- packages/docs/docs/vercel/types.mdx | 2 +- packages/docs/sidebars.ts | 2 - packages/docs/src/data/articles.ts | 18 ------ packages/template-vercel/create-snapshot.ts | 15 ++++- .../src/app/api/render/route.ts | 39 +++++++++++- packages/vercel/src/index.ts | 2 - packages/vercel/src/restore-snapshot.ts | 35 ----------- packages/vercel/src/save-snapshot.ts | 32 ---------- 13 files changed, 52 insertions(+), 221 deletions(-) delete mode 100644 packages/docs/docs/vercel/restore-snapshot.mdx delete mode 100644 packages/docs/docs/vercel/save-snapshot.mdx delete mode 100644 packages/vercel/src/restore-snapshot.ts delete mode 100644 packages/vercel/src/save-snapshot.ts diff --git a/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx index a6c4161af90..6d5a40bad72 100644 --- a/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx +++ b/packages/docs/docs/vercel/add-bundle-to-sandbox.mdx @@ -6,9 +6,7 @@ crumb: '@remotion/vercel' # addBundleToSandbox() -Copies your Remotion bundle into a sandbox. Call this after [`createSandbox()`](/docs/vercel/create-sandbox) during development to add your bundle files. - -In production, prefer [`restoreSnapshot()`](/docs/vercel/restore-snapshot) which already includes the bundle. +Copies your Remotion bundle into a sandbox. Call this after [`createSandbox()`](/docs/vercel/create-sandbox) to add your bundle files. ## Example @@ -49,5 +47,4 @@ A bundle can be created using the [`npx remotion bundle`](/docs/cli/bundle) comm ## See also - [`createSandbox()`](/docs/vercel/create-sandbox) -- [`restoreSnapshot()`](/docs/vercel/restore-snapshot) - [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/add-bundle-to-sandbox.ts) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 0375299004f..45c1b2571f0 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -91,6 +91,4 @@ await using sandbox = await createSandbox(); ## See also - [`addBundleToSandbox()`](/docs/vercel/add-bundle-to-sandbox) -- [`restoreSnapshot()`](/docs/vercel/restore-snapshot) -- [`saveSnapshot()`](/docs/vercel/save-snapshot) - [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/create-sandbox.ts) diff --git a/packages/docs/docs/vercel/restore-snapshot.mdx b/packages/docs/docs/vercel/restore-snapshot.mdx deleted file mode 100644 index 8ab3782bbcb..00000000000 --- a/packages/docs/docs/vercel/restore-snapshot.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -image: /generated/articles-docs-vercel-restore-snapshot.png -title: restoreSnapshot() -crumb: '@remotion/vercel' ---- - -# restoreSnapshot() - -Restores a sandbox from a cached snapshot. Reads the snapshot ID from Vercel Blob storage (keyed by `VERCEL_DEPLOYMENT_ID`) and creates a sandbox from it. - -This is the production counterpart to [`createSandbox()`](/docs/vercel/create-sandbox). Use `createSandbox()` during development and `restoreSnapshot()` in production. - -## Example - -```ts twoslash title="route.ts" -// @module: es2022 -// @target: es2022 -import {addBundleToSandbox, createSandbox, restoreSnapshot} from '@remotion/vercel'; -// ---cut--- -const sandbox = process.env.VERCEL - ? await restoreSnapshot() - : await createSandbox(); - -if (!process.env.VERCEL) { - await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); -} - -// ... use the sandbox - -await sandbox.stop(); -``` - -## Arguments - -None. - -## Return value - -A [`VercelSandbox`](/docs/vercel/types#vercelsandbox) object restored from the cached snapshot. Throws if no snapshot is found. - -## Using `await using` - -You can use `await using` to automatically clean up the sandbox when it goes out of scope: - -```ts twoslash title="route.ts" -// @module: es2022 -// @target: es2022 -import {addBundleToSandbox, createSandbox, restoreSnapshot} from '@remotion/vercel'; -// ---cut--- -await using sandbox = process.env.VERCEL - ? await restoreSnapshot() - : await createSandbox(); - -if (!process.env.VERCEL) { - await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); -} -``` - -## See also - -- [`createSandbox()`](/docs/vercel/create-sandbox) -- [`saveSnapshot()`](/docs/vercel/save-snapshot) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/restore-snapshot.ts) diff --git a/packages/docs/docs/vercel/save-snapshot.mdx b/packages/docs/docs/vercel/save-snapshot.mdx deleted file mode 100644 index df619d1aa98..00000000000 --- a/packages/docs/docs/vercel/save-snapshot.mdx +++ /dev/null @@ -1,50 +0,0 @@ ---- -image: /generated/articles-docs-vercel-save-snapshot.png -title: saveSnapshot() -crumb: '@remotion/vercel' ---- - -# saveSnapshot() - -Takes a snapshot of a sandbox and saves the snapshot ID to Vercel Blob storage, keyed by the current `VERCEL_DEPLOYMENT_ID`. This allows [`restoreSnapshot()`](/docs/vercel/restore-snapshot) to restore the sandbox in production without re-creating it. - -Typically called during the build step (e.g. in `create-snapshot.ts`) to cache the sandbox for production use. - -## Example - -```ts twoslash title="create-snapshot.ts" -// @module: es2022 -// @target: es2022 -import {addBundleToSandbox, createSandbox, saveSnapshot} from '@remotion/vercel'; -const sandbox = await createSandbox(); -await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); -// ---cut--- -const {snapshotId} = await saveSnapshot({sandbox}); -console.log(`Snapshot saved: ${snapshotId}`); -``` - -## Arguments - -An object with the following properties: - -### `sandbox` - -A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) instance, typically obtained from [`createSandbox()`](/docs/vercel/create-sandbox). - -### `expiration?` - -The expiration time for the snapshot in seconds. Default: `0` (never expires). - -## Return value - -An object containing: - -### `snapshotId` - -A `string` identifier for the snapshot. - -## See also - -- [`createSandbox()`](/docs/vercel/create-sandbox) -- [`restoreSnapshot()`](/docs/vercel/restore-snapshot) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/save-snapshot.ts) diff --git a/packages/docs/docs/vercel/table-of-contents.tsx b/packages/docs/docs/vercel/table-of-contents.tsx index 79ffb66b370..e7a139bd921 100644 --- a/packages/docs/docs/vercel/table-of-contents.tsx +++ b/packages/docs/docs/vercel/table-of-contents.tsx @@ -14,14 +14,6 @@ export const TableOfContents: React.FC = () => { addBundleToSandbox()
Copy a Remotion bundle into a sandbox
- - saveSnapshot() -
Snapshot a sandbox and save to Vercel Blob
-
- - restoreSnapshot() -
Restore a sandbox from a cached snapshot
-
renderVideoOnVercel()
Render a video in a sandbox
diff --git a/packages/docs/docs/vercel/types.mdx b/packages/docs/docs/vercel/types.mdx index 8379afcddd9..1c245e609d0 100644 --- a/packages/docs/docs/vercel/types.mdx +++ b/packages/docs/docs/vercel/types.mdx @@ -16,7 +16,7 @@ import type {VercelSandbox} from '@remotion/vercel'; // ^? ``` -A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support. Returned by [`createSandbox()`](/docs/vercel/create-sandbox) and [`restoreSnapshot()`](/docs/vercel/restore-snapshot). +A [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support. Returned by [`createSandbox()`](/docs/vercel/create-sandbox). ## `CreateSandboxOnProgress` diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index 7ad5acba1a5..79ce168f498 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -727,8 +727,6 @@ const sidebars: SidebarsConfig = { items: [ 'vercel/create-sandbox', 'vercel/add-bundle-to-sandbox', - 'vercel/save-snapshot', - 'vercel/restore-snapshot', 'vercel/render-video-on-vercel', 'vercel/render-still-on-vercel', 'vercel/upload-to-vercel-blob', diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index e760b99e003..0983cbf3c6a 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6583,24 +6583,6 @@ export const articles = [ noAi: false, slug: 'vercel/render-video-on-vercel', }, - { - id: 'vercel/restore-snapshot', - title: 'restoreSnapshot()', - relativePath: 'docs/vercel/restore-snapshot.mdx', - compId: 'articles-docs-vercel-restore-snapshot', - crumb: '@remotion/vercel', - noAi: false, - slug: 'vercel/restore-snapshot', - }, - { - id: 'vercel/save-snapshot', - title: 'saveSnapshot()', - relativePath: 'docs/vercel/save-snapshot.mdx', - compId: 'articles-docs-vercel-save-snapshot', - crumb: '@remotion/vercel', - noAi: false, - slug: 'vercel/save-snapshot', - }, { id: 'vercel-types', title: 'TypeScript Types Reference', diff --git a/packages/template-vercel/create-snapshot.ts b/packages/template-vercel/create-snapshot.ts index b349dd0ac2b..431248e5daf 100644 --- a/packages/template-vercel/create-snapshot.ts +++ b/packages/template-vercel/create-snapshot.ts @@ -1,4 +1,8 @@ -import { addBundleToSandbox, createSandbox, saveSnapshot } from "@remotion/vercel"; +import { put } from "@vercel/blob"; +import { addBundleToSandbox, createSandbox } from "@remotion/vercel"; + +const getSnapshotBlobKey = () => + `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? "local"}.json`; const sandbox = await createSandbox({ onProgress: ({ progress, message }) => { @@ -11,6 +15,13 @@ console.log("[create-snapshot] Adding Remotion bundle..."); await addBundleToSandbox({ sandbox, bundleDir: ".remotion" }); console.log("[create-snapshot] Taking snapshot..."); -const { snapshotId } = await saveSnapshot({ sandbox }); +const snapshot = await sandbox.snapshot({ expiration: 0 }); +const { snapshotId } = snapshot; + +await put(getSnapshotBlobKey(), JSON.stringify({ snapshotId }), { + access: "public", + contentType: "application/json", + addRandomSuffix: false, +}); console.log(`[create-snapshot] Snapshot saved: ${snapshotId} (never expires)`); diff --git a/packages/template-vercel/src/app/api/render/route.ts b/packages/template-vercel/src/app/api/render/route.ts index f0740384974..59790f8301c 100644 --- a/packages/template-vercel/src/app/api/render/route.ts +++ b/packages/template-vercel/src/app/api/render/route.ts @@ -2,9 +2,10 @@ import { addBundleToSandbox, createSandbox, renderVideoOnVercel, - restoreSnapshot, uploadToVercelBlob, } from "@remotion/vercel"; +import { head } from "@vercel/blob"; +import { Sandbox } from "@vercel/sandbox"; import { waitUntil } from "@vercel/functions"; import { COMP_NAME } from "../../../../types/constants"; import { RenderRequest } from "../../../../types/schema"; @@ -14,6 +15,41 @@ import { type RenderProgress, } from "./helpers"; +const SANDBOX_CREATING_TIMEOUT = 5 * 60 * 1000; + +const getSnapshotBlobKey = () => + `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? "local"}.json`; + +async function restoreSnapshot() { + let snapshotId: string | null = null; + + try { + const metadata = await head(getSnapshotBlobKey()); + const response = await fetch(metadata.url); + const cache: { snapshotId: string } = await response.json(); + snapshotId = cache.snapshotId; + } catch { + // ignore + } + + if (!snapshotId) { + throw new Error( + "No sandbox snapshot found. Run `bun run create-snapshot` as part of the build process.", + ); + } + + const sandbox = await Sandbox.create({ + source: { type: "snapshot", snapshotId }, + timeout: SANDBOX_CREATING_TIMEOUT, + }); + + return Object.assign(sandbox, { + [Symbol.asyncDispose]: async () => { + await sandbox.stop().catch(() => {}); + }, + }); +} + export async function POST(req: Request) { const encoder = new TextEncoder(); const stream = new TransformStream(); @@ -54,7 +90,6 @@ export async function POST(req: Request) { sandbox, compositionId: COMP_NAME, inputProps: body.inputProps, - bundleDir: ".remotion", onProgress: (update) => { switch (update.type) { case "opening-browser": diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index b5717cb26e3..b2dae89b0f3 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -2,8 +2,6 @@ export {addBundleToSandbox} from './add-bundle-to-sandbox'; export {createSandbox} from './create-sandbox'; export {renderStillOnVercel} from './render-still-on-vercel'; export {renderVideoOnVercel} from './render-video-on-vercel'; -export {restoreSnapshot} from './restore-snapshot'; -export {saveSnapshot} from './save-snapshot'; export type { AudioCodec, Bitrate, diff --git a/packages/vercel/src/restore-snapshot.ts b/packages/vercel/src/restore-snapshot.ts deleted file mode 100644 index 7c5b7784086..00000000000 --- a/packages/vercel/src/restore-snapshot.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {head} from '@vercel/blob'; -import {SANDBOX_CREATING_TIMEOUT} from './create-sandbox'; -import {createDisposableSandbox} from './internals/disposable'; -import type {VercelSandbox} from './types'; - -type SnapshotCache = { - snapshotId: string; -}; - -const getSnapshotBlobKey = () => - `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? 'local'}.json`; - -export async function restoreSnapshot(): Promise { - let snapshotId: string | null = null; - - try { - const metadata = await head(getSnapshotBlobKey()); - const response = await fetch(metadata.url); - const cache: SnapshotCache = await response.json(); - snapshotId = cache.snapshotId; - } catch { - // ignore - } - - if (!snapshotId) { - throw new Error( - 'No sandbox snapshot found. Run `bun run create-snapshot` as part of the build process.', - ); - } - - return createDisposableSandbox({ - source: {type: 'snapshot', snapshotId}, - timeout: SANDBOX_CREATING_TIMEOUT, - }); -} diff --git a/packages/vercel/src/save-snapshot.ts b/packages/vercel/src/save-snapshot.ts deleted file mode 100644 index 3bdcd86f21c..00000000000 --- a/packages/vercel/src/save-snapshot.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {put} from '@vercel/blob'; -import type {Sandbox} from '@vercel/sandbox'; - -type SnapshotCache = { - snapshotId: string; -}; - -const getSnapshotBlobKey = () => - `snapshot-cache/${process.env.VERCEL_DEPLOYMENT_ID ?? 'local'}.json`; - -export async function saveSnapshot({ - sandbox, - expiration = 0, -}: { - sandbox: Sandbox; - expiration?: number; -}): Promise<{snapshotId: string}> { - const snapshot = await sandbox.snapshot({expiration}); - const {snapshotId} = snapshot; - - const cache: SnapshotCache = { - snapshotId, - }; - - await put(getSnapshotBlobKey(), JSON.stringify(cache), { - access: 'public', - contentType: 'application/json', - addRandomSuffix: false, - }); - - return {snapshotId}; -} From 8e81e6cdfae1befe82cefd3dd3906ccdb5626753 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 11:03:50 +0100 Subject: [PATCH 21/70] alright --- .../docs/vercel/render-still-on-vercel.mdx | 32 ++--- .../docs/vercel/render-video-on-vercel.mdx | 115 ++++++++++++------ 2 files changed, 93 insertions(+), 54 deletions(-) diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index 8fa4715f8e8..dd912e6cbbf 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -45,7 +45,7 @@ Props to pass to the composition. ### `imageFormat?` -The output image format. `"png"`, `"jpeg"`, `"pdf"`, or `"webp"`. Default: `"png"`. +Which output format the image should have, either `"png"`, `"jpeg"`, `"webp"` or `"pdf"`. Default: `"png"`. ### `outputFile?` @@ -53,63 +53,63 @@ The output file path inside the sandbox. Default: `"/tmp/still.png"`. ### `frame?` -The frame number to render. Default: `0`. +Which frame should be rendered based on its number. Default: `0`. Frames are zero-indexed. ### `jpegQuality?` -JPEG quality (0–100). Only applicable when `imageFormat` is `"jpeg"`. Default: `80`. +Sets the JPEG quality - must be an integer between 0 and 100 and can only be passed if `imageFormat` is set to `"jpeg"`. Default: `80`. ### `envVariables?` -Environment variables to set during rendering. Default: `{}`. +An object containing key-value pairs of environment variables which will be injected into your Remotion project and which can be accessed by reading the global `process.env` object. Default: `{}`. ### `overwrite?` -Whether to overwrite existing output files. Default: `true`. +Whether the file should be overwritten if the output already exists. Default: `true`. ### `browserExecutable?` -Custom path to a Chrome executable. Default: `null` (use installed browser). +A string defining the absolute path on disk of the browser executable that should be used. By default Remotion will try to detect it automatically and download one if none is available. ### `chromiumOptions?` -Options for the headless Chrome instance. See [`renderStill() → chromiumOptions`](/docs/renderer/render-still#chromiumoptions). Default: `{}`. +Allows you to set certain Chromium / Google Chrome flags. See: [Chromium flags](/docs/chromium-flags). ### `scale?` -Scaling factor for the output. Default: `1`. + ### `logLevel?` -Log level for the render process. `"trace"`, `"verbose"`, `"info"`, `"warn"`, or `"error"`. Default: `"info"`. + ### `timeoutInMilliseconds?` -Timeout for delayRender() calls in milliseconds. Default: `30000`. +A number describing how long the render may take to resolve all [`delayRender()`](/docs/delay-render) calls [before it times out](/docs/timeout). Default: `30000`. ### `chromeMode?` -Chrome mode. `"headless-shell"` or `"chrome-for-testing"`. Default: `"headless-shell"`. + ### `offthreadVideoCacheSizeInBytes?` -Cache size for `` in bytes. Default: `null`. + ### `mediaCacheSizeInBytes?` -Cache size for media assets in bytes. Default: `null`. + ### `offthreadVideoThreads?` -Number of threads for `` decoding. Default: `null`. + ### `binariesDirectory?` -Custom directory for FFmpeg binaries. Default: `null`. + ### `licenseKey?` -Remotion license key. Default: `null`. + ### `onProgress?` diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index 8a7e063284d..a180601f186 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -49,7 +49,9 @@ Props to pass to the composition. ### `codec?` -The video codec to use. Default: `"h264"`. +_"h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif"_ + +Choose a suitable codec for your output media. Refer to the [Encoding guide](/docs/encoding) to find the best codec for your use case. Default: `"h264"`. ### `outputFile?` @@ -57,47 +59,67 @@ The output file path inside the sandbox. Default: `"/tmp/video.mp4"`. ### `crf?` -The Constant Rate Factor, controlling quality. See [`renderMedia() → crf`](/docs/renderer/render-media#crf). Default: `null` (codec default). +_number | null_ + +The constant rate factor, controlling the quality. See: [Controlling quality using the CRF setting.](/docs/encoding/#controlling-quality-using-the-crf-setting) ### `imageFormat?` -The image format for intermediate frames. `"png"`, `"jpeg"`, or `"none"`. Default: `null` (codec default). +_"jpeg" | "png" | "none"_ + +In which image format the frames should be rendered. + +- `jpeg` is the default and is fastest +- `png` if you want to [render transparent videos](/docs/transparent-videos/) +- `none` if you are rendering audio ### `pixelFormat?` -The pixel format for the output video. Default: `null` (codec default). +_string_ + +[A custom pixel format to use.](/docs/transparent-videos/) Usually used for special use cases like transparent videos. ### `envVariables?` -Environment variables to set during rendering. Default: `{}`. +`Record` + +An object containing environment variables to be injected in your project. + +See: [Environment variables](/docs/env-variables/) ### `frameRange?` -A specific frame range to render. Can be a single frame number, a `[start, end]` tuple, or `[start, null]` for open-ended. Default: `null` (render all frames). +_number | [number, number] | [number, null]_ + +Specify a single frame (passing a `number`) or a range of frames (passing a tuple `[number, number]`) to be rendered. By passing `null` (default) all frames of a composition get rendered. ### `everyNthFrame?` -Render only every nth frame. Default: `1`. +Renders only every nth frame. For example only every second frame, every third frame and so on. Only works for rendering GIFs. [See here for more details.](/docs/render-as-gif) Default: `1`. ### `overwrite?` -Whether to overwrite existing output files. Default: `true`. +_boolean_ + +If set to false, the output file will not be written if a file already exists. Default: `true`. ### `proResProfile?` -The ProRes profile to use when `codec` is `"prores"`. One of `"4444-xq"`, `"4444"`, `"hq"`, `"standard"`, `"light"`, `"proxy"`. +_string_ + +Sets a ProRes profile. Only applies to videos rendered with `prores` codec. See [Encoding guide](/docs/encoding/#controlling-quality-using-prores-profile) for possible options. ### `chromiumOptions?` -Options for the headless Chrome instance. See [`renderMedia() → chromiumOptions`](/docs/renderer/render-media#chromiumoptions). Default: `{}`. +Allows you to set certain Chromium / Google Chrome flags. See: [Chromium flags](/docs/chromium-flags). ### `scale?` -Scaling factor for the output. Default: `1`. + ### `browserExecutable?` -Custom path to a Chrome executable. Default: `null` (use installed browser). +A string defining the absolute path on disk of the browser executable that should be used. By default Remotion will try to detect it automatically and download one if none is available. ### `preferLossless?` @@ -105,107 +127,124 @@ Prefer lossless audio encoding when possible. Default: `false`. ### `enforceAudioTrack?` -Enforce an audio track even if the video has no audio. Default: `false`. +_boolean_ + +Render a silent audio track if there wouldn't be any otherwise. Default: `false`. ### `disallowParallelEncoding?` -Disable parallel encoding. Default: `false`. +Disallows the renderer from doing rendering frames and encoding at the same time. This makes the rendering process more memory-efficient, but possibly slower. Default: `false`. ### `concurrency?` -Number of frames to render concurrently. Default: `null` (auto). +A `number` specifying how many render processes should be started in parallel, a `string` specifying the percentage of the CPU threads to use, or `null` to let Remotion decide based on the CPU of the host machine. Default: `null`. ### `metadata?` -Key-value metadata to embed in the output file. Default: `null`. + ### `logLevel?` -Log level for the render process. `"trace"`, `"verbose"`, `"info"`, `"warn"`, or `"error"`. Default: `"info"`. + ### `timeoutInMilliseconds?` -Timeout for delayRender() calls in milliseconds. Default: `30000`. +A number describing how long the render may take to resolve all [`delayRender()`](/docs/delay-render) calls [before it times out](/docs/timeout). Default: `30000`. ### `videoBitrate?` -Target video bitrate, e.g. `"1000k"` or `"10M"`. Default: `null`. + ### `audioBitrate?` -Target audio bitrate, e.g. `"128k"`. Default: `null`. + ### `audioCodec?` -The audio codec. `"pcm-16"`, `"aac"`, `"mp3"`, or `"opus"`. Default: `null` (derived from video codec). +_"pcm-16" | "aac" | "mp3" | "opus"_ + +Choose the encoding of your audio. + +- The default is dependent on the chosen `codec`. +- Choose `pcm-16` if you need uncompressed audio. +- Not all video containers support all audio codecs. +- This option takes precedence if the `codec` option also specifies an audio codec. + +Refer to the [Encoding guide](/docs/encoding/#audio-codec) to see defaults and supported combinations. ### `encodingMaxRate?` -Maximum encoding bitrate for VBR encoding. Default: `null`. + ### `encodingBufferSize?` -Encoding buffer size for VBR encoding. Default: `null`. + ### `muted?` -Render without audio. Default: `false`. +_boolean_ + +If set to true, no audio is being rendered. Default: `false`. ### `numberOfGifLoops?` -Number of loops for GIF output. Default: `null`. + ### `x264Preset?` -The x264 preset when using H.264 codec. Default: `null`. + ### `colorSpace?` -The color space. `"default"`, `"bt601"`, `"bt709"`, or `"bt2020-ncl"`. Default: `"default"`. + ### `jpegQuality?` -JPEG quality for intermediate frames (0–100). Default: `80`. +_number_ + +Sets the quality of the generated JPEG images. Must be an integer between 0 and 100. Default is `80`. + +Only applies if `imageFormat` is `'jpeg'`, otherwise this option is invalid. ### `forSeamlessAacConcatenation?` -Optimize AAC audio for seamless concatenation. Default: `false`. + ### `separateAudioTo?` -Write the audio track to a separate file. Default: `null`. + ### `hardwareAcceleration?` -Hardware acceleration mode. `"disable"`, `"if-possible"`, or `"required"`. Default: `"disable"`. + ### `chromeMode?` -Chrome mode. `"headless-shell"` or `"chrome-for-testing"`. Default: `"headless-shell"`. + ### `offthreadVideoCacheSizeInBytes?` -Cache size for `` in bytes. Default: `null`. + ### `mediaCacheSizeInBytes?` -Cache size for media assets in bytes. Default: `null`. + ### `offthreadVideoThreads?` -Number of threads for `` decoding. Default: `null`. + ### `repro?` -Enable repro mode for debugging. Default: `false`. + ### `binariesDirectory?` -Custom directory for FFmpeg binaries. Default: `null`. + ### `licenseKey?` -Remotion license key. Default: `null`. + ### `onProgress?` From 6b9c48b02c936d47da0e37f5387dcccb5b546c1a Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 11:15:48 +0100 Subject: [PATCH 22/70] bunch of simplifications --- packages/docs/docs/vercel/index.mdx | 2 +- .../docs/vercel/render-still-on-vercel.mdx | 3 +- .../docs/vercel/render-video-on-vercel.mdx | 31 +++++------- packages/vercel/bundle.ts | 5 +- packages/vercel/package.json | 1 - packages/vercel/src/create-sandbox.ts | 17 ++++++- packages/vercel/src/render-still-on-vercel.ts | 8 --- packages/vercel/src/render-video-on-vercel.ts | 8 --- packages/vercel/src/scripts/upload-blob.ts | 32 ++++++++++++ packages/vercel/src/upload-to-vercel-blob.ts | 49 ++----------------- 10 files changed, 67 insertions(+), 89 deletions(-) create mode 100644 packages/vercel/src/scripts/upload-blob.ts diff --git a/packages/docs/docs/vercel/index.mdx b/packages/docs/docs/vercel/index.mdx index 2cc3e777ba8..65044ed87eb 100644 --- a/packages/docs/docs/vercel/index.mdx +++ b/packages/docs/docs/vercel/index.mdx @@ -10,7 +10,7 @@ import {TableOfContents} from './table-of-contents'; # @remotion/vercel Render Remotion videos on [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox). -This package requires `@vercel/sandbox` and `@vercel/blob` as peer dependencies. +This package requires `@vercel/sandbox` as a peer dependency. ## APIs diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index dd912e6cbbf..2ce41a8672c 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -6,7 +6,7 @@ crumb: '@remotion/vercel' # renderStillOnVercel() -Renders a still image inside a Vercel Sandbox using [`RenderInternals.internalRenderStill()`](/docs/renderer/render-still). Writes a render script to the sandbox, executes it, and returns the output file path. +Renders a still image inside a Vercel Sandbox. The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) to upload it to Vercel Blob. @@ -17,7 +17,6 @@ The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/v // @target: es2022 import {renderStillOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; const sandbox = await createSandbox(); -await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); // ---cut--- const {file} = await renderStillOnVercel({ sandbox, diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index a180601f186..65e0eecf336 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -6,7 +6,7 @@ crumb: '@remotion/vercel' # renderVideoOnVercel() -Renders a video inside a Vercel Sandbox using [`RenderInternals.internalRenderMedia()`](/docs/renderer/render-media). Writes a render script to the sandbox, executes it, and returns the output file path. +Renders a video inside a Vercel Sandbox. The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) to upload it to Vercel Blob. @@ -17,7 +17,6 @@ The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/v // @target: es2022 import {renderVideoOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; const sandbox = await createSandbox(); -await addBundleToSandbox({sandbox, bundleDir: '/path/to/bundle'}); // ---cut--- const {file} = await renderVideoOnVercel({ sandbox, @@ -248,24 +247,16 @@ Only applies if `imageFormat` is `'jpeg'`, otherwise this option is invalid. ### `onProgress?` -A callback that receives render progress updates. - -```ts -type RenderOnVercelProgress = - | {type: 'opening-browser'} - | {type: 'selecting-composition'} - | { - type: 'render-progress'; - renderedFrames: number; - encodedFrames: number; - encodedDoneIn: number | null; - renderedDoneIn: number | null; - renderEstimatedTime: number; - progress: number; - stitchStage: 'encoding' | 'muxing'; - } - | {type: 'uploading'} - | {type: 'done'; url: string; size: number}; +A callback that receives [`RenderOnVercelProgress`](/docs/vercel/vercel-types#renderonvercelprogress) updates. + +```ts twoslash +import type {RenderOnVercelProgress} from '@remotion/vercel'; +// ---cut--- +const onProgress = (update: RenderOnVercelProgress) => { + if (update.type === 'render-progress') { + console.log(`Rendering: ${Math.round(update.progress * 100)}%`); + } +}; ``` ## Return value diff --git a/packages/vercel/bundle.ts b/packages/vercel/bundle.ts index 9bf4d120a99..e1a716b3e2b 100644 --- a/packages/vercel/bundle.ts +++ b/packages/vercel/bundle.ts @@ -12,6 +12,7 @@ const scriptMap: Record = { 'render-video-script': 'src/scripts/render-video.ts', 'render-still-script': 'src/scripts/render-still.ts', 'ensure-browser-script': 'src/scripts/ensure-browser.ts', + 'upload-blob-script': 'src/scripts/upload-blob.ts', }; const generatedDir = path.join('src', 'generated'); @@ -41,11 +42,11 @@ const output = await build({ build.onResolve( { filter: - /(render-video-script|render-still-script|ensure-browser-script)$/, + /(render-video-script|render-still-script|ensure-browser-script|upload-blob-script)$/, }, (args) => { const name = args.path.match( - /(render-video-script|render-still-script|ensure-browser-script)$/, + /(render-video-script|render-still-script|ensure-browser-script|upload-blob-script)$/, )?.[1]; return { path: name!, diff --git a/packages/vercel/package.json b/packages/vercel/package.json index 708e5895238..fbdc686cba3 100644 --- a/packages/vercel/package.json +++ b/packages/vercel/package.json @@ -26,7 +26,6 @@ "remotion": "workspace:*" }, "peerDependencies": { - "@vercel/blob": ">=2.0.0", "@vercel/sandbox": ">=1.0.0" }, "exports": { diff --git a/packages/vercel/src/create-sandbox.ts b/packages/vercel/src/create-sandbox.ts index ac8d8f23319..c0435d13545 100644 --- a/packages/vercel/src/create-sandbox.ts +++ b/packages/vercel/src/create-sandbox.ts @@ -1,3 +1,6 @@ +import {script as renderStillScript} from './generated/render-still-script'; +import {script as renderVideoScript} from './generated/render-video-script'; +import {script as uploadBlobScript} from './generated/upload-blob-script'; import {createDisposableSandbox} from './internals/disposable'; import {installBrowser} from './internals/install-browser'; import {installJsDependencies} from './internals/install-js-dependencies'; @@ -63,12 +66,24 @@ export async function createSandbox({ }, }); - // Write package.json (module type) so scripts can use ESM imports + // Write package.json and scripts so they're ready to use await sandbox.writeFiles([ { path: 'package.json', content: Buffer.from(JSON.stringify({type: 'module'})), }, + { + path: 'render-video.ts', + content: Buffer.from(renderVideoScript), + }, + { + path: 'render-still.ts', + content: Buffer.from(renderStillScript), + }, + { + path: 'upload-blob.ts', + content: Buffer.from(uploadBlobScript), + }, ]); report(1, 'Sandbox ready'); diff --git a/packages/vercel/src/render-still-on-vercel.ts b/packages/vercel/src/render-still-on-vercel.ts index f52320410e6..201edf52bd3 100644 --- a/packages/vercel/src/render-still-on-vercel.ts +++ b/packages/vercel/src/render-still-on-vercel.ts @@ -1,5 +1,4 @@ import type {Sandbox} from '@vercel/sandbox'; -import {script as renderStillScript} from './generated/render-still-script'; import {REMOTION_SANDBOX_BUNDLE_DIR} from './internals/add-bundle'; import type { ChromeMode, @@ -79,13 +78,6 @@ export async function renderStillOnVercel({ licenseKey: licenseKey ?? null, }; - await sandbox.writeFiles([ - { - path: 'render-still.ts', - content: Buffer.from(renderStillScript), - }, - ]); - const renderCmd = await sandbox.runCommand({ cmd: 'node', args: ['--strip-types', 'render-still.ts', JSON.stringify(renderConfig)], diff --git a/packages/vercel/src/render-video-on-vercel.ts b/packages/vercel/src/render-video-on-vercel.ts index 7becbe4fd7d..e68678cdcf0 100644 --- a/packages/vercel/src/render-video-on-vercel.ts +++ b/packages/vercel/src/render-video-on-vercel.ts @@ -1,5 +1,4 @@ import type {Sandbox} from '@vercel/sandbox'; -import {script as renderVideoScript} from './generated/render-video-script'; import {REMOTION_SANDBOX_BUNDLE_DIR} from './internals/add-bundle'; import type { AudioCodec, @@ -157,13 +156,6 @@ export async function renderVideoOnVercel({ repro, }; - await sandbox.writeFiles([ - { - path: 'render-video.ts', - content: Buffer.from(renderVideoScript), - }, - ]); - const renderCmd = await sandbox.runCommand({ cmd: 'node', args: ['--strip-types', 'render-video.ts', JSON.stringify(renderConfig)], diff --git a/packages/vercel/src/scripts/upload-blob.ts b/packages/vercel/src/scripts/upload-blob.ts new file mode 100644 index 00000000000..ea4d45ad634 --- /dev/null +++ b/packages/vercel/src/scripts/upload-blob.ts @@ -0,0 +1,32 @@ +import {put} from '@vercel/blob'; +import {readFileSync, statSync} from 'fs'; + +type UploadBlobConfig = { + sandboxFilePath: string; + blobPath: string; + contentType: string; + blobToken: string; +}; + +const config: UploadBlobConfig = JSON.parse(process.argv[2]); + +try { + const fileBuffer = readFileSync(config.sandboxFilePath); + const size = statSync(config.sandboxFilePath).size; + const blob = await put(config.blobPath, fileBuffer, { + access: 'public', + contentType: config.contentType, + token: config.blobToken, + }); + + console.log( + JSON.stringify({ + type: 'done', + url: blob.downloadUrl, + size, + }), + ); +} catch (err) { + console.error((err as Error).message); + process.exit(1); +} diff --git a/packages/vercel/src/upload-to-vercel-blob.ts b/packages/vercel/src/upload-to-vercel-blob.ts index d446a502468..bc830e836ea 100644 --- a/packages/vercel/src/upload-to-vercel-blob.ts +++ b/packages/vercel/src/upload-to-vercel-blob.ts @@ -9,42 +9,6 @@ function getExtension(filePath: string): string { return filePath.slice(lastDot); } -function getUploadScript({ - sandboxFilePath, - blobPath, - contentType, - blobToken, -}: { - sandboxFilePath: string; - blobPath: string; - contentType: string; - blobToken: string; -}): string { - return `\ -import { put } from "@vercel/blob"; -import { readFileSync, statSync } from "fs"; - -try { - const fileBuffer = readFileSync(${JSON.stringify(sandboxFilePath)}); - const size = statSync(${JSON.stringify(sandboxFilePath)}).size; - const blob = await put(${JSON.stringify(blobPath)}, fileBuffer, { - access: "public", - contentType: ${JSON.stringify(contentType)}, - token: ${JSON.stringify(blobToken)}, - }); - - console.log(JSON.stringify({ - type: "done", - url: blob.downloadUrl, - size, - })); -} catch (err) { - console.error(err.message); - process.exit(1); -} -`; -} - export async function uploadToVercelBlob({ sandbox, sandboxFilePath, @@ -62,23 +26,16 @@ export async function uploadToVercelBlob({ blobPath ?? `renders/${crypto.randomUUID()}${getExtension(sandboxFilePath)}`; - const uploadScript = getUploadScript({ + const uploadConfig = { sandboxFilePath, blobPath: actualBlobPath, contentType, blobToken, - }); - - await sandbox.writeFiles([ - { - path: 'upload.ts', - content: Buffer.from(uploadScript), - }, - ]); + }; const uploadCmd = await sandbox.runCommand({ cmd: 'node', - args: ['--strip-types', 'upload.ts'], + args: ['--strip-types', 'upload-blob.ts', JSON.stringify(uploadConfig)], detached: true, }); From 0b4952f85feeea8522209aa778579fa294e1cac5 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 11:36:31 +0100 Subject: [PATCH 23/70] Fix broken links to vercel types page Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/vercel/create-sandbox.mdx | 2 +- packages/docs/docs/vercel/render-video-on-vercel.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/docs/docs/vercel/create-sandbox.mdx b/packages/docs/docs/vercel/create-sandbox.mdx index 45c1b2571f0..aaca8ba905e 100644 --- a/packages/docs/docs/vercel/create-sandbox.mdx +++ b/packages/docs/docs/vercel/create-sandbox.mdx @@ -51,7 +51,7 @@ const onProgress: CreateSandboxOnProgress = ({progress, message}) => { ## Return value -A [`VercelSandbox`](/docs/vercel/vercel-types#vercelsandbox) object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support). +A [`VercelSandbox`](/docs/vercel/types#vercelsandbox) object (a [`Sandbox`](https://vercel.com/docs/vercel-sandbox/sdk-reference#sandbox-class) with `AsyncDisposable` support). ## Stopping the sandbox diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-video-on-vercel.mdx index 65e0eecf336..59044c5e803 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-video-on-vercel.mdx @@ -247,7 +247,7 @@ Only applies if `imageFormat` is `'jpeg'`, otherwise this option is invalid. ### `onProgress?` -A callback that receives [`RenderOnVercelProgress`](/docs/vercel/vercel-types#renderonvercelprogress) updates. +A callback that receives [`RenderOnVercelProgress`](/docs/vercel/types#renderonvercelprogress) updates. ```ts twoslash import type {RenderOnVercelProgress} from '@remotion/vercel'; From 3c9f1da9f22ff63282a1a1aaada527dc495d7672 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 11:39:47 +0100 Subject: [PATCH 24/70] update cards --- packages/docs/docs/vercel/index.mdx | 2 +- packages/docs/src/data/articles.ts | 2 +- ...ticles-docs-vercel-add-bundle-to-sandbox.png | Bin 0 -> 49474 bytes ...ticles-docs-vercel-get-or-create-sandbox.png | Bin 50129 -> 0 bytes .../articles-docs-vercel-get-snapshot.png | Bin 45637 -> 0 bytes 5 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 packages/docs/static/generated/articles-docs-vercel-add-bundle-to-sandbox.png delete mode 100644 packages/docs/static/generated/articles-docs-vercel-get-or-create-sandbox.png delete mode 100644 packages/docs/static/generated/articles-docs-vercel-get-snapshot.png diff --git a/packages/docs/docs/vercel/index.mdx b/packages/docs/docs/vercel/index.mdx index 65044ed87eb..6049aa8dc7a 100644 --- a/packages/docs/docs/vercel/index.mdx +++ b/packages/docs/docs/vercel/index.mdx @@ -1,8 +1,8 @@ --- -image: /generated/articles-docs-vercel-index.png id: vercel-api slug: /vercel/api title: '@remotion/vercel' +crumb: 'API' --- import {TableOfContents} from './table-of-contents'; diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 0983cbf3c6a..9a686e04e1f 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6561,7 +6561,7 @@ export const articles = [ title: '@remotion/vercel', relativePath: 'docs/vercel/index.mdx', compId: 'articles-docs-vercel-index', - crumb: null, + crumb: 'API', noAi: false, slug: 'vercel/api', }, diff --git a/packages/docs/static/generated/articles-docs-vercel-add-bundle-to-sandbox.png b/packages/docs/static/generated/articles-docs-vercel-add-bundle-to-sandbox.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbbc8474b5d256ae4ea73cd2acb2a6e1e77ded2 GIT binary patch literal 49474 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 Io;Gy<5B$6pcK`qY literal 0 HcmV?d00001 diff --git a/packages/docs/static/generated/articles-docs-vercel-get-or-create-sandbox.png b/packages/docs/static/generated/articles-docs-vercel-get-or-create-sandbox.png deleted file mode 100644 index 73155d1c7c88d80a9e96265bd1dae704751ecb8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50129 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 OLsU7ToOR67_x}L6D?1_p diff --git a/packages/docs/static/generated/articles-docs-vercel-get-snapshot.png b/packages/docs/static/generated/articles-docs-vercel-get-snapshot.png deleted file mode 100644 index 359aeea7705bdd5279d81129303e56fcf91b4f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45637 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�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 From 7f25cf530ae6eb7b4e809b6f260f3747156cc8cf Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 11:46:09 +0100 Subject: [PATCH 25/70] Rename renderVideoOnVercel to renderMediaOnVercel Aligns with renderMediaOnLambda, renderMedia, and renderMediaOnWeb. Co-Authored-By: Claude Opus 4.6 --- ...ideo-on-vercel.mdx => render-media-on-vercel.mdx} | 12 ++++++------ packages/docs/docs/vercel/render-still-on-vercel.mdx | 4 ++-- packages/docs/docs/vercel/table-of-contents.tsx | 4 ++-- packages/docs/docs/vercel/upload-to-vercel-blob.mdx | 4 ++-- packages/docs/sidebars.ts | 2 +- packages/docs/src/data/articles.ts | 10 +++++----- packages/template-vercel/src/app/api/render/route.ts | 4 ++-- packages/vercel/src/index.ts | 2 +- ...-video-on-vercel.ts => render-media-on-vercel.ts} | 2 +- 9 files changed, 22 insertions(+), 22 deletions(-) rename packages/docs/docs/vercel/{render-video-on-vercel.mdx => render-media-on-vercel.mdx} (95%) rename packages/vercel/src/{render-video-on-vercel.ts => render-media-on-vercel.ts} (99%) diff --git a/packages/docs/docs/vercel/render-video-on-vercel.mdx b/packages/docs/docs/vercel/render-media-on-vercel.mdx similarity index 95% rename from packages/docs/docs/vercel/render-video-on-vercel.mdx rename to packages/docs/docs/vercel/render-media-on-vercel.mdx index 59044c5e803..7bc24d3d9ad 100644 --- a/packages/docs/docs/vercel/render-video-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-media-on-vercel.mdx @@ -1,10 +1,10 @@ --- -image: /generated/articles-docs-vercel-render-video-on-vercel.png -title: renderVideoOnVercel() +image: /generated/articles-docs-vercel-render-media-on-vercel.png +title: renderMediaOnVercel() crumb: '@remotion/vercel' --- -# renderVideoOnVercel() +# renderMediaOnVercel() Renders a video inside a Vercel Sandbox. @@ -15,10 +15,10 @@ The rendered file stays inside the sandbox. Use [`uploadToVercelBlob()`](/docs/v ```ts twoslash title="route.ts" // @module: es2022 // @target: es2022 -import {renderVideoOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; +import {renderMediaOnVercel, addBundleToSandbox, createSandbox} from '@remotion/vercel'; const sandbox = await createSandbox(); // ---cut--- -const {file} = await renderVideoOnVercel({ +const {file} = await renderMediaOnVercel({ sandbox, compositionId: 'MyComp', inputProps: {title: 'Hello World'}, @@ -271,4 +271,4 @@ The path to the rendered video inside the sandbox. - [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) - [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) -- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-video-on-vercel.ts) +- [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-media-on-vercel.ts) diff --git a/packages/docs/docs/vercel/render-still-on-vercel.mdx b/packages/docs/docs/vercel/render-still-on-vercel.mdx index 2ce41a8672c..e14ee3ecf8e 100644 --- a/packages/docs/docs/vercel/render-still-on-vercel.mdx +++ b/packages/docs/docs/vercel/render-still-on-vercel.mdx @@ -112,7 +112,7 @@ A number describing how long the render may take to resolve all [`delayRender()` ### `onProgress?` -A callback that receives render progress updates. See [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel#onprogress) for the type definition. +A callback that receives render progress updates. See [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#onprogress) for the type definition. ## Return value @@ -124,6 +124,6 @@ The path to the rendered still image inside the sandbox. ## See also -- [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) +- [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel) - [`uploadToVercelBlob()`](/docs/vercel/upload-to-vercel-blob) - [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/render-still-on-vercel.ts) diff --git a/packages/docs/docs/vercel/table-of-contents.tsx b/packages/docs/docs/vercel/table-of-contents.tsx index e7a139bd921..0e9cb35194e 100644 --- a/packages/docs/docs/vercel/table-of-contents.tsx +++ b/packages/docs/docs/vercel/table-of-contents.tsx @@ -14,8 +14,8 @@ export const TableOfContents: React.FC = () => { addBundleToSandbox()
Copy a Remotion bundle into a sandbox
- - renderVideoOnVercel() + + renderMediaOnVercel()
Render a video in a sandbox
diff --git a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx index 62293bbd65f..fe54084da75 100644 --- a/packages/docs/docs/vercel/upload-to-vercel-blob.mdx +++ b/packages/docs/docs/vercel/upload-to-vercel-blob.mdx @@ -6,7 +6,7 @@ crumb: '@remotion/vercel' # uploadToVercelBlob() -Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage. Typically used after [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) or [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) to make the output publicly accessible. +Uploads a file from the sandbox to [Vercel Blob](https://vercel.com/docs/storage/vercel-blob) storage. Typically used after [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel) or [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) to make the output publicly accessible. ## Example @@ -65,6 +65,6 @@ The size of the uploaded file in bytes. ## See also -- [`renderVideoOnVercel()`](/docs/vercel/render-video-on-vercel) +- [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel) - [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel) - [Source code for this function](https://github.com/remotion-dev/remotion/blob/main/packages/vercel/src/upload-to-vercel-blob.ts) diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index 79ce168f498..59e80456f3e 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -727,7 +727,7 @@ const sidebars: SidebarsConfig = { items: [ 'vercel/create-sandbox', 'vercel/add-bundle-to-sandbox', - 'vercel/render-video-on-vercel', + 'vercel/render-media-on-vercel', 'vercel/render-still-on-vercel', 'vercel/upload-to-vercel-blob', 'vercel/vercel-types', diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 9a686e04e1f..2a875ff8c7f 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -6575,13 +6575,13 @@ export const articles = [ slug: 'vercel/render-still-on-vercel', }, { - id: 'vercel/render-video-on-vercel', - title: 'renderVideoOnVercel()', - relativePath: 'docs/vercel/render-video-on-vercel.mdx', - compId: 'articles-docs-vercel-render-video-on-vercel', + id: 'vercel/render-media-on-vercel', + title: 'renderMediaOnVercel()', + relativePath: 'docs/vercel/render-media-on-vercel.mdx', + compId: 'articles-docs-vercel-render-media-on-vercel', crumb: '@remotion/vercel', noAi: false, - slug: 'vercel/render-video-on-vercel', + slug: 'vercel/render-media-on-vercel', }, { id: 'vercel-types', diff --git a/packages/template-vercel/src/app/api/render/route.ts b/packages/template-vercel/src/app/api/render/route.ts index 59790f8301c..419f473caad 100644 --- a/packages/template-vercel/src/app/api/render/route.ts +++ b/packages/template-vercel/src/app/api/render/route.ts @@ -1,7 +1,7 @@ import { addBundleToSandbox, createSandbox, - renderVideoOnVercel, + renderMediaOnVercel, uploadToVercelBlob, } from "@remotion/vercel"; import { head } from "@vercel/blob"; @@ -86,7 +86,7 @@ export async function POST(req: Request) { await addBundleToSandbox({ sandbox, bundleDir: ".remotion" }); } - const { file } = await renderVideoOnVercel({ + const { file } = await renderMediaOnVercel({ sandbox, compositionId: COMP_NAME, inputProps: body.inputProps, diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index b2dae89b0f3..e803a0f7764 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -1,7 +1,7 @@ export {addBundleToSandbox} from './add-bundle-to-sandbox'; export {createSandbox} from './create-sandbox'; export {renderStillOnVercel} from './render-still-on-vercel'; -export {renderVideoOnVercel} from './render-video-on-vercel'; +export {renderMediaOnVercel} from './render-media-on-vercel'; export type { AudioCodec, Bitrate, diff --git a/packages/vercel/src/render-video-on-vercel.ts b/packages/vercel/src/render-media-on-vercel.ts similarity index 99% rename from packages/vercel/src/render-video-on-vercel.ts rename to packages/vercel/src/render-media-on-vercel.ts index e68678cdcf0..a66d722b0fa 100644 --- a/packages/vercel/src/render-video-on-vercel.ts +++ b/packages/vercel/src/render-media-on-vercel.ts @@ -17,7 +17,7 @@ import type { X264Preset, } from './types'; -export async function renderVideoOnVercel({ +export async function renderMediaOnVercel({ sandbox, compositionId, inputProps, From ae4ee7a2eab38e55399f67fbde99129d43aad292 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 13:07:37 +0100 Subject: [PATCH 26/70] Fix formatting in @remotion/vercel index.ts Co-Authored-By: Claude Opus 4.6 --- packages/vercel/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vercel/src/index.ts b/packages/vercel/src/index.ts index e803a0f7764..50d6adfd3ec 100644 --- a/packages/vercel/src/index.ts +++ b/packages/vercel/src/index.ts @@ -1,7 +1,7 @@ export {addBundleToSandbox} from './add-bundle-to-sandbox'; export {createSandbox} from './create-sandbox'; -export {renderStillOnVercel} from './render-still-on-vercel'; export {renderMediaOnVercel} from './render-media-on-vercel'; +export {renderStillOnVercel} from './render-still-on-vercel'; export type { AudioCodec, Bitrate, From 1d2c08b5243854676cb77663673fe7d3989d2d17 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Thu, 19 Feb 2026 13:17:34 +0100 Subject: [PATCH 27/70] Clean up stale OG images, generate new ones, mention @remotion/vercel in licensing docs Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/licensing/index.mdx | 3 ++- .../articles-docs-vercel-create-snapshot.png | Bin 46664 -> 0 bytes ...icles-docs-vercel-render-media-on-vercel.png | Bin 0 -> 46080 bytes ...icles-docs-vercel-render-video-on-vercel.png | Bin 45326 -> 0 bytes .../articles-docs-vercel-restore-snapshot.png | Bin 46064 -> 0 bytes .../articles-docs-vercel-save-snapshot.png | Bin 45857 -> 0 bytes ...icles-docs-vercel-upload-to-blob-storage.png | Bin 48787 -> 0 bytes 7 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 packages/docs/static/generated/articles-docs-vercel-create-snapshot.png create mode 100644 packages/docs/static/generated/articles-docs-vercel-render-media-on-vercel.png delete mode 100644 packages/docs/static/generated/articles-docs-vercel-render-video-on-vercel.png delete mode 100644 packages/docs/static/generated/articles-docs-vercel-restore-snapshot.png delete mode 100644 packages/docs/static/generated/articles-docs-vercel-save-snapshot.png delete mode 100644 packages/docs/static/generated/articles-docs-vercel-upload-to-blob-storage.png diff --git a/packages/docs/docs/licensing/index.mdx b/packages/docs/docs/licensing/index.mdx index 0c852e9cbd4..b89dc118ad4 100644 --- a/packages/docs/docs/licensing/index.mdx +++ b/packages/docs/docs/licensing/index.mdx @@ -14,7 +14,8 @@ Also, it offers an API to programmatically check the usage in order to implement Not directly - you can directly pass the `licenseKey` option to track a render. -**For [`@remotion/lambda`](/docs/lambda)**: Pass the `licenseKey` option to [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#licensekey) and [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#licensekey) to trigger an event. +**For [`@remotion/lambda`](/docs/lambda)**: Pass the `licenseKey` option to [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#licensekey) and [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#licensekey) to trigger an event. +**For [`@remotion/vercel`](/docs/vercel/api)**: Pass the `licenseKey` option to [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#licensekey) and [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#licensekey) to trigger an event. **For [`@remotion/renderer`](/docs/renderer)**: Pass the `licenseKey` option to [`renderMedia()`](/docs/renderer/render-media#licensekey) and [`renderStill()`](/docs/renderer/render-still#licensekey) to trigger an event. **For [`@remotion/web-renderer`](/docs/client-side-rendering/telemetry)**: An event is always sent. You must pass a real `licenseKey` or declare your eligibility for the free license using `licenseKey: "free-license"` - see: [Telemetry in client-side rendering](/docs/client-side-rendering/telemetry#setting-a-license-key). **For [`@remotion/cloudrun`](/docs/cloudrun)** (_deprecated_): No telemetry is implemented. Use [`@remotion/licensing`](/docs/licensing) directly to track usage. diff --git a/packages/docs/static/generated/articles-docs-vercel-create-snapshot.png b/packages/docs/static/generated/articles-docs-vercel-create-snapshot.png deleted file mode 100644 index 4ae4bb19d272d80d24f28daa7f18b33dd709c424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46664 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νjj+v(DhbF!<7QPuer#TqQgp$nGq1NVoYdleN=;H zM}E-+^FQZF-5qw9P>Ly+Aq^X|ovMRagNjTYN5^?S4Z(aG@OF?GKi+vE3r?oDzY1!( zg3^o^t>FW_?OOo8+Bwcp>a1O23Ub-Z`Jwx_A*416j{1rSN4YXo75;R|=y*XyAHjo1 z7LxhFq&Iz-n#txyu<+`5O?wF`6^IC%Z9-h-x}PCqGpt#hB}Q3_n2*ODlmxrLvEuEat-v+=b%TB%L8iqs>y{4 zn^{v;>xO_^E~_AgUWvPT9`JIjFS*cuP5%`Wj*z}&p+~e`rhtdr{a*gUe(FZ0mlE$tnyn1oGgDRCeJF*yPe z@f7rXD0yu&&20iZ`M3KN{GJhVtE+&x=ngax&-q_L-nQ)SDiWza5%03njo&|sQ9~?QaVa%awugTu^zkbo9HctpaWBYMRi8Zb)AsrA)^n}2;$_w=ydGI{G*MS5 zY`eS`Pb8kjI7*j#%F`0v;48zooit#Qag;5iea3$bi3{M5Adjh9EuxJka= z&1Ll-!3Iih4c9+Z?-O)8;IJIm{2GA$0u>hp9PYPDHSPGav?=M`a8}f79URVaRMJE> zne6)0V=S_JpYibeU%p13`R0MistYLaYY$gk+8#8{?RztKDYbsL_}C|3@&5kIL4`cr z&XCl)CYEBtd5ZaPQLNzwEz+ z$FIwrr8`7?q&i4yB62v8AO3)ibFewZ2wPH>4wn`FYdAXPse*vyeRqleXiFENfl5X* z^$p%g_Gknfavl)8hV{utz564e$(W+HZakEE?b>F9CP}3&RCPdOs+kW^(w3vW| zEzXIk$i^GZ6c&7h#wRPWL)v&BddpXi(b+>p2RO;O?lPg+w^0K1j zASj3cL!29lB2jlhgH}R}$zdeh1=*btH zm@S1MG|C1xAsXq0^!9<2LOVnHdJnc;f1=X$K;cZHydhmZThpUghu@n z850|CfmUyzEW4g*H`lz?>k<9q1}&nwo-}{aFWUjorMryv7sC|c+xRxHo8JY8F+dNF zF5YnxctCFVV~t@DQ`eg568f4VEk0G*EvA!MjQ)C{new@qGu%U~%DzO&LhA?U9uaAr zZ1u{KUa3OWrd6wgV_O~|hOrxU@Pl&0{AW8$)zb4U$951O+Oi2htE-FwLzu}14M#PV z;aAc`t(~1J4(@wDeL+`GHi}K;l8j%d(7{{^NN`J-m-s?QS|SNsQ9g(2QrVG6<~&aE z?3v+k*)gN(<+TJo=;Riq9ObM*(Arx9-A5)b6evr}z0Nd^0sR_EEOm_b3;UE})9c z^-^;hUJYKmh145Upq3)(7TEof65W6Ekx8G`sCijQzuCQkECsPk-F2rYRoCV~KbG@O zj-hdmh(9ri9WtcXx&72;QAz3#VpeUl9d$g+Tukwc9{YPxdW$lKk4}e+Yy*p zHKxrpA#I)qHV8ruVdh+V9SCTp^7kJdmMG;+=po&9mHx|psPk>)uCh&oH%vAU0K0>1KecOJ6tS$*QG-5 z$_S@ElI_p^*#gSu{ej#^mUjD@DM39UxtAGBl$I=i9;|#kZzFknf?IRO&qBn-&_x7Q zG_AgWpq0{go~Io%;?wbzZWJ|=iMfs>n3CI!I(#6;+D?AaO+6`k{13AX9;v`2XjvyKq6zmIKaGqXn@B8F*uKP zvOs7vzw|nP$&wHgg9dj2uz=-}lEs@V2^;Jc9u@sN072G1ZJ)B#Z1p53C;wOwsu6)+ z4FA2hL8-GyyLWM&GQqGGH#<$J zizK-M#kTj(CR7(|&@$Apd(p8MTzxp3P+bV=F~*x%j6V}9*p)vA217V>Jx3C20gRSB zCZoq_Ub!S|d-%FUka=d<;@M8rV3r?%=AZmm2lIDe8emqY3>Z+w9R6o$jE-@gwVv`i z>Lx6{GUNYGzj}0_T9>|TMWlHDB?Nwh`Jir~?4h>>&Gh2@pE$e$V~l;nbdZXBFyvqL z^oRo8n_t7kMak%soG0b^Owt(;O5a^ivinWnzz=QtZ0y@i%C8hN#;$%2e9CsLR9`hKE&-Gj!?k?uXp}*A0FXYWSba8~fhg zXXBr@p&_lnS}I((=3OkVc3oUU0o(tn>%ob<%+f_#|eFF7G z8StELuhPHfFr*3{i~!G%|4TeQm&94(SOnoA#-CZTN}u}s*b6gz+S_?m{pIdYPHmpT zz0i|18&-OamsZ0#jYJwukuRSWvXv}Mouo0^t3;5}6}NO2g+l}X-h=JFT0nFzRs1Aa z6(YOF@n}Tc(g3`?`s`&rSASW4gi0B`qN+f#M6>A6c;c`uC7H$PtRaRf;vWve-LFo= z0{KcE%b3d>gSz4-vu;cn$ixYNi|bwwvE~1eF1$+KSAG!tD9tkdS&#eZ!hZKS4T&NS z#gEj3j|x)mih1)!VS<7K z)1EzyzMMkwycaNUZ#PA3bT|2ZU(^(^VIFr#m)p52pyn7K#zT~2lw!v7g;Si~joN&T zb}H()r!*8*t|iY7DFjV`hUCW5zq*KGOq5?<9;bbJTB*Bc0S+i5Sd#j=0V#3Abu*V) zqOk{c!%ZOQ65=;b)l(;ae&fH(RDHNcIu*q1o^RP4G5gWoLwkOyNRn=s;g*NydW{(2 z_6S4WWgQhg0-ATQR7e_T()_Wc|MiVz)aTwSNvjZD_XAov+ZZMW_dVm)c=%<6S-FCEUI>WL;z$ zyiLCm*#TEsLkhC}@*qurn51;lN=JC=^mMq5U6N(AZta&A_BD%VZiDSPoY`?@PHNhr zl};`kxdVDt3v{I|9_1R{LL?E#uI}^fVkF#_A?PZbF?{`N55JZy9M{rT>IWUGY7Kri z5*vwdKX{HL;Jl-tJ1dhj|6g|@4quIvq(o|9Gmf|5!0Ki%?^dB#*f&Mu{!kH{$-$&DT@woD->eLYtmN8%kOZX8z@tTf|s zNTj~FB}+B*a9}KL*@QtlxYi}s%f;+zjhMe{@cc(Db_QtQe&WNmS{gsw+}DjFxRM*! z;Obi4Dd|I<&2QrGG_Gh)SS6O2MzrU|m5PyHi=upx$+engt@QX%a(bPl>&b(-+ZMhh z%gO}EF74i0(J5X(?BkfqOg7uqwlFvCOf%l(=Lt`x5M*1FD#K>N-%X~NsE&-MKM)OY z=FL+qs8ksvbKUA^N6eK|%V6JxgyzR6)By-L6E_VX$Bo@hXL7c3H};jj+21@o71I{9 zJ61EXi_^+7R(C(#p_xN`@5h7hMV*Z1s_b0?7HoXROYkoaCy$1#nDue7_&Bq)=XTc& zzAtn!ArH74jJY;*2{V;wY-Kf0L(S(~x*c!atkm>>VXxW|38;6N9 z(qU3AC@;CBx96+&PImZJ32ENaG~U|^;~P^d)Q##Sb~d!?BoGnwRtpQz>Gwt8qS73p4`ppURAEHb%xCT z9xgnTDQdL8{cz#OC()}_G)n{gr?p#TuN*n+HBt(XW-^i&uh-ErGb#Jtb#27bi=-<4 z(d=C8+d1_ijp@nqO1>)bGW@%g@|zv^g2zVDSF)aeZgl>(Q^KpU)N0TS0nwy^psUU*;}e2lo#A# z%(%DT!J1~pAh*x(klQQysOwQ+iW8h8`~iMhLrB6SNGG|LX5GVEofsYF8ZVbRnh$8; z=+|H&WuipPyF(9JxEzK$JiflCTB|kod=ge8!ZI{E+a45Ar$rR;;MZ)e=Jt-9wtn{k z*2DZbIsH$&54(y|vG-O2Ji8*^q5_gCWFU?)SH;H<7tTsp~mqv z!h_oczC`mM{Vhg?&4_*>x@)TrYj$tty#RopGqrhF*LZ)SYZ2)(mg1WeS)F_RVauk~ zlm6(gd3PF@&pfhZI`hXlZ|I8sW)$(p(IlyV-~Lh*B}{n_EX>U7xa{3thxR&bEB_m9 zm4``<&{$=f-QgEbS%TKLU#VTBmR8f?cRSStW{Q;X+>1BTES1|&QcPbcm1k>hNMb)u z3EJ`x)hv|}wg=J}H78mR4vWtIDc@d`vFmZ0bc?uUqhxfjb+lNK#wKs9FLHcxIuA~x z^`P!~yJDw;MUJ|YM(QH+-MiwVkDcfD6$K+O=UmjW<}CPnkaw1f$b#QY*(`~6YCH98 zh8b1=;>C63ba${{H?f}c2@=`=%u-FN>UglJ#21un?CK&C(HODqQfNK#X1Y;8qoOl2 z&CZg3b-V2o&uO-JqM@DTd!%WRt_!ZBjjzYt?w#(lp}qoZrxReK!?)4 zti9Z|FR2n5AH3Gy-2YxDj(J&bYoD<4Wx^Nn#Z-QX6^VERlkg8dQB>9oZoyp^-jIS~ zUse~jfyc+@84PI?;sqX>_TNaTlwEZajFEG<%$fEMy1GN=R>z`UG%7&k)~Iqad3{@E z&thAahUs!mDgVU%`M@iOKd#UzO!ZqH`_6Zm-Wb-h{u(VvBeVcr^~b*5m;qw40B2XP z9~H@h4Q;%5!m--+CUrh<73Z$$Gya&zS|FFj$FCeMxC}BcEa*$v9VC-Y4-2LrHl$DT z{XN2)pDdFaYF+tu#$IvqA(hsTA^9=lDIX4v5d2H)FLEH&kFu?nNV}_jOqS?6Hb*bH z4rY>)cWZZE!-s9u8VjcmtEdV=>;#bU?klavr(JL82KMr6vd2<6Iu|LFJEPU!!Ky)u zH$^KU5Oq7zWqo;J#_mVnK{wy@YK`6YW!mNwa^*|W{rLlFYVH7LcFj}~L9^c(>=l+R z4xOFi%JTEZN=9@_n5JkOYFK_mK78ZYBNQj+9n`E>%Q9e zll99sXuS<`Z|SU`3vz7#65_77&CqS<>-vtOue_2snXF~bl)aRfyIuwVSgqDD*oEoU zH%HMpQcQuPcP~Uo^z$xRjca>TVp40BC?TqMM)QuLV;(UJ?@zAxm7VSZXMBclTJ!>= zj9x%}53fjg_c(dm@5w>#fY{v6_Kg_s%=AYm;)tUbI+L0_hvm}j0eHsIlbAe#C_BkJ z&W+8d_3JC$?(TIP$6bwu$B3&DW5EYaiy|+^yo-Z=DLM>a9me{02mf=1x%8o)J_b1i zm0Dy;*v+PDD2WY+uxR-i#d^apmw)XJTUNp-NYl7arhhaC5k5fJ7Z5j#T4hnKiPvye)kDby~ zC{#1=H&nq3b7eA}dOBh!AeTliAC$o28mi3V`{cBaJ!AVTC*sCwPc=2u6^=*I)AHkr zcYaZMXcl%j#kt^|s-!2pYIG)Kn7BHwv-+W#|I)UV-ch-C+#>&$MYcHta!41^SwvT`vly$Ru(%&1&1nh3+4}Whx!~tjv27=uB`TWAgp_qmvoc&Ws35SDZex>gQje zG-Mg8Kb^xDLcB2*)8l6%`Fa}1D0~O@epZ)I#ponx989jmJJVF;?wwfFkHqr4mb9F^ z`EfeTvZg^gKp_4G)SXK*`&eUez^$Z^(7o2x&Ug~IBGX=jI#jhi0vt@%-WbX;qD!HewCq*;%7lekXx8F~fk=ooUGGVHN7X-hbJPNsX zppo(MNWj2cY%BC+hJhB(fr->*Ya~=n<%x{YwR<(YZ<8Hs8sk6UkzZnLI!ZLJi6_0M zO58IQ3EdV}p8-m1;ePW*uk_l+?6WUsqQsE(8{!KHiKA#4nPKRfbpCTKtGG}LC10uo zWPa5gu_Oumm=|+xs`Pq5(HdFCM@Ln9>n`Rv3)d^lT0_O!@uOiHQ-+mR{5G8sqLYQ# zX95D-nZ2b82SJ=DTe-Wl#{hcjvXZLcgT_k`!` ziE0GdtncS5yKRVhlE5f5b|`cz`Yg?!2<=&9eEuvm&>*CTOLQ4-xllr#43Z}S^W9hN zEn7)x{D+El4_AMbV%l5|o4=7CibVF8>qqO@JV^>dKgmq&e#@@mduYZvfJnIFq@ySl z&rPAJ|M|2HBfaUOcc=Ly5`y-RnLAH~H8hMvoB_THe!3frGpfHtwe+r@n-gVJ`X6>oJ30u>|}!#$!uvF@-$9rGvIbJ_%F6HCMG+ zj>?kyMA^9TJl%z$Y-NyXAdS7P#rbN`xHRt|eCImSDu_DKU>qjq8ku6TUt^+ID%J;z*w?E7=x z$VT@W;chGQWO?M_iS!GO?Xj`bQl;Z+|tVz5lo|+MjXEAB5l4rM=aocjw_4dz$ zS39Tq+1P>mZ9?A`s%t#R%#?CsoF&sNcD9Zd&1aN(r?=i^pou;xikg?kaDpqYN5)^} zEwh`!;K86tcM0l#^O#gR#^dSmusQbD$8QxlW#s#FHYa7DU(7ZhiRNYZXseqm%g8O} z@fXOWm%dMto;7eC;MugR=!@Lpz9dPMzo7aMr+j+uXmGPVzmpmF;gKoKzbie6wR+hcp8~<+n z)>Tf_u+g6B?{NLM_Zb=O}b zxo678T5{h1G}Vg9Kwm34^*^e!86~FgvL0n=atK@~`fhH+e%d#NV~f@Hz2M#MO!>*0 zsfITUUC8pQvW20kyoIw+KJxi}sY=?r@tW7|Qos{yVUf<^)e?^P&fia{drYY6_W8906^<3^c zcoPFLAbDsYS6bT6S}lE1?m9*vAW&JZ#CT#FYcFurMcw|j1fEh&63lAxj9dJ3V5#5K zWA!L8x0&)+s>&bpRj1ZxQ#lGsM~Sr)GLLuGoOQNpqaI*hGEJ9#fb#rFQn+>van&RIeRT|aOs-AmY?Y($Bw)Kc~J85>6A+04aCY(`Ax>}H!U`Uv3#B3iWM@b%qt zH}}Ql9DJU8v(Yes8bz z9wDiV^!f}7a)&^7aZSYHVY$yPg(;B9+VZs!mvwizhghrjeV-SB=%vVkZQt%?f7LdM zyj*N2evAA5PIT2CauTDW0tcz)De)`(ZJdhNHndX4J#wB$te8}rlSBRrr> zfAL{%w9d~Ge;G-;n^OfO*)S-tm!pTf@E~^SV<;sA&yLBjb(F2Nw2v9v>GW;@!j+sv z0P^3mNLgf-Y2=QD^ste|R;#(7wa=iwL9iw6e2GGBV~XDpl4Nr>2xmw&f^S}Q@*ex0nf(Y2JZ2}#j&|83*zXDKtn zZLQc(D3N^*@C?#ghsW=X!_=%EohEBmZD%$y%O=8oOpxD*SI7;XHA_0-qD(O=S+;BP zx|(yOz%ahC=9AB!Ym9wH>tS*k#pEejDrrUB+SmeFM(!M_lNB12t|io3Z;+p|KkA+k z?^Jo~HcDRY`S`O1dY;>7rs8n^ych06H}0aMp^wP>yw!c5y~*iXA>OA;HYqYKDvrxv z__W6|sfqEyKYv^7XF@+rmc*E3P0T5II$zKs7-2ugNO5X5ZLzBud)%_&E2O=@BbOuA zp*p+{vGy zXYanYflHleSI&&_9X!fwA5K)jUUg(e|D!mBjt7a&Xa#{b!+I8xdqd%dw%YnBfP~CE@zLL zB*}Yzy~lH=bvKa?xz7UEBMIp|HpIfHe_at$&*}_?b`mOTz;`!Kr!Cz?IZG-in@uR~ zM~adb<-(t8Q&sc+3@o!~=^r>&;m=AcLL)LyH?rpJ5Oxce!e z6E2=|?th#V+9%1aWwDD3L-U1cq5>A1<5d;N#R_x%=7g=y1!hZTA=|A_{&!ghnP-|i zRk$dgCS`O~ifc%EOH>{!4-s9tOiHPkI69T}BG5AbA?Q2!y*aGYM73#Rkk9hg>Kz94 z)QhZu$6VpJ;aUkj?Ps#z&PgU;1G>5Td^{lBaIbZg!fsP6P<iCecNt$ zhxurRkdEEnjn;5J3#qNX;a$Vb(pHhlH8h%jpsuSUEdnb>nb0dzV}K+g`1)Hho`lyj$>qAyUxpdjPW9C(zb# zhqA1#@*Oim>!D7Y)c!4FxPh?$U|p4_5Q*hc0q;_3p>5fdqvKbcPFj?xEY&?+UZV2=iAG7g-;NOGZRerB z641qTjT2ykN+o zdbaax<*Ur=?5=yN$4Vm<{1S?%_D1-V^OUml8(Vzc8>7NaebM;V}H;#Ku`( zKmTU^(BT-nvX9$vvnsre$kKyiIbl+!xT5>ZT-)meo(65|IF~w3XK{trF$MZmKCWPw zEs)S`2es85H^R-jM%HzRox;p2))D3)of&9o6hLI$Ck-2cFD?i;w5=j5CpIo&`%>uPga5s`(Ce>b-Si4qP6J;{6Hu~IcAyVqmjf2FsYx^tvU9%Oh8>xIj zKcchLbb1}Zbx`MKO-9Hbxx+YrxK$BP10wn+;df8Gn#to zZ@Hdy$mIx7{u*9bm*`_$4c@WVPV@m13s7&E!we&=rWl z&dsqY?J}h91Bb0Z9r1x`FM%J+6aS;?tmC4}-aoz~sDP*_At0b)AP7hcNQlycAk7dW zN{^^?g9=ECN_WG+&%gkcT4}C>#n=s-~P2PoSA#?x#v9Rsq=YX%wRX+JReuQ zz_M*nB_3bKi=|}jx&eV#fiN* zOoH14iSmoEj^=O`;x|)iKI?_=)IHDR%qqP1s8X~NtlE8xpOt4zP#$rln0`-u0cppr zoxVh~2+e)N?Kl*F7i7A1M}~-t3hITkURy3dCM?jty|Q<{O=GNlcm!Lvva@?hNunwf z6+M4Y*V-MNb96*p&Xy3#-7?MMQ@f;7i8+QEQJFRPv6VBgj;`{d>hBkBmpAw~;xWxzfedKIY|kQ=7YUgDP&LKgjabH4P}VwLzO~qR2zG4a#1IBws6x z|4#c``H#1L?qoKucMPICjG%Y9A8}CHY)x&i<$3IVEwjOm;T7eJwjw4F>4{F6LPb!UKFo){K*BJu*>6# zQ`QQbWZv4_{=`w^G^4Yp?rcYX;eEL~nn&|TWC80+{C66|Z3Nk)BU48pV zDF3}Es@v-q>-_r8*ua8m+V=8V>b?%S3B}j4>9ozZM_^w)lVbhQCFLF0wI6Kw4ZW;S znb>Kq+rIvmggihL)SgJ4m9EE-D0zxpJf_u9{nNdn{l&mG=F-dJ59{ffP56Uq);eX6 z%cjK-w_iD$)s?TTZC9kKFu_mgtYzZl){^zOsmj+$k(sQkygICZ zBrQ)le$^Z$S5cFBwB`RqWyhk;M72yOGtu{PpXCFQlw%J@Mhfk${Y=6gA3t4WW&ON7 z5^b?mV|}M@FhPO#Kr>86_x!P=uL>b7L%DIkDqd$cTKe+qA5^?%q5SUU7M1-P-D1e{ z>ELS+c6LX@<_+D8A|5|-J~nxlX@bA%ZCufVBM-gIM!X!B^2dvLGy5INmpk`(QKrgA zd3VP5zFy)gh_x-}#vIRc6dY=Q-@M_Vv*D_KSkC`qAk#eid9`eg`HOqz=>@pC80#)i zq2s07bk7$v!d1gLQ_@Xb%;rg+gqu9dbLDDP`QGKGE0_^PQN;BU@)Ay1-QJ`C5~I=*g3s?Qe0l>C#U#U@jl4 zqrZA&TCiAE7y>S-0cTwOs$ZUo_~r@uhfOJyROd8C8hlgwEtntKb11>WcyRVo)9_{a z1!uji*jKl2MHdIEVfF(>rU%aw`7I{zmhK24vujagDClS0}-(~8}Ulb2X zlJ6Z9wrmp;7}-_T;ktRN>~1?ec6k`>I!{ABdBpu|rC;j0+xXNl;>jHz8{chmFcQ9b7*E=t(0<^kfK^rwyQwQZqZ-(` zy+3KY$?DZ&g`N~dtZA{-u^u}K&HM{T0`C)}ghz<)m6zRpN`K2;q!X`=;Jw1K9|`G) z@(LZNmcWVphLjPUm+J9GyP)0uv6NPvCBv__mp`|M0}6FG1Kv&Pk2Jl9l?;p1+IW1E z;M!}*K>MoC?rKD+)SBneZ9p22-D)AK+WSXI8OgQUxoWc|nrqgk;|KOuV`<#xk0H;o z$1JY2rd+Pmr5LItTX6DMMqAnZVa|w3{#yD(moCkM;5C{dHaU->0Be0wXLi%!^Ye;f zcSuN;LI!(to~*fEKz%+M=oc85e&6LRpnW8~ti!nJr`pp~c|=ZtB+( zHjIkxzQP5p??l2C*<9T39C4f^mzn%xZ_q89BYWJ)jOP7(`EtQ~CrR(wo1B)mryvyE zOB|`bw!C za7>cNmdh^}i8Y;K4ZCkOeS6}7ta{ruAXoIwxexIoRnC8n_o`q-FQ>blSo(A!MLD4f z`(;^inwD4Het;~fAvCqM<`WfT=({Oht&$PyO&jOOmCBH6P)=h~xi+y;P`VVd#wkzh zZ%1wQVLEfoR5Me~QtZ(DNNasITG{L2z}?j+U0)_K&G6qZST*Ir_IUpO>nxJ-#|}eE*kqw9e7+ zRZMy4Eqec35P;Jy5|$bJO-F0UZZIF;E!;Y!ej66(1$c;)^1m=+ANl~bc z@7&x@+Rxcdm}b_CmUFCJm-+FjcRF+b&|-{^B(3Z8miQpV#1h-rj}_|ELEf&Mo7(CE z1E=<~H-=|<+4qs}WV`#IEhPwB{T?`(bURoV`hY0JuC5xQocp{k#oU6 z2|NicOE2~%x(`^?9HY^aftjkesMI;zGHq`(=_cAlb8RKaW}BsisfVFThjPBeyT}~8 znRGnun}+F@xq^7#&;Qz@&)mE1>jHIp<%N!PTWxzO6`h_X1IRS#h(D2MvDh9vK2EP~*V)kkuD6D@QS+y834yt|;UTg>V=DC@!9-T8i-4s zHKab)@dua9?)-eTC%4Hpt#gE!vA7$#I}AyC_(8+*`CcSW8fu9hLR&_mEfV>CKN&9! zFJn^}?njXg_NS(7XAr#X5Zj|z%HMQXl|zOs)JG3c zBy=>>VTCkqV2*SPo`jHQZi^|GZ)34^B-h5-m=mh0QpzOQXX8a~(9sBOeg6@< z86g!Fi(*!>@8WuuDRQW-eCF0Aj8tkxR%(Nw(9|ZrV|(iL zGLi^O{qJ!{fwqtK%syA7xtXn-5(sVYy(Ox7OCP1s|B|^U`n9janSP9?Mir zp=^bk&p1{AiF-4|^DC#L57j3RP7cz|YX79!8gaBC@#oY@dpY}DSow+5i4!+-f;LLG z51Q7)X_g6B^ph;DaT^BCDg+MfrZe~5I9nLm55p3%=gqU7=ik~=2H6I)6YFfL#He-N zj>bHMewxw&o}FouHgAdVp29XH!?gK&P7p6zuV8jo^mlgKRzi{@r<{ir1hXHVbzb14 zzz|pdRFuJ`r5$DO#yCvvc-d*$n_9ML(lIk!ly+%*H^|VifpH;XyAL}G9hZa64h%C5!^dz$x?UFz($#Aa_(3*CR1vi;T9iKe5MX+d+sDSCq~(otnr`6LCC zA6A(mfnJSdk6E6|T&ZoDGU%3c&newrG&6y)OJ-g+I`EU2?~twV=nA?klHTUv zZb7iz_;qxP1|U$r)cS#KAQ zyNC{{s-tW)8}^|Hx!658EwmKtuUh+BsjlB;rhU0teQ{4BMJbnclX6-0EA(^FH#0j< zejB&83*NW8-}lzL!Gbv^pIxp{f2o$d4Ha*fbFOY%%=gC7`q+=eEt@8_^^p?YrjpEN z7G*MBVq(jdja{i4YdV#Q@;9tUd%MdRwxgUQJjAB4E^huf>|OSz+PohtB2)0ITZ6ji zyZ!u^Pc&z@T-$H-Sf<2Eu<%->$9_-3=7%L6X>9gylMe24r-t*|L{~utdWwX#|v8t4A}jz>y2mUaK6sbcA7 zP}khUo$DOB{9nMMAQO!(7WNs%nRVZrpI6nL_r77?DIvt`#($DbY^KlSEfERp0f*tD z`LQ9+#R;Jk&v4b~J9j3b>{vBQNRs@^smtJ~o4}dmR=B0UXWWaLd>EK%$r-r94$_V{x`%%DYygz2uB79{AJ9dEifF2;exm)*L zz)V9{_{L;#P*ZuzBZI1u2R}9*Scs-M9EkK8=d#Qd`mJZ%C+C+l6gLv~kOzX3j2K^RVM>>*$D{on>(My}$3P-oK zF1X)SYx*Jzvan-ps;ihtyK|CB6-Rg_Vn%rq{xXmk;8L17D83-B+oZFvAIN%5`r0e6 zlDW3r_@mE;0n04=6yU0;=vL;)uPjsh?(M~if6lNou&pS5JXCM|DpmWnq_syaZg^ez zN6%MBUVWIv!@g&WdFm_MXIjr}rrpv|xhG$)rmt(_#gY5$1so`AJ6!cTwY>wavBz)P z4C6_t>7Msu#`E08wv9QBuo5e{Xl^WIDk z%ufE=>Swfy)xK1^Iug##EcN|l^Wdx4)V>54Pr|6>)w$`?fRW&Ag24dwblZ2vUe!%v z23Lcwyf#4pynGIk_qKRx8t8{-M|Ajcf;aM+S&BQ^iM<1y)PlWdhWoM18?#Z>SX(|r zx}dA0sCchFu9sOjcblW++>I}<13hgT7ii@Y_D}oZy-ArM|H{bZ`TDb`aJtY$;`^f& zRxPTzmHPIJ;bEVebUw^s6*jj8Tg)P?wkBJ3+YW#J$py5@p=Um5U=0**fWKWjg-LOI6)LCR4hk zcxBvSF^GklWnT|n^<#&|$ick^$@a0+Tt)N_LQ84N)SV>SLT9d5E3f`cPGgn*$?H6) zm^L{?9_BG%TQogH+J%b$yzlg&v2Rg_GPBRRv;9|DrNCHm*RGPq67y?5qL!_aOwk8! zuLt3IGPi_;KOebrP88h5f3I_-wYmKyQ^Ei`5w+(w-x@rxrB>cLbXv2O>7Kdflm0}S z;Ul7!jUV&mg*1Vkf11OD$6ZaHPEQPXEM&$H8kf)BOLb*Y@+Uazfwp@tLC^CFDIDEEbJd%97Wo@VH;UYh6vj{gs+-yC&%w`8|+YL{~dk(wO zzVo%b)a?B`JNp<4Yn5Mz0sQf=sGGU(kc&;k6El<_BuhU&;IgBq^nkM1(&Sp$3(Yy} zw1;g^!}plSx%>I{{4oqsD@Xi;*PKW9zrJb`UbX4c@P9veF;Itv&7x=QHO;k>?GIO% zd7F=yX~ns-U->8x&-H%oiLEhyk#N50n?~oWu*(nC-VPtz;kHPfjnd03!j`b(GIPBT z2w!A`3Y-zG-!94!XvQyvWzjf9pK*!b)~)CGD-)ybjjUAWm*LbK4R7G3Su9J3a6`7( za@?G~G@B~3pd)(kjdCt2`3TF0gAWHivdReq8&+p;ccrvBtB3BCuZ}$2%J6s=o7(22 zJdy0ILc9AbCr~+C8d|!#V&e}cQq-&`a!PB%www)(UOYF|oud}C?-GiCTV@pT^K67( zUG0XR$wv1!c~iVq7^su;oC>8Ng2+C-+Gt)B%S8Fdf)Tm{SkOh(vE4E zXebgYy#0&vgc>Sc0AuZ>J+zkLRlqr&wv*v#jhtp+-uEz1r_~Bq8MN=PXMVP$QJ$Zl zzQ@+n*kfr|z3{SpnOb&cFOH_4lxS#w*eg;(1%H3dao$~g7n*1+7&9Gi8gdz$BE2GQ zpIp`{%heNKvij_AJrU-ZTX0bgHhF$)w5-JYpwyxXilUnPwQIc+!W#kk2P>@F{E-KzI>k>dp$9Ut zqcp1W znVmE)uIH{=l1Tg6jyGQlO`n(e)tBjA+C5*i5KP~m1aSX;<%f7afiui09; zg#Np=>CDTu(Yl~pcRgRa2wpdc>A6DaHgz~}`7ABm*ByHhKq!>LanQpgrdjK_>?)O^G;EA`Q7!>ZgmHR`R{YEq){>OslD_1@`Nj8{(r zeZhy_I6cydj9@HLtP9DLjj$NQ;UZyUH$bijhhb&*c;9`*rYmb zl{)jMYtGdWWU?WrNmR>x_209H(%l9VM#W(H@MhqAFKmeB7R5!^W>xjS2zBDVe~R zTJlZ@G!3P^J^fVW%Bcx;Kldo3l|0!~*^t98`$20_kJ)JUYB2uJneDWJ+>BlCl*O`& zQfW8(*JRC@dK}*^9nV|*Mz2!L9kWDos3lL*eXDKCQ^4G~DEi|Xd(~eikI_bvMo6tn zJ14M!g{P=#v+lm-+$CJ#ww97%o9#w_mi#*w>gdj<&&}uNRd&@|7bm9I(=7ZJw_Do< zmr=_LIm1?etFU&b}8n(cOFonSgw$ z1Nr%rJ05N(OOb_7B+$9x4dg^~>*&Rzl*5kP*etC(oSRt{1>^j@U&1FN2?fK~v6U(@ z-&cqX1Yhzgl(QKRq{{t85^(EwXJzEZy0N3^+@&l!yhu8J#@(^@O8&7zX}8tg)okVQ z?2DAf{=2@)oYTs)20Ep!^|^EuckN^4X1{gomg@EY&{|HFXIl!VVvOOQJ1Y?EX@$9P zw~hWT(U7H&)g|@VQ@HNU$(Qtabd+o)O`g|H*%}+CNHEaWZNw6td5YWHOtO=$8IIeu zqvvgo)}GExnyJ*RaTe=3C!G7>0iMG>vQ&me0*lNTiE_KQ83Mvu!WJ^I;budYfm*5= z;USQiv9__84O~udT~zJ2zAk@U=g7%2nv%)VJ5vB-#~VcBsFZ2x%JtHCIXeGIPp62b z7>co{G2T-8msOEWG3;0;@0BR=KIXq*LCqK|MR;(VG01Sc;t9#?nbrH3!atocc=~Xt zZPsqwJdpa}!Ur|3Sq9OEy8!`#AGrQXym&i~Kb|$+Mz7Hz4UAFY5H0y`Nc%y?nTV)& zGb$*072`msl+AY~4MXJbbaXQ8cT=ptxxd6CBDVZ?*7;fJ)$5VR`SJPBohWN2NwmDp z6(Jym5%wR$b$p$k_v!kdaqf8EFsyxefM-%cW5SFiK*ZwreA1LmmrHfw=)}lrMu9Tr zGHdqv{<3092iupkNr^&jF?eeoI?rudnI!mYASZH5=&uDKWjx{_H;bM?OzBPAa_WLM zM#E3mbAwv^Ap)qtcYM@TtzR1blD|`3ENLiG?3|@8afp*4devNRVv!bkM!4Q{$<(ep zb6$*MG&zBCH?Qr>OAqDvr28ktOeox!gyUxFT#<(QUg-8`;TMQg_|`n2N^d7W#`f-q zJH19cSA`C?^|CQ_*xh1rxg|Ju`3FiN^3QqW3fZUiG!4fO-9L!$pIBD>wVz#6uA{ak zw|w5jtwWAEl=tgGp`I7?e5+;l7S(cNZwmB0@*BzYDPHm*KlKoS(Hx@?`*U(skid`} zkCadeOPF6+{%m#a0}m1T%YBb)L_FFXSQBuq2lkj9ycPa(y#^;sZcs%G{j1@K9A60b zrBrr@BV5nKzUds1O*S*Dy7ddmE0E6jY(Fft=6O&7XFywzd;AUU_Cf30XyT9XrdWHM(9v zsAs$ni+j&cW4A9_+nI_xi8hNJFPktyS>z&0wfB$IJ90w#6oJrTDQ0zXlFccXscI3A z+!+oD$u6b*au8~JdYP3d@gW3t*B2JJ$cSA3=n$Mra1(+4s?`=1I!+vipYyqAx-Vwx z*&BBKGJguT<=w62ssb(S)**LpIH}EhjOiaO_8|i89jh*if-lxIxu(0B%0#5`CK)^t zYYlU({%iwwYC9<58}rO2aVE^DD_H=DdPRGj6L~<_uY~fT|9<&nC7#*g*P@Ad8Q#Lw z{ZG8X!be@0v(9O|maAc2fw553=XD;O$#1{j(4!xed8+Ba+Sf~PZxRE2HksCXJF)S> zvQZBhLn^05GPomM?)3QGJ^1^W{$)QrB|vf!-PWO{UakD`IXd&+Oh97Oa(eH=)Ed}4 zotnhJk}3mr4GGu zA#NuFS^t|4m(PX&g_`yPQA^e})2dscd$YI?FimNUn zMZ~Q_f4+420U{i+QPF0K{Kd8NRF>-B{{-^$E_cHHZaDrUPT*=oB#(^8M?_ge-TA}p z<$r(OrTnk!=jvtQ%7gco{v{qDKQ~AoGyS)~`rpbuf9|!O#Z?oLl=#s8zcL1J{yYZW zp$Mbbi$6*W|0qqk#=u4ICo;mx-PxNW-v2%DGZ0bt@$~ooZB#x1AK{;Wx_k&pSxD9^>y6~EaP6vWiTRcNZ^7m>( z#u&M$PYfUHUGDG+K4tswFs`prO@t+I3T&X~`o=&-) zI>kr)Ki90cI=1WK;{DgLSmM)te?E-p8@PzvAbQxYk5?s`$M~CU^5=O^Jr97Jsil9! z|L4C&ICJ+w3Nf-G_Xtvm|GZwwJoueBx72@NG0w-N z{~pti2s7qOR<7bdZ>3)Am>nX3m*5Yd=V#OW_$L>zdx==%Kb*=(G~UKZS1tsnvVQ#G z`u{wm$YoA^j_g371KD&M{(+PIeXZXBhZNGjf6d45sRS?rysAbar#vBbyoEpFD)57@ zw?P-CvFe?4FuW_CW4M18=Np8Grs~H9paW!(Z;H_UJwf*>>{IQzqE|5X$E{U(hN#0!tdTle?mml1@^zrXgMadDL-VEk7|@$&yS zE)QHleD(J*CAh-K|7To8tcY6$ke_q4Ks3X87#*eVA+ z^8bEJn4kKmTBYI1E)&6Z8C!e*2f^s7M3iNQKMqIlFS1F^{bTO_xubEmkFC^%r!M@E znf&uhe=nh3xSgbd>{!A7|L0Gz%s=Bdz5Jh<^7{j+2$UjGXbe5fBJ6 z($Yl4#Gu1Zr;Ig4bjhB(z@<)Hx)%0_>!FK39+3DnQ!bL9=!k4@a(a3iyQhlP;CA~^ zQ&Z!09u#&Jori>LJV2vQe#d4Zi2wI2Mer5D4EF{8nWdM%;}NZp%^RI=wJ!HMPEOyQ zp@o{{{-CCzfw?q-Wjy!z*c|8)eS`bHQ5&f7$JCY*kdZJ|c*prtKU5MieCSRs+WCwu zFblR%8^SDBPZ(IKZ~ChLyt9vVcwXbi-RV?%C?zTQ50qTtX(^wFu-6V{Bg^XJDc8=E z?>%S8{{wi@;pH25VN_UztnU*MudlEB>Tq|~$JWWIBTUAGSP=&yqK+&*u3Nud;@{Vq zy(}*;KiYkoz$@G|M+!8wHS!GGN^I9b${q*G;>aM3PUAcSbU^ux;5}1%p_#7Ug(>)| z$PZW#icY5t!BJussY3>7gN%`h=}9Lg$l|{&d;xme*1ftOvb;k|v08BRUphcI>;-IcE1!7$8OUG?eHr>x@Nwng%fOMx8iu2(wN?<;bG@T;4#*ESd343ABUgWCt9 zQ`UVif=jphWv+uN;v$6_Q+ay&qse^b6W?2v;7j*mGGDqkWAV3DgpOejJ3W#mqjN2N zZc|O+%ueQ09!&}*$pO_tEGQ<9LH%&Fac2rCF2qWy;HB0wX-yW*C&a0{CJQFUsB_^D z6zK_DjG7#KES5GgF|jiK{yYw2JdXug;v&ld9NHUnP173l)@Zm4Ds3qob7vmkJ{ScE+)0I4#5nznqCp3V7UbbgmgGoG$F2*paG6K#9*U$->2v@CyJ z8o7Ux_NRg^D06o)$?DqAWnW4AJ?EZWjag|d9HC&*V9Yb0I@zL7QUF4B%(pvjV$7M9 zwUgx{L6cQLHQ=3y24QQ+C1jVWd>6ICIs#g-)c|Axbb;yK0BDyZT6CN99)JOm!r{I2 z7S9ix51UiD;kRR_5+tFA(gv1;Mo?pij*9-P3RraUk&NKXr=a z2Uv{H%xzy}=gUzOiJoq@Nzcpc#5N$>vwYJLoE9_k z1cV42Lk@(@FUZ}E1)u|PLaYZKZU%q(0#8OKu#okx9rp}qG9^OBoKn#>h=ivbrS@IG zHE27m)&RU>aDp-Uakvp7UN(ezwJ$?Rxf5~%5G_5+?V_(5lpQ>!7PIZ3b$M84c?9Zu z5xB(!-QP>3l7Q?SKQRzvlA0Tj}?4kG8@P2FFrZVg%MAkY_e z1Z!4vl2@w;2Xd9+vTcb9dhQ_M9&7Rw;X43NN9T17xuE@4x^h|&)&;FVX(Z^}l?UR= z;b~UGwgy@W2rT8o<9iA{W}G8otzudzqnuJ=<0&(kX)-~#sqQ>=p*x+119(JrQDM~H znM-%&{k>p0QJR!-mjd%+?p6*RQ?zBb`sRF3K?X;=on$(5(`e;8WvzKYRw!u}#| zAOkd%izsF|+HzjVOy2c2`XE*939|QCb2J$3ou}4bHG(jO`HMRHlX7x6ru`x^J?Dff z)qO4@I%z;b^fT(;lstQ%eC1+OjxPWo8a=M% z@0;IT_$&crY4^G;kMaVE7`?)|jM{&#PHYxt8p^ZBGTqxAG|&IRbE{voU?>fw>x;N= zT;hEh5dbJ4HT1It<=WG-n zRe^lzQ_$@77urq9_n|&QNDqnyq?kES$^|`hE3l`H9Dp6lqDFKqK_h+^2sAXHGMKK8 zKu=y!Ty_QZ7i4oJJvGD7ucASjYV0>c+!`_l`j=+RR8|TBQCF)$o^z*YK0{GW?c7q@ z!_5!Kf@_|RC6c)}tU^*Oz`;PCqE(Dz&BsZtHQPBI?iiq^{Dlt<8+1us(-AxHqdJT= zau@U_eUliiIL=QQj=d!y_PL~&;k^nfmnOw(b2)+zzh1?=pfebkf>19(DE5mrXy2x| zt7_ZU@GGU{|LFV`zHVSB-h1X^$h+O`GEGI;F3H{)G9fPle^hgYK_hdx8{G zy4Xce;TB8Ov~JUW2UXxdKoOeNOtMcBb5xz z&`ydhPW&fG$a?kHVDBP`{jLJ&DJ8S0AJ*>6sk>u9c*uA(zX3Y~uTgsf=#f(64>)cQ z30TZLbs|FPByjPxT@YBOZLWNG5*ddds$UZela|Z&=VN^m6~^BsF;zbTLmG7(6OW`!qdg9!DNCx zCGMQOsGt(4!-QmNklU{V&;oR_XEYWC^ynOR6=Tg5;NWa zZRsB%UZ0siq;QU(x<&6NQ(&-)8< z@}@~?@zU;*jnl=5T0Y+)u1`Ol$_<2l4V2?josSO1{ic3&4)PnJYSMuGkV9+L8@se? z=2Z-~%hzFG&_P{EmDs!s^y{1Q&Nqeg_Gl`C7HQWBz4p7wZ@7%uret!9+V34~bo}V# zvfD6h@|BW}1XN2cpKlEqDXGguw1KwZAW?-j{&qRz&Yhw;$1gFB8?qY6y3Wua?@sg> z05EP8IE+PUN5|uJFTKvxM>UC4HC6S9KztwbM{Pld%a1ZA0vxgIdgaZL0wxjiv=*C#bj6k^L2~@CfMLvL`KSTQ#3SZij_7h&AAH0%(;#`zAnuAo51hGpr$X`wR*093 zZ{9#jR#vO#3t8rlg2|$}v=H{tgZyFqi)xrFYs2*3>?(nsVm2OSpWPi499%HrC(y60rH~YLO(k<_cbWvtebGpePjEKj zGeRmeh<3CZ|K@3yzGr=~*+XMe-HdDmz%LuLUoHi!)Ber#LjD-Ix80dK!V|vl!nFV7 z0`O?9E)+ZxyoTtfgLJVcNS8aUeZPrtNQ^t)$t+eCdG2<_OPm#4cLeVb5OoZKgNP6{ zI8;_z8~Hyp+Ig`z%K>sj$M+^7iXd&ZMQ}S}j&H(;)3l^)Go>PgT`wWgpc_$n=8wB1 zYv-5#Xx?HrF_>vYuiYl|2cmxr_>&xC8Ud^HGZNrWV1q6Fo3LrXy0IE_qnyi-QcktD zd+q?1a%QQ%L^+G%hA+5PkQteuO<|elM7TT*S?t2wo1U{uZJX`&2*m*rKle>w(JJb! zf87k|1bK#~Cz0U7aS$;!bDalw$En!zsK3B0(@>F_&x`2fJTp3KBri?v3nALkX~;s^oi?oYsV*v zYdrWOE^1C9JZD@4o&}~Piq#}AV{pnlRnTrjp6Yj2!j%y}Vl3zxlYyZA`%z7DF~2CS zt)-y>9D^1f*@b=%%NK2TV^wyR#IAhIAniz!EuO=q6lvwSNV+n-TSl+j3ZLW`#xY+?g)^%RE-)VV=IVA zl)^Kn5G=*ptCNOl2Uz*_!KYGIH5AI7 z9A9YM^yj?qPJ|)KYIzrddvVW#r1zQLYlVV<`0_e#SrZ(Bd9u6( zTHo>hLK+rc1?1V#giIWIP7>NQbl*NrwR-2mg4fxRNiyG^EG;ABn-CSUHP5dDH=h7({7E!vtipa@%|VpjQnHqu8$DyC8nep zf*&+FIVmm(#Db_f@VP0Q>g6kQ-5EFAGTUTi{ROu|G9FE(Vf%mVZ;B@VZJDp0e>JSk zob#qz9s&mg{o8y*b<=L}>+2%9!hFSpC-MmxC2@s_s`9KW85}inH=_`M zT`z4YhHhFvXe`aa1rm1m_PsQu=KLliH+EOkfEn`{VWtoE;2`$BJ@Dn z30&dih&Nv6b#DsV=T6NVrSVZ1H1W1GNceSrjSf&5#rT_vx!1<=MGIJG(D_k&7qzER zP03*UgWE*47@A5A7v%&NpMOzRY`HseI#HHgi)mv)@vMs_=n@d!16qglokX|4d?8SO zbfMJ)gZ-|1TvV_vm)zS?fgT3VC@ncX9sE-L=0|R?aF5It9-zEVaPyj%Tp(&e0(PJ{ z8jM8J%*7=Uf86nDR~LEhcU4f!JTlFckNQ$a*C0zhJ8_yVwbc5DI)|i1AXl-&wQE}?jZ9{bPrkJpev`w~(gm-ZC_17j0 zSMxp)(WJW?ueko3`aL3Ke98WV`mJJ>gNc%nmLyk!ocI_x0&-C$Z903fZq3r2&(s%r z26W#{Ke6$p+apJOOv#^)-U;X_KiF^9X!U4WM`Ae4O$o6aZ@CzBTK0V&_7)a(fR(3r z`c+x91zt8gg>NmR;M0n~v{)L&CR5N}=er~mxs5(%LGa?`8_08$1x(yJ!f|W{2RlWg zd}{j#qlBWESPcQCX3PoZCP+Aar+DhDekBI=3MCw|Jzg}S+N;M*5iBM+e{ZGYI9i$8 zu(iU*!Kg{~vaS|ahnEuf44J|@+2~^K5}R;npv_GSDdo#Z+Qf||skd=4urq7&-SfGa z8C#RybK3yW;0Nr+JEdn|6qJi*z`I(ieYUa#Uf+p=>%fxy;8!MrP8Y3Ug4}V}Wm@`UTA<06JPU)(V{F=yua|4R&5e8~{*=c5Ny!qYxM9Ht|r!R1^k zUqi+>PnvF(aQPKLDIpVM(uL`Q5HH{Bcby6jh73gx@K~I9Z&H5Lp~C3oZTD){p~bv- z5tqAoe?mXZG*qLrtF`axWU*{fr(Jo@MXLw5v>?~fTv-Z06YZYKtnhD9d=M3(u2YvN z8)9mE*Geh7761Zg7o3glx_}z!c#b+|t`Ix{yI_d-u?s|smTB?s>J3Pq0LXB`+&3jP z{Lgar(j;7aaqa`CMBKT`N_0~tCMRbN@QV&G0tiJnWjhZ*GGdAdAOyTV?j%Y}K{}e| zP|j%(t+xl~fPz&M^rRd^ff)ev?hv+;uLtANJgV32Mw9PynhN%}A@cO#?)P8q%5wYu zyLhld(F(GHE}Y3KSPdMaiaEbyzlOH*7PZA@3kYYGP6 z$N-5`PJ8>Y5qWn4HRMdr7@W+X13t^edp21-3ZvWL0W#O|+%k4-T{SR+`>^3|R9OS> zL1;R{oNNYzTkbhfe~LP$_ZkR?;AOOu&L0W_c%eJk&_qWS=Pi}`59%q#>(UDvqtH88-qAlX~$2Teub+m#JU@7zE>qN&#(h;Yr|Bv zC7=9PQ?&4ix=3Bm)U8L6r<*?^VM@&XcS>Er?x5Nl*lZTu*3`aaSrl*~9=1mx7t=q` zqtGj(CE*3W11U6#^W{Gu%|3iY{Zj$o5UY+gp7~|>*q|C{B=QCp$r4@=rjI~S43XP% zS^3fk1bjwHP7s*f)e-DkucH&Ri+EK<2t>Y)8?eC}kCc_37$?i3LWQm)^FD!#vMUN$ z!ap>*&U-b%E926w!gqU%SpL)M zfN~(X`X(7}E@-p}aIu~Yt!TTsTZ?j}Q%F+K=U{DZjm#zt-GR@$v@MTto&Y-+ib!SxZ)`);32p(J1>$0?J+{bpV?^!}aAFWUA-Z-Yx;YYPMdT zwndv5E+p&gSA=%T>y0kknQ9gvhUgYRADQanSDNyBwC8;`$Zi{*Zn~ZH{+Z-Jfdg~L zZn3l1?iant&Jv)*+5@&%I%EfEy!60#e0I~sKToB)#FvIw<*N4QW}@lhFqjP;U1M-yd0sPYm=UzOFtq;pt3u!-3HbgiG|`DRZVs=c1}8cvlQWsGSZu zfu{P`hgajqjY&>Zn_$hmG8H6D{MrSUzQ#{II`vHf42@riQXt1MD<8;YL!Mp}pX}+k zM7jcLu8K{F>3h5Rol%Y5J|{@14Gr6Hz_xRI(ZEhw?ZoYOHA8Rci0^n5MBU+I+2+gr z!B-zOp+CD{ax_;GsrC#*CBJ=(r>8(Ttut{E(q-8^3l39_p}2iWc?`UHrfy-!^uD7W zBN2(jJ!o`85DSU8TQE-9xV)o@abn-<_4Jgu)YPemP|&={O-lp)0mk^f%t#^Q?y&;) z0-MFxV^wZAlyi*}@*=TL1H>NUmvxyZE_HAc-;EbASAIx1kSQRZhwgN%=5d0Zn2ww& zCI^e|ObKAQ8B_z<(1EGu2l~u+^lDF|{3uM)?XUFNas{)XlJa$LP7}@!-dk{ge)Sx} z-}p*?{da);iKXHY4oA9(vZ2t;5n1utIBcAD=gO#-_0Wrf)N%glkXVWL=bkU)Y&hy~ z=r(*yi^>Wte&IfpN-AB59@k`6E~rxYDG>gXCeV$<1nnW@6$HhcKV7$1&pErw^7JK4 z6ghV<>w3TDMX(~cB^^is`eJYplv+{^MU;;{C3}jPscUkV+qebH>LPh}$;rt*O=?Xt zOQ-hFgaA~tcPr)ol>x>$tjluTI;|2qPRqoBMt8u(qzh;-N+vsFK{t4e6u*$RDmNcwi8U%!bM# zV&HJ_tT&hNxyWuhB)o2h(t>q6&*6@2#{oTc6v%wiAijHCbSQp6V?T4!gcF_iOmiP% zfe0P%xa|AW^d08z^Z`p6UHrT|u+q1Ee(FGpB=T9aaeVV@IBN2uKhFr451GL1$q;Yq zbaSVcAK<v#1x$}AnnsW1*9iR!~Q2T%oiX6EgSFsEMU%v8J)4rVEx=Ak4 znf=c$h+PkmpfehX%nqSniq2-bz7AmZZ@3X`!SLD>)AT>N06UJ=!9kdo%N8>0^QJ9onMiE7DYYjE^?-2jE( z0e`O4xQl6?h-L1bR;)Km?%?Dyk%l*c)L9yy#%`S&IWT4GAFn(BfS+FH$Kc?eJfjXE z7K_9O)0^#^Aqhk?GMU4{o$Ktza}efPL)O4FyM{vC{!4E4836>wjj&Av^qR@bYql>- zuR##YInR3@YM?}#Nc^yF_9jINQc%t-l_$3$X&Udt*HfRnz9-t0f9;$kw!(d&>2Cfz z<8!BGk853 zHqvrOatqi_gXbF4yN!#3g}E8Vkh#IB=Yn^rgn}gkIm0|$KL9QRdETV~CP{Iz?Op9~ zsXYyeJe3{?D$&3f;Y%e3Yh$WvF_7O{gj#?Qyes9}`nHmk6iIFqjA~|-G^XNKa>O%D z!!9?(eF`(lP>^WUGP$7lMAv}kTOx)lbQ03>kVNb^hJl=hq|vbLv{73`XB`04;yAKx~9j{LF7i(M=Z!ble++NSXhDfJ<7>B!LrP&X5%~qRX81W-GIS zyb-$mLQ0SWFp#NF=Pika647uK=!-`l!US~MnWP+;qCSNr@(db7R)0ex-!f3jrM@+H?s9F5HxJm<&|i8gX_;v0MIxMUedh z)I4{gM4i-iUz1ez^|BNc!35nxFq;}&KaN;c8emBZY5IA8|ClIUdbxSciR>x^4 zu|15;D5WA$RXbH8kU`u>z5)Pk!KrkPRdY;<%C!ln48S}?jieyM81gJnt^>y%!A%1P zEnWHy|IB4A!Y{1}$rg5(w;@Hv>Ozo&1Ia}{YHsObm1LzikN^V| za$$D2o{spjkwVrYjA926<)2e@-&gQsN9TOMp)d6N#WxX{R=+mJu2blQuG*O>728AF zo1C!sDzn?kqLo`)9cAgC-{g66-wetVzijDyYM>IT_sihsfURv`dD^Q5fzjE5AuCj` zvQ$H-SkulxVC^uHt>Z3(c~%>T&S;2><3Q;zcms#N>)=uE@q|05;900DxjVkcYBd0I zeOc)(Ar#%AGXayfsSARn zg8=9Z>`w4DF)~U$KLw#2WTEa*Hof0U@i)>_cuav9xjplY{(v~?X}0+AE1@_`m5dpg zct4F7a&{rcN%?gE?rrYh2KP2Z_3bG74zrRdrCAeN5eniN<%f0y%z|F6WUZK7rb|O* zd9i%6q&Wd9AN$h#oP)L3RppUvdHLaP1LN;zGHAZ^rR}4p+CtGg9({|zo}Z2r73xZt zh=ZW!EgGxh2yqfIC2QUkb8bn=AdixGh&#F^!*Y9u^KY%SaVjozd{?&z#Jjk0 zT-y*Nhgt78bxaIFWmoznbKEX76Vv&ggbx~`y7+_O+zvgj_xE=Z64bF@=!;Bha{$-2Z88M+k10X9gh)N z>yXP2liO`-omsK9roDkq!VX8deWX(=dO~)bL~YkQuX2k*cL*)Sx`8xc4|&8`ea}Aqoy{mRB35xvL34F zDshdmxYg!_ar*hcA{G1>=Sz@1zviP?&c?S@xLXT9WondBhB3G5`=r7fLsa{)M@fhD zT;mq^o=PCb;wiCUCc{jg1atG6$ZOmWo2nd$siIQ^SI;-!cmSY}rU{mTPt;OoVZJKM zX>KLziu7T4_|ilPdZkU;M`IyU0Z;M-;d@$>_V@=VN{c}Dk;mECH>l3(1kp-xV@6@y zA))y^^E!5pD}$_C+G6JwPld*1RwFSxyRF^wql3pi~ef z2?K+!T5N^B&IQr2bQ*A+cjb8~p?}OAsx@Jm0>**4CF;HCz&_F3gn(DfX6fA1r1_PQ z60P!)?7GH@W}(V-y!EZ?W4yvTv{~c}BwC(a2iKLk@^{qRW z+yvG~ib;=}Y?3d}bPJ$sl`} zDB;B;@kq;;tl6TdNQf+<6lHnQj8YP%v`A=d$y#K2c*XNdDzb*qOGNforA2<{erGZL z{?T;5_j{Lf&pr3tbI#{`vNp-h)s^=Zszs+ly4l8}>ZzV=%PUVbsv8Te6ehy!LgA=H z2{7edeuBVhvTii)j(8FFCe@3mly2U=)841vDQE+D7QMBU%$9uvy7d&fRD){-(lcfc zEARWU`_IY4V0*}a?>}eR2jn0YGC8N3j7)+L;yuaBw#in6Rd_poE zRfoqRP%8KMe(P8tvww#EE!SS6C`*Kxd!u7Yn~l}oerBY~XGz!0of+XA0 z`Vi0O0~+M{&IOiA=~Uw@%k+sM3F9VH#` z43c%;u)gMW>TSx9*m*Hu*~WLzo=d%OmbyB2@oVqcfxq9MO#85}3jEoMJy%TU;(8h@ zb(CxN&nmdK-HRiM%<@JT3j`sJZirMBsOMqivMWWX9eWPGnTkV0o8PD@nY{;}MD&hW zTNF@)tPBkmP2yy*DL^vkH<1pTx?OtrX-YWE*gdT2zb1Rhr^stWM$4;F>P`tHP*(M9 zQ+sRi{#@nhtNhiEfKd-fXo|YOG(_UAxHHAMW|M(`)8mUDLC4vsFb3;z_aiGQr5j5D6xtWO_5q)CTVIwrfY1E2XxC)#{Ff-D!;jhpJWDx-htB zlz;Ir`waT1bGiRj(c~q|pX}TKsZ3K<)~Lz_y7ug9rx6#FO0HmHFy5IfMo^$y{RbxP%IXG0;NPL02l4?=A6eEhlLzh`-FZJ%# zDFwBLMZYnAKqy5%t-MUUMeTvxu=ig9>SvHdxd4(daglt^i@i2FG9$fUSB|fVVmOZH zW)l%mKT2Yi>wMv1Hb3v?K3%*$|kF>6wKv}*fjU;l_kIQz27w&wO z)Cm^TJ~Giw{k}R<%l_IEV*@**xMV-kr#lPN1AlHkY5?RJ}7DM4G{lFGqLWRadHET1NG#ozY7rT!C5i+h83W_M`=tHK>Wj@ROKZ4u4!nG!{+;0-u20;s#y*f-w z57?wG4>2wE=E?H+Ag`})(s;e>fzqiE$omf2Zwtzj4i|p-w=?sob-mg-*NVX16ApUj zvfI9bpW___fBD}u+?k%B>-uF*NIRY}Hd?lSudZjbkxVB9eO@~hH8BpG_0EGg$mcg; zkr|SA|LDb{UP*PC#I!TA0(kUjy+D$JU+3lVgIR~QE(h=3I|NZuj3<}B8tyB!zTPb( zTRNP8LgVcr%021Bri3P;5wIwN_Vvka8saQ`It#8ICfjBnv+kVz6E3I$WEtAN)(jKm z@BjlF7|8-4YHRGjyVYSlI>%h6VwBGA*ls8$KI1)Gkpbz?Ey_|MexyDRG!#cT&{kGk zU(;PboaBLWyu$6+ziX=gx*OXT;1U8MZ!vZya3HIB`8|Vsw@1M;e#OD9^Te7AoD38W!`{L|PI z;=cI-a5_)G$@Nv7=ic|WP&cR<=i*Z&D1JC(qT6ovS;h_3tv7ro>>duBHJEB~vX0%> zM6^<0{lJwbBZ5)SliUZ_^kx>Te7^POba>!r*cwk$^xHq{HQ%)U{w&%`=~TTUF3%!B z?QMUv!_(W+t2u2J4tJ~T8(g~TV#4*jpQeCqR*llu?l^vOIQmFql9u51HP&hCp8w!6 zini~pds<)pV<( z5(}@s%o<#1}8znuhQ12kGUx?BnPt$XQvl2Dz!TwQZ%A?aoaO-XY?fg@J+uxDV z>YJ32B@iVf-S+6tOBEgvvL+su(JDe+vwkfM`uUGw%()A0KGWndMY2~@a<<_E;|{A- zwCmf*OMdEq$$nK0j=W`|RyT|9fo5lCE2ZP>-=f~#es77O8g-ZRouFH%cScBr3#9 zX$^o**m#gq1yOrDsr^T<){S%^M+A!fYtxnp2#P)mHvxwy=gb?gFsi5+o6mw^1}hM@#QbLM<4eE2D3Xlj6(1cH>F%ox z(wWM!5LkaK1@(=x&j2hYeT~?@i6p7 zXbvRMf{D=q4h{|nN23QY>sTpqzI}VPX=>zc1DMStbXUEh`~9&dF&PI0B@~h%io~8O z>G3vh**|bCv@8p&F@xlp-FQ~{6gbod{2`!%yxM|R4hCZz0hP;Jmq?me-LzgKe-k+m z4hRXTrEc9H3<-u=fugGGaU1?S5jP!@=#I)m*@{)v-^0}Sw-v9jynOTT0nFrh?1I7R zwp^z=q-bSrf$>MrOt3+fq8k0h$3d~1tDf?6d;H{y_@J+yd)n~k-<`{?uEx&7ee^mS z=Yxxx2TgcR$%~hu6tE3?z_)P*o@=DwKZpzistnBoqixxy6FEf8gtpml-IlAdi^LV` zgSm6CWS4z_}EFi|qQX%hDl5J)2q(TiD#Kk-b%ZUFjdrR5nGm;lil zPEHnB>EgAfOlEFp);kFZ*WsyhM;Nk)O1cSgn!+A~G}vm|d=?$MePWDm>rvspWj zd_#~AvgEsk{KvbDEm(YlGYgC%4)98iH~+mfQg6@6p^ZaCP)=SAxqxr6GzZ$6`SCx6 z=FpKi6nyAx@dwyBj>&fl6onoo49A_+OV2Qd#gF zKy7-qN34!0hWDIwm^tY^GYA1Jd>dT_xIOcP2Mc6KF^?vE$CoY!@ImhDbaFY6K8zYk z>VS{#EhP3zQ#D}l z2i>zonFXRNu)EB+00&CbJXqerbQR)!f+0Z;@Fu__@p^}FHC`azzY$?dX_|6pNder; zLid+2@4Y8NxiOiZ&V)>`Ut@kC>6K+Fy8xd7#tY;3sx{0w%}LbGIy<((?yy>as8kj- zzh$)>*d(GCAR&?WuZ1^LxUR&knGJf@0DV3yc!aaTU6G^$#E^&3M|I7F*S(mBS31xl zm1woR(1DOd7PC9%9H`agk$Av`rVCT@*&U*t2Pw|Q8;WR}&gVpDf5jAvA`ODDEzjyK z;ZJT9AH5s)s>eqUKj6n-9+}f%n4~SaIL3}DK`dwPZ35jBgqE^p@+^yAfj^ewJzqqi zzl+yXIoP{OCCnCdzF8z}-X^suqFVSM;b?TBefExl4o)srN&Xd*e&3n8f$09Xvq{7+ z^k;9bgP$ikDd?FCa|A8S!-H9p{L44f!sn?`vIFROMp(lIWm8uaW3c7%>tyJ+NbcY_ zCcL-SiTIP5Zyf{vF>>ROtz;+d9@-!Kp?Lr5*PLmA#ur8^m7>SMyp#qqG`Y7ZH9><^ zTydPHd1TW*&SddvueOKL9A7MJ%_1X<5Cf{f{kGO)Ml1=!o-rLE8s5al$R*y*fRzkdHOdW;hoc9fp9vbV94UqO!x1D86l=M1kpCh`xWL|Y zZb3rt6Jg}AM%xeP7ndNps)2pS7cvTF#T%5dghOL2ToB>ZV$hc6U8l=UOuDDw?OUM; zC*^$c+dQkmFZv=8^KtlK^&(%SuQSh0#5)P+VQHnqx=Tu0gONtWS+NV~VDk(-0wE=S zJTqLBlS91xN~MJtk?|VOh%BqUtU{npkGzZwQ|4jA0xf$`dtf90Ay6=A;>YGodawvX z4!Y)nu6G7fMoC;FIxWul><`f5#!e;6n)%V7Ukdcw#Pnv}0*-88K5ihv>aNm@(KbDwK393L~ERk}+VZ zrQ&6JIaJFPb8Ci281hRDnp&7}wSC{2_Kjj*0F>Ahkt@edPYSX7#vrU+q64T||jnC>S7#Fuw{I)Ubq63 zl|v|GZewa9&_Vm_Nb3<+`{p+Y-_fHIbcl>ER+ZyycS?*4O@`7S1U>ZWJ^jRn7UOj8 zBOlVcPSZRkyupQ~I^eSdc5Zk;)2ukBcbB`ENd75CrT!3(n%kRC_*D%50Vc#hq(6XE z{7ClE;w(L84D%H^XoqX!R2Q-j`@0zT!IU6Xy-bHiemI(L;)JCd!V3aX*-jj?(S69> zu-`ABU2PTc*)H+Up9I1JEem7AZ3supSwC5_c{YkB89GJ#KeZ!Q#M}!@N|rBSedB`7 zfb`qYm;26!I7A=L7J)^20kmzO70e`ix4gjd>PTYDcb z@4rODW@4W_VOLs38ip2X|Ds`f`)|UwVwYEv^2CysQzT+Oqw%PUyp0h;zJQYpL5*HJM> z740irGnh}(V4BS-f19A!^?9uDf64rd`1wyP2;IPX+fi@?FL#AOxt_`6bfu}m0P-nX%EiZjjww8WKqB#8I=s0+;fq(SYT!UvFq!4~$Kq*7M}J;XEP(^Xt0CPF{$lw~ z$CDV~>otl)LD3dCEzN{`iO<8EA;FN_m^e7I>t8dLuAu)r8tG(A$LJG9d-Uhv*MjDD;r;S5HvTA)|cDte^qB6~av<{Rd+MfNiuE z$2xz~LXhb27hUm>fXg3svk3okSsz!Ipfu_0&5C)WV6cy3cxNR@r?fJC*%?G z<{yO-PXK~BTpnWkiw;6Z5ITTD4eY4kny~FZegagqDMD@n08uYLnNVKEA61RQU_=xW zS?Cw^7D4+zc5VRsZJcW2{PzU>f)E1hHTo))ig`sv5U3VG0ks;zPfmo9yi`#Kum5E! zPBSfFaxBlN-MRk!5=2(`dmjYSY;aCE;;@b<*}3!ZA)uhR)hbMVi3TJcqtgl%XPpTG znV<0gcoi3%C&=n|G5`-^JuQN+B98td8)Ag!6O}Dp{m--jGrW+1#$I1f?0odpllu|^ zIQd8g;9gnR3vM|@rTM3xA=d%!?1{xv2$7Vd&GY{~gen5QrxAPO@YhuZqHNzp&`Z$? zIP4|B$A0^g`uoW0{zxcMkAVoCn?4X;;c$o*@@@hZIG|=jv2gt=IutlC&w5YhVRhQz z|09b6#|hx`g*>^JD}?{5uZ36vq0BbEN{>K)hDSku0USc%hlY-ByZ@`l9w<8p@?pTm zbry6GNJZ8SsXy#|;fGZFN87&mAt5JWKl1-W7tjVF!bD4i)N=uzg+B|gYJL`xZZP^I z;FFk>VwK)r+YUFfgPGr$J1+w5cPXyR8X{(?{-ESzHyG0z>y<*8BNVaDuK&m$>tASL*JNxSgc ze@&NS3}yLToD?iT0PkO=5}rFS#6MoY(dFoY>dFJi?<-|19~UsKj6}c*yWS* zj06~%7X@Y~=igV&s^Gu}emnO2=LC86Vit&d?SQ+p$g|5ZKeWHmj#FaX~_9w zbb8?n>wd*neJqd;r*U z3%dC10vCNE-E*H{2$)QpVkCBjXM<>}q7=2@`NEFz+Lh-NA@nH7%a4)ukgzdiE|Z3H zZYUtG=QA|BN-8oc3Io7?{`=EuRx!`dSJW`X8C)La*k;0lf}X13d2&gZ8X`_m-S}vA zF55?9p6Y+RU$YS)%R-=P8|y;Ja1);ZD+{p&7jZi_FEC%49E8RP83jETn4M<+7r_g@ zAgFHEMs^`Y=-NXp`U?^M5%Dr%bE7A7b@1KVrx)xw{{Zh1K!-v+TOtDK=xS=>r3$Rw zAl!f#ByhDzu9rN;5zhpwAk3Y03vn-nJW4OZauKw&AlyJ5i|d8;I3o9-^CMLP;3KoX ze36;pG|M2n07DQ0x^}C(E0N&}`(K11x!tS*0DfWPV*P`Oxbh=qNV6w1H$$rORf2(T zqylTF_T?a=OAEeo6Gg}ZLICclrh+J0IJ)HjUa29hDBLgnIU*w}#4Mot%h%sQ0PgC2 za~BW^z}KEyo`wiWUiSfAZ5ua`#{Q<4UYfXx35X9Afqt3_-@X(J2p|lQCERsz|NI?) z{eKX_F9;6Wl<6I0Jw6wUOZR@R051vv)J9T1;y+pRUtXd=5(P|S3F>_Vu|drw_^S~J zY#squNR1njjj#$6RGQ1nQq{qMzNzIu$&;5H`n5l7LIGNP_uY30 zcJ*r{P)q#vBY0F0{ws{Q>PJ>laxWFm=BgjDQS{XQYc8H3gkSL^MG~HM=Uj6F5ya(Y zA=xD=6#FP8An@n|xF6mJ2L2`XT+=DEP?ot~0cCh!oJ#$FxDv8zhx^$CDY{}4_3;8Huz5%AhZL-A8!yKLKEsA`6kt~hKEKoHm1`o-R+#KF)5=PxAl#RVwC4#qLU zH593M#$Q6g1s73v7ohwhQ~FL~?Vlshz(sfCh|(^k?xl;~i2-;^feZ+^2}wo#K1T)o z^N|)ZhW-!_w)r(#LpyVY`Bp#V&K*y!7oD(Ae2yqjZ z|KoGtp_KelC{TRi0(}F9CTup$!6aQ9u-5#Kyb-S4B^v zHOr&`77}j^ar{5d&%JtY_$(|l9Q}XL!(j&a$Y9{L;3Pi3gn$qPqSSvGjK%Pjq6gIk z!O=fT26>Cf_y&xdQID5$k27UP^>Q-x-^hKQDUl?M#63)Cns0XK&Wxw<9LIqZeL$b zO>J}J<0}6nle25rZ_QV2$hu$>J`tB|xS1m=c3jf)e5rP0Er@qjT($3>YG{?myP388 z`qQ6Zo_D_Z%L4IYz^iC%r0QTH-3EVxV7^W9Flw3Ma%+zf%W_ktPPO-MqUI7j>NLu& z($dmYG+&80J69Ip;^y>n9CtQuYZP2KIb6ywLowBsmE+u85q<{B6;ky;hRG$ z76+R%ej2A%6_anJm#0T7ZFQVy2#RMo%zEcXD~l_|QM{J%6IK3j?-8Q=((*+qLCy;> zTeIs|`GmW9&dxi^po;nA0IS-a{_52#^Iu=Qw5se(M=J_TKX97%qzAr{FgIFFrKh87 zR6A`9B8_?PM$V$|Q#wSX`BF$vFNwpC9bsTYC?$x1AP%Y{J)YhnV`&t);Mwc7@mg4n zRo%fXoPRI&ZT-0W(F*Tc%~rP*6EuX`Y5iA(w#!0{b=|@GckE!EMH=&i-IWo*pSAw` z-O66G?J;Yn2LNzUo{Y5%;JV|4TX`v#+u?R0M!+{-f7KZsRfS@Zfs*3Z?naV*IEs0H?!rj9wV};- zi_PCHdt;6|K$*Fo_z4FPF)4TMXHQ!LwIF4E@lMTRe|-`Iv%R6Hs3@Q7G>TkOv(jd! zu_hlT^sY?3=tav7^4IHMu3>Kj<@Go_Jv*8>8}~Rn@%P7o70H+n<$_X zFGic^-Q#swu0K09w@8Mv8Fwhf8OJ-%9?T`=XIgY6i!^47+j1QB$O^h0Z!|Gg%_k#Y zyUuqwpQ7F?o&~F^++(Ug?yi!IV^yIod^ss>u%hE}k|tt{R~>2{1CQg~3*;KF07Uox z0s>K6Nbopy9;>o1({D`1h#@emFX}7oQB5c#{qN;3%3!{!A+?lvz3*@D-866?cb=n7 z+R!exq1wJHmu?C4I9yrnF&3wKYbIVG^TewrQsdZHZ}~XBSxmEH28`u4!Ba%y;yBFv zGv!m*9bnUW-`OpP+4t7C@KVS)iKpsL510DlTLH3@e&q3j9(6<4@h+`jA9$uaOZSqi zUZ8)t%ks@7P{3}!^JH&gVzA4){-nR!agCvDFxhIX>S(1r;d+oo53GFLnpDI+HY1b!MFj<&&0Vj%Qzb+tw6f?Ua}_f>kZ;^i{MvG~ zR4 z9dE&7plWx_8k<8Y%ZJT!`e7P5)Bg5rwR_qkx7DA} z(pD}Pwc^`F%>-(hkEhF!uqnPDDmJF?iN(*PQB+J2aBGvMihb1#ywY%%Vg{+h;AEsh zP*+{=ubjLpNmHzTAULb^@NCw{1j^9H)J}1i8)Qzue2KI(E!V1+7#j{2m-|$7NI5e( z>2YWM$lXmCS1YE2^arNiKaMx)wP-^)NyFiE7K6sS=IxbJJSiXW%v$<2tlfI$#k6c% zsBA*!5{0}S#_U!2zfeDqHNj__AF;02YSQw{g61eU zG&H!ZXL{O3b6Lle-F1n*?>PF3_@}b#_B{VmZgJVDjTHZr(*DYu+?TSA1yS=AN|7@i zD*Ii-)pW~|GXJ=eOfQZGVT>GhIU~~T9=fH}fTNn48X%46DB=>9o_?R}LC<*>QVT*O zMYr(TOypYC1@JNM1rR^!hE|Ju;lu86cT`?~XA$K;icbufrY9?SQeqiSNPxt*)y5{N zngMJ{qy4{?lAaP6$AmPdS%j8@gu?IjUPW2U;&#sb+TG|%UUOmGBcU6lb|*Un8f=!P zr2hrJ7-lVX>XG4!v+dxPd=`!WUQLDe8yv24Hk^jj8l8{+lUv#>@C>^DJ4{v?J^Kfd z&g;UX)oSxx1=G3I{jFc#*viZcnufnC_|(~pvR7$J0=5f!*NgP6N92-3-vXz6^lG~C z-p>Lfs)B$XOef+dGwD_t0NbA`t;`pH^?H|W4X8T zs#l9X*Dq%0lrUipo7{&-=Z7+m6a?GDx_MVCQfBoYYv`u1V&G9rM<)8Pn3{BO8&w?4 z#_%rn>W+~*j_O&=7;7siOleC`hFL!8ps~J>Nom;u?LL-Ejxv=RbjSap%ImbQOQ{z# zA}R+LI9lehU%YGByEz`?zL5)C4`8Y@`NTduoG)q^?mnO7w~eFlE%L{I7K6-aBeHxO zKjK|iOMur?Tn}Z}1xMkZpd+jeM{ele?PNV$6ccoQC@~ z(<0?UQ!B+EW}ztk>FGj(0HbD`y*hqbsZUT36d6jTJO(LLO!h5 zZR9O+Djhw&qU(ni^?3~60FQp>&@qr z-I29mkmi7l5XAnB&W@_d64RdC0MV-CWc~ThB+=nWjT`-+dW?I>6XZ}caYbfGdVoI- z^kEU4i?!X{-27B`yxGdZMa}PyFTA%jum;kKfr81$39lcL8-&j;9_>wdLqy`DDEp-?VMX6%x3a%U}W!Rx?{~BF0VML6dHoM>->ge5>Nz8osL8R{c^*$;qG>uv&Ix;|VK3dyWhIl1Qy)+xoUz?pP zeavB`UHref8~0y+(Q+IsU8_5?D%+4X%zY{W5`cp1Bxi-kadzDjbOz6X8|4I!EpLGU zLMMitowpOt{21*~9FKi>a^vB1frA%RZKkWEm7?mCJ`95M1qTjd$L0q$lqF2r> zxcJ zO8xvaUh_mkQNc^{Ny5t>NYt)jTR1u|utztex`PMhK*cB8dYz)9%BVhkr8hT9)%~L0 z7=5~sk&qi;R8>;aD@}xtA8AUZscZ^kaocDh68#qG7ibDA{OsQz!zH`rBkf-Z+xZWf zW7L=-v4U}#r8^|GG_u?OHG44og0|;%;r3Gh#{?=d0Y<`(s3ku&l{!zC^6T?7$~$&D zplrH9_$4tMgLv8PpADYykTVEcx@_;P_Y9`U4;r3=45TvGKJRd)d?Gd~t3{$46TR=e z2ZJg{!C_3ei-+o!dlTK;Q-b8s5+eYbu z&qPFgLz(9U#$rjLIcW3(=GkwXo;=CKxEmH!v=TPP942zn3-AG@%Q3?9e610lzjph- zFEr$3cm~kH$}7AGy{vV&ux?=Ol2M7tJ7oa#+eu+_mE)6QBq{2~WdW(Ly1 zC})r!kG=ekWzZB<3w-5BnWgzG{l;c16DUoaj1%0-4ye0r;r!)7-q+PUtmh~F=+ z9y%@;HXY`2XX}G9BCfP1nRF>Rw9Ih$`mI3L!gd%-rCC9(w-R?53!{im*N&B_L*5w~pMU!%!tg4~qt*#UXHW72MUB+SkJD}0g9tcx-tQ#nrE*%BR7Cfv7 zH4j_iuj8cy+O9uv#X$XH4N9l}&$WO9N6W=qqKP(9dkp_(4V6xgk2GP?6(j^fVrh=n?EuqpV|OxYP*e zuKk$(K$Lm-pzB&KN3gBJ4f_}L^lE}j-Dv>~AsPwQ8wo2phM)OYu3kh^+x4 z&Vk45tBUt%M5CPbjuz6U#tSi?8YT*+apovS?0W&P_7SO9=(NZ*=(yD^ON4HQpf z!*|pCu*t0~Ww&PAVfN7rrRD?Crk5p%rz|pxaDp7ZRE%fiC_AI^vi3$iW5fVVBV!PL z*cZ^KZkxCMMLOmtbhAs093+;{je_9M^0jN*KGuW626#v7)4^ZKA^~>JIs===t`RAf zda*are2D)mQtqy_of9K-ez7stKx{|MX4D3<&KFua9qMAru$)i*&3%^TW1M>5eBOt9 z#3yhf^0G44$G#~T^>b}eDFy2wFw5l{o}?!D0|Rr9ZsHyT%<3m*|6#0Um%bD7(ukOw z-*uP0?s=oClCCMKggZ$7@sSsW40EAthD0gPlpLo{%+tg?MEIe@VW1SvbBX;2j3 zVw>x5)S^KzKrAOITc^x;b*wY;cf}_hu;)aH*@%MjwI{ zIaklq9_D%&Yuiys==96$2K$d*m`3?`Y{44sS{LFEMS0L=JuPWn^(0?dS)JPv-Sd#( zw*~lg8Uq5rw?AaHm3*SpX7Ix7(N@UQ+uRkKvL8i_QY({XG(Mb+yROk@Bql=iGIpNE zWb1*HpL_ZP+oyNN9~XbOgtZg1zwOV{;E_T^bqB5{vsmvx`tpRwW>3e^V**8!X* z(ADtxcJuN4sqac)ky)iEEbt>S9T#4sCLFU=Iat~tlp7_A0)iM8g7pwE%8xuXfMD{W zS)@D#^}_~8+|}geU+wg%M1+U8N3uL+X#rki59n)qf}l=B7jS|q&r+eFC*=ZEn?oSQ z2jwoD)R&<%QRv!AN0r&vH)zCnNVu$GITTH`LI<*;Qtw|#6VvhoQ$6X;{RsLb<)7PH zTZ>P=c-zB_)nkIm_<0m63`dSZfyhirI6`+8@ZAr)oUm^F8>Zz~kUWPnGBVyKdBwC*^0NnpA z63(`&Mf}#sNU(!4JJ80m-TL~k`y2CIJWWhfuDIo{tOW-Iwzm{z(AniK;slcTI%^RuF4|F-n)FbmG45k1w^ zl<-!|zS1?&pD-m*t+HD{Bhr*pQ0N9J3EHhH4A5`;L7!i_6-An$wdb`t{;j zk_7>`!?rkH6;~F*?;WuE3KRU!NjALx$|_y0-U<_toaSWj+RNjH>bE9J6?{c7p?3XrW?|lQCGe-f{T+1H3jma4X(OSz8lQmG^KMF^Nt=h2f9$fmLsgl-D7a-L(7oU<+0)H@w}oA5Ylcawzgd)EA@e?QPP-HPC9< z9kKS8B6s?QY`M8JpaX(}`crNDrG5^7wK*e8$+l>YR?y2Km79qPTT~g|MN0zRy>!XL z*k?(^xr&49gPAbkG=U3Oy1P3Qp_5HT{P{I-;m=aX`GGy~yb)!wCF@I>LDW3gra|j! z!26k8wwjoXcLK5fs9w+72actDt?IJt$!Gi1*rY?CTdmz|_V&C93H(<2gIC3=QU9H6 z_oQW0>N^~O!j*a8xFG6#g6+nuL-%XhZN>jhEgs1MZ{roI6wc$--Q8^v#61g)AX3od^k+CdLRr*` zjoh}o#HPQU@PiPOWq!}qUse}1@akSoPsnhM^@8ZVzi41Sfr9^cZ0QvXR(ZgHDqbrt zPZ_4}eI3hT!fmh2a)gX-Cmpg z-Ae=0Z{BnEvLe*|8aA=a<#e%|{>wNnghB(LSv(`&{dckF95~qSiBkj1Hj#aP5gnHU z>T^Ux(Uy_*et*nGz`cTKGh&A}mnXK%;qB&Cf(BM%k31s*T?Xj}PcNh=0BIG55X5;qWlX-v~dHdf^Be>E=nW72ol=64j{n^w)&_?kF zvhuC7;Rx!QYdh&$>tD~8|2sH9ibzYDCsD?$bYFu%;L|~?NE#cQ);UG2%Z)TUp~$t5 z&-`XL`ipeHR3kDj^%XHs)=Sake359+aUU&L)f+Fpp|VtG-q)`&XRSe>FIp;BN|!Y3 z8{^{|Loi2M{9G?neyqm3EXPJY;Ef*-A!AjIUE6yRhVm)@VQ5tNSHfSDB+JuJmvA6o zGLRbn5dKb7_g7sXp|&zljpC$L%$zmefrz4nkbCCIb0~F!_VF|t)sclFRkRFk07MR` zthdc0lN$(I^wdHAiIB`I^j`X(J(<6-{FHLyE6}aBKGwX-AjIOYa=E{vuZY@>7{-%1 z?*3UgLacMp_&|iws@BwZ9#S1LT=W8}x1`wVB0JT&lpI`I-&o)Hw59hu9Q4@oQT4wdd)@G zgz%r&Ktbc-$Z|11QmRQSrVwP`*q%CU_;AOCl)wK5Vmtb7lb7`5q{AYrVXklw_ff3>OPOdW5_F{_& zV{LzSMl}KTZ*iAZ@uT7FM(SqDYQie%?>vuA;vKC7=8RTwbRVB|=7@M{U#FB|shP6WptoMmYAE!GFfsHH)RB`vsGk^`rE*q0 zBs^k};YRI7EY*NIa*U0?)y`|hd~U7IcSNb&Butg6=g7RIUbK`iu)D&sMlmeAN}B6u z6W;(MpJVUqfMeg*0X4_2QZ;BqR?{k4|F;(Lx!IJ5_daG98|{RAJ954zmCsu-Or|kQ zw9iYhq^?X<>bCo2elXw z0k3cOyVaYFS(4{29!ei5J3gt_o1$9^atT!HaxxjZm!IqOqH!@TCb#hO@FUm=PsFm0 zW!Mu!9Q1g|OWDU?i<80Mao~tjm=_U#&ObUxkkKzF(BjRvugTawwX8AU*B5HYF4fzU zH8R39nP1MM%sJyLP?~gWD~FaOtrs0|)*K6cXsc!nbZhjq4jq9mTXibaYY47Uxemmu}h)aFQrjeht#*>e2rwUxaT5#ll)n$$A4RV%lP92~Q?3QjVI@eB? z>1)07WS$cGIY4q2e`Q8kW zMakl(yaMMcT%6s_07AC=FMwHwVJ(UJN8hI(~hN{zwA=8~WA@)~}-; zt>*?i29nilET^!LlDO)W3Z6#oK@6#*W?yT>^us-JZT0FHZ-z;*B->8v@w(KLa7W1$ z473-wFn+W7iN@}v-M(X*1j+lJsoHoQrlqDtwt0(o&mu&JZDHcNrR68F=sxtnElUvZ z2hiTi?3~V4#4XJ>>|!DB1Pq*g_T*(*BeLIXsVMcoHnFOf>RhCe=d|T}$A9XKa1^yH z%vceHC5w*Jt7mV!!ed}9kbt;72xhaS%;a7|MDM%}_E9`N6RgERap!0aRzKlZ-ac67F7*;WlphD6ry@2;IXafnynHa_^omedw>I*+v^ZPg zj`f`{OP=p#m*=k($~07UzC#!M@73?H8ROcrhuyt%;e++KU%M1o@u=79zaP6Bne+{Z zmZ(PKS~B&_203c344`0R`k5f&4(6mMlK%rrA8Z{G?Y+P|M0 z^Df`eRFzFu*4X~1o6GbF$I1A*Q*c!2TaCy0RdWVw)z@7}dlcKM^kPlzGsbQ&B^2DS zQlT1VVr|bg4hyQg9jhI<<7A>Pr~@DUZ{f8?{HKR5T9zZs^+$QoU^6AdxhiLuKAE3Z zoXXjUJ0Y08IfthsRe=o*S~DllLjvOhR?ozYE8+y~yt>THgKdTEj#7ZZ;`|bdLKj&S z5BZ{vwTV5Ec;Xj|(I$jb#C{Wo~Uzm5iEjSFUI+K%g5G%wO6~9R7?paNm$AK@~U=fS?glQ-#e*+%c%HkMOSLQjI35nZdx4|v+X#3w?+iT3XLZf zJ<_naw-exuLq;IsMvcMHooddiMHS4G_j3Hp4t%ekk>RAmx-dSt(RO{#Ybn9o7O?&Bz$iF*?RqXeimTxF=kM7AJGgu|)`wo~%HQO_yZy|4 z;l~cs+rP+=DUVGFOXUh@iTLL{Wz$nz zL$D)a<5ej0X^H-{y>@=iTDfE=vV5Y<6SiCqB_7f+e7H?9_7;D^}R^K6E^M_ga zi~XbxpU1!NKsUm4#_CR}%J_*jPAZ(nSj$70?dF5rW$%mnw&99VXT-`cKjB*~(I=vhvm)?2c7L_7;-_L=YVW>- zKB+C_E?%xu&6#sJOe?a*L`#a_p7G_(QPti!=R@qxTB%;nxM%h|SvX3LiBjKv^Q$03 zS~W21pY_bj%T&#CE#4c?TKBZf!GFt(mGz?8*uB200Ru&exQbF=w$CHm-ElO!<34AqD($`8p(npg^FA)7;MlQ8Xsem| zq%;b#%wZ@)+hUJv;48PtiB3d)GfLNQV~^JBuy+@KH#zGWd#xEsB6HK%?nlpQrubL3 zR|bw;2RgFOXxsseOnp$Bxpe3ffv?ArvNlcXN0<3U-zm6Mzh8iV5NB4i`6M&>z-#0B zGJU8tQJPi)?cT75_*3W5pCuDn*&79~ItaK;==tvv;4bw2`oND_Mnmv+b2)7Ou$(rM z>m`53Brmiuf837S1Wuh|@A7c8zpjexmaGGV645rE-tUoFx^!Nm8^NGX1UZ z2rUgCGL-El_rKk&b*eYpx}Fz2gkP|bYQW1#zD?Vom?kM2&0dn{WdAiS4Ux>G>$wjO zI9uif%{vbm>}8Y3$>)MzEXf)Xl_h~gx8hT#UI{lScJ)LiD+p>1?~k@E)u5qfG10a@ZsFf^{rzE$}#pH}{}MZ2+waoXSW zd*iyu8ELpJn&@z)d`6y6UmGCRl*y0{T=3N(7l~gbG*5jVp(fzX*zkPCA(QoF`C~sz z?f2h5#QP=z!4+gz)wv> zpTs1U$t4p}o

l_!Pf`eJ6>Lw=q^J{Jt?IV(`6)^yQOeQx7F^8ZG#bm|>`jT?U1i zBanjY+O+lKAzkiz zuT(0qok+j`(wUOuXga$@+%RtNJUy#;zSL8Mohq!uF%Xn1ZHSpZ04A?eb*?I(2rK`T}3<=`)&h#AYsqQ#$Mt z*j4s|R0|rom8rvM7@PAs7yYE<$8@xYx48dc+{myE4_D6Oy|C(fonB?VwgABKdE}_i z#`^MoA#Z1x1|L`Dc;pmo^SG4K$URE*3*!*9aH&>z4iz3BJs%=D@ViN)a*VrZ0& z=rR$H(TH8d9wPC6e>3OzT;Q_$U6P}D?(v9aP=?frbsEc-f4!4Z9O~}gsTvdFJWNio z;6lBs$+ZUh7WNDzf+<$FOd*Y1K`l20>g0Dnw~*n+xtfc$slwz9_gG1zpE(k>WVX9$ zHqhL07_XP{LV*?Je7Xm6U2P0}lmib2Xe*@*@uwcGx8mj}zk~Tp|C>!LvHX4vKMH^J zsHAiMcO|SwC*{pn_G;7auaz;fV-KdiilI4UB1XgX6SB!UZ@Tg>H`Lm@%G6O0aPUFH zEAjr#;Yr3s-qlsKhp@f{kM4zr#-r<$;qU3rmTNIP%vao2KV&}_^z93E4ca6ajGZX^ z^?l5LiK8z5>8^Y>c|Wh&n79vaAH$o_H2M71~k3qr2L z`}^QMuGWxX=022JJiHE4lBi&p!-#SsNkh&!CNuHE~ z+0qy$j=Hi7cE8ngay%@1=H4z%FLHj zu=s|)JC07)f;BF1{_Lt{Eg7tioGK~ab||p`M^DEO*?=(=PU8a;+kPdV?fZ^HW=%Yr z?$zrBbXX{S4|_a27!_&Pk8g@-i0&)+M8>?5I$Gr6ZLD!_BOxU6VdVc}z-JcGzG-bi zbadCK&615v>HfZU{#2v^b1|8@uzg)u%3yR@bO}h5!|{DaCkS1eccFawBOg!PyGjJ< z>}tAqq+^|23iX9Kz6|`%4NS53KI*8vz4&9i0quR=YZ4bb zJ$auHIqdxpuF(AH!~4gZ`KWxzW5Fp$qzUbkc6Z0e{iMc984X-O$bzGjgiu;)uVUej*>5XFLUZl}%^b8wHyfn;EgV8_^vn`bq>H z$CSteDPeQYs6JJ`scvabW~KJ09rioK_l(LH+&KFfFrp@uYm;8xJd`a*-*FO`GaT;& z+3LK&@r;&81)e|ingHEv=7jh8iyS$A9yr8WXLJY1Nk>TT`~yyXCXZ}U6%c>PBx$)D zZss*I>>3RE7udDyGtu--`Fsv`2bKBxuk9Ka;Y3b4IV)9a?tJ7H0r!$i)aQ?zCuSW- z8KGgg9}cW7+ZU7a+8>U-DC^xEOSYGNT~>7#L(j{vcnW#*p#5ppF*N)|jAR0Ch;35$h+JTK=(Rgz!=Ub1 zJk>lfHBcVi+E{$Q)$dZrNlSd6FsXHe`R$l;lCCj%exY9ZP8(mAGn7BuvVnCQsx>F6 zAtwBJ#&;%OtWSX_{dW=6sydT=!%9J#*MJgr3h^Ip#Drj=P$#lgbtMDmW-9l6#l=KM zWWEer*^>8#TK>;FXZz#>L9wNW$K}dpq;;BJ{&RjE`8=Jx!|dvKrgi!2E^wu8|!$Ck5=L>@)RY{npoeOL$N=S9f1Bf5}Itl1C{IL0+Io%10JR?KHF)67(kib`=+k z-m3cEo=cPl?JIX5TvxdGlLzpMgI2y|Ni;gM7kpu>%JaTc8*pWFoTC;s^W)JcJ*(;> z`^);o2{IhnzI~)B7KC6dFYWo9!|sKT zyO!k3eq7>^qExbWFIR4Qt_RaLJ*jC{s%spEo8LRk)>dy{S+4)@0C}>W-X7I%*5;t+8Rx$3@MpczWIS*){_!wX?Cw zD~}uBPd0hj9a^xKNJqREoh;ZQ)R>9*!E&6q)PX4ad&6cTK4@jpZ1+YevlFYQ^Y)mj z4vs}dg$m$Rs(8N^)TvE5B)D$v+*EWzu9bHZzcY+cs#pEMu!&z|l`J?4>!pOE73GJ+)fn%LWu^?7xBRBu_bhYSF z`OP!A`GH~HH_-c2qo&C=Z`LzGVJ$E3B1WD-*wZt)8mw&n>Zr(#TNd$LCi&r_zF;^IzQ8nRn?Kvw@CYhe6NyiOte=*`JFkN%atc^kAw zMmt~VQ(}Kd+Fx~&TsO|Rocp>`esWbav`K|Mw*_UyQ;?P>IHu1hxqeA$CBbIkJ*~7M zBk=g}$`!zhvpAj|=`7 z`Go@{^4Z<&+o_&;<5dER?mxn2szL<^cDSZCg_A_>$H>MVWz;x879LYaKk(Kikk(PJ zlhLJ#IDzlzfLP1XjHv9;-q@x2)60lQpKVGX#)=;wKk;Ma4Z5pF#(B$q?x?iNvokH& zP^F8?-ca+GDA^)wRn6$mn-{}t1jN2ChjQLbMhdzlg$}0gedgzLD`i|}U!5!>8p%FN zud3V0DB6|}{3iBIZ27)Gy-msvTj}rjFWl=*K#JlLojMccq>i~(F15IjSp7hyw%q0< zbZ~p3sa|>6X@C`r#44K9XkqpxSA6dhvj~G)DJ5S3gGf!-#>CfGLw>9A^JtS|P3slf zG(k=_m91~VA3jZRMCTdzgyzA2aBtCX51W_pbsrCAw6>Qg_%KY*4H$m2%6z3VcK>(+ z>`2YR>^*#!`?~E1bBcD!3G;j0xN3hw8Be$r+iM$h?=I}DZd31YIpbpQ=Nx*B*`{LT zRPkdf;^3I^jdo?8vEprFtn1jP;=I$)4KsEhEtN+`k-(ShWAZ39TE@<^rdLY(nFVH4 zo0JK+?H<^-ACbL^$aY?;E)7tbKYOQGP0G)>_uVS%zxB}p%6`|eqZ~UAuI0C)>2LB1 z)=+snmx|4XkAKXyW*p<;uCL834c}(k+Uj@+or%>PZ_WNzHUDa;6yt7BqT|D#chPv* zgBmmqXo=r*n7wm2UHcibRWzvlUerH!O?JHSdHm}9h~zLKfej6Hi6Qk%mX% z?3jW^=B4}xzMI(YLHl-{JumCUYMO3>ntwJ9Wi`}$_?H^Qknb^^2{-VdGFL0%P~pdj z9@|;w%leq~b`2{6qhCq~rp}xTngv=b&2!#znQ(eCCSJ3HZ=3e36H~=YvxS;+3k&4C zvx&R&v3&Ipp{1p+7L_4!BgEWub#*pTOIct(7_yTxEaVR5a=|yv(_0kJ`Bcx`QvWnl z>xq4BsA|s&mh^D+O)n+P-x)4`%h+E3p?0{pAC*`tt+^8)IV6n?CdzxWoDJ=aOvW_X zp)u<>nl<={o^(`-3N@Yl;t3+eSSd7&G|rnl5+V3ldt~sVRVRh2>SO2K=+Gbs_mCx~ z&A`3k(n4M>Uy}bClWpDSgC?2ShHmSAgr$csjl;vFyX%CKZ-9!6>DAXOM~q@B`O6$f_&iRj(%jPvk|KuQ4%X4M z8OnXjJcz01pXy8BSrO`DjG1xO4%jB1rjM<&7?p&>(eJI4w2w8>UoT-;zm~_U*Cg2P z*5E*Ln$kR-Y}C&9{>ZJye0wl`H%ST(FIY(au|=xM2;0;o@DcNc8z%=9(k~4KwS{7IKvE zlTvxE2OS=*NAfT~J3sju#xRc5Tbnsmw0Ag@Fy9s&h#J-YK6_@2HBi2{IG)pmH;az? zjABa40WvJc2L7n}b8hEBhvufZQ=L$KD#dSOjLK7J;KI${_hOyK^Bmk&esGrBaZL3q z$GO`LOu&9L+WRXAY#n}G3N++8m>8m4GAo5+SNv2hw@DwX=j~7%{~uRp9Z+SqwebN( z5d={|8dQ`NX^=+g?k*AOlx{=;r9lDd?nX-TC`fmggd$zi4c|IA&dmM(m^*V7&UxP* zYp>Yr`L!I-*6GH-OPH?~!Sfy{JARa2u+Mwh+VDjEjzy|ZYt-fM@?nuiKVcvf~uaYe{5kE^D_NR14dzNtBIv0I;H^@QaDaB)BQD?4V%&w>pWB;bqw}+d*!ei2C zaxxn__<0_VI_8=2zdxO^-^#Rm$-ykE;sYI|mKIw2QV91G!c6YtNjN_wxGP!};bIsJ6Zpswauq zSBPpWaeV6J62BeFgK}i@z}Yp$5IlLg6?e9TsJXA!XrWQ0RvMBQ3OPdD=a2N?=Qz!g z%L|3j7MgHVkq12flM5)6w2lyOQ8M<_H+*8cQ}FYPZ0(fCuzSTBnZty`2?J@lLl9Q* z=Jn^k6GKLZaORmBX(afqP2EmW5#F)eUr-HMXd!g!-gF^PxvM+>!{CCm$e5;JVYLVU1DRiX?F*{*ds9AzvBwpG zLv~o``RnaLc3)Xo6Ag`!A~C*Xk78EugnpDYZ|2|r*?ZG7*UYsRg_1TjF_k>!!6v%r zv3-MRww>2mHS>1E-H`ZoH7eP?fk8i_!6yk!ekqoX-n4NwG^-&P_VhWI6QFRe9wMEV zXvjntlA}E3;+|2ljqv)8vE3r=j@6OmV!yKgf zQ1#HBVWKyv2vee>+)#_p!AwT9y>q@YtvRrD;mV*kU;oUAWdET&f;p|@%SkROiMIH2 z-}$3&b`hRUI?EI@EW0)*d|quLyj%@Oyjc-w`ibcf9c5(BMn4)h%et47DcGLRlYrgD zktrQlF|=j>z22SVMOuxU>@eBNN$n1UNAz}c)cWoiX2#~|Pcq^W&0EbM=UE;GR|z5* zcATWx^0HNvoOYj1v8U<|eyH*YcKi@kcjp`S&#IMEF9i{F?G3f)ODG{*T0|OOA6}pe z4a2fITYPoVfhOTv-@PKj1YNDQg0 zam=XRk}+Rn+D|S1@*JV7gbul}EG!de%C23PW}%iSSMoDF}G>UNWJ^;>+1;vdhr z!_YmYtN!tBn%5)JS5IZK-PoNynq^bozH^D-A78Gna}e7;+GROZo;YcUUYqiW3vGUV z)GR*7u!X*Uv+ok^M?DJB2=5K-Yiay*y-+7WAn z`pns4C_V=1V2ggu-mvx5#3n+#p!-eR%&_V5@mjTul8(Cd`_W0PP1%u7*Id=Q-F=c7 z%7_g8I|kj9d%DsC@egW??ma);uDEyUJCTQ-r_wN8*VfIOYlF8v)!r ztvXcAek4v_>2PH4I5L_rEhG*mQhs}NcZvwFf1>j&(mk`z{^V}|VWS^Y;%T)izdOex z-&Y=!^K*nw%QBss&iQJe>z9^+g8#kr@KsdR{GW0yc!?hh-bosj(;Prv#^A{HBqPZb`!_doFmI3|}bN)DD7{XFXk1 z{Cqhg91=x3HAs(9-iGtW+8I4p-WM!=yzy$kZrVtYzV)no>$TCF6*+^WGmipBsn>S; zG8Eo=Drz73ijTV_p6U*6;hk!Xtw=2;ymdV$*^2I}WH9Qw!~IG7soU&MV`CRa>*L#_ za5=K|R>tWzdPjop_fwRd=4#w3&pFN2y0fSy$%hQ~(QA*s9R-{!$(m;1BYu(L5ZFB5 z@yMspnJ%}8;@`=;QMhIPb@FP$kKHm$E>GD<6Rywo4@VmxPHWgtJDg3_29Jb4FZgxr zAk-ayEiu7=FMy~Ms@2FGhuPGgNAp~~s1i92=cJhi|5?D61YQy0yRf+_Augxz1 ztl-k*=tAv4?y`mGHJ^uJ371yMSJbkM-Xu=h56Bb}txvd@pqNOdt&FnnUapv~8GoqE z&FWD73cr^rD0gY6+2C;D>iRIp;LYys5vh<5*tIUQJhe{ET!;J}9^2H1P+!&YZ^#>u zDsvJR3rP%;O#WP#!;$s-!nG7_45*(S z=2GEjAC>!R+dnOPk%?EW^=_<<8y`R74P}=-clW9s_xkMn`jxRf(}5R0L}GR*!^R!Y zhdD09D&J?==*i6eLFg)vFVg*@nqAtw9m;`nj(wX_ZtIz4YZcxDjM{8x>qSdeyVN#y z&MQzvSL}XJusp-9Dd6619~Gd0*f{tD#uO~O&hVJ|*IV-xj8|r79(r54JC3(q&^bu2O_+IYH!<8!yEdKT}mbLbE zOq>nV-C77=Bi-SsPSR2LRfn=oQ}a!6Dc6mS0xP4k4~B$ZjHrIycW+D8(6C(+n)Z@a z<@O}+7-OG!cAVqcx?t&3UL3iEs z<_4K6W+>1vGT=wl4d?C$kqPt1>3-a9>ubl(ntPFsQ(hp=!dqB{Jzm_Fi2p&yR<0~2 zb}0d_1Pq@@!sU@q;{4AH52w&GC0Cs$*|=DI*6|0wT&X`_ysmr>)%Wj_==Vi!)wfG{ zk}Gi~J8qa|;<|Gr{e)^XOl*u=`=`czc;Q^12iX zYwf9KY<@|DASou*9*x5!ThXolo2!wnb!1jU`6<%NDg#i%sUX-EAnL7@yO!MDMdQ4- zpW-M>ce?TF#>C}s^>jo^t_6utL*gzwH});MC{IBpFh0Zn77OK$(rSgwn&UNl?7lB$ zk+MovAtL`5CDM7U2M0%e3KLmejm;w~C5eT-m`XLb_{tHcHBgF;o?&FP~k5MG18%ZF}uiil>@Zxc&TCTnEn39qw$l9!qpY>YWv{`_(9y!o5LS zX(#QYHEimBkHUQuKQi1pE>$g@9M$moQ$-s?VZ7xhAA+}n**iBk?%}Q?KEx@8xV&)l zCRdPX&pn))^|+>TuN%!^dHY^asmeiSHTG<_z*WWm!vp^YZT73D>t8;xCMc^T6}=lT ze<<)#DZq+nHx#Zhim(pFufcnpOl#EN-?W;LXD-+Tl!xNSJDDT?lXdzrNcr9_UpJ!6qrzy29U|KBK~S=2KWgV)Yh~y8X-`e`9UFej05m`hpopEDQo4 z|D;jrs*83UYb(Py+}0hY$LVw(PxNx_>{X89_qwZIi#*snb|8$9nq-~sj9_q!ZfV!G zpPz1yTz0V993!#lOnpYQK%B4%N8ky@xfK!OC8DA{40vl7l0Bn1E6;OVFnN-p&}nLi z?n592-j>!(s4M>hhd_`sgZLODxOYMLt7i)~XIA%i`==`EG;^Dy65sjJrp8`(+nUDj7GA#_$EittU)BPZB9-HN#jjT(+}5O+7VQHp0MHJTO0W(DPY)xY!yM zdMbVDY~eUR{@|uUnc02+OPc&zky*W6>YgeKUlywxcIXt3b53Dl@BBb`G`~2$8GdAo z(Ce&u*vV7Z(Q$SPzCzTz#vvj3)RmtaD0J7wB4HLkKF{WmL#@KD)=O!Qf5MMN#$zxT zN+W(o%gImwf`Mgq&tFFNL$fXW&Y51U82#d=l=CqK%hHqi-dRO$1R0~kg?BOJ4M*Sl zc0AzY3}o4$?Y?k0E8(XLc44;AUC1fUxFGtHJ*dYWe1N>HGKG?8NWBZLApF-gDp_=KwID48*HX+ z^%n3)c1U0CTI-{dd-39`a_eBTfCm$W&R7dijjxIf#`joZH^T=Z7Rt1CW*X8Q) z26hVLXc&k^YSvHs(M?HT2`)7Lz)KEjE*QWxzdBB7{T}j~BbF^6qYxs-i#a`4x(gr8 z?=0{sgte*eKq1ua=%|bf|Lg1Bp3=d!FP=NJ$-^=agN^XV%0tuyFZzaW1)-hCA0E6+fgXKr1#XT zQatcsmEeS1vlf>ah_{2MtmMnhYxx!rG>FE7(sq=a4;dP}DcKZ7lc$L3?A7oBmKL)~ z`1>J;K949<*oP9Y*)Q7B0V1tco~mP{bxNB%W6IZAs3{sGZGT3*>;dj1jgvA5wrGV> zdl>^%HuM*(W^)BkkBrR=DiaW|`L{n2R;a!{b`AD-50|?$8(w#RZAv^ha*yby_DX&e z%bieW@Dvyao~KJb9o92Q=U@n6J@C{Fa6Ph@cl!E%xuO1!qKfoc?Gs0F3)Kr4-gc2E zZjT!wflJ3Vc9c9@6~CgBX}>yJnE!SFZFacYKDx|$WP4zWR;kZGp`qTAfL(D<)Uhs8 zs+NGsb|+kS=ybFDus=s#!Cln|Z+mk0OOA+O`>vbyK?nbkr-m##+Zq0b8g&+<*{}Bm zXEPd&-`|8h7^Zh_jH4sz&4?*}F1+wwm+q3RdRhO3fp!ATnR~WOlE;#cE~UrTPMOew ztR>rBel3ePg}e0aDGRcnBJb^vUiTIi{+Q_Z9d~#>D4`@{vDTo9sP4x^gi9#{wdPr1 z&jpW@sy0s|*`D@SF_}~`B3|2Zyvt>HT;C$-ZnF22Sw+`KBsW50$K;+6{it( zOlcOK2G)a)!;&9WS8~gV70OSv4O~9w`Y>?_>r0e3XIjWJpeIBu-?12PtIBc}NMKXL ze9IBhO=&wkR_NP;dus_tDymu~>|JnOM<*(m)aLN(?~M$@ahpFd4wmKh3U;LKd5_sL zz^UIOE?xTxvhc!YT{>BcE}s{QCQo{opemV-?}GL#Z>Uz_qwZj5Ev7EVWqX&g<6VP? z*KWkmbV!@~#kzfSUMw;CV%v;A%D!EqR!F^`dwQRHz~SuI(}f+Yp@nbrnNQkohu(te zFD)wR-^N@ZvF$v{#da~TEWiw+BfihN2!qiB7Ql?#t#a++vJ2CRg|rZ+9StL#m>8`w zSakg+$`julS`Odm9u{;hDY?viRjxvdeXA{;C-^<44On4qk`#Wg1Q3(lb5*0~{DVyZo zqp$5Td%GLkr1NH??3MGx8Af$m%xIS7B;3Iv-=pV4SUev0Jy34YrWnp6<9aqv%R!>B zI`5UfN1|Mt_F3cc{&px$Zr^6itva@!cX4EHe|ycV#ku*r#jXXU|B+q11gOpY^Lx1l zP$D{;6U;@pYHYk~mt^2iiYcySI$H?*F?Bhj&gn_-XZPH}ojvUSO39&#N4+zGfg-bT z^Y{OW*MfMq29EXh{TCZm!Lq_96Lx5^I+XZM#|7T*XG9DZ@81@#ln=Kv1AJs;J1k*g zEcnp}rxp8PWSlzN&;%l#XCY{y!>m#%7lqj*F)yPFJArM8SRCr(Y`|*+O zo3ChoeZw~^NDTGourA0(C*9oNeD0~N$r$#&mv%|29O+5;WdGY4c^e1S(d|>tSuE43 zZ)P|418U8Rv()za4%tIT+#~aAjX1w>(Uk-iMl~>g_d=idN#j(1)@M=WAXeF(NJ(?c z+=TFBbaCxtH$DzllgG;u<{ij0WOEpW`2J=4PcteOs^%SP2~zkW`L(p_b%2z({w-&!hB_>*ro1;~fL~j(dGtsGlWxd|@~o!3 zA!`$Pj-1VmJ>3Z%x;+ixou0&->F48cj3I|)X|!BL@v*%otvT_->m%4!Un%vSIY+bk zj>0H}`2@tP%4UK$=PYkb(`ysvEdzo zUHuXl*9jfK)=;^iG|a0$%{X-pc)*`W`5PWZi;rts?5Aoi+0>a=`q$0?w=d8 zWmf9tv!v}{A{48Jqww}Tt2FLBW8Y5X`-z+iOL9+_f9MkXcu6Ecok)g1zeT20<^4xX z33{#EP|f4%U{EV<(iW-yX_Q3%z|)&qSJ5q;AN+5x^go0IO?>tL^u)vRKvFa42&3+V z=A&+7B70zwO`5RITHw>eEY!}q7mN0v#xUHv)hBZgIW%_$B-Abr6bdSr?*K zIBzgTJ_yu~&RGQSC}HcfYS8}EL=A1WNd2-<4furtmlBSDz7zSypK;JX$Ngz3`}c+a zLS01mCdYHR{x9?Z^*$syvl<@je-wS0@ZSaL1|L36PN4z%;*ar@-2XJ>3i!gL87_FG zj-LO?;`OJ6zyAu9{XyxORQm9b^0Xgr(nENj+siOMC8s$3kNf-;*NvI}jCCK3oT~Dw0^C0K1_D3nH9T#QnAEhkhTX?{io=C{U zqJ2dr5b$SCKu;TXL|{Nj(0Qk{!u`)4fB)6(4R{(qj&zZ~AM&m2%lzLzgTyD?HFo#| zL4YPfnU_4!^py#(%e6C#Y#Th^!SFwo_XKn=AcfOE2|juK?{^{>!vOj{mfKR&*G8au z|DT_S{}Pab?`0}34pV$d^6&V-PGg1Pm*Rc~di}T2doKO+S6+EY;)j2O7!~qUe_oOM zLmhfv2+y-irs?uq?q8r3HT=ABzl8}th=hCE?w{6k#*0x%*??pmlsh4)|9mhs^dq~? zaX{^#5%uct$^G-B0+bj+{f4OZ#-;z_2+m*PIWib-BA4R&GXlSV<0~v!f>>hBJE3GK z|MWg1UltW+<>p&)WRIu7U9_x!c8l2m8d2o(IRC^y4us<0kJ+M);)0Z;yeJA!`Kb9- z>s&2&cA5|{@meu1 z4hQ)Dk=2oZB`waM%Gm4bRdklI*rxw|w|@ky_0U@WYp}f1K&qWGDAFI=GS5{I|JaB$ z6&TdA$(3_agU>im|FE1;V34kUew=jW_vAjW_^VbB`NiltF!^#JS6BZrD9rLNVSoih zkXrBq-&2Zz|HAnk!Hh*duY+HhBNue}f2-vlj<5iM;)(fx%ro+t{+2t4D&+{c^zS^w z${7L$62p@_8L!cuFy;Q0-?+^ItIKxlQ$I}1pM`S%dr>gllxSCePuEB3m#4o!Z5q@s z7S(fIH1QA3~2bho&P=z0M78mOoJ|Zi_fOp z{8)A*z_VL;_ng10TdGwpYHU9wob!eE$FdCnyH?IW z?vG_@aX>jdCo7%L_y1UyXljAj>%Z=Rgua}HhDL?uL?`Xp(r}?J2p|!$nd0K(tLCcY zgWxdVQW82Wh0y=U=i;QoaesriGFYIk`91L&B1buQPWg0pex6R~0WGaUxLUQts!N2Y z|FvAz!h+4-b#Hp4vHV|^3^uzLtICZlv9R|S2 z#$bzZ!mGEwNdLp6L4Wr$obNw;1R_EpmcyH3E}wumjLx;UaZB(n8=qE1~;) zC5XLwnequ<=xe2svVxYD76QUS`{hGI!$4cdb5>fK$n6spJ=4QhoxiQmZ6h?(p}gqC z#3(Z|A0Lp?V&gN-3TueFpFRV_z=rDQ{Gx*ho9mr9%F=ILmfJh1XlQ6*4mkoZKuy~0 z+ou;LhMgc9Ue$ojJpk|Tva^J7eAnXHPt|M%VU%PHvo-aR5pN`R4MzYT_AfHr7;k|{ z^d2mD(PWhV5um%wCrDOhPS-qO0T1ZwN<)D-)L%Mgpv55E`(hv9_xghwQcXUZ=GEB)9 z5I0uRWhOJWKJ%GJvv4jCy;j4SR zs11^u+*ZfqAa)qvxipa7-?S4?%x=E$0Ec~kL_cIuCFYHGY@n3=&!RR22>pxXAV7!8 zG$NyjH>ecv;CxfG;>bD8<&}fL6UJ)X!Kp3o`fBBT0tO}<*}^x8h+&W$hwTsk*{QF8vR6x&V#| z4dUIZ&lmFK%*s+>Wzr_sOMSsLo~$`QicNunQO*!YJZ;e0msi#(gms%EkyoBErLkmbySM!}f1kQj8l9LBkFyzZkA4 zV=`815<#nc*CORGARu55WV4V$T^4jIWv0rLe5Nc{x_(@^#`6orOA|o`5j5j}fXb&< zu#NSYlq8OrFW56?r3-3CMKN}u5Uoj^cC*Nysbvw=zt7YT_CWFMa%Ft!`3WX~ih<5n zAq@(FmGq(kFw^}Lt)N3^UNPZ7q%@FnX%7}~T5&3f&V2)IV$gQ(3KJz$hgF2cN>v8J?dq?xNcCSgCesV-G0&>T#9jsMuX1gi>n6aWgH!Z*-=hQkxdkgg@!A$7Od zVpIAvo33^W8$AQjt|1e(Ju}yxrSz@Rl9z0vXm%kg{p{oB`g7|bq@VL0SRL!2ui3R> zSjU#^W?>*D5u1yFi5b+<6hut71+wEqo%+%s`tN(IQ+&^t0aP9*WG3}PcsrytQvehI z5_X?Jd+ZW6Nfzbk5K%xIKWN?;)NHoF#+RyQXU@0n#Ufywh5;UwhTS|lR@L^7^4v!* z(h;~|w|rJ|tmu>>*8Q&djx&g>0vh0{hR?yG4odj*OJQ@_GVb&$#*Zx-!`#%CeD$p##qAz};ZFQ&{cRkvyto1Oj&6Dc` z@-HJ=IXbU#(Oy)h0DWXmW!EM`qnhnLNve3eca@dVNEixI)E!t3{W9G7x(E+bpfSA9 z!@u7d!xqbI;J?XG`SV6J&vuWX?OX>ZNIZ8Cm5)3NkmWo0*-DkDqzt06Id^}85aK42 za6i?Xn|6S^y^En{^^4HQ4zniqB3})^a10axjz1rekjqMh^`WQ2a^@?g@2cZ9a3ri}PWFg6J3k3bx zV^T(1#f)3p#U5yswunV-^`?q0-?Ml~o6NEiZIqB5`$=Lv1C%=t04>AF{NbUt3sL|y zyzm9jvRv{It)if_;iF6veWW0AhwW>&tNpzCsh1d;+agPG{3Fe!vF;e&vpL#RVsjLela` zh9_XZv;$>6b3Vz^bnT+GyY#}aYMvTbNzG}sY}gWh&xNfVZ^&sHgd=BpNU3jMC5{_m zH)29Vt(xF*-8Hur1>M?Q%aWLYd;f4s7uQ!{Z3Ky|fX=Lhahx27S%h4YnuH|OGU zPIXb!57-JrnX=>&Ot)Z;o>S;`VPaw;i6X*sZP{5_3m`1-k4MLvVjSnFTA-C3#ya?` zlVd9DWd^9uirJ2D|7y5K%&BQvnV!OyZqGF=u6;!s$$ptD7q4b4q_=zM43B>6f!b5L zRF&xJBlu~y0cY6MIbpOa;9h`0EDe*}zV%j)!Qu8Ik@o`z2Gu&spj)PKidV3NO$)^7 z7stw$0WgwMO1UFx`x{FZ`?8B-PBOQ$%}trZHr(2|0x?u2g>i7Wvz&Pp*v0I!G0fTZ z2upo8+wPaZ3586IJ$H(Mu1GVGS-Qxq_H5NIG))9i^IHM1|@q!Sw6*LDEMc z=#T$UD=T3!a0G<;ZR38yf{@R!@1rZT99;u_V6NV!v`JukfImTq28XvMjF!D>_p#n* zIH%mtPWCkHKcieWE?5MJO}~~hD4DuS826!hsp|wZrN#QpJ+ynJItRy9Ze<48Jx9RN zNQ_Y0;?r99JieTr4f?Jj>VEQS69Yld(+5+<-&3wuEf)}dW}Okyck3qEieolt+h``A zLU^75)(Fetl4;ySK!w{Vc#Su$(t-<&CHP6{C`=Qdxq*CR-&BUjh~Me@ zS=W7M5R?+1{fu4z{0%fK3$l*6;cy64j-gYu9cOh|QKM*f%FH@&7{b?a`qEO-*~t;G z6!@$FT&|dCl@u7^7_+{JFR*KLMnmaX(X&aUiTnZg5`3M>wD&knB#473tb{oztPj?P zf{FCf2VViC;lZj1CS++^sa9b+kNcuf^)5V_U-*X2y@FGorXG^$?TZ0eljNRyl?a`K zST?haVP~`ZZAx0Eb(@;1VIoM1HM$A|D4W~!*d(*T%O*+AcrR^&!*Bw?6dJvFATJ=5 z*kg^>fcwMmxDL;2I+>cEl~ts&KxN^9A@7QqeuWumMbYE&2Ag!Lu2Q~_T3?!uDyJfe z;P#lrd%{IRD{|iN-Z$q!2-P7J=}0KjoNpOXwZxP9lQV{-!ZVRz?0mCt&vrZWYkm_ z-BLtUIjrWq&#+YQiel1-tqB6tYd}L7OcuPH|1ok~YI$w`v)6?;Si~7eHKxa)K$_)Z zm-)!I3B-ssG^)tmVT&*E zjFaP^Ug&H8T<{lD&UQpfO(O+)zrARV&h(g{ge!GOL}+VCeqMC6;AfH}=58z(W&3c9 zMd2xGIk03s#qy~lfLOA-#bOi8wUh<8BIZrw16uu{wmnk534*E)T!|)J zFjRb}`})9aG93p9S5U_(F(ObYHC*z;LpEj$+pPd=)`4tE6d(d*-SoXN_gv%!#)HAI zHs8|0sLYsT@rE?uMzQM;!|B&KB6lIGN`v0TMipci>6U%-s+6eTFbzG-RGUH3X7dMl+jv9QRkx{(2xLHSR z7LOrc+6vya<67l>jz*)2sl&#_6rZKapYJ3GoF=X) zv+yi4VVYO3miH;FxWI$w`k25y7MlFZ6fK?04D@@GiFTANkccJhW;|7` zWJ+z|NAShotAI(P!R7&@cRwR%pc-uD(f&*be*6y$;T0G2EWjzGNkJmTU|?l|A4T(G z7WebB{PCz9&5DAs2h`L(n8lVHOKbxzy#z^X?}$wF>z;l=op{9B=i-N0%!m#5fN^3S zP77TG>>To(wP%rKipT&Z@S(sjN}stFWpeE0P3kwA9RK73N(|F2`hjF+{&T@Mz3XzS zNKl^^7CUp$0aEF_pEkdwPNv(RrLb}?2FYXV>?t*yUB8_jh+(Y2$f;L z-1(81G}pJ~)V-rGEy_nllEYsyQ7qWpDw;J$V8|!9ZMFh~YTUsna=>HoNqhj_cvQ6B zO$fobF4GA44an?BJ`T%KAQXOqac1|?RwZ4kc;Tw+W-Arl>Vv0qSueZtx%xS0oKpjd zJVAq)c4)A5qQ%d&p!wx1sk2zIX>fRuqV0Bfg9mJaaCR4Z1uwX-@#~~C+@aIH0(1br zFqcd-0-q@iK6l>_r`%7(FKR)aPTN{7;sJ`;#jLQ0(7IJN1Go|yTWOa?a#rI|OO6{hNUhp}Bz~BImSY;97rHqWVcT4sv0Yup>mw%KR$KtZa6i2F@ zz~6$o^17jy3BD`6`p2(o=_-r&b;6R1jpLV_l8dw2gOS7lN9v$Pz}?j<9QcU}`}vy$ zNyQ&&mYJq2<`rkX4|Pcjd1Q0r&^?Z23o%1L)-8ord{EeP#nN@|8lEmry}1A zTWPwnoGnW;Z?bJOxZ7jkB^gb{ z6EAtE_ZR!t#N`H(G;;cH+wrm8(w_6z!EF-4u<5`WkTN+T6g2Pv--gSGF4+Xob-=}W`9mJF-X?RjJm?S%aD4+vUK7Oc5@m{D^7c0ufoaqbbJbZY|pIuQm zAN@EBKq~Xx91#9)$`?1QL%p(`60MS!^EfjrCi5>VM4PTXGu;c>1-tD2_s+3>Dr&{* zX%%T>5{J42k1GLL(ct?D!ge0m)u}lWRNG*;`p+muTH(F=#hkkA+m(xJjhISa@)TAr z(P|S!aT=z8{vihq|2xR*6|YrMM2DO$Xv482uwPI^tc+M zX$ys=$5JsK0H>qk8r!r3SYg^v3d$h1?g@~P(l&!C@C}q+Gc7*Xrym7!9EEN}h)CUC z&D!l{pVN1e4|{#VcJCo6eBs5XcHWoBz?0sCV0&SA9&ll}r!;EHTY(a+AaFAW+e=D5 zMW%aoyh0Ts_{1Sv{l5K7E`wcRilC(c%Q7Of=<_`G$i+DPsjinjyC;dnreZywF7b|a z-L}o7j-|?lFIc3@rRbO3zMB_qQb=r_N62NxqGP17Y8VQ7wKPjnweZ zzY&D7^ewY#WOD+4a0Rw!<%i;YQV4EVWs37(Ryv&?%r6U>KRlG8{xN6}NMuNl05aDU zyuc6%zsUq&&wa1Ncj1r!Fv)o;QHjF(KaD~*V}>tdeiA(hVbUY}B_c=R+pNx`@-pCg z^fOL_y)Jj!_#wuY#Q>%CASSn2EQ-;)7@G4x61b-gWoCo z(3cN8*(zkZ;vk8nfq9QTpRxP+6>Ev1Fdx!y!jF){P4kifI>4HhZ&33o$o(VfVvg&R znJT9=7UtT z42UePx+OJi#SW`u*C|Bo@{V1>(st~%M;X|?Q6goX& zH;aV&f!ANu%;LM_IBfv{x-@|VCb$xZ$>({Voz}bJI!Q${JFaO>#IZ3?%=_=f z*`GqL3y>^n8tE69Ui|p_z2S|SlFCL-zIe{)QnsE>V@g}8%u+mR*V;riVzZ5IDgKo+ z>El5Y`qa|$h{_vMS8gVySc9MWUFlCb!Rso%T-MWNFBYnm;f|4Vel8q zz$fuo{nT;llVVT_-uV&0Q0_7GxrJj6U)wG$|J{AbNNPg}E+W}30%3Cy4mHo#`yWQ0 zMWv*qfL47|mc$k~xP7B7kdy@2B)^846o!dq)gq-)TIN%6ePa>bc_j!UjO%P>+W?Zb*~PtHx+``-G*=ePK}*#o9^wz4^au}RXJmyFz-q*o z*|3RkEP=`IiM(IZ6haP7@=}W z&qfcJk<5ILaboNsfqIoD&J3el)*_B`IaxQlWIKh+oXve2*gb~w)E}17Bz?@c0A>|E zRYGG*%H8p~E&bo?tn-2}Keu2tWOM*j*T+5{nFW_zL7|MZM%e>y0cSP zGp|SeU80SUA6^c8lJCm7*+P*YAd#!M6mvrg{h}_!75mL^Z{5Yw5nvh@jPL|R^xOLK zUp^@vkPTj#ZsXtDD|`rnPFvs?fV5bIN5~_U*~KznvfLhEtIB_TrdG$^UryWA2vFKb zh+D$?ue-?mZGFjm*E9yXI1aY^W%q*T3Z-M&Wtfc0u5>Wv^gTWRP-kE%=Q@&oS$>~Y zt)l&5^$0U$!p++Kj9!3SRo(ZWstXXt5) zPoZYQuXGBi%NKg%-;XPEiW<)kJR8x^&YT4!4MXnp>4FGnuE^JqNiUVm1>!r2F@~&mC6lFb{A6F@s7Z&Oqw{o6WV!>Z9F-PQdXUOvwOZedYYC)31=Yvb~^HiO1`Z62NAOx%q>=_jw+jLF7jFR( z^m{zFJKpN_wmIf6GrJ-b^cnan^uaxj? z05ZmcZ?IK$-R*%>1k)&rS0wGC&G+Lih230#K$&{UZkB{nvg<6c^O{3pi0Hs7!!#oPnx4ZNJqy(JB=A(NAy@#$`XjL2-X8fkQ`{-U;vT05M&olt=t!n76sfsP2eKfmv4ccE z1GZ(n%uH25A!RFolV-qqG5tgRj}cm_z7!cF0L~T5FZ>(?4)is^`9KO)ab_y-cpT0$ z``{9G!7t-*pgs#I%}0ACDI3EoF4|n4Z`p-S^2i!eS8!NGy;?2SZ$_erkfnuu@ue2< z7cE_{j^uzij{p?$F9qIau>F$@Sh9YurGL!+Y181i6Ht|l2HWuDDuJxVJxSn^0WGO7 z?+L?#2-Af55g?Jko{`cgIQ{UWwT4vplEYk2vLGI_w*8=Tj%Z;$*L#x)CYo(yDk01g6=3&Hg#|e^kHlS3KX<`3EKKL$4>KqKFJX_Z1a2iEi zrUXDDRjr#Toz`PAY_E>1ZbVt;(f(p-BL~b4ZK3%5jR++aVFdUEeq1S)DUTbyms&Ct zJ#u=wMucov<*TjBA19~g^gVY_xt?^3ZSiUvRz%M>tV!yzfs_m=0q5Gpk3nVZ73@4s ze3U9KCJeLu46&m=TK@NLrJ~YExU#y=Wns>y(ow_M=!1L6djPB$k6wF6(5Z5bzt3_E zGIfOTG5Icv=JWJl(~w886Txrmh5q-ik*U{PZpu8mV}3bTDLWvJe?1*(^8~sR z_&?s-5g(=EMdK0+Sa%DE%S_#7nu3Ca$K7^UM*Z8&qc<2#zwHOIbfLSx#5G*bbAhCw zPc3i0cKa3#m-4GCUQ);kSvW-m)~Zr?dh6JG$Z1)9eS3X~Bt0TqRTJ(<19GcHtnnaFpX!`8o|)Al&0plN>uGT6X;PSU>1aBxO3`g{&W0<-9b|X+ zT8tV?vsSr6w&Q+wHsnFwAopcgl#+wU%X{D~?VocWSLBac0Huh)j4GT7vQC@bx)5fAWXRHwWkBA#=k3)9e(>=d zJLY_eT9q=|>q>{Z)4oejykVCxjZ(cbLCwZ5_X6PFG;e6=E-qX|C1iM7_g4&WFJ~iA z9cwjW7DsLn{Z;ebmw5Zod|Zp+$fa^fEQwyXvnWB@+-ydjgwy6H z*QP}@M2$6Nkzlpfz_LOKYI(BO6^<0+ zHA{_?h4l22=VI($JAiYCQPokgj66g@Br{cZs4Y`E)&W^nDk|2juvE;H8D#w6yQvgH zIet6VW)i63NMjPIX(>MzHDHdG$mK;CfCP~O0GErr0t%79(yj6|f!zAzS++>y2d272 z)rw>3SpNQl9@1RRS!o$itI`aJ!KE|pWslYZ^y%PVi;!D(7*tm6EI8IIdg_Hyy&`FL zBE_|nW0RWp6Q^S*tA zWzEu0170)Hu?aAJcFIXxGHIxOZK_gPW>@ALn$!_7Y5gf%@8i1O!6gsm_0A;Hum@Hl z2fl*BqH~13yM~g>6*e4JlizTnA;@-ax7c3j70Gy(0|;O&PNKpApfRUxD4Srk=3TIB zq8w_ANVWYA6>J>{v>_XzsF%D^Co#)SrJO4zYz#H1!3H2GXL&nMD(IIQ%Wx6W2@Ixa z6jV~$tJ{`bNda@KJF1YBgJktm@GROQSUw~AEK z60RL=(62Ig~ z`UXs7OsHbN#>AzFdHZ4QOq9VQ>AnMP{aDj?2b4(ztbw%V? z!51VohrIQIbFsb-`^`xhnfAt;AhP({9+PKKAB8I{pCKA3;0`Re^_SPV6VxS9t{AIA z!_%MUJ)cIL#PR5~zMMxv8G{=MbG}8d0rwKV12B@Au0Oy5?j!~C9U4zuwO`yM_dM3K zd`4NnwhRXc8z#XO;rgz3PgsUxw!lT|Q}1Yze|rjtIS}8Ti~Az(5Ig09gO zcAoSHk#Y~^jf&NPZY<3cQd*9&#-@~T})=T(i4h5E`=D5!O{O zPbpX@puMflt{qt^(8)hZ+T0(S(1~bA4dH3-hebNUZ zBdM&LZ)_1n)ULq1S1Ht4)iU@=U8fM2iX*wvnp;?R2;fq}gYwE(0`a}zD$IW?G)1pA z)5K~@!QlVCzlErj_nR~I)j5N&woqX=>>!ALP}=6MaIB9UZp+O+Nrq^&K%tSnq%MFa zs+o07L0+*4PlE-F$UIOJo4yGJ?Hzwg^{j%zdJG%!6|~l&TJHYMfem*!v;#L|kja{= zCF{u2IiWI&v&|vxP?4vp0)b~YahlMZ4U4Z(+Ys}6)cC&JW;Pv2`k*?2&f3>ixmF(& zjXdX4uqV9D`qKQu4gm2>qgQ7jKOYMVWgeoS;e%{oG=h)bukoQ(L%>lAUUdn!4e_km zK-LRz<%ky3y4=ej@1+G9YPl??-=va>W7K;E?Sjo*!+vdQN;SOhhuh#Ef-A3$8{+}j zP7;rpO$ivEzTAD57E~D=FB6%g9*}bk2}{-bsDYXxd5@#y8KK zCs6M~NFRFPx&aGw<)=%ByOXX~TkVYY^9u75Vx-8cDscS<8!d=7iHXj~VonvHxu$Nm z8TI`6gK2MP{ewIq6dB~L9Jj2NJ_ySI$NF=P$|K44T)xAHH6 zb>2NidJPt|XL0!opNv5>esye4_MQoeJy2^scGExgW|c#(Ys|0j*?`vjOBX5%jukcD z|6f_x9v5@g#(y(SnJzTC5;2q{p;GCBey9}1bXCc2R!t<9>F*kXHxg6$CW9Fv62HY2{G2*)aG6%NVbiy^Nz=XUr_V)N zVVBFSO-Iezg+T{gA{?!{+-DhJ4}`+xqG(3=z0m&9%2fNZL1fY(56bY+-gZ;pge14i zv5AtB1>`J7t{BT#l>Q>;S^bT_<&k}%1UDvZQ?OmWG;RF}KPh(w`PC!?or; zuMolAJ6uij0yG_`B>A?4R;m6JnA0vQrg34gt*utaf{R=%Jz7eFfelR@IdHlSzmXz_of* zY1ej=gc8sQR~^>-LyZe?>MyLUPUUr&hdf-S;!if;_&n&ogEXu6Tg+7S zZk`fPve&U5us<98Wrz6Blh_0Ez6qcj!VJ?auIGE6L|CO|yf0v8Dp{t}9w~U;dt%|$ zFR+%L`LRf_YRmb;>X)>?*_d3Tfw)g~G>v&XPIh*VSWiSjA$eV^oBxD1Bxc){_hZ$* ze_gq-8PjMI+F-ZD?ytk<{>2VY%aGRBC(blzzA*MAW}zNNC#$iJrDyKeaIN*1b8YKP z&Lh=TWNi1S^pC_xSdVdyxjEKr)6J0U0d41C^<5!%f9QhicicQQfK~k!S2H7w(*oZB z&SSpcJ1OC(y5Y-(?WKm|tK8^37n)_JCw`)r71|-sUl5yB=i1AajalZS@N3qSmQVQ3%>t9 z(@@|mguVffG0*J?JG?pfs93`Xn^qW`NpDP6yg};j9aIu1uHF_%*Hqxi$=+s^c6K^4p7{u=^xVQ6o#Y2y(tLN$ ze%tWF^z@s}qZVW!1L8pZ=iA1|mAZdMc!>N$lzr^(>Q9kP9?6OT^(fpHiPiy;diE90 zw>OB-zQ+{F$+9NJWa@1v6c1|Gm4~zcGf0r5Eso_@p2tCkB4oSqij?GCI z!EN#57SBulj>DezI{-Q(vFzDB?8_cGBL?4G>S=|#-XHxlA!`4$<<+B>=IH#_aoPEc z7bA+m02jcdV=FmOLyaOtO5^(D036{YG+mW|<0#&ZWOuZ!vU-5>KR$ zIE}0E^V*TEe|3#_@(!-V563JLI!uK9byZdk{Z=z}-h5;c7+&$2BvXu>3_|y4M=zp_ zHlA)6B~M+K=1%aqjWDGaeL=GG?oZT8vOy_97435&#M4xQ>|v7e-eH9ubLUNIxlsC( zGHQ;T^e2iUi#^XaNX%r3@u$6nTcuS;3sHgASj!UPWu#X)%Z2x_R9{VadcW_f>{4lG z)dJy`)rEK=)O?AXlF>#C?6v6&9q#*|Jbh*5GYt~u8epBG=4#9|E^2eM1EM?c_`?4Ek z1RYT>y4Bvez≤=HkC+H;@Y2M&N}3m%Kq`z5H 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 diff --git a/packages/docs/static/generated/articles-docs-vercel-save-snapshot.png b/packages/docs/static/generated/articles-docs-vercel-save-snapshot.png deleted file mode 100644 index 8c3d82fdded1f523665e48ffdc7658f40e1d1aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45857 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 Ss;L53C^nY%7T3(ShW{TEw6f6v diff --git a/packages/docs/static/generated/articles-docs-vercel-upload-to-blob-storage.png b/packages/docs/static/generated/articles-docs-vercel-upload-to-blob-storage.png deleted file mode 100644 index cf3b5ed4e4c0f7702a4d0bc892541d37d799a1ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48787 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 Date: Thu, 19 Feb 2026 13:25:19 +0100 Subject: [PATCH 28/70] Mention renderMediaOnVercel() in cross-cutting docs Add references to renderMediaOnVercel() and renderStillOnVercel() alongside existing renderMediaOnLambda() mentions in chromium-flags, scaling, env-variables, render-as-gif, timeout, three, and audio/exporting docs. Co-Authored-By: Claude Opus 4.6 --- packages/docs/docs/audio/exporting.mdx | 8 ++++---- packages/docs/docs/chromium-flags.mdx | 10 +++++----- packages/docs/docs/env-variables.mdx | 4 ++-- packages/docs/docs/render-as-gif.mdx | 6 +++--- packages/docs/docs/scaling.mdx | 2 +- packages/docs/docs/three.mdx | 2 +- packages/docs/docs/timeout.mdx | 2 +- packages/docs/src/data/articles.ts | 18 +++++++++--------- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/docs/docs/audio/exporting.mdx b/packages/docs/docs/audio/exporting.mdx index 3f4dab7a52e..70b377bf5c8 100644 --- a/packages/docs/docs/audio/exporting.mdx +++ b/packages/docs/docs/audio/exporting.mdx @@ -79,9 +79,9 @@ await renderMedia({ }); ``` -### `renderMediaOnLambda()` +### `renderMediaOnLambda()` / `renderMediaOnVercel()` -To render only the audio via Lambda, use [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda) and set the [`codec`](/docs/lambda/rendermediaonlambda#codec) to an audio codec and [`imageFormat`](/docs/lambda/rendermediaonlambda#imageformat) to `none`. +To render only the audio via Lambda or Vercel, use [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda) or [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel) and set the [`codec`](/docs/lambda/rendermediaonlambda#codec) to an audio codec and [`imageFormat`](/docs/lambda/rendermediaonlambda#imageformat) to `none`. ```tsx twoslash import {renderMediaOnLambda} from '@remotion/lambda'; @@ -169,9 +169,9 @@ await renderMedia({ }); ``` -### `renderMediaOnLambda()` +### `renderMediaOnLambda()` / `renderMediaOnVercel()` -Pass [`muted: true`](/docs/lambda/rendermediaonlambda#muted) to [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda) to mute the render. +Pass [`muted: true`](/docs/lambda/rendermediaonlambda#muted) to [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda) or [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel) to mute the render. ```tsx twoslash import {renderMediaOnLambda} from '@remotion/lambda'; diff --git a/packages/docs/docs/chromium-flags.mdx b/packages/docs/docs/chromium-flags.mdx index 95dbcf68176..9a29fdb19d6 100644 --- a/packages/docs/docs/chromium-flags.mdx +++ b/packages/docs/docs/chromium-flags.mdx @@ -17,7 +17,7 @@ Remotion will automatically append the `--user-data-dir` flag. ### Via Node.JS APIs -In [`getCompositions()`](/docs/renderer/get-compositions), [`renderStill()`](/docs/renderer/render-still#disablewebsecurity), [`renderMedia()`](/docs/renderer/render-media#disablewebsecurity), [`renderFrames()`](/docs/renderer/render-frames#disablewebsecurity), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#disablewebsecurity), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#disablewebsecurity) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#disablewebsecurity), you can pass [`chromiumOptions.disableWebSecurity`](/docs/renderer/render-still#disablewebsecurity). +In [`getCompositions()`](/docs/renderer/get-compositions), [`renderStill()`](/docs/renderer/render-still#disablewebsecurity), [`renderMedia()`](/docs/renderer/render-media#disablewebsecurity), [`renderFrames()`](/docs/renderer/render-frames#disablewebsecurity), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#disablewebsecurity), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#disablewebsecurity), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#disablewebsecurity), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#chromiumoptions) and [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#chromiumoptions), you can pass [`chromiumOptions.disableWebSecurity`](/docs/renderer/render-still#disablewebsecurity). ### Via CLI flag @@ -45,7 +45,7 @@ Results in invalid SSL certificates, such as self-signed ones, being ignored. ### Via Node.JS APIs -In [`getCompositions()`](/docs/renderer/get-compositions), [`renderStill()`](/docs/renderer/render-still#ignorecertificateerrors), [`renderMedia()`](/docs/renderer/render-media#ignorecertificateerrors), [`renderFrames()`](/docs/renderer/render-frames#ignorecertificateerrors), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#disablewebsecurity), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#ignorecertificateerrors) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#ignorecertificateerrors), you can pass [`chromiumOptions.ignoreCertificateErrors`](/docs/renderer/render-still#ignorecertificateerrors). +In [`getCompositions()`](/docs/renderer/get-compositions), [`renderStill()`](/docs/renderer/render-still#ignorecertificateerrors), [`renderMedia()`](/docs/renderer/render-media#ignorecertificateerrors), [`renderFrames()`](/docs/renderer/render-frames#ignorecertificateerrors), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#disablewebsecurity), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#ignorecertificateerrors), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#ignorecertificateerrors), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#chromiumoptions) and [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#chromiumoptions), you can pass [`chromiumOptions.ignoreCertificateErrors`](/docs/renderer/render-still#ignorecertificateerrors). ### Via CLI flag @@ -101,7 +101,7 @@ Prior to `v3.3.39`, the option was called `Config.Puppeteer.setChromiumHeadlessM ### Via Node.JS APIs -In [`getCompositions()`](/docs/renderer/get-compositions#chromiumoptions), [`renderStill()`](/docs/renderer/render-still#gl), [`renderMedia()`](/docs/renderer/render-media#gl), [`renderFrames()`](/docs/renderer/render-frames#gl), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#gl), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#gl) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#gl), you can pass [`chromiumOptions.gl`](/docs/renderer/render-still#gl). +In [`getCompositions()`](/docs/renderer/get-compositions#chromiumoptions), [`renderStill()`](/docs/renderer/render-still#gl), [`renderMedia()`](/docs/renderer/render-media#gl), [`renderFrames()`](/docs/renderer/render-frames#gl), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#gl), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#gl), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#gl), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#chromiumoptions) and [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#chromiumoptions), you can pass [`chromiumOptions.gl`](/docs/renderer/render-still#gl). ### Via CLI flag @@ -125,7 +125,7 @@ Prior to `v3.3.39`, the option was called `Config.Puppeteer.setChromiumOpenGlRen ### Via Node.JS APIs -In [`getCompositions()`](/docs/renderer/get-compositions#chromiumoptions), [`renderStill()`](/docs/renderer/render-still#useragent), [`renderMedia()`](/docs/renderer/render-media#useragent), [`renderFrames()`](/docs/renderer/render-frames#useragent), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#useragent), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#useragent) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#chromiumoptions), you can pass [`chromiumOptions.userAgent`](/docs/renderer/render-still#useragent). +In [`getCompositions()`](/docs/renderer/get-compositions#chromiumoptions), [`renderStill()`](/docs/renderer/render-still#useragent), [`renderMedia()`](/docs/renderer/render-media#useragent), [`renderFrames()`](/docs/renderer/render-frames#useragent), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#useragent), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#useragent), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#chromiumoptions), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#chromiumoptions) and [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#chromiumoptions), you can pass [`chromiumOptions.userAgent`](/docs/renderer/render-still#useragent). ### Via CLI flag @@ -137,7 +137,7 @@ Pass [`--user-agent`](/docs/cli) in one of the following commands: [`remotion re ### Via Node.JS APIs -In [`getCompositions()`](/docs/renderer/get-compositions#chromiumoptions), [`renderStill()`](/docs/renderer/render-still#darkmode), [`renderMedia()`](/docs/renderer/render-media#darkmode), [`renderFrames()`](/docs/renderer/render-frames#darkmode), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#darkmode), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#darkmode) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#chromiumoptions), you can pass [`chromiumOptions.darkMode`](/docs/renderer/render-still#darkmode). +In [`getCompositions()`](/docs/renderer/get-compositions#chromiumoptions), [`renderStill()`](/docs/renderer/render-still#darkmode), [`renderMedia()`](/docs/renderer/render-media#darkmode), [`renderFrames()`](/docs/renderer/render-frames#darkmode), [`getCompositionsOnLambda()`](/docs/lambda/getcompositionsonlambda#darkmode), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#darkmode), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#chromiumoptions), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#chromiumoptions) and [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#chromiumoptions), you can pass [`chromiumOptions.darkMode`](/docs/renderer/render-still#darkmode). ### Via CLI flag diff --git a/packages/docs/docs/env-variables.mdx b/packages/docs/docs/env-variables.mdx index 5a2e581f38b..98cdae964fc 100644 --- a/packages/docs/docs/env-variables.mdx +++ b/packages/docs/docs/env-variables.mdx @@ -50,7 +50,7 @@ You can override the location of your dotenv file using the [configuration file ## Using in Node.js APIs -When using the [Node.js APIs](/docs/renderer) such as [`renderMedia()`](/docs/renderer/render-media) or [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda), the environment variables are **not** picked up automatically. +When using the [Node.js APIs](/docs/renderer) such as [`renderMedia()`](/docs/renderer/render-media), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda) or [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel), the environment variables are **not** picked up automatically. The reason is that one might integrate Remotion as a small part of a big application and if Remotion would read the `.env` file automatically and forward all variables to renders, it would lead to a security issue. @@ -60,7 +60,7 @@ If you want to read the environment variables from a `.env` file, use the [doten ## The `envVariables` option -The `envVariables` option of [`renderMedia()`](/docs/renderer/render-media#envvariables), [`renderMediaOnLambda`](/docs/lambda/rendermediaonlambda) accepts an object of key-value pairs. +The `envVariables` option of [`renderMedia()`](/docs/renderer/render-media#envvariables), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#envvariables) accepts an object of key-value pairs. These values can then be read from `process.env` inside your React component. The option is not for authenticating with AWS - instead, load the AWS credentials using one of the described methods above. diff --git a/packages/docs/docs/render-as-gif.mdx b/packages/docs/docs/render-as-gif.mdx index b04a0e94916..3dcd2580861 100644 --- a/packages/docs/docs/render-as-gif.mdx +++ b/packages/docs/docs/render-as-gif.mdx @@ -10,7 +10,7 @@ _Available since v3.1_ You can render a video as a GIF by: - passing `--codec=gif` in the command line -- setting `codec: "gif"` in [`renderMedia()`](/docs/renderer/render-media), [`stitchFramesToVideo()`](/docs/renderer/stitch-frames-to-video) or [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda). +- setting `codec: "gif"` in [`renderMedia()`](/docs/renderer/render-media), [`stitchFramesToVideo()`](/docs/renderer/stitch-frames-to-video), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda) or [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel). ## Reducing frame rate @@ -22,7 +22,7 @@ Commonly a GIF has a lower frame rate than a video. For this, we support a param `everyNthFrame` is supported: -- in [`renderFrames()`](/docs/renderer/render-frames#everynthframe), [`renderMedia()`](/docs/renderer/render-media#everynthframe) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#everynthframe) +- in [`renderFrames()`](/docs/renderer/render-frames#everynthframe), [`renderMedia()`](/docs/renderer/render-media#everynthframe), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#everynthframe) and [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#everynthframe) - in the CLI using `--every-nth-frame=2` [locally](/docs/cli/render#--every-nth-frame) or [on Lambda](/docs/lambda/cli/render#--every-nth-frame). - in the config file using [`setEveryNthFrame()`](/docs/config#seteverynthframe). @@ -41,7 +41,7 @@ The `numberOfGifLoops` option allows you to set the number of loops as follows: The `numberOfGifLoops` option can be set: - In the CLI using the `--number-of-gif-loops=0` flag when rendering [locally](/docs/cli/render#--number-of-gif-loops) or on [Lambda](/docs/lambda/cli/render#--number-of-gif-loops). -- in [`stitchFramesToVideo()`](/docs/renderer/stitch-frames-to-video#numberofgifloops), [`renderMedia()`](/docs/renderer/render-media#numberofgifloops) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#numberofgifloops) +- in [`stitchFramesToVideo()`](/docs/renderer/stitch-frames-to-video#numberofgifloops), [`renderMedia()`](/docs/renderer/render-media#numberofgifloops), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#numberofgifloops) and [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#numberofgifloops) - in the config file using [`setNumberOfGifLoops()`](/docs/config#setnumberofgifloops). ## Importing GIFs diff --git a/packages/docs/docs/scaling.mdx b/packages/docs/docs/scaling.mdx index b2fd88fe139..a035aa734eb 100644 --- a/packages/docs/docs/scaling.mdx +++ b/packages/docs/docs/scaling.mdx @@ -19,7 +19,7 @@ Remotion can support this higher resolution by: ## How to scale - In the CLI, during a render of a video or a still, pass the [`--scale`](/docs/cli/render#--scale) flag. For example: `--scale=2` -- In the Node.JS functions [`renderStill()`](/docs/renderer/render-still#scale), [`renderFrames()`](/docs/renderer/render-frames#scale), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda), [`renderMediaOnCloudRun()`](/docs/cloudrun/rendermediaoncloudrun), [`renderStillOnCloudRun()`](/docs/cloudrun/renderstilloncloudrun), you can pass a `scale` option. +- In the Node.JS functions [`renderStill()`](/docs/renderer/render-still#scale), [`renderFrames()`](/docs/renderer/render-frames#scale), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#scale) and [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#scale), [`renderMediaOnCloudRun()`](/docs/cloudrun/rendermediaoncloudrun), [`renderStillOnCloudRun()`](/docs/cloudrun/renderstilloncloudrun), you can pass a `scale` option. - In the client-side rendering functions [`renderMediaOnWeb()`](/docs/renderer/render-media#scale), [`renderStillOnWeb()`](/docs/renderer/render-still#scale), you can pass a `scale` option. - In the [config file](/docs/config), you can pass the scale using the following statement: diff --git a/packages/docs/docs/three.mdx b/packages/docs/docs/three.mdx index 9fd0bef290c..5380c0c88db 100644 --- a/packages/docs/docs/three.mdx +++ b/packages/docs/docs/three.mdx @@ -88,7 +88,7 @@ Since the config file does not apply to server-side rendering, you need to expli } ``` -to server-side rendering APIs like [`renderMedia()`](/docs/renderer/render-media), [`renderFrames()`](/docs/renderer/render-frames), [`getCompositions()`](/docs/renderer/get-compositions) and [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda). +to server-side rendering APIs like [`renderMedia()`](/docs/renderer/render-media), [`renderFrames()`](/docs/renderer/render-frames), [`getCompositions()`](/docs/renderer/get-compositions), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda) and [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel). ## Thanks diff --git a/packages/docs/docs/timeout.mdx b/packages/docs/docs/timeout.mdx index de91f0b3145..d8508826064 100644 --- a/packages/docs/docs/timeout.mdx +++ b/packages/docs/docs/timeout.mdx @@ -67,7 +67,7 @@ You can increase the default timeout: - In the Remotion Studio render dialog under "Advanced" - Using the [`--timeout`](/docs/cli/render#--timeout) CLI flag -- Using the `timeoutInMilliseconds` option in [`renderStill()`](/docs/renderer/render-still#timeoutinmilliseconds), [`renderFrames()`](/docs/renderer/render-frames#timeoutinmilliseconds), [`getCompositions()`](/docs/renderer/get-compositions#timeoutinmilliseconds), [`renderMedia()`](/docs/renderer/render-media#timeoutinmilliseconds), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#timeoutinmilliseconds), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#timeoutinmilliseconds), [`renderStillOnCloudRun()`](/docs/cloudrun/renderstilloncloudrun#delayrendertimeoutinmilliseconds) and [`renderMediaOnCloudRun()`](/docs/cloudrun/rendermediaoncloudrun#delayrendertimeoutinmilliseconds) +- Using the `timeoutInMilliseconds` option in [`renderStill()`](/docs/renderer/render-still#timeoutinmilliseconds), [`renderFrames()`](/docs/renderer/render-frames#timeoutinmilliseconds), [`getCompositions()`](/docs/renderer/get-compositions#timeoutinmilliseconds), [`renderMedia()`](/docs/renderer/render-media#timeoutinmilliseconds), [`renderMediaOnLambda()`](/docs/lambda/rendermediaonlambda#timeoutinmilliseconds), [`renderStillOnLambda()`](/docs/lambda/renderstillonlambda#timeoutinmilliseconds), [`renderMediaOnVercel()`](/docs/vercel/render-media-on-vercel#timeoutinmilliseconds), [`renderStillOnVercel()`](/docs/vercel/render-still-on-vercel#timeoutinmilliseconds), [`renderStillOnCloudRun()`](/docs/cloudrun/renderstilloncloudrun#delayrendertimeoutinmilliseconds) and [`renderMediaOnCloudRun()`](/docs/cloudrun/rendermediaoncloudrun#delayrendertimeoutinmilliseconds) - Using the [`Config.setDelayRenderTimeoutInMilliseconds()`](/docs/config#setdelayrendertimeoutinmilliseconds) option in the config file, if you render on the CLI - Individually for a [`delayRender()`](/docs/delay-render) call using the [`timeoutInMilliseconds`](/docs/delay-render#modifying-the-timeout) option - The [``](/docs/img#delayrendertimeoutinmilliseconds), [`