WitNote 2.0.1 仍然沿用原有的 App Store 产品记录,但内部已经完成一次较大规模的 Swift 原生重构。重构的目标不是把功能做得更热闹,而是让 Markdown 写作、本地文件、格式转换、双语阅读和端侧 AI 重新回到同一条可解释的工作流里。

这次发布也把工程验收和商店信息放在同一个发布门槛中:模型能否在干净 Mac 上工作、文件夹授权能否在重启后恢复、下载是否能取消并重新初始化、Lifetime 购买能否恢复、第三方模型许可是否随包说明,都会影响用户能否相信产品页上的承诺。

开发细节补充:这篇记录放在 WitNote 智简笔记 的产品日记里,不是为了把一个功能包装成故事,而是把“08 · 2.0.1 重构:Swift 原生工作台与本地 MLX 架构”放回真实项目推进中看。它要同时回答三件事:用户为什么需要这个点,开发时哪些边界必须先定住,以及这个选择会怎样影响上架、推广和后续课程复盘。平台口径是 macOS / Swift 原生 / 本地 MLX AI,当前公开状态是 Mac App Store / 2.0.1 / 本地优先,所以文案不能脱离真实发布进度。

对应的 docs 线索主要来自 WitNote docs/superpowers 计划、MAS 与 DMG 开发记录、本地文件和写作工作台迁移记录、多语言与上架文档。公开页面不会照搬内部工作记录,而是把可公开、可学习、不会泄露私密路径和账号信息的事实整理出来。WitNote 的开发记录反复围绕本地文件夹、Markdown、预览、角色库和模型接入展开,说明它不是聊天壳,而是写作者长期工作台。 原生版本多次 spike 选择、格式化、HTML 导出、文件 IO、可折叠面板和当前文件搜索,说明核心难点在编辑体验和本地文件状态一致。 MAS 与 DMG 记录把收费墙、构建 SOP、多语言 README、隐私政策和发布包串在一起,证明它不是单页 Demo,而是完整桌面产品。 2025-12-30 WitNote 1.2.4 曾因 macOS 主窗口关闭后没有重新打开菜单被 Guideline 4 拒绝;1.2.8 用 Window 菜单、Dock 激活和快捷键修复后通过。 设计规格强调安静、克制、可回到原稿,让 AI 能力服务写作,而不是把作者的资料和草稿交给不可控黑箱。

从产品功能看,WitNote 智简笔记 关联的能力包括:Swift 原生 macOS 工作台、Markdown 文件夹与本地知识库、MLX 本地 AI 与内置 Qwen3、PDF / Word / EPUB 转换、双语阅读和写作辅助。写这类日记时,不能只说“做了什么”,还要说明为什么先做这些、为什么暂时不做另一些。比如一个按钮、一个导入流程、一个本地模型开关或一段截图文案,放在代码里只是小改动,放在产品里却会影响用户理解、审核员复现和后续推广素材。

从工程推进看,这篇日记对应的检查点是:2.0.1 使用 Swift 原生 macOS 界面和 MLX 推理路线重构;内置轻量 Qwen3 模型帮助用户快速开始,其他模型按下载源和许可单独管理;本地文件、AI 推理、模型下载、StoreKit 和 App Store 合规作为同一条发布链验收。真实开发最容易失真的是中间过程,因为最后页面看起来只有一个结果,但实际会经历方案取舍、权限确认、素材准备、测试设备、审核备注和发布节奏。把这些过程写下来,后面做同类产品时才不会重新踩同一个坑。

从隐私和合规看,当前约束是:用户选择的文件夹、Markdown 文稿和导出结果默认保留在本地;本地 AI 推理不把文稿默认发送到托管 AI 服务。模型下载、StoreKit 和用户主动打开的外部链接会按实际操作访问网络。这类信息必须前置到开发日记里,因为独立产品的可信度不是靠口号建立的,而是靠数据在哪里处理、用户能不能退出、功能是否离线可用、商店页怎么承诺、隐私政策是否与实现一致这些小事实积累出来的。

从课程和复用看,这篇内容可以沉淀到 Swift 原生 macOS、本地 AI 与 MLX、Markdown 知识工作区、App Store 重构上架。它的价值不只是给访问者看一个产品,而是展示一个独立开发者怎样把想法转成可验证的产品:先收窄场景,再选技术路径,再做体验最小闭环,最后把审核、推广、运营数据和失败教训都纳入下一次迭代。

