Skip to content

Luau Run · Guides · Development

Building from source

Using a release needs none of this. See Getting started. The source map says where code lives and how a run passes through it.

  • Bun 1.4.0, which runs Luau Run and its tests.
  • pnpm 11.23.0, through Corepack, for dependencies.
  • The Rust toolchain that rust-toolchain.toml pins, for the Windows supervisor (the program that starts Luau Run’s test processes).

TypeScript 7.0.2 is the type checker. The architecture check uses the compiler API of a separately pinned TypeScript 6.0.3.

From the repository’s folder:

corepack pnpm install --frozen-lockfile
corepack pnpm run build:windows # dist\luau-run.exe
cargo build --release --offline --locked -p luau-run-supervisor # target\release\luau-run-windows-supervisor.exe

build:windows stamps the exe with the commit it came from, and --version, doctor and every receipt show that commit. A build from a tree with uncommitted changes to tracked files is marked -dirty.

From a checkout, bun src/cli.ts runs the same commands as luau-run, such as bun src/cli.ts test. self-install refuses there, since there is no luau-run.exe to place.

To use a Lute that setup did not install, or a supervisor you built, name them in these variables. A supervisor must match the pin.

$env:LUAU_RUN_SUPERVISOR_EXE = "C:\path\to\luau-run-windows-supervisor.exe"
$env:LUAU_RUN_LUTE_EXE = "C:\path\to\lute.exe"

Forward slashes are accepted in these variables.

corepack pnpm run check:fast
corepack pnpm run typecheck
corepack pnpm run check:architecture
corepack pnpm run check:native

check:fast runs every check that needs no provider, with provider switches and tool variables removed from its environment. The full check, corepack pnpm run check, also runs live checks on Lute and on Jest-Portable, Luau Run’s fork of Jest Roblox. It needs eight variables, named in CURRENT_CONFORMANCE_INPUTS in scripts/check-current-conformance.ts:

  • the Lute, Luau, Lune, pesde and supervisor executables
  • the Jest-Portable fork
  • Jest Roblox’s source, and the outside packages it bundles, which the fork’s build reads

The Jest-Portable repository holds only the packages. The fork’s build tools and tests, which the full check and the Jest builds below need, are not public.

check:studio launches Roblox Studio and is not part of the full check.

build:windows makes an exe that carries none of Luau Run’s own files: the supervisor, the Jest runner for Lute, and Jest for Roblox Studio. A release exe carries all three. Both Jest parts are built in the Jest-Portable fork, not in this repository. To make an exe that carries them, build a release folder from the fork’s output and embed it. --frameworks names the folder the fork’s bun run build:lute-artifacts writes. --studio names the Studio framework set, which holds CandidateReceipt.json, Roblox.luau and packages:

bun scripts/release/release.ts local --out D:\release --frameworks <the fork builder's output> --studio <the Studio framework set>
bun scripts/build-cli.ts --embed D:\release

Or install from a copy of that folder, which uses no network. Put the pinned Lute archive, lute-windows-x86_64.zip from Lute’s v1.0.1-nightly.20260729 release, in the copy, then run luau-run setup --from on the copy. Keep Lute out of the release folder itself, which holds only what a release ships.

A build that carries none of these files reads Jest for Roblox Studio from LUAU_RUN_JEST_ROBLOX_ROOT, which names the pinned jest-portable-studio-<version>.zip or a folder holding the same files.

src/manifest/manifest.ts pins the size and SHA-256 of Luau Run’s supervisor build. The build records the paths of the machine that made it, so the cargo build above gives the pinned bytes only on that machine. To run your own build, run bun scripts/pin-supervisor.ts, which rebuilds it and rewrites the pin, then name it with LUAU_RUN_SUPERVISOR_EXE. Commit the pin with the change to the supervisor’s source.

© 2026 PRMS Developer