GPUI Kit:用 Rust 做跨平台桌面界面,GitHub 本月新增 3,924 Star

用 Rust 写桌面软件时,窗口、输入、表格、停靠面板和代码编辑往往要自己从渲染层往上搭。 GPUI Kit 把这些放进同一套框架:底层是 Zed 的 GPUI,上面是带样式的组件、无样式的交互基础,以及可选的 JavaScript 扩展宿主。官方文档写明,它从第一天起就用在已公开发布的商业桌面应用 Longbridge Pro 里。

截至 2026-10-28,GitHub 仓库 Star 18,702、Fork 1,155。当天 GitHub Trending 的 Rust 月榜列出 21 个仓库,GPUI Kit 排第 4,页面标注 this month 新增 3,924 Star。最新版本是 2026-10-26 发布的 v0.8.1,crates.io 上的 gpui-kit 也是这个版本。


1. 应用只声明一个 crate

仓库把入口收成 gpui-kit。应用的 Cargo.toml 只写这一个依赖,就会带上固定版本的 GPUI、无样式的 gpui-base、带样式的 gpui-component,以及默认的 Lucide 图标资源。组件从 gpui_kit::component 来,GPUI 的类型从 gpui_kit::* 来,不必再单独声明 GPUI。

默认后端是发布到 crates.io 的上游快照,包名是 gpui-pre,当前钉在 0.3.10。它不是另一套渲染器。需要换 GPUI Fast 时,打开同名 feature 即可,导入和 init 不用改;官方说明这个 feature 是累加的,上游包仍会参与编译。

JavaScript 扩展不在这个默认依赖里,要另外使用 gpui-shell。

2. 表格、Dock 和代码编辑器

中文 README 把组件和原语写成 75+,覆盖表单、导航、浮层、数据展示、编辑、反馈和布局。复杂界面里,文档点名的几块是:

  • 数据表:虚拟滚动、固定列、列宽调整、排序和单元格选择。README 写可以承载数十万行。

  • 虚拟列表:只画可见区域,列表项高度可以不同。

  • Dock:面板可调、标签可拖、分割可嵌套、边缘可停靠,布局能序列化保存。仓库示例是 cargo run -p example-dock。

  • 代码编辑器:README 写 20 万行规模下仍保持稳定,并接上 Tree-sitter 高亮和 LSP 的诊断、补全、悬浮提示。示例是 cargo run -p example-editor。

  • 正文:同一套 UI 里可以渲染 Markdown 和 HTML,也带图表。对应示例是 example-markdown 和 example-html。

v0.8.1 的发布说明把这一版的改动集中在文本选择、Markdown、编辑器布局、滚动、焦点和无障碍,并给文本样式、编辑器滚动条、Diff 解析和高亮加了兼容的定制接口。默认后端仍是 gpui-pre 0.3.10,可选的 GPUI Fast 是 0.1.12。

3. 发布之后用 JavaScript 加面板

三层的分工在 README 里写得很直:

层

做什么

适合

gpui-component

带样式的完整组件,可换主题

直接做应用

gpui-base

焦点、浮层、虚拟化等行为,不带预设外观

自己的设计系统

gpui-shell

Rust 宿主里的 JavaScript 运行时,能力要逐项授予

插件和脚本化面板

gpui-shell 的定位是:贡献者不用 fork、也不用等一次发版,就能往已发布的 Rust 宿主里加面板和业务逻辑。v0.8.1 的说明里,它准备以配套的 quickjs-jit、quickjs-jit-runtime、quickjs-jit-stdlib 0.14.1 发到 crates.io。

交互层带 AccessKit 的 role、name、state、relationship 和 action。测试可以在 headless window 里渲染真实组件,驱动鼠标和键盘,再核对状态、焦点、布局和无障碍信息。组件画廊用仓库根目录的 cargo run 打开。

Web 目标是 wasm32-unknown-unknown。iOS 和 Android 的嵌入方式在下一节,桌面那套 application() 到了移动端不再使用。


4. 移动端:GPUI 实验性嵌入,以及 Native Shell

手机上有两条路,画出来的东西不一样。