本地优先 AI 工具要先保护用户资产和写作节奏,再谈模型能力、补全效果和商业化。 这也是为什么每篇产品日记都要写到足够长:不是为了凑字数,而是为了把“证据、决策、实现、边界、复盘”都放在同一页,让读者看到一个判断是怎样被逐步验证出来的。最难的是在 AI 能力、文件系统、编辑器体验和上架表达之间保持同一个本地优先承诺。

所以这篇日记的结论不是“功能已经写完”,而是把一个阶段的判断公开化:哪些证据足够支撑继续推进,哪些资料还需要回到源码、商店材料、公开文案或运营观察里补齐。这样的记录会比单纯的发布公告更慢,但也更真实,能让产品页、发布记录和课程内容保持同一条事实线。

验收时我会把它拆成四个层次:第一层是用户路径能不能走通,第二层是异常状态有没有被诚实处理,第三层是页面上的按钮、状态、截图和文案是否对应真实发布渠道,第四层是公开证据能否支撑这个判断。只要其中一层对不上,产品看起来再完整,也不能算真正进入下一个阶段。

交接时也要保留边界:源码、构建、测试、商店元数据、公开文案、平台反馈和运营观察分别保存原始资料。产品日记只把这些事实翻译成读者能理解的过程,不替任何私有记录保存原始材料。

把这些内容公开出来,还有一个很现实的原因:AI 教程如果只展示成功结果,很容易让人误以为产品是一次生成出来的。真实情况恰好相反,真正可学习的是一次次收窄、验证、失败、补证据和重新提交。日记越具体,后续读者越能看到判断的脉络,而不是只看到一个漂亮的截图。

Swift 原生工作台

应用界面使用 Swift 原生 macOS 结构重做,文件夹绑定、编辑器、预览、聊天、模型管理、格式转换和设置各自承担清晰职责。根目录授权不能只在首次选择时成功,还要考虑安全作用域书签、重启后的重新授权提示和用户可以主动重新绑定的恢复路径。

这让 WitNote 更像一个可以长时间停留的桌面工作台,而不是把网页能力包进窗口。窗口生命周期、菜单、文件权限、取消操作和异常反馈都属于产品本身。

Markdown 与内容工作流

Markdown 文件仍然是内容的中心。文件夹和文稿列表负责组织,编辑区负责修改,预览和双栏目模式负责阅读,格式转换负责把内容交付到 PDF、Word、EPUB 或其他工作流。EPUB 和双语阅读是能力入口,但产品定位仍然是本地 Markdown 写作与知识工作区。

内容处理尽量保持可追溯:用户选择文件和目录,应用在明确的权限边界内读取;导入、转换和导出不应该让用户失去原始文件的控制权。

本地 MLX 与模型管理

AI 路线采用本地 MLX 推理。安装包内置轻量 Qwen3 0.6B 4-bit 模型,让新用户可以先完成一次本地 AI 操作;其他模型按硬件建议和实际文件大小单独下载。模型选择会在聊天、双语翻译和其他 AI 入口之间同步刷新,下载成功或删除后不需要重启应用。

模型下载器需要把真实的已接收字节数、速度、剩余时间、网络等待、取消、失败清理和重新初始化区分开。下载中断后重新下载必须清理不完整目录,避免把半成品误当作已安装模型。模型管理器也允许用户通过模型文件夹同步识别可用的本地模型,但不把外部模型的许可责任隐藏起来。

隐私、购买与第三方边界

本地文件和本地推理是默认边界;模型下载、Apple StoreKit、支持与法律页面,以及用户主动打开的外部链接才会按实际操作访问网络。Lifetime 购买由 Apple 处理,应用只根据 StoreKit 结果解锁并提供恢复购买,不接触 Apple ID 或付款信息。

MLX、Qwen 和随后下载的模型不是 WitNote 自有资产。安装包提供第三方声明和内置模型的 LICENSE、NOTICE 文件;网站、应用内关于页面和商店材料都需要避免把模型来源、模型能力或云端服务说得比实际更强。

上架前的发布门槛

2.0.1 的最终门槛包括 1300/1300 自动测试、正式 Distribution 签名和固定 SHA-256、无开发工具与无缓存环境的首启和 AI 操作、Lifetime IAP 购买与恢复、12 种语言的关键页面、隐私与第三方许可、任务取消、内存表现和长文本表现。

这些检查不是为了制造漂亮的发布数字,而是为了让官网、App Store 元数据和实际安装包说同一件事。不能在干净环境复现的本地 AI 能力,就不能作为已经交付的商店卖点;无法确认的性能,也不写成绝对承诺。