ScriptC removes Node only when your code fits its compiler
ScriptC takes TypeScript or JavaScript through typed intermediate representation and can emit readable C, LLVM IR, assembly, object files, executables, or WebAssembly. A static executable includes a small native runtime without Node or a JavaScript engine. That is the interesting part: a command-line tool can keep TypeScript as its source language while shipping a native artifact rather than a Node installation plus node_modules.
Static compilation is conditional, not automatic. The scriptc coverage command reports which statements compile statically and gives coded diagnostics for the remainder. Passing --dynamic embeds QuickJS for npm packages and any-typed code that need JavaScript behavior. The executable then avoids reading node_modules at runtime, but it no longer has the same engine-free shape as a fully static build.
The 13-second build passed, while the test gate exceeded 900 seconds
Our run at commit fc2569e installed 407 pnpm packages in 10 seconds and occupied 292 MB on disk. The monorepo build succeeded in another 13 seconds. The checkout contained 2,908 files and about 429,956 lines of source across 40.9 MB, so the quick build result is encouraging for contributors working on a sizeable compiler codebase.
Tests did not complete before our 900-second limit. The final log printed context canceled 12 times, with no assertion, test name, or stack trace that established a cause. We can report the timeout, but we cannot turn that tail into a diagnosis. The repository has a tests directory and 2 CI workflow files, yet a clean 3-CPU, 8 GB sandbox did not give us a finished local gate.
What happened when we ran it
The install and build completed in 23 seconds combined on our box: 10 seconds for 407 packages, then 13 seconds for the build. No Dockerfile was present. ScriptC uses pnpm workspaces, and the ordinary workspace build does not require a local LLVM installation, which keeps the first contributor step much lighter than rebuilding its native helper stack.
The test outcome is the constraint. After 900 seconds, our harness stopped the command and recorded a timeout. Its last 12 lines all said context canceled. That wording could come from several layers, so assigning blame to Vercel Sandbox, a particular test, or the compiler would exceed the log. A team evaluating ScriptC should split the local test commands and preserve per-suite output before setting a production CI deadline.
Native output has several different toolchain boundaries
Node.js 24 or newer is required to run the compiler. Emitting IR, C, or LLVM needs only Node, while assembly and object output can use optional platform helpers installed with ScriptC. Ordinary LLVM-tier executables still require a linker driver and platform SDK. Explicit C builds, sanitizer work, and fallback routes add a C compiler to the setup.
WebAssembly uses Zig and targets WASI Preview 1. The README names unsupported portable capabilities such as network sockets, fetch, child processes, OS signals, and file watching, which fail before linking with diagnostic SC3002. That boundary is preferable to a mysterious runtime failure. It also means a server, subprocess manager, or file-watching tool is a poor first candidate for the WASI route.
JavaScript compatibility still needs an application corpus
The project calls itself experimental, and current issues show why that label matters. Issue 31 reports that an out-of-bounds array access can abort with a RangeError where Node returns undefined. Issue 238 reports rejected decorator syntax, blocking the documented NestJS example. Issue 432 describes an AbortSignal field causing unrelated method calls to be refused in a dynamic build. These are ordinary language and framework shapes, not obscure benchmark tricks.
A compiler diagnostic is the safer failure mode because it stops the build. Semantic differences that compile and then behave unlike Node demand stronger tests. Run the same input under Node and the generated artifact, then compare stdout, stderr, exit codes, files, and network behavior. ScriptC's full corpus already compares several of those outputs byte for byte. Your application-specific cases still belong beside it.
Debugging and embedding remain specialist work
Open issue 461 reports that Xcode breakpoints are disabled because the generated binary lacks the expected DWARF metadata. Issue 260 explains a separate embedding constraint: a host that owns the main thread can prevent ScriptC's event loop from making progress. If your use case involves native callbacks, a GUI loop, or a library loaded by another process, prove that control flow before adopting the compiler.
Rebuilding native helpers is also a different job from installing the CLI. It requires CMake, Ninja, and the pinned LLVM 22 development package on each target host. The managed sandbox test route needs Vercel authentication and installs a pinned Node, pnpm, and LLVM toolchain in disposable environments. Those facilities are useful for compiler maintainers, though most application teams should consume published helpers first.
v0.1.5 is moving quickly enough to retest often
GitHub showed 5,112 stars, 62 combined open issues and pull requests, and a last push on September 26, 2026. Release v0.1.5 arrived the same day with wider static HTTP support, more numeric APIs, Effect package compilation, and fixes for dynamic islands. That pace says the project is active. It also means a compatibility judgment made against fc2569e can age quickly.
ScriptC is worth trying when native output is itself the requirement and you can choose a contained program for the experiment. Its 23-second install-and-build result lowered the trial cost, while the 900-second unfinished test run raised the cost of treating the repository as settled infrastructure. Start with one utility, record its static coverage, and keep Node as the behavior reference until the generated binary earns independence.

