Compile TypeScript to
Native Executables
Perry is a native TypeScript compiler written in Rust that compiles your TypeScript directly to machine code. No runtime required.
$ perry build main.ts
Compiling main.ts...
✓ Built executable: main (2.3 MB)
$ ./main
Hello, World!
Why Perry?
Everything you need to compile TypeScript to native applications
No Runtime Required
Produces standalone native executables. No Node.js, no V8, no runtime dependencies. Just a single binary that runs anywhere.
Fast Compilation
Direct TypeScript to native code compilation using SWC for parsing and Cranelift for code generation. No intermediate JavaScript.
Small Binaries
Output binaries are typically 2-5MB. With optional V8 runtime for JS npm packages, 15-20MB. Ship less, deploy faster.
Type-Safe
Leverages TypeScript's type system for optimization. Types enable better code generation through monomorphization.
Comprehensive Standard Library
Built-in native implementations of fs, path, crypto, os, Buffer, child_process, and more. Use familiar Node.js APIs.
Optional V8 Runtime
Need to use a pure JavaScript npm package? Enable the V8 runtime flag for full npm ecosystem compatibility.
Write TypeScript, Ship Native
Use familiar TypeScript syntax and APIs. Perry handles the rest.
// hello.tsconst greeting = "Hello, World!";console.log(greeting); // Compiles to ~2MB native executable// No runtime needed!Performance Comparison
Native compilation delivers unmatched efficiency
| Metric | Perry | Node.js | Bun |
|---|---|---|---|
| Binary Size | 2-5 MB | ~80 MB | ~90 MB |
| Startup Time | ~1 ms | ~30 ms | ~10 ms |
| Runtime Dependencies | None | Node.js | Bun |
| Memory Overhead | Minimal | V8 + GC | JSC + GC |
Get Started
Install Perry and start compiling TypeScript to native executables
1Installation
$ git clone https://github.com/aspect-build/perry.git$ cd perry$ cargo build --releaseRequires Rust toolchain. Binary will be at target/release/perry
2Usage
perry build main.tsCompiles main.ts to a native executable
perry build main.ts -o myappSpecify the output executable name
perry build main.ts --enable-js-runtimeEnable V8 for JavaScript npm package compatibility
perry check ./srcValidate TypeScript code for native compilation
Feature Support
Comprehensive TypeScript and Node.js API coverage
Core Language
- Numbers64-bit floating point (f64)
- StringsUTF-8, all common methods
- Booleanstrue/false, logical operators
- ArraysTyped and mixed-type arrays
- ObjectsObject literals and field access
- BigInt256-bit integer support
- EnumsNumeric and string enums
Functions
- Function DeclarationNamed functions
- Arrow Functions() => {} syntax
- Default ParametersParameters with defaults
- Rest Parameters...args syntax
- ClosuresIncluding mutable captures
- Higher-Order FunctionsFunctions as arguments/returns
- Async/AwaitAsync function support
Classes
- Class DeclarationBasic class syntax
- ConstructorsWith parameters
- Private Fields (#)ES2022 #privateField syntax
- Static Methods/FieldsClass-level members
- Getters/Settersget/set accessors
- Inheritanceextends keyword
- Super Callssuper() constructor calls
Type System
- Type AnnotationsExplicit type declarations
- Type InferenceAutomatic type detection
- GenericsMonomorphization (like Rust)
- InterfacesInterface declarations
- Union Typesstring | number support
- Type Guardstypeof operator
- Type Aliasestype X = ... declarations
Standard Library
- fsreadFileSync, writeFileSync, existsSync, etc.
- pathjoin, dirname, basename, extname, resolve
- cryptorandomBytes, randomUUID, sha256, md5
- osplatform, arch, hostname, memory info
- Bufferfrom, alloc, toString, slice, copy
- child_processexecSync, spawnSync
- JSON/Math/DateFull implementations
27+ Native npm Packages
Popular npm packages reimplemented in native Rust. No npm install, no node_modules, just fast native code.
Database
Security
HTTP
Data Processing
Date & Time
Utilities
How It Works
From TypeScript source to native executable in seconds
lift
01NaN-Boxing
Values are stored as 64-bit floats with special bit patterns for pointers, enabling union types without runtime overhead. This allows (string | number)[] to work efficiently.
02Monomorphization
Generics are specialized at compile time, like Rust. Each type instantiation generates optimized code, eliminating runtime type checking overhead.
03Static Dispatch
No virtual tables. Method calls are resolved at compile time, enabling direct function calls and inlining optimizations.
04Zero-Cost Abstractions
TypeScript classes, interfaces, and generics compile to efficient native code with no runtime representation overhead.