native README

The project's README from github.com/vercel-labs/native. As one markdown file: README.md.

Native SDK

Native SDK is the complete toolkit for building native desktop applications.

Native SDK exists because expressive UI and native performance should not be competing goals. Developers often choose web-based runtimes because they offer freedom, speed and control over the product experience. But that freedom often comes with a heavy runtime. Native SDK keeps the expressive authoring model and replaces the runtime with native rendering.

Views are declarative markup in .native files, logic is plain TypeScript compiled to native code at build time — or Zig, first-class by choice — and Native SDK's own engine draws every pixel into real OS windows. No browser, no WebView, no JS runtime in the binary: Zig is how everything works, TypeScript and Native markup are how apps are authored.

The Soundboard example app rendered by the Native SDK engine: a music library with album cover art, search, and a playback bar
The Notes example app rendered by the Native SDK engine: a three-pane notes manager with folders, a note list, and an open note The Calculator example app rendered by the Native SDK engine: a finished calculation above a full keypad

Soundboard, Notes, and Calculator from examples/ — every pixel drawn by the Native SDK engine, captured through its deterministic reference renderer. The images follow your color scheme.

Quick start

Install the CLI:

npm install -g @native-sdk/cli

Create and run an app:

native init my_app
cd my_app
native dev

A native window opens with a working counter. The whole app is three files of truth — view, logic, manifest — and no build config. The view is src/app.native, a markup file that binds values and dispatches messages (the counter row at its heart):

<row gap="8" main="center" cross="center" grow="1">
  <button variant="secondary" on-press="decrement">-</button>
  <text>{count}</text>
  <button variant="primary" on-press="increment">+</button>
</row>

All logic lives in src/core.ts: a Model interface, a Msg union, and one pure update function — the only place state changes, plain TypeScript compiled to native code at build time:

export function update(model: Model, msg: Msg): Model {
  switch (msg.kind) {
    case "increment":
      return { ...model, count: model.count + 1 };
    case "decrement":
      return { ...model, count: model.count - 1 };
    case "reset":
      return { ...model, count: 0 };
  }
}

Prefer Zig for the core? native init my_app --template zig-core scaffolds the same app with src/main.zig — same loop, same runtime, first-class by choice.

Edit src/app.native while native dev runs and the window updates in place, keeping your state. native dev --core runs the TypeScript core under node for instant logic checks, native check validates the core and every view in milliseconds without building, and native build produces an optimized release binary.

Read the full guide at native-sdk.dev/quick-start.

What you get

Beautiful by default — Great software should not start from a blank slate. The built-in component catalog — buttons, tabs, text fields, dialogs, charts, virtual lists, and more — ships with considered typography, spacing, and color, so the app native init scaffolds already looks intentional the first time its window opens.

Customizable by design — Your app should have its own identity, not ours. Styling is design tokens end to end: color, radius, and typography resolve by name, re-resolve live when the theme changes, and can be replaced wholesale — examples/soundboard and examples/deck are the same music player separated only by tokens and a chrome pass.

Native from the start — Every interface is rendered without a browser or WebView. The engine draws into real OS windows while scroll physics, menus, dialogs, the tray, and text input stay with the operating system, and markup compiles into the executable at build time, so a release build carries no parser or interpreter — the scaffolded counter app builds to a single binary a few megabytes small.

Predictable state — State changes should be explicit, inspectable and easy to reason about. Events produce messages, messages update state, and state renders the interface; markup can bind and dispatch but never mutate. The loop is so deterministic that native automate record journals a session and replay reproduces it headlessly, verified frame by frame against state fingerprints.

Simple authoring — Interfaces should be easy to read, easy to write and easy to generate. Views are elements, flex layout, {bindings}, and expressions like selected="{f == filter}", and native check validates every view against your app's actual Model and Msg — bindings, iterables, message tags — in milliseconds, with file:line:column errors that teach.

AI is part of the workflow — Native SDK is designed for a world where humans and AI agents build software together. Every app embeds an automation server, so any agent can read accessibility snapshots, drive widgets, assert on live state, and take deterministic screenshots of the running window; accessibility findings are machine-checked in native check; and the CLI ships the agent skills that teach all of it (native skills list).

Examples

The apps pictured above live in examples/, most as zero-config projects with a manifest plus src/ and no build files, run straight from their directory with native dev. Many examples predate the current app.json default and retain app.zon; both formats have the same capabilities. Start with the TypeScript examples when learning the primary authoring path. The -ts suffix on soundboard-ts and system-monitor-ts is historical because those apps are ports kept beside older Zig originals. Chatbot is TypeScript-only and follows the unsuffixed naming used by new apps created with native init.