GPUI Kit 移动端把 GPUI 嵌进原生 App。移动端文档 标成「实验性」和「依赖平台」。

  • 首要目标仍是桌面。移动端用来复用一部分组件,例如在原生界面里用 TextView 渲染富文本。

  • 中间是一块 GPUI 自己画的 View。导航栏、底部输入框留在原生 UI,两边各自管布局和输入。

  • 组件还是 Kit 的 Rust 组件。移动端不调用 gpui_kit::application() 或 gpui_kit::platform。宿主初始化 GPUI,调用 gpui_kit::init(cx),再包一层 component::Root。

  • gpui_kit::is_mobile() 只看编译目标是不是 iOS 或 Android。

平台层是社区项目 gpui-mobile,实现 gpui::Platform:iOS 用 Metal / wgpu,Android 用 Vulkan 或 GL / wgpu,管窗口、触摸、文字和 GPU 表面。

  • 作者账号 itsbalamurali,资料名 Balamurali Pandranki,地点 Tallinn, Estonia,公司栏 @wearekesk。

  • 仓库创建于 2026-03-03。2026-10-28 的 Star 是 441,许可证 AGPL-3.0。

  • 公开资料里没有把他写成 Longbridge 成员或 GPUI Kit 维护者。

GPUI Kit 当前接的是兼容 fork longbridge/gpui-mobile。

  • GitHub 的 parent 和 source 都是 itsbalamurali/gpui-mobile。fork 创建于 2026-09-11,许可证仍是 AGPL-3.0。

  • 以 gpui-pre-mobile 发到 crates.io。0.1.0 对着 gpui-pre 和 gpui-pre-wgpu 0.3.4,平台、渲染器和应用用同一套 GPUI 类型。

  • 下游不必再检出 Zed 的 Git 仓库,也不必自己打 Cargo patch。

  • 文档把它称作临时兼容包。等上游 gpui-mobile 接入、GPUI 自己也发布 crate 之后,改回社区包。

  • Rust 视图树和组件仍由 GPUI 与 GPUI Kit 管。

文档写明的验证范围:

  • Swift 托管的 iOS 示例在模拟器里构建并运行过。固定脚本面向 iOS 18.6 的 iPhone 16 Pro;示例最低部署版本写成 iOS 16,不表示每个系统版本都测过。

  • 一个 AI Chat 区域在 iOS 和 Android 上做过功能和性能验证,用到 TextView、Button、Menu、Popover、Scrollbar、Input、Textarea 和文本选择。TextView 在这个场景里覆盖完整。

  • 其他组件和完整应用布局还没有在移动端验证。Android 的 Activity 示例走另一条宿主路径,该页没有展开步骤。

  • 示例把 gpui-pre 钉在 0.3.4,当前 Kit 工作树是 0.3.10。只换本地路径,Cargo 仍可能同时选出两套 GPUI 类型。

  • 模拟器上的布局和点击不能代替真机帧耗时。

Native Shell 是手机上的另一条路。仓库 longbridge/nsh,文档 nsh.dev。按钮和文字由系统控件绘制。

  • iOS:UIKit、CoreText,iOS 15+。

  • Android:Android View、StaticLayout,Android 9(API 28)+。

  • 界面用 Rust、TSX,或让 TSX 引用 Rust 组件。菜单在桌面上是弹出层,在手机上是 sheet。

  • 单独运行:nsh run my-app --target ios(Xcode 和模拟器),nsh run my-app --target android(Android SDK,模拟器或真机)。

  • 嵌进已有 App:iOS 用 Swift 的 NshAppView(NativeShell.xcframework),Android 用 Java / Kotlin 的 NshView(nsh.aar)。示例是 examples/embed-ios、examples/embed-android。

  • 导航、地图留在宿主里。NSH 那一块仍是 Rust 或 TSX。

仓库数据、桌面平台和 Swift 注册方式在下一节。

5. 兄弟项目 Native Shell

