visaljs
JavaScript in. A native binary out.
A simple ahead-of-time compiler. It reads your JavaScript, turns it into C, and compiles it to a native binary, all in one step.
Smaller binaries, less memory
One small binary to copy and run, with nothing else to install. The same servers, from a bare node:http one to Next.js, built by visaljs, Bun and Node.
Binary size
- visaljs3.2 MB
- Bun91 MB
- Node127 MB
Memory under load
- visaljs13.2 MB
- Bun62.8 MB
- Node81.2 MB
Binary size
- visaljs4.5 MB
- Bun91 MB
- Node127 MB
Memory under load
- visaljs18.4 MB
- Bun78.7 MB
- Node106.6 MB
Binary size
- visaljs11 MB
- Bun92 MB
- Node128 MB
Memory under load
- visaljs28.0 MB
- Bun87.8 MB
- Node102.3 MB
Binary size
- visaljs20 MB
- Bun—
- Node—
Memory under load
- visaljs57.8 MB
- Bun244.0 MB
- Node528.8 MB
Binary size
- visaljs45 MB
- Bun—
- Node—
Memory under load
- visaljs108.3 MB
- Bun270.8 MB
- Node518.0 MB
Measured nightly on GitHub's runners, last on 2026-10-19. Node and Bun can't build Next.js or vinext into one binary: their rows runnext start and vinext start, without a size.
Node compatibility
Use Node v24's built-in modules in your compiled program.
30/58 modules fully supported
- assert
- assert/strict
- async_hooks
- buffer
- console
- diagnostics_channel
- domain
- events
- fs/promises
- https
- net
- os
- path
- path/posix
- path/win32
- punycode
- querystring
- readline/promises
- sea
- stream
- stream/promises
- string_decoder
- sys
- test/reporters
- timers
- timers/promises
- trace_events
- util
- util/types
- zlib
- child_process
- cluster
- constants
- crypto
- dns
- dns/promises
- fs
- http
- http2
- inspector
- inspector/promises
- module
- perf_hooks
- process
- readline
- repl
- stream/consumers
- stream/web
- test
- tls
- tty
- url
- v8
- vm
- worker_threads
- dgram
- sqlite
- wasi
How to use
A single command: point it at your JavaScript, and visaljs does its best to compile it, npm packages included. All you need is Node 22 or later and a C compiler.
npx visaljs build app.js ./app
Builds app.js and the npm packages it imports into one native binary, ./app.
npx visaljs build ./my-app
In your project's folder: visaljs tries to detect your framework and entry file, and compiles them into one native binary named after the folder.