CLI Reference
The CLI has four commands. scriptc --help prints this same surface.
$ scriptc --help
scriptc — TypeScript/JavaScript to native and WebAssembly executables (experimental)
Usage:
scriptc build <file.ts|.js> [options] compile to an executable or source artifact
scriptc run <file.ts|.js> [options] compile and run
scriptc coverage <file.ts|.js> how much compiles statically, and why not
scriptc coverage <file.ts|.js> --dynamic what a --dynamic build compiles, and what still blocks it
scriptc coverage <file.ts|.js> --external-types <specifier=file.d.ts>
type-resolve an embedder-provided module for analysis
scriptc cache warm [runtime|tls|dynamic…] verify and load precompiled runtime families
for the current compiler/SDK/targetscriptc build
Compiles a TypeScript (or JavaScript) entry file to serialized typed IR, textual LLVM IR, native assembly, a relocatable object, a native executable, or a WebAssembly module when the wasm32-wasi target is selected. The program is type-checked first — by the real TypeScript compiler, honoring the nearest tsconfig.json — and any construct without a lowering is a compile error with an SC-prefixed code, a code frame, and usually a rewrite hint.
$ scriptc build fib.ts -o fib
$ ./fib
832040Without -o, the primary artifact lands in .scriptc/ next to the input. Source outputs have stable suffixes and stop before native compilation:
$ scriptc build fib.ts --emit=ir >/dev/null
$ ls .scriptc/
fib.ir.json
$ scriptc build fib.ts --emit=llvm >/dev/null
$ ls .scriptc/
fib.ir.json
fib.ll
$ scriptc build fib.ts --emit=asm >/dev/null
$ ls .scriptc/
fib.ir.json
fib.ll
fib.s
$ scriptc build fib.ts --emit=obj >/dev/null
$ ls .scriptc/
fib.ir.json
fib.ll
fib.o
fib.sDifferent output kinds accumulate in .scriptc/; rebuilding a kind updates its file.
The IR and LLVM source outputs require only Node. On supported macOS, Linux, and Windows hosts, assembly and object outputs use the matching native helper installed with scriptc and do not invoke an external compiler, archiver, linker, or SDK. The object is a relocatable program object with undefined scr_* runtime symbols and a required scr_runtime_abi_v5 marker, not a standalone library. External consumption is experimental and requires the exact runtime version reported by --print=native-link-info. That option still writes the object, performs no link, and prints a versioned JSON recipe with the target, main entry, installed precompiled runtime pack, FFI inputs, and system libraries. It never reports private scriptc cache paths. See Native Program Objects for complete C-driver and direct-linker examples. --emit=exe is the default. LLVM builds emit the program object through the helper and link precompiled runtime objects; runtime development with AddressSanitizer compiles an instrumented C runtime.
scriptc run
build followed by executing the binary, with stdio inherited. For wasm32-wasi, the CLI starts the module through Node's WASI Preview 1 host, preopens the current working directory as /, and exposes the host's /tmp as the guest's /tmp.
$ scriptc run fib.ts
832040Note: run does not forward extra command-line arguments to the program. To pass arguments, build the executable and invoke it directly.
scriptc coverage
Analyzes the program without producing a binary and reports, statement by statement, what compiles statically, what needs the embedded dynamic engine, and what blocks the rest. With --dynamic it answers a different question: what would a --dynamic build compile, and what still blocks it. Both forms are covered in depth in Coverage Reports.
scriptc cache warm
Verifies and reads the installed precompiled runtime objects and vendor archives. Pass one or more of runtime, tls, and dynamic to select those families. Ordinary builds need no runtime compilation or installation-time warming. With --sanitize, this command builds instrumented runtime objects using the development C toolchain.
Options
-o, --out <path>- Primary artifact path. An explicit path is exact. Defaults are
.scriptc/<name>.ir.json,.ll,.s,.o, or the platform executable name. --emit <ir|llvm|asm|obj|exe>- Select the invocation's one primary artifact.
irandllvmneed only Node.asmandobjuse a matching bundled LLVM helper on supported macOS, Linux, and Windows hosts and for WASI; they need no installed C compiler.exeis the default. --print <native-link-info>- Build an object (equivalent to
--emit=obj) and print its machine-readable external link recipe as JSON instead of printing the artifact path. The document names the exact installed precompiled runtime pack and all link inputs, but does not invoke a linker. --dynamic- Embed the dynamic engine (~620KB) so npm dependencies and
any-typed code can run. Static stays the default — without this flag, dynamic-tier sites are per-site compile errors. See npm Dependencies. --ffi <file>- Bind signature-only TypeScript declarations to native C ABI symbols and link the manifest's archive, object, and system-library inputs. See Native FFI.
--backend <llvm>- The production code generator is
llvm. This is also the default when the option is omitted. --strip- Remove symbol and debug payload when linking an executable, including cross-compiled targets. This flag preserves code optimization.
--optimization <release|dev>- Select native optimization for executable, assembly, or object output. The default is
release(-O2).devuses-O0and emits source locations for TypeScript and JavaScript breakpoints and stack frames. LLVM builds include source variable names and native storage descriptions; see Native debugging for the supported representations. macOS executable builds also produce an adjacent.dSYMbundle. --windows-subsystem <console|gui>- Select the subsystem of a Windows executable.
consoleis the default;guiprevents Windows from opening a console window for the app. Valid only for executable builds targeting Windows. --npm-static <pkg[,pkg…]|auto>- EXPERIMENTAL. Compile the named npm packages' shipped JS statically as program modules instead of embedding them for the engine (repeatable;
autoopts in every eligible direct import). A package the preflight refuses falls back to the island with a coverage-report note. See npm Dependencies for maturity notes. --provenance-sources- EXPERIMENTAL. Compile npm dependencies from their provenance-attested source, fetched at the attested commit, as static program modules; packages without a usable attestation keep the engine path (a note, never a failure).
--external-types <specifier=file.d.ts>- Coverage only. Map an exact bare module specifier to a local declaration file supplied by an embedder. Repeat the option for multiple modules. The declaration supplies checker types so application coverage can continue; runtime imports and values remain explicit
SC1010blockers. Relative paths resolve from the current working directory. Accepted files end in.d.ts,.d.mts, or.d.cts. --sanitize- Build an executable with AddressSanitizer plus the runtime reference-count audit — the same lane the compiler's own test corpus runs under.
--emit=asm|objrejects this option until the helper's sanitizer pipeline has parity. --emit-ir- Additive IR side artifact. It is deprecated for executable builds for one release cycle; prefer
--emit=irwhen IR is the primary output. Library mode retains--emit-irbecause--emitdoes not select library artifacts. --keep-llvm/--no-keep-llvm- Keep (default) or delete the generated
.llfile next to the executable. -h, --help- Show usage.
Environment variables
SCRIPTC_CACHE_DIR- Override the persistent build-cache root. By default it is
$XDG_CACHE_HOME/scriptc/buildwhen set,$HOME/Library/Caches/scriptc/buildon macOS,%LOCALAPPDATA%\scriptc\cache\buildon Windows, and$HOME/.cache/scriptc/buildelsewhere. Cached frontend results and LLVM artifacts are verified against their source, helper, target, and compilation settings. Native outputs also depend on the selected runtime pack and linker inputs. FFI objects, archives, and system libraries relink against their current dependencies. Sanitizer development builds additionally cache instrumented runtime objects and verify external compiler and header inputs. An existing POSIX override must already be private; otherwise caching is bypassed without changing the directory's permissions. SCRIPTC_NO_CACHE- Set to
1to bypass all build-cache reads and writes. An explicitly emptySCRIPTC_CACHE_DIRhas the same effect. SCRIPTC_CACHE_MAX_MB- Maximum build-cache size in megabytes. The default is
4096; the default cache is swept periodically, while an explicitly configured cap is checked after every successful cache write. Least-recently-used entries are removed when the cache exceeds the cap. SCRIPTC_CC- The external compiler for runtime development with AddressSanitizer and native FFI build tooling.
zigccselects Zig'sccsubcommand. SCRIPTC_LINKER- Platform linker driver for ordinary LLVM executables. The driver receives only the helper-produced program object, precompiled runtime objects/archives, FFI inputs, and system libraries; it locates the platform SDK and CRT inputs but does not compile scriptc-generated or runtime C.
SCRIPTC_TARGET- Target triple for cross-compilation, e.g.
aarch64-linux-gnu.2.36,x86_64-windows-gnu, orwasm32-wasi. WASI builds default to a.wasmoutput name. See Platform Support.
$ SCRIPTC_TARGET=aarch64-linux-gnu.2.36 scriptc build fib.ts -o fib-linux
$ file fib-linux
fib-linux: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 2.0.0, with debug_info, not strippedLLVM backend
scriptc emits LLVM IR and lowers it to native code. Executable builds link the resulting object with the matching precompiled C runtime pack. Use --emit=llvm to inspect generated code.
For source breakpoints in Xcode or LLDB, build with --optimization=dev. In an Xcode custom build rule, list the executable and its .dSYM bundle as outputs. Keep the bundle next to the executable and retain the original source files at their build paths. LLVM preserves source locations across imported modules.
Tool requirements
| Operation | Node | Compiler | Linker / SDK |
|---|---|---|---|
coverage, --emit=ir|llvm | Required | Not used | Not used |
--emit=asm|obj (macOS 15+ arm64) | Required | Bundled scriptc LLVM helper | Not used |
External link of --emit=obj with the reported precompiled runtime pack | Not used by the artifact | Precompiled runtime objects | macOS linker and SDK required |
--emit=exe | Required to run scriptc | Bundled LLVM helper | Platform linker and SDK/sysroot |