GPUI Kit 中文 README 把它写成兄弟项目。源码链接是 longbridge/native-shell。2026-10-28 打开后,仓库名是 longbridge/nsh,主页 nsh.dev。

  • 创建于 2026-10-14。当天 Star 775、Fork 58,最近推送 2026-10-28。

  • 用 Rust 写的原生 UI 框架,平台包括 iOS、Android、macOS、Windows、Linux 和 Web。

  • 状态、逻辑和 API 共用。颜色、字体、间距和动效由应用自己定。

  • 界面可以全用 Rust,也可以用 TSX,或让 TSX 屏幕引用 Rust 组件。nsh init --template mixed 混的是 Rust 和 TSX。

各平台用自己的控件绘制:

平台

绘制

版本要求

iOS

UIKit、CoreText

iOS 15+

Android

Android View、StaticLayout

Android 9(API 28)+

macOS

AppKit、Core Animation、CoreText

macOS 14+

Windows

Win32、Direct2D、DirectWrite

Windows 10 1809+

Linux

GTK 4、Pango

GTK 4.14+

GPUI

GPUI(GPUI Fast),crate nsh-platform-gpui

macOS、Windows;Linux 需要 Vulkan

Web

HTML、CSS

现代浏览器

菜单、启动和嵌入:

  • 菜单在桌面上是弹出层,在手机上是 sheet。

  • 运行时可以加载签名的 TSX 包,在宿主配置的沙箱里跑插件、功能和由 AI 生成的界面。

  • 命令行是 nsh。nsh init my-app --template rust 或 --template ts,再用 nsh run my-app --target ios 这类目标启动。安装见 nsh.dev 的安装文档。

嵌进已有的 Swift / UIKit App 时,NSH 的屏幕仍然用 Rust 或 TSX 写。iOS 文档:

  • 链接 NativeShell.xcframework,import NativeShell,放一个 NshAppView。它是 UIView 子类。

  • 加载 nsh build 产出的 bundle.nshc。开发用 NativeShellDev.xcframework 连接 nsh dev。

  • 原生页面、导航和这块 NSH 界面在同一棵 UIKit 树里。一个 App 可以放多个 NshAppView,每个是独立引擎。

  • 示例 examples/embed-ios/main.swift:上面一条原生 header,下面一块 NSH。

  • 文档里的 Swift 示例是 UIKit,没有把 SwiftUI 写成宿主。

Swift 控件插进 NSH 布局,见 Native Components:

  • 宿主实现 NshComponent,用 app.register(component:) 按名字注册任意 UIView。文档举例是地图、相机预览。

  • NSH 侧用 Rust 的 native("名字") 或 TSX 的 nativeComponent(),把它当成普通元素排进去。

  • props、事件和 command 走 JSON。

  • 不经过这块视图时,Swift 用 app.params、app.send、app.handle,对应 TSX 的 host.params、host.on、host.call / host.post。

和 GPUI Kit 的关系,两边 README 各写了一句:

  • GPUI Kit 中文 README:GPUI 桌面后端正在开发,将基于 GPUI Kit 构建。

  • Native Shell 同日 README:GPUI 后端已经在 macOS、Windows、Linux 上用 GPUI 绘制,并能嵌进 GPUI 与 GPUI Kit 应用。命令是 nsh run my-app --target gpui。

  • nsh/base 里 Button、Checkbox、Switch 这类无样式组件,在名称和范围上跟随 gpui-base。编码指南和设计指南也引用 GPUI Kit。


6. 功能对照

场景

仓库里已有的入口

边界

第一个窗口和按钮

Getting Started 的 gpui-kit = "0.8.1"

使用组件前要先 gpui_kit::init

看全部组件

cargo run(story 画廊)

第一次编译依赖会比较久

IDE 式布局

cargo run -p example-dock

Dock 序列化是组件能力,业务状态仍由应用保存

代码编辑

cargo run -p example-editor

Tree-sitter 按 feature 选用

Markdown / HTML

example-markdown、example-html

HTML 渲染不是完整浏览器

浏览器里跑

WebAssembly 文档

工具链要求与桌面不同

iOS / Android 里嵌一块 GPUI

移动端文档

实验性;中间是 GPUI 自己画的 View

iOS / Android 上用系统控件画界面

Native Shell

nsh run --target ios / android;宿主是 NshAppView / NshView

多平台原生界面,或嵌进 GPUI Kit

