Bundle rules
What goes into a deploy bundle, the limits that apply, and how to set compatibility flags and WASM modules.
runlot deploy packs everything a deploy needs into a single tar bundle. The CLI, the control plane, and the node each validate the bundle; the node does not rely on the earlier checks alone.
Size limits
| Item | Limit |
|---|---|
| Compressed upload | 64 MiB |
| Total uncompressed size | 512 MiB |
| Single file | 64 MiB |
| Number of entries | 20,000 |
| Path length | 255 bytes |
runlot.json | 1 MiB |
Exceeding a limit produces a bundle_too_large error. Usually this means node_modules or a build cache ended up inside the assets directory.
compatibilityDate
{ "compatibilityDate": "2025-01-15" }The value must be in YYYY-MM-DD format. If you do not set it, 2024-09-23 is used. A date in the future relative to the runtime is not allowed, and the default is never moved forward automatically.
compatibilityFlags
Compatibility flags are managed as an allow-list. Right now there is exactly one flag available: nodejs_compat.
{ "compatibilityFlags": ["nodejs_compat"] }Flags that are not on the allow-list cannot be used. For example, unsafe_module lets user code control the worker process, so it cannot be set from the manifest.
You normally do not need to set this yourself. If your bundle imports a node: built-in module, the CLI adds nodejs_compat automatically. Without it the module cannot be loaded, and it is also added automatically when you use TypeORM, Sequelize, or Knex.
nodejs_compat changes globals (process, Buffer) and module resolution, so it is not enabled by default — so that a deploy never changes the behaviour of a worker that does not use it.
wasm modules
WASM inside a bundle cannot be compiled with new WebAssembly.Module(bytes). The runtime does not support that, so WASM files are included as modules in the manifest.
{
"main": "worker/index.js",
"modules": [{ "name": "query_compiler.wasm", "type": "wasm", "path": "worker/query_compiler.wasm" }]
}The CLI generates this for you as well. Prisma's query compiler is included this way.
The only value allowed for type is wasm. worker is reserved as the entry module name, and module names must be unique.
What is not allowed
- Symbolic links — to prevent unintended node files from being served.
- Paths that point outside the project root — for example,
"assets": "../../etc" - Absolute paths and
..path components - Duplicate tar entries — to prevent the validated bundle and the executed bundle from differing.
- NUL characters in a path
- Unsupported
frameworkvalues — the only supported value today isnext.