[go: up one dir, main page]

AHEAD-OF-TIME TYPESCRIPT COMPILER · SWC + LLVM

Your JavaScript/TypeScript,
compiled to native.

Perry compiles TypeScript and JavaScript into a small native executable. One codebase, 11 platforms, no Node.js at runtime.

$ npm i -g @perryts/perry
Read the docs
~/hellozsh
$ perry compile main.ts
  parse      swc
  transform  hir
  codegen    llvm
  link       runtime + gc
✓ wrote ./main   ~330 KB
$ ./main
Hello, World!
$ █

Stop shipping a browser
with every app.

Electron bundles Chromium. React Native bundles a JavaScript engine. Perry compiles your code to machine code, so there is nothing extra to ship.

Electron, React Native and Perry compared
ElectronChromium + Node.js per appReact NativeJS engine + native viewsPerryLLVM machine code
What shipsYour JS + a full browserYour JS bundle + an engineA single native executable
UIHTML/CSS in a webviewNative views over a bridgeAppKit, UIKit, Win32, GTK4, Android, DOM
Targets from one codebaseDesktopMobile first11: desktop, mobile, watch, TV and web
JavaScript at runtimeYesYesNo. Optional V8 fallback for packages that need it
App sizeIncludes ChromiumIncludes a JS engine~330 KB hello world
Honest tradeoffMature, huge ecosystemMature on mobileImplements a practical TS + Node subset; pre-1.0

How Perry
builds your app.

SWC parses your code, Perry lowers it, and LLVM generates machine code. The runtime and garbage collector are linked into the same binary.

  1. 01

    main.ts / .js

    Source

    TypeScript or plain JavaScript. Classes, generics, async/await and npm packages.

  2. 02

    Parse

    SWC

    Fast parsing into an AST.

  3. 03

    Transform

    Perry IR

    Type resolution and lowering.

  4. 04

    Codegen

    LLVM

    Machine code for ARM64, x86-64 and WASM.

  5. 05

    ./main

    Executable

    A single file, from ~330 KB.

One UI codebase,
eleven native targets.

perry/ui is a declarative UI library built on stacks. Each widget maps to the platform's own toolkit: AppKit, UIKit, Win32, GTK4, Android Views or the DOM.

app.tsdocs/examples/ui/overview/quickstart.ts
import { App, Text, VStack } from "perry/ui"

App({
    title: "My App",
    width: 400,
    height: 300,
    body: VStack(16, [
        Text("Hello from Perry!"),
    ]),
})

$ perry compile app.ts --target <any of 11>

  • AppKitmacOS
  • UIKitiOSiPadOStvOSvisionOS
  • SwiftUIwatchOS
  • Android ViewsAndroidWear OS
  • Win32Windows
  • GTK4Linux
  • DOMWeb / WASM
  • ArkUIHarmonyOS · preview
  • broad
  • core · gaps documented
  • preview

35+ widgets

State(), stacks, spacers.
No CSS.

  • VStack
  • HStack
  • ZStack
  • Spacer
  • Text
  • Button
  • TextField
  • SecureField
  • Toggle
  • Slider
  • Picker
  • WheelPicker
  • ImageFile
  • ImageSymbol
  • ProgressView
  • TextArea
  • Section
  • State
  • …

97%is the target for Node 26 compatibility. 3,371 of 4,340 tests pass today.

We run Node 26's test suite against Perry module by module and compare the output with Node. 4,340 tests across 53 modules. Failing tests are listed in the repository.

3,371 / 4,340 passingtarget: 97%

REAL NPM PACKAGES, COMPILED NATIVELY

Fastify · Express · mysql2 · pg · ioredis · ws · bcrypt · jsonwebtoken and more. Plain JavaScript compiles too. Known gaps are listed in the repository.

53 TRACKED node:* MODULESPer-module pass rates →

Benchmarks against Node.js,
wins and losses.

Perry 0.5.1639 · Node.js v22.23.1
Apple M1 · macOS · 2026-09-23
wall-clock ms · lower is better

  • 5.2×faster

    string concat

    perry 6 ms · node 31 ms

  • 3.5×faster

    array write

    perry 2 ms · node 7 ms

  • 3.3×faster

    date format + parse

    perry 33.1 ms · node 110 ms

  • 3.2×faster

    batch processing

    perry 21.9 ms · node 69.4 ms

BENCHMARK
← PERRY FASTERNODE FASTER →
PERRYNODERATIO
string concatString append loop6 ms31 ms5.2× faster
object allocation1M objects8 ms5 ms1.6× slower
array write10M elements2 ms7 ms3.5× faster
mandelbrotComplex-number iteration25 ms24 ms≈ even
binary treesTree allocation + traversal13 ms6 ms2.2× slower
method callsClass method dispatch35 ms11 ms3.2× slower

Real projects,
compiled with Perry.

Apps built with Perry

CASE · CLAUDE CODE

13 MBof minified cli.js
from npm

We pointed Perry at the bundle npm ships for Claude Code. The native binary launches, logs in, streams a real API response and paints what you type.

160compiler fixes landed along the way