Native Shell / longbridge/nsh

独立项目;Swift 宿主用 NshAppView,界面仍是 Rust / TSX

系统库和编译器

安装文档

桌面要求见下一节

官方站点还有一份与 Iced、egui、Qt 6 的 对照。那一页的性能结论以项目方材料为准,本文不转写排名。


7. 在本机跑起来

安装文档按当前依赖图要求 Rust 1.92 或更新(Linux 侧的 oo7 0.6.0 写明了这个下限)。平台要求是:

  1. macOS 15 或更高,并安装 Xcode Command Line Tools(xcode-select --install)。

  2. Windows 10 或更高,安装 Visual Studio 2022 的 Desktop development with C++,Rust 使用 MSVC 目标,终端里要能运行 cmake --version。

  3. Linux 以 Ubuntu 24.04 的包装清单为准,还需要可用的 Wayland 或 X11 会话和 Vulkan 驱动。libasound2-dev 只在打开 speech feature 时需要。

sudo apt update
sudo apt install -y gcc g++ clang libfontconfig-dev libwayland-dev \
  libwebkit2gtk-4.1-dev libxkbcommon-x11-dev libx11-xcb-dev \
  libssl-dev libzstd-dev libasound2-dev vulkan-validationlayers libvulkan1

新建应用:

cargo new gpui-hello
cd gpui-hello
[dependencies]
gpui-kit = "0.8.1"

官方入门把 src/main.rs 换成下面这样。窗口中央是一行字和一个主按钮,点击后终端打印 Clicked!。

use gpui_kit::component::button::{Button, ButtonVariants};
use gpui_kit::*;

struct HelloWorld;

impl Render for HelloWorld {
    fn render(&mut self, _: &mut Window, _: &mut Context<Self>) -> impl IntoElement {
        div()
            .flex()
            .flex_col()
            .size_full()
            .items_center()
            .justify_center()
            .gap_2()
            .child("Hello, World!")
            .child(
                Button::new("hello")
                    .primary()
                    .label("Click me")
                    .on_click(|_, _, _| println!("Clicked!")),
            )
    }
}

fn main() {
    application()
        .with_assets(assets::Assets)
        .run(|cx| {
            init(cx);
            open_window(WindowOptions::default(), cx, |_, cx| cx.new(|_| HelloWorld))
                .expect("Failed to open window");
        });
}
cargo run

已克隆本仓库时,安装文档用 cargo run -p hello_world 检查工具链、开窗和点击。Debug 构建几乎不优化 GPUI 和组件,帧耗时会明显高于 release;安装文档给框架依赖写了 [profile.dev.package] 的 opt-level = 3,这只改善运行,不缩短编译。

可选后端:

gpui-kit = { version = "0.8.1", features = ["gpui-fast"] }

8. 谁在维护

GitHub 组织 longbridge 的公开资料是 “Longbridge Developers”,主页指向 longbridge.com。组织页创建于 2020-07-17。GPUI Kit 仓库创建于 2024-06-13;这个日期只说明仓库何时出现在 GitHub,不能当成 gpui-kit 这个 crate 的上架日。crates.io 上 gpui-kit 的包记录始于 2026-09-03。

提交数最高的两个账号,GitHub 资料都写着 Longbridge:

  • huacnlee(资料名 Jason Lee,简介 “Ruby / Go / Rust”,公司 @longbridge),contributors 接口的 contributions 为 1,501。

  • madcodelife(资料名 Floyd Wang,公司 @Longbridge),contributions 为 474。

这两个数字是默认分支上的 commit 贡献计数,不是 PR 数,也不能据此写成头衔或全部维护者名单。


9. 技术栈

版本以 2026-10-28 仓库 main 的 workspace 和 v0.8.1 发布说明为准。

部分

要求或版本

用途

语言

Rust,workspace edition = "2024"

组件、示例和壳都在这个 workspace

编译器

Rust 1.92+

安装文档给出的当前依赖下限,高于 edition 本身的门槛

桌面

macOS 15+、Windows 10+(MSVC)、Linux

一份 Rust 代码;Linux 包装清单在 Ubuntu 24.04 验证过

入口

