Metal GPU 渲染
render · gpu三缓冲的 SDF、文本与图片渲染器;GPU 完成与 CPU 布局重叠进行。
高性能的 Zig GPU UI 框架。Signal、样式配方、Flex / Grid 和 DevTools,写起来像 Web;Metal 渲染、完整的文本与输入法,跑起来是原生应用。ReleaseSmall 打包的 Hello Button.app 只有 1.7 MB。
examples/hello_button/main.zig 的完整源码,和它编译出的 .app。窗口里的画面由 E2E harness 录制:在真实窗口里点了三次按钮。
const std = @import("std");const ui = @import("ui");const App = @import("zenit_app").App; /// 样式表:具名纯函数 + 应用层自定义 recipe,与业务逻辑分离。const S = @import("styles.zig"); const Counter = struct { n: u32 = 0, label: ?*ui.Node = null, buf: [32]u8 = undefined, pub fn increment(self: *Counter) void { self.n += 1; const node = self.label orelse return; const content = std.fmt.bufPrint(&self.buf, "Clicked {d} times", .{self.n}) catch return; if (node.getText()) |old| { var t = old; t.content = content; node.setText(t); } node.markRenderDirty(); }}; fn mountUI(cx: *ui.Cx, scope: *ui.Scope) anyerror!*ui.Node { const allocator = cx.allocator; const counter = try cx.bindState(Counter, .{}); const click = cx.on(Counter, counter, Counter.increment); const root = try ui.boxStyled(cx, S.root, .{}); try root.appendChild(allocator, try ui.textStyled(cx, S.title, "Hello, zenit!")); try root.appendChild(allocator, try ui.widgets.Button(.{ .label = "Click me", .variant = .primary, .size = .md, .on_click = click, }).mount(scope, cx)); // 应用层自定义 recipe(styles.zig 的 PanelRecipe)包住计数文本 const panel = try ui.boxStyled(cx, S.panel(.highlight), .{}); const label = try ui.textStyled(cx, S.counterLabel, "Clicked 0 times"); try panel.appendChild(allocator, label); try root.appendChild(allocator, panel); counter.label = label; return root;} pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); const app = try App.init(gpa.allocator(), .{ .window = .{ .width = 640, .height = 480, .title = "Hello Button" }, }); defer app.deinit(); try app.runWith(mountUI);}zenit-ui-dev 是一份从 zenit 框架本身和一个基于 zenit 的生产级 macOS 编辑器的开发历史中提炼的 Agent Skill:组件选型、样式三层、Signal 用法、原生集成、截图自验,以及几十条按“坑、原因、正确做法”整理的条目。放进 ~/.claude/skills,Agent 写 zenit 代码时自动加载。
~/.claude/skills/zenit-ui-dev/
Pencilpen.dev我们推荐用 Pencil 画界面,再让 Agent 结合本 Skill 实现。.pen 的 Flex 布局、间距、圆角、字号和 lucide 图标与 zenit 的模型很接近;Skill 里附了字段映射表和 design_diff 比对工具,方便 Agent 按数值而不是凭感觉还原。
没有 WebView,没有虚拟 DOM。UI 树输出扁平的 DisplayItem 列表,由 Metal 渲染器直接消费。
render · gpu三缓冲的 SDF、文本与图片渲染器;GPU 完成与 CPU 布局重叠进行。
Signal · Memo · createEffect不重建树、不做 diff。依赖直接定位到订阅它的节点。
text · text_coreUnicode 17、UAX #9 双向文本、UAX #29 字素边界,以及端到端的 preedit / commit。
ui.devtools · harness语义定位、虚拟光标、Retina 截图与 drawable 直录 MP4;DevTools 随框架提供。

平台、渲染与文本细节由下层接管。边界在构建期强制执行:越界导入会直接编译失败。
Debug 构建下的基本交互目标,包括数万行虚拟列表中的滚动、光标移动与输入。M 系列 Apple silicon。
layout_isolation 边界截断 dirty 级联git clone https://github.com/version-next/zenit.git cp -R zenit/templates/minimal-app ./myapp
模板已含 build.zig、build.zig.zon 与 src/main.zig。
zenit.attach(zenit_dep, exe);
一次调用接入 ui、zenit_app、原生桥与系统框架。
zig build run zig build app
直接运行,或生成可双击的 macOS .app。
0.1.0 是第一个公开版本,但 1.0 之前 API 仍可能变化。请固定到明确的版本,每一处破坏性变更都记录在 MIGRATION 中。
zenit 的代码、文档和测试大部分由 AI 编程 agent 编写,架构、审查和验收由人负责。因此我们不把“能编译、看起来对”当作证据。CI 会运行约 2700 个确定性测试、逐个分配点注入失败的 OOM 测试、真实 Metal 设备测试、真实窗口的像素级 E2E,以及模块边界检查。发现 bug 或设计问题,欢迎提 issue,具体的报告对我们最有用。
来自社区的现有案例,真实窗口原样录屏。
0:18社区案例代码 IDE(原生)接入真实的 TypeScript 语言服务:边输入边补全、方法签名提示、悬浮文档。补全列表、提示浮层、编辑区和小地图全部由 zenit 在 GPU 上绘制。
1:09社区案例所见即所得 Markdown 编辑器一个完整的原生文档编辑器:边写边排版,列表、清单、引用和多级编号即时成形;表格、流程图、代码块和截图都活在同一份文档里。没有 Electron,没有 WebView,每个像素都由 zenit 绘制。
2:22社区案例合成器课堂与钢琴卷帘(原生)一边做音色,一边学合成:内嵌课程一步步讲解滤波器,每个旋钮都实时驱动滤波曲线、包络与频谱;再在 7 轨钢琴卷帘里写完一首歌,每个音都由应用自带的合成器发声。点击播放,带声音观看。已经有合作伙伴在用 zenit 开发无限画板设计软件、代码编辑 IDE、视频下载器……同一套节点、样式与原生能力,撑得起完全不同的产品。
缩放、拖拽与多选都跑在 GPU 上,液态玻璃浮层叠在画布之上。
大文件虚拟滚动、完整输入法、多窗口命令面板与原生菜单。
后台任务与进度反馈,下载完成直接拖到 Finder。
框架无限,等你解锁。从一扇窗口开始,做你想做的 Mac 应用。
开始构建