Blog

News, tutorials, and deep dives into building native apps with Perry.

GCperformanceLLVMdebuggingarchitecture

Building a GC for a Native TypeScript Compiler: Decisions, Surprises, and How It's Going

Perry compiles TypeScript to native code with LLVM — which means it needs a real garbage collector. The decisions we made, the bugs that left no evidence, the CI gates that couldn't fail, and where the numbers stand against Node and a refcounting AOT competitor.

compilerGCdebuggingNode.js paritymilestone

Compiling Claude Code: One Minified Bundle, 160 Compiler Fixes

We pointed Perry at the 13 MB minified cli.js that npm ships for Claude Code and tried to turn it into a native binary. A month later it launches, logs in, streams a real API response, and paints what you type — and 160 pull requests had landed in Perry, from a no-op MessageChannel to a missing GC write barrier on RegExp headers.

watchOSApp StoreiOShow-to

Shipping a Watch-Only App to the App Store (When Nothing Else Will)

Every documented way to upload a standalone watchOS app to the App Store fails — altool, iTMSTransporter, xcodebuild, even Xcode 26's Organizer all refuse the watchOS platform. Here's the undocumented workaround that works and keeps arm64_32 for older watches: an ITSWatchOnlyContainer iOS stub, uploaded with iTMSTransporter.

npmtest262Windowswidgetsmilestone

Real npm Packages Now Compile: axios, zod, express — and a Conformance Sweep

The ~270 releases from v0.5.875 to v0.5.1146 weren't about one benchmark — they were about making real npm packages compile and run. axios, zod v4, express, fastify, and hono now work; test262 parity jumped (String 60→79%, Array 61→72%); Windows went Fluent with Mica; and DatePicker + drag & drop landed on every platform.

GCperformancebenchmarkscommunity

What aya_koto's Benchmark Taught Us About Perry's GC

A reader benchmarked Perry on AtCoder ABC451D and measured it 3.85× slower than Bun. A silent regression had widened the gap to 6.59× since. The fix wasn't where we expected, the deliberate GC trade-off it exposed was real, and Perry v0.5.875 now ties Bun on the same bench: 425 ms vs 431 ms.

updaterdevtoolsrefactorcommunitymilestone

Auto-Update, a Live Inspector, and the Compiler That Halved Itself

Perry v0.5.306 → v0.5.359 in four days — 53 patch releases, ~30 issues closed, and three big things landed: perry/updater for desktop auto-update, a live inspector at localhost:7676, and a compiler refactor that shrank the four biggest files by 33–91%.

GCJSONperformancebenchmarksmilestone

Generational GC, Lazy JSON, and Benchmarks That Hold Up to Scrutiny

Perry v0.5.174 → v0.5.306 in three days, plus the GC and JSON work that landed alongside. The generational GC ships as default. The Small String Optimization ships as default. The JSON pipeline gets a lazy tape that lands at 75 ms median on validate-and-roundtrip — best in the dynamic-typing pack. The benchmarks page is rewritten with RUNS=11 median + p95 + σ, simdjson and AssemblyScript+json-as added as peers, and every weakness Perry has surfaced honestly.

npmdeveloper-experienceperformancewatch-modemilestone

npm Distribution, perry dev, and Winning Every Benchmark

Perry v0.5.80 → v0.5.174 in six days. @perryts/perry ships on npm for all seven supported platforms. perry dev adds watch-mode auto-recompile on top of an in-memory AST cache and on-disk per-module object cache. json_roundtrip closes its last gap — Perry now wins every benchmark against both Node.js and Bun.

performancellvmJSONGCservermilestone

Optimizing Everything: One Week, 68 Releases, and a 547x JSON Speedup

Perry v0.5.13 → v0.5.80 in seven days. JSON.parse closes a 547x gap to Node. mimalloc lands as the global allocator. Inline caches, shape transitions, typed buffer slots, i32-native bitwise ops, scalar replacement, and a native event loop that keeps Fastify and WebSocket servers alive.

compilersllvmcraneliftperformancemilestone

From Cranelift to LLVM: How Perry Got 24x Faster

Perry's backend migration from Cranelift to LLVM is finished. The initial cutover made benchmarks 70x slower — then six targeted optimizations brought Perry to 14/15 wins against Node.js, with up to 24.6x speedups.

tvOScross-compilationbillingWindowsmilestone

tvOS, Cross-Compile iOS from Linux, and Perry Login

Perry v0.4.24: tvOS as the 10th compilation target, cross-compile iOS and macOS from Linux via ld64.lld, perry login with usage-based billing, Windows UI overhaul, macOS notarization, and 120 commits in 5 days.

threadingi18nwatchOScompilermilestone

True Multi-Threading, Compile-Time i18n, and watchOS

Perry v0.4.0: real OS threads with compile-time safety, a zero-ceremony internationalization system for 30+ locales, watchOS as the 9th compilation target, audio and camera APIs, and a parallel compiler pipeline.

compilercross-compilationinfrastructuremilestone

Cross-Compile to Windows, iOS Game Loops, and 100% Test Parity

103 commits in one week: cross-compile to Windows from Linux via lld-link, iOS game loop support, crash reporting, a two-stage Hub build pipeline, and the self-hosting compiler hits 68/68 deterministic test parity.

distributiondocumentationWidgetKitmilestone

The Full Pipeline: Docs, Distribution, and WidgetKit

82 commits in one week: a 49-page documentation site, automated App Store and Play Store publishing, Homebrew and APT packages, native WidgetKit extensions from TypeScript, new widgets, http/https modules, and a self-hosting LLVM compiler.

ecosystemperry/uidatabasesinfrastructuremilestone

From Compiler to Ecosystem: React, Databases, and Cloud Builds

Perry grows from a compiler into a full ecosystem. perry/ui at the core, Prisma-compatible ORMs for MySQL/PostgreSQL/SQLite, universal push notifications, distributed builds with App Store publishing, and a React compatibility layer — all in one week.

UIcross-platformreleasemilestone

All Six Platforms, Full Feature Parity

20+ native UI widgets, a Canvas widget, Table views, system notifications, keychain access, multi-window support, and full feature parity across macOS, iOS, iPadOS, Android, Linux, and Windows — all from a single TypeScript codebase.

architectureperformancecompiler

Plugin Systems Are a Performance Tax

Plugin architectures trade performance for extensibility. But what if extensibility happened at build time instead of runtime? Compile-time composition gives you both — zero overhead, full flexibility.

compilerframeworksprogress

Compiling Hono, tRPC, and Strapi to Native Binaries

Perry now compiles three major TypeScript frameworks — Hono, tRPC, and Strapi — into native ARM64 executables. They compile in under a second, produce binaries under 2 MB, and run without crashes.

tutorialshowcasePry

Building Pry: A Native JSON Viewer in TypeScript

A walkthrough of building Pry, a native JSON viewer compiled from TypeScript to machine code with the Perry runtime and GC linked in and no webview.

architectureUIcross-platform

Cross-Platform Native UI from TypeScript

How Perry maps one TypeScript codebase to platform widgets across its documented targets, including the platform-specific limitations and prerequisites.

announcementcompilerTypeScript

Introducing Perry

Perry compiles supported TypeScript to standalone native executables with its runtime and GC linked in, without requiring an external Node.js installation or JavaScript engine.