gpui-kit 0.8.1

应用侧通常只依赖它

渲染

gpui-pre =0.3.10

Zed GPUI 的配套快照,版本必须精确相等

可选渲染

gpui-fast 0.1.12

feature gpui-fast,允许后续 0.1.x 浮动

组件层

gpui-component、gpui-base、gpui-kit-assets

样式组件、无样式行为、默认图标

扩展

gpui-shell,QuickJS 相关 crate 0.14.1

发布后的脚本面板

文本与布局

Taffy、rustybuzz、ttf-parser、ropey

排版和编辑器文本结构

编辑相关

lsp-types 0.97.0;Tree-sitter、syntect 为按需能力

诊断、补全、高亮

界面语言

rust-i18n 4.2.0

组件文案

Web

wasm32-unknown-unknown

文档中的浏览器目标

移动端

实验性;文档示例钉 gpui-pre 0.3.4、包名 gpui-pre-mobile

嵌入 iOS / Android 原生界面,不用桌面的 application()

数据库 / 队列

无

这是 UI 框架,不带服务端存储

源码和文档里的代码示例是 Apache-2.0。文档正文和原创图示另外提供 CC BY 4.0。GitHub 仓库的 license 字段因此是 Other,不是单一 SPDX 标识。


10. 项目活跃度

查询时间:2026-10-28。

指标

数值

Star

18,702

Fork

1,155

Contributors

211

累计 commit

2,711

最近 commit 日期

2026-10-28

开放 Issue

113

开放 PR

16

已合并 PR

2,508

已关闭未合并 PR

326

Release

18,最新 v0.8.1(2026-10-26)

crates.io gpui-kit 下载

189,694

当天默认分支最新 commit 是 089bcd5(message_scroller: Let the scrollbar reach the end of padded content)。按发布时间倒序,跨进 2026-09 的前几条 Release 里,落在 2026-10 的是 v0.7.1(10-05)、v0.7.3(10-12)、v0.8.0(10-19)和 v0.8.1(10-26)。v0.7.0 的发布时间是 2026-09-28。这些是已发生的发布和提交,不能单独换成“长期不会再有破坏性更新”。

Star、Fork、Issue、PR、commit、Release 来自 GitHub REST / GraphQL。本月新增 Star 来自 Trending 页面原文 “3,924 stars this month”,没有改成自行计算的近 30 天。Contributors 来自 /repos/longbridge/gpui-kit/contributors?anon=true,每页 100 条,读完 3 页。


11. 如何贡献

说明在仓库的 CONTRIBUTING.md。

  1. 反馈:bug 和想法可以开 Issue,也可以到 Discussions。指南更鼓励能复现时直接提 PR。一个 PR 只做一件事。

  2. 本地验证:./script/bootstrap 安装依赖;Windows 用 .\script\install-window.ps1。改现有界面时跑 cargo run 看 story,或 cargo run -p <示例名>。改渲染时,macOS 可用 MTL_HUD_ENABLED=1 cargo run 看帧率,也可以用 Samply。UI 改动需要跑到受影响的 story 或示例,并附截图或录屏。

  3. 提交 PR:允许完全由 AI 写出的补丁,但提交者要自己看过、测过,并让 diff 保持小。新增、修改或删除公开 API 时,描述里要有 ## Public API,按 crate 写出签名和用途。已有公开项的变化放进 ## Breaking Changes。GPUI 核心行为应提到上游;gpui-pre 只做版本对齐的快照,不在 Kit 里携带行为补丁。


仓库:https://github.com/longbridge/gpui-kit

文档:https://gpui-kit.com/zh-CN/docs/getting-started

移动端:https://gpui-kit.com/zh-CN/docs/mobile

Native Shell:https://nsh.dev ,仓库 https://github.com/longbridge/nsh

组件画廊和示例都在该仓库的 crates/story 与 examples/。