Read the write-up
  • NPM PACKAGES

    axios · zod v4 · express
    fastify · hono

    Pure TypeScript and JavaScript packages compile natively. Some need the optional V8 fallback.

  • FRAMEWORKS

    Hono · tRPC · Strapi

    Native ARM64 executables under 2 MB, compiled in under a second.

  • THIS SITE

    perryts.com

    The server answering this page is a binary compiled with Perry.

Test, ship and host
with the same toolchain.

The compiler is the core. These tools handle testing, publishing and hosting.

  1. 01 COMPILE

    Perry

    JavaScript/TypeScript to a native binary for 11 targets.

    MIT · open source

  2. 02 TEST

    Geisterhand

    UI testing that drives your app's real widgets.

    geisterhand.io

  3. 03 SHIP

    Perry Publish

    From main.ts to the App Store: build, sign, verify and submit.

    $ perry publish

  4. 04 HOST

    Coop

    Runs Perry-compiled JavaScript/TypeScript apps over HTTP.

    Pre-1.0

Roadmap:
core first.

Perry is at v0.5 and hasn't reached 0.6 yet. Until the core is stable, most of the work goes into Node compatibility and performance.

Release notes on GitHub
  1. NOWv0.5 → 0.6CURRENT

    Stabilise the core

    • Node 26 parity from ~78% toward 97%
    • Performance: GC, dispatch, startup, binary size
    • Close JavaScript/TypeScript and npm gaps: Proxy, decorators, weak refs
  2. NEXTafter the core

    perry/ui

    • Wider widget coverage
    • UI parity across the 11 targets
    • Core and preview targets moving up a level
  3. LATERon a stable base

    Extensions

    • Perry Publish hosted builds and signing
    • Coop hosting
    • More first-party packages and tooling

Need help moving from Electron or React Native?

Perry is an independent project run by its maintainers. If your company needs a platform, package or feature, contact us. Scope, timeline and terms are agreed in writing.

  1. 01

    Migration reviews

    We review your Electron or React Native app and tell you what compiles today and what needs work.

  2. 02

    Paired implementation

    Work alongside the maintainers while your team ships its first Perry build.

  3. 03

    Sponsored features

    Fund a widget, Node module or platform. The work goes into the open-source compiler.

  4. 04

    Hosted builds & support

    Signing, verification and release planning, with support terms set in your agreement.

Tell us your product, targets and timeline.

Perry for teams

Built in the open.

Perry started in January 2026 and is pre-1.0. All work happens in public pull requests on GitHub.

7,424pull requests mergedsince January 2026
~49merged per dayover the last 30 days
38contributorson GitHub
5.0kGitHub stars182 forks

Figures read from the GitHub API at build time.

Browse the pull requests

Frequently Asked Questions

Everything people ask before compiling their first binary

Does Perry need Node.js or a runtime?

Native Perry binaries run without Node.js, Bun, Deno, or an external JavaScript engine installed. They do include the Perry runtime and garbage collector, statically linked. Packages that need engine semantics can use the optional embedded V8 fallback.

How big are the compiled binaries?

Size depends on the target, imports, and build profile. The published examples range from about 330 KB for hello world to about 7 MB for Mango; full-standard-library or optional-V8 builds can be much larger. Treat any size as a measured example, not a universal output size.

Can I use npm packages?

Many pure JavaScript/TypeScript packages compile natively, and roughly 50 package/API implementations are tracked. Compatibility is not universal: packages using native addons, unsupported dynamic behavior, or engine-specific semantics may need the optional V8 fallback or may not work. Run perry check and consult the limitations.

Which platforms does Perry support?

Perry documents 11 targets: macOS, iOS, iPadOS, visionOS, tvOS, watchOS, Android, Wear OS, Windows, Linux, and Web/WASM. Web and WASM are aliases; HarmonyOS is a separate preview. Platform maturity and API coverage differ, so consult the platform guide.

Is Perry free and open source?

The compiler and runtime repository is MIT licensed, and local compilation requires no account. Hosted Perry Publish and commercial support are separate services; availability, limits, and pricing are confirmed in the service or in writing.

How is Perry different from Bun or Deno compile?

Bun and Deno standalone executables bundle their runtimes; Perry native builds compile through LLVM and do not embed a JavaScript engine by default, although they statically link the Perry runtime and GC. Exact size and startup comparisons are version-, platform-, and workload-specific. See the dated Perry vs Bun and Perry vs Deno pages.

How is Perry different from Electron or Tauri?

Electron ships Chromium and Node.js; Tauri uses a system webview with native-side application code. Perry instead maps its UI model to platform widgets where supported. Bundle size and platform capability vary, so use the dated Perry vs Electron and Perry vs Tauri comparisons rather than a universal size claim.

How mature is Perry?

Perry is pre-1.0 and changes quickly. Real projects use it today, but language, package, and platform parity are still active work. Review the showcase, current limitations, and changelog before committing a production workload.

More questions? Read the getting-started guide or ask on GitHub Discussions.

Sponsored by

Sponsoring Perry funds work on the open-source compiler.

Become a sponsor

Install
Perry.

macOS
$ brew install perryts/perry/perry
Any OS
$ npm i -g @perryts/perry
Windows
$ winget install PerryTS.Perry
Then
$ perry init my-app && perry run .