为 AI 生成界面而设计

NSH:一份 TSX,
每个平台都原生

NSH 在 iOS、Android、macOS、Windows、Linux、GPUI 和 Web 上运行用 TSX 编写的模块——由模型或你的团队编写——可以嵌入你已经发布的应用,也可以独立发布成应用:经过签名校验,运行在宿主配置的沙箱里,用每个平台自己的界面技术绘制。

一个模块,手机和桌面都能运行
  • iOS
  • Android
  • macOS
  • Windows
  • Linux
  • GPUI
  • Web
  • 120 FPS · 低 CPU 占用
  • 开源 · Apache-2.0
  • 由长桥(Longbridge)构建
CLInsh run App.tsx --target <platform>
Chat.tsx运行中
示例应用里的 AI 聊天,用 TSX 编写,在这里由 Native Shell 的 Web 运行时在浏览器中实时运行。回复是本地脚本模拟的流式输出;可以点建议或用 + 重放场景。
AI 友好

为模型编写、为宿主把关而设计

生成的界面要是真正的原生界面、跑得流畅,能作为插件装进已经发布的应用或独立成应用,还要好写、可验证、跑得安全。NSH 的每一层都围绕这几点设计。

高性能:120 FPS,低 CPU

在 iOS 与 macOS 的 ProMotion 屏幕上,滚动和动画稳定在 120 FPS,CPU 占用很低。响应式图、渲染器、布局和每个模块都是 Rust,JS 只运行应用自己的代码;每一帧只有一次跨线程的批量提交,原生动画不经过 JS 逐帧计算。

  • 120 FPS
  • Rust
  • Taffy
  • QuickJS

真正的原生界面

模块在手机上由 UIKit 与 Android 视图组成,在桌面上由 AppKit、GTK 4 以及用 Direct2D 绘制的 Win32 窗口呈现,在 GPUI 应用里由 GPUI 绘制,在浏览器里是网页的 HTML。地图、网页视图这类原生组件可以直接嵌入,与界面自然叠放;系统的文本、输入法和无障碍都原样可用。

  • UIView
  • android.view.View
  • NSView
  • GtkWidget
  • Direct2D
  • GPUI
  • HTML

插件,或独立应用

在已有应用的任意页面放一个 NshAppView(iOS)、NshView(Android)、AppView(桌面,以及作为 GPUI 视图放进 GPUI 应用),或在网页里用 createPlayer 加载,运行时动态加载模块,新功能随时上线;同样的模块也能用 nsh package 打成独立应用或静态网站。

  • NshAppView
  • NshView
  • AppView
  • createPlayer
  • nsh package

AI 友好:TSX + Tailwind

一个模块就是一个 TSX 文件:组件、信号和 Tailwind 类,正是模型最擅长写的格式。每个元素、属性和模块都有从 Rust 源码生成的 TypeScript 声明,文档以 llms.txt 提供给模型。

  • TSX
  • Tailwind
  • llms.txt

在服务器上就能验证

nsh trace 无界面地运行模块并报告错误;编译器还能在进程内或浏览器里运行。生成、检查、重试。

  • nsh trace
  • compile_module

不可信,也能安全运行

每个视图一个 QuickJS 虚拟机,内存、调用时长和节点数都有上限,只能使用宿主授予的能力。

  • NshLimits
  • grantCapabilities

签名下发,可吊销

模块以 Ed25519 签名的 .nshpkg 到达;发布密钥由离线根密钥认证,设备端检查吊销列表。

  • nsh publish
  • NshTrust
三种用法

同一个模块,三种用法

首要用途是 AI 生成的界面;同一套机制也让原生应用可以扩展,或者直接组成一个独立应用。

AI 生成的界面设计初衷

用界面而不是文字回答

模型为每次请求写一个模块,服务器检查并签名,应用在沙箱里原生地显示它。

import { mount, signal, View } from "nsh";

function Answer() {
  const range = signal("1W");
  return <View class="gap-3 p-4">…</View>;
}
mount(Answer);
  • 每个回答一个 TSX 文件
  • 下发前完成类型检查与 trace
  • 只拥有宿主授予的能力
为什么做 NSH
原生应用插件

发布之后再扩展应用

在任意页面嵌入 NshAppView(iOS)、NshView(Android)、AppView(macOS、Windows、Linux 与 GPUI 应用)或在网页里用 createPlayer,承载团队、合作方或用户之后编写的功能。

let app = NshAppView()
try app.grantCapabilities(grants)
let info = try await app
  .loadPackage(at: file, trust: trust)
// verified, sandboxed, running
// NshView on Android, AppView elsewhere
  • 一个页面可以放多个模块
  • 宿主注册自己的原生组件
  • 更新随时下发
各平台的嵌入方式
独立应用

也能组成完整的应用

同样的模块可以用 nsh package 打成可安装的 iOS、Android、macOS、Windows、Linux 应用,用 GPUI 运行的桌面应用,或一个静态网站,适合试用和小工具。

$ nsh init my-app
$ nsh run my-app --target macos
$ nsh package my-app --target windows
# ios · android · macos · windows
# linux · gpui · web
  • 使用预编译的运行时
  • 一条命令打出安装包
  • 保存即热更新开发
打包
工作原理

在服务器上生成,在设备上被信任

服务器负责生成、检查和签名;设备负责校验、隔离和渲染。信任边界清清楚楚。

在服务器上生成,在设备上被信任在服务器上生成,在设备上被信任
平台

每个平台,都用它自己的界面

同一个 bundle 和同一个 Rust 运行时:在每个平台上,模块都可以嵌入已有的应用、借助热更新开发,也可以打包成可安装的应用。GPUI 后端用一套渲染覆盖三个桌面平台,并能嵌入 GPUI 与 GPUI Kit 应用;Web 平台把应用渲染成网页里的 HTML。

  • iOSUIKit · iOS 15+--target ios已支持
  • AndroidAndroid View · API 28+--target android已支持
  • macOSAppKit · macOS 14+--target macos已支持
  • WindowsWin32 · Direct2D · Windows 10 1809+--target windows已支持
  • LinuxGTK 4.14+--target linux已支持
  • GPUIGPUI · macOS / Windows / Linux--target gpui已支持
  • WebHTML · 现代浏览器--target web已支持
原则

模型负责编写界面,
宿主决定它能做什么

模块只能看到宿主授予的能力,只占用宿主允许的资源,只在签名校验通过后运行。剩下的——文本、输入、无障碍、动画——交给系统的原生视图。

在线试用