资料与使用说明

  1. 热度查询日期为 2026-10-28。Star 18,702、Fork 1,155 同时出现在 GitHub REST repos/longbridge/gpui-kit 和当天 Rust 月榜卡片上。月榜页面是 https://github.com/trending/rust?since=monthly,GPUI Kit 在该次抓取的 21 个仓库中排第 4。新增 Star 的口径是页面上的 “this month”,不是按日历日重算的 30 天增量。日榜和周榜当次抓取没有这个仓库。

  2. 官网导航角标当天仍显示 18,664 Star,与 API 的 18,702 不一致。正文 Star 用 API。

  3. 累计 commit 2,711、开放 Issue 113、已关闭 Issue 630、开放 PR 16、已合并 PR 2,508、已关闭未合并 PR 326、Release 18,来自 GitHub GraphQL。REST 的 open_issues_count 为 129,等于开放 Issue 加开放 PR,不要把它当成 129 个 Issue。

  4. Contributors 为 211 个账号:2 个 bot、209 个非 bot 登录名、匿名贡献 0。名单包含维护者本人,只统计默认分支上的 commit 作者,不含只参与 Issue、讨论或未合并 PR 的人。contributions 不是 PR 数。

  5. 仓库创建时间 2024-06-13 不等于 crate 发布日。crates.io gpui-kit 创建于 2026-09-03,最新版 0.8.1 发布于 2026-10-26,累计下载 189,694。同日 gpui-component 的简介仍写 “60+ desktop UI components”,下载量 361,448;中文 README 写的是 “75+ 组件与原语”。两套数字都保留原文,没有相加。

  6. 仓库根目录 README 的依赖示例仍是 gpui-kit = "0.7"。安装步骤采用同日的入门文档和 crates.io:0.8.1。Hello World 代码来自 Getting Started,按该页可运行示例缩进整理,未改 API。

  7. “120 FPS”“表格数十万行”“编辑器 20 万行”是 README 的项目方表述,本文没有做对照测试。贡献指南写明 Metal HUD 只在 macOS 可用,显示帧率受显示器刷新率限制,常见是 60 或 120。安装文档也写明 Debug 运行明显慢于 release,cargo run -p hello_world 不能当作性能测试。

  8. 桌面平台范围以安装文档为准。移动端以 2026-10-28 查阅的 移动端文档 为准:页面自标实验性,并写明首要目标仍是桌面。文中的模拟器目标、已验证组件名单,以及 gpui-pre 0.3.4 与当前 Kit 0.3.10 的差异,都来自该页,没有另做真机测试。itsbalamurali 的姓名、地点和公司栏来自同日 GitHub 用户资料,没有再核对他的雇主或职务。上游仓库创建于 2026-03-03,Star 441,许可证 AGPL-3.0;longbridge/gpui-mobile 的 parent/source、创建日 2026-09-11 和 gpui-pre-mobile 的 0.3.4 钉版本,来自同日 GitHub API 与该 fork 的 README。WebAssembly 另有工具链要求。

  9. Native Shell 的 Star 775、Fork 58、创建时间 2026-10-14、最近推送 2026-10-28,来自同日 GitHub REST repos/longbridge/nsh。GPUI Kit 中文 README 仍链接 longbridge/native-shell,当天该地址对应的仓库全名是 longbridge/nsh。GPUI 后端「正在开发」出自 GPUI Kit README,「已能嵌进 GPUI Kit」出自 Native Shell README,两句并列,没有并成一种进度。平台版本表来自 Native Shell README 的 Platforms 表。Swift 嵌入、NshAppView、NshComponent 和 examples/embed-ios/main.swift 来自同日查阅的 iOS 文档 与 Native Components。第 4 节的手机对照还用了 Native Shell README 的 Platforms 表:Android 绘制为 Android View / StaticLayout,嵌入类是 NshView(nsh.aar),系统要求 Android 9(API 28)+;示例目录 examples/embed-android 来自该 README 的示例表。mixed 模板的含义来自仓库 README 对 nsh init my-app --template mixed 的说明。文档没有把 SwiftUI 写成宿主。本文没有安装或运行 nsh,也没有编译该 Swift 示例。

  10. 本文没有安装或运行 GPUI Kit,也没有核对对照页里的帧耗时。功能范围以 README、v0.8.1 发布说明和上述文档页面为准。

排序方式 :

成为第一条评论!

Nobody's responded to this post yet. Add your thoughts and get the conversation going.