Example What it shows
chatbot TypeScript + Native markup end to end: modules, a text editor, streaming fetch effects, and replay-safe configuration.
soundboard-ts The full music-player showcase in TypeScript + Native markup: audio, search, assets, timers, and context menus.
system-monitor-ts A live process monitor in TypeScript + Native markup: subprocess effects, tables, charts, and timers.
calculator A complete small app: markup keypad, keyboard input, chrome shortcuts, theming.
notes Persistence through the effects channel: debounced writes, restore on boot, dialogs, search.
soundboard Album grid with decoded cover art, context menus, timers, and a custom theme.
deck The soundboard player rebuilt as a dense hardware chassis: two windows, same widgets, different tokens.
feed A 100,000-row list, virtualized with runtime-owned scrolling.

The unsuffixed showcase apps above predate the TypeScript default and retain their Zig cores as first-class alternative implementations. The full catalog in examples/README.md also covers guarded OS capabilities, GPU surfaces, WebView composition, web-frontend shells, and the iOS/Android embed hosts.

Platforms

macOS is the primary development platform and carries the deepest support: Metal presentation, OS scroll physics, native context menus, app menus, tray, and dialogs. Linux runs the full showcase through the deterministic software renderer in real windows, with pointer, keyboard, scroll, native context menus, IME composition, and HiDPI; Windows runs on a Win32 host with native context menus and IME composition and is exercised in CI, including real input injection. Mobile support is experimental: iOS is simulator-proven through the embed library and Android cross-compiles with the full embed ABI, but APIs and tooling on both are still evolving — desktop is the mature surface. WebView surfaces coexist on every desktop platform. The platform support matrix documents exactly what each host supports today.

Documentation

The full documentation is at native-sdk.dev.

Contributing

Native SDK is pre-1.0: APIs still move, and the toolkit is evolving quickly. Bug reports and focused pull requests are welcome — for larger changes, open an issue first so the design can be discussed. See CONTRIBUTING.md for the development setup and local checks.

License

Apache-2.0

native (vercel-labs/native)

Searching Database…

7.8K ·GitHub
这是什么?Native SDK 是一个用于开发原生桌面应用的工具包:你用声明式的 .native 标记语言编写界面,用普通的 TypeScript(或 Zig)编写逻辑。SDK 会把所有内容编译为原生代码,由它自带的引擎直接渲染到真正的操作系统窗口中。最终生成的程序里不包含浏览器、WebView 或 JS 运行时。
这是一个 UI 框架,还是更像一个自己绘制窗口的游戏引擎?它是一个带有自研渲染引擎的声明式 UI 框架。标记文件(.native)与状态绑定,并在“模型/消息/更新”的循环中分发消息;自研引擎把每个像素绘制到真正的操作系统窗口中,而不是交给浏览器或操作系统的原生控件库来完成。
我该如何创建并运行第一个应用?先安装 CLI,然后运行 native init 生成一个新应用(包括界面、逻辑和清单三个文件,没有构建配置),再运行 native dev 在真正的窗口中启动它,并看到一个可以正常计数的按钮。native dev 运行期间,编辑 src/app.native 会直接更新窗口内容。
我需要了解 Zig 吗,还是只用 TypeScript 就够了?应用逻辑的主要编写方式是 TypeScript,它会在构建时编译为原生代码。如果你更喜欢 Zig,它也是一等支持的替代核心(可使用 native init myapp --template zig-core),但并非必需。
这个东西可以直接用于生产环境吗?不可以。Native SDK 仍处于 1.0 之前的版本,API 还在变动,可能出现不兼容的修改。移动端支持(iOS/Android)也被明确标注为实验性功能,桌面端则被视为较为成熟的部分。
我可以把它发布到 iOS 或 Android 上吗?移动端仍是实验性的:iOS 已通过嵌入库在模拟器中验证可行;Android 可以使用完整的嵌入 ABI 进行交叉编译。但两个平台上的 API 和工具链仍在演进中。
它在 Windows 和 Linux 上的表现和 macOS 一样吗?不一样。macOS 是主要平台,支持最完善(包括 Metal 呈现、原生菜单、托盘和对话框);Linux 通过确定性的软件渲染器运行完整的展示程序;Windows 基于 Win32 宿主运行,支持原生右键菜单和输入法(IME),并在 CI 中进行测试。
内置的自动化服务器能让 AI 代理做什么?每个应用都内嵌了一个自动化服务器,使代理可以读取无障碍快照、操作控件、对运行时状态进行断言,并对正在运行的窗口截取确定性的截图。CLI 还附带了代理技能(运行 native skills list 即可查看),用于讲解这套工作流程。
主题和样式是如何工作的?样式从头到尾都基于设计令牌:颜色、圆角和字体都通过名称解析,主题切换时会实时更新,并且可以整体替换。因此,只需修改令牌,同一个应用就能呈现出完全不同的外观。
编译后的应用有多大?标记内容在构建时直接编译进可执行文件,因此发布版本中不包含解析器或解释器。脚手架生成的计数器示例会被构建为一个只有几兆字节的单一可执行文件。
What are similar projects?mygo, Valdi, ng-native, gpui-kit, kivy, e2e, flutter, fyne
Size
45.8 MB
Stars
7.8K
Age
5mo
Commits · 90 Days