做一个可发布的 Record & Replay macOS App
原文:https://indieseek.co/zh/blogs/record-replay-macos-app-technical-plan/
做一个可发布的 Record & Replay macOS App
Codex Record & Replay 指向了一个很有意思的产品方向:很多时候,用户并不想从零解释一个工作流。他已经知道怎么做,只是想演示一次,然后把这次演示变成以后可复用的东西。
这个想法很强。但如果要做成一个独立产品,它不能只是浏览器录制器,也不能只是鼠标坐标宏。别人要安装、信任、反复使用,它就必须能记录真实浏览器和真实桌面,保护敏感数据,并且回放工作流意图,而不是机械复读像素。
我会把它做成一个本地优先的 Mac App:
录制一次浏览器 + 桌面工作流 -> 复查记录了什么 -> 编译成可编辑 routine -> 带验证地回放它相对 Codex 的优势,不是“做一个更强的通用 agent”。更现实的优势是产品控制权:本地存储、自带模型设置、routine 库、运行历史、计划任务、日志,以及可导出的 workflow 文件。
核心产品判断
一个有用的 Record & Replay App,应该把一次演示变成以后可以重复运行的 routine。
演示 -> 采集证据 -> 编译 routine -> 运行 routine -> 验证结果这里最重要的词是“编译”。原始事件是证据,不是最终自动化。
如果用户点击了一个按钮,产品不应该只记住 x=1040, y=72。它应该记住 app、窗口、可访问性目标、周围文本、浏览器 DOM、必要时的截图,以及这一步为什么重要。
这就是工作流系统和脆弱宏录制器的区别。
第一版必须覆盖浏览器和桌面
只做浏览器自动化当然有价值,但对这个产品来说不够。
真实工作流经常跨边界:
- 在 Chrome 打开一个页面;
- 下载一个文件;
- 在 Finder 里找到它;
- 上传到另一个地方;
- 从 Notes 或 Slack 复制一个值;
- 确认一个 macOS 弹窗;
- 回到浏览器提交。
如果产品只能看见浏览器,就错过了 Record & Replay 最有价值的部分。
所以第一版可信产品至少需要两条 surface:
flowchart LR User["用户演示工作流"] --> App["Mac App"] App --> Browser["浏览器 Surface\nExtension + Native Messaging"] App --> Desktop["桌面 Surface\nAccessibility + 输入事件 + 截图"] Browser --> Trace["本地 Trace\nsession.json\nevents.jsonl\nkeyframes"] Desktop --> Trace Trace --> Review["复查和脱敏"] Review --> Compile["Routine Compiler"] Compile --> Routine["workflow.json\nroutine.md\nassets"] Routine --> Runtime["Replay Runtime"] Runtime --> Verify["Verification"]浏览器侧应该记录 URL、标题、DOM target、ARIA role/name、selector 候选、输入变化、导航和关键截图。
桌面侧应该记录前台 app、窗口标题、Accessibility role/name/value、焦点、选区、输入事件和截图。
两边都写进同一条时间线。编译器看到的应该是一段完整工作流,而不是两份断开的日志。
Trace 是证据,不是产品
Trace 格式应该无聊,但明确。
每个事件都要说明:
- 来自哪个 surface;
- 当时哪个 app 和窗口处于前台;
- 用户做了什么;
- 操作对象是什么;
- 捕获了哪些上下文;
- 哪些字段已经脱敏;
- 哪张截图、DOM 或 Accessibility 快照能支撑这个事件。
一个简单事件可以长这样:
{ "eventId": "evt_001", "surface": "browser", "app": "Chrome", "windowTitle": "Dashboard", "type": "input", "target": { "role": "textbox", "label": "Search", "selector": "[aria-label='Search']" }, "value": { "kind": "text", "redacted": false, "preview": "invoice 2026" }, "contextRefs": ["dom_001", "frame_001"] }产品不应该把所有内容都当普通文本永久保存。原始内容、摘要、截图和准备发给模型的上下文应该分层。任何内容离开本机前,用户都应该能看见。
Compiler 才是真正的产品核心
Compiler 负责把嘈杂证据变成可编辑 routine。
flowchart TD Raw["Raw events"] --> Clean["清洗噪声"] Clean --> Segment["切分步骤"] Segment --> Anchor["生成稳定锚点"] Anchor --> Params["识别变量"] Params --> Verify["写入验证方式"] Verify --> Routine["routine.md + workflow.json"]好的编译应该做到:
- 把连续输入合并成一个输入步骤;
- 去掉误点和空闲时间;
- 识别哪些值每次会变;
- 优先使用语义目标,而不是坐标;
- 给关键步骤写验证;
- 标记风险和敏感字段;
- 只有意图不清时才问用户。
好的 routine 应该像这样:
打开报告页。 选择日期范围。 上传指定文件。 提交草稿。 确认成功提示出现。而不是这样:
移动鼠标到 1040,72。 点击。 等待 500ms。 按 Tab。Replay 必须有验证闭环
回放应该是状态机,不应该是逐行盲跑脚本。
stateDiagram-v2 [*] --> LoadRoutine LoadRoutine --> CollectInputs CollectInputs --> Preflight Preflight --> ExecuteStep ExecuteStep --> VerifyStep VerifyStep --> ExecuteStep: 通过且还有下一步 VerifyStep --> Recover: 未通过 Recover --> ExecuteStep: 自动恢复成功 Recover --> HumanTakeover: 需要用户介入 HumanTakeover --> ExecuteStep: 用户修复后继续 VerifyStep --> Done: 全部通过 Done --> [*]执行时应该按稳定性排序:
危险动作必须确认。删除数据、提交付款、改密码、上传私人文件、安装软件、发送敏感信息,都不应该无人值守运行。
BYOK 是真实优势
Bring your own key 不是一个普通设置项,而是产品优势。
它让用户选择成本、隐私和模型能力。App 至少应该支持:
- OpenAI-compatible base URL + API key + model;
- Anthropic;
- Gemini;
- OpenRouter;
- Ollama 或兼容本地服务。
API key 应该放在 Keychain。设置页需要有连接测试、模型能力提示、上下文预览和大致成本估算。
便宜模型可以做文本清洗和 trace 摘要。更强的多模态模型留给歧义屏幕和视觉恢复。
分发也要提前设计
这种 App 第一版更适合走 Mac App Store 之外的分发。
它需要 Accessibility、Screen Recording、Input Monitoring,部分场景还需要 Apple Events、helper 进程和浏览器扩展安装。Developer ID 签名和公证是更现实的第一路径。
用户体验里也必须清楚解释权限。工作流录制器会看见很多东西。如果它讲不清记录了什么、数据存在哪里、什么会发给模型,它就不值得被信任。
一个现实的 v1
第一版可售卖产品应该窄,但完整。
它应该支持:
- Chrome 或 Brave 工作流录制;
- macOS app/window 追踪和 Accessibility 目标;
- 一条本地 trace 时间线;
- 支持删除和脱敏的 trace review;
- 编译生成 routine.md 和 workflow.json;
- 浏览器 + 桌面回放,并带步骤验证;
- 不确定时允许人工接管;
- 本地优先存储和上下文预览;
- 签名、公证后的安装包。
适合第一版的场景应该故意无聊:后台表单、浏览器 + Finder 上传下载、Finder/Notes/Mail/Calendar/Slack 里的简单稳定流程。
第一版不适合承诺银行、支付、政府、医疗、游戏、复杂设计工具,或完全无人值守的敏感操作。
最终判断
这个方向可以做,但定位必须诚实。
它不是“自动化所有 app”。它不是“录制像素再回放像素”。它也不是“套一个漂亮 UI 的浏览器自动化”。
更强的承诺是:
录制一次浏览器 + Mac 工作流,把它变成可编辑 AI routine,并用你自己的模型反复执行。
这个定位让它在 Codex 旁边仍然有存在价值:本地优先、模型可选、routine 可迁移,并且有一个专门为真实重复运行设计的产品界面。
来源和相关资源
- OpenAI Codex Record & Replay:https://developers.openai.com/codex/record-and-replay
- OpenAI Codex Computer Use:https://developers.openai.com/codex/app/computer-use
- Captr for macOS:https://github.com/anaishowland/Captr_MacOS
- OpenBrowser:https://github.com/softpudding/OpenBrowser
- Interceptor:https://github.com/Hacker-Valley-Media/Interceptor
- workflow-use:https://github.com/browser-use/workflow-use
- Apple Notarization:https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution
- Apple ScreenCaptureKit:https://developer.apple.com/documentation/screencapturekit/
- Apple AXUIElement:https://developer.apple.com/documentation/applicationservices/axuielement
- Codex Record & Replay 原理分析
- MD+HTML Reader 产品页

浙公网安备 33010602011771号