作品

备忘之外,动手做出来的东西:这些年的个人产品和工具。公开仓库附了链接;未开源的项目只写做了什么和为什么这么做。

个人产品 App

面向个人使用开发的 iOS / macOS 应用,改动克制,不为堆功能加设置项。

读书派(TextReader)活跃维护

面向中文长文本的 iOS 阅读与听书应用

把手头的纯文本(电子书、长文)变成可读、可听、可问的材料:导入、分页、TTS 后台朗读、锁屏控制、全文搜索和 AI 提问模板,纯本地、零数据收集。支持文件导入(UTF-8 / GBK / GB18030)、粘贴创建、系统分享和 Wi-Fi 局域网传书四种导入方式。

  • 「大爆炸」分词交互:长按正文用 NLTokenizer 分词成可拖选的词块
  • 提示词模板系统:选中文本套用 {selection} / {page} / {book} 占位符,在阅读器里直接生成 AI 提问
  • 只做 iPhone 的取舍;审核样例态与真实数据隔离
  • 睡眠定时器、耳机与控制中心遥控、后台播放
SwiftUI · AVFoundation · MediaPlayer · NaturalLanguage · Network.framework详细介绍 →GitHub

随心记(Vibetaking)活跃维护

打开即写的 iOS 速记应用

多数笔记产品以「回顾」为中心,打开先看列表;随心记把入口放回记录本身——启动直接进入空白编辑页、光标就绪,写完再由可配置的 Workflow 流水线处理(AI 处理、复制、HTTP 推送、保存)。数据以 Markdown 加 front matter 落盘,iCloud 同步,支持 ZIP 导入导出。

  • 四个取舍:入口快、启动快、输入快、整理快
  • 标签推荐:基于候选标签、历史打标样例、文本相似度和时间衰减
  • 配套 macOS 菜单栏接收器(vibe-taking-desktop):HTTP 收文本并自动粘贴进当前输入框,零第三方依赖
  • 手机与 Mac 的配对协议:草稿变化即时推送,不做防抖
SwiftUI · Observation · Network.framework · Keychain · iCloud Documents详细介绍 →GitHub桌面端仓库

Focus Keeper个人日用,未开源

macOS 菜单栏专注计时工具

为专注会话保留仪式感与不可逃避性:专注不能暂停、没有提前完成入口,只能自然结束或明确取消;历史里只显示完成的专注。由早年的 Electron 番茄钟演进为原生应用。

  • 反主流的强约束设计:不给「暂停一下」留后门
  • 守护形象可替换(猫咪、黑洞),黑洞形象从 GLSL shader 移植到 Metal
Swift · AppKit · SwiftUI · Metal详细介绍 →

豆包语音输入助手(doubao-voice-bridge)日常常驻,未开源

按住 Fn 说话的 macOS 语音输入桥

把「切输入法 + 双击 Option」的语音输入启动动作压缩成一个 Fn 键:按下切到豆包输入法并启动语音输入,再按停止并恢复原输入法。前身是 Hammerspoon Lua 脚本,后用 Swift 重写为原生菜单栏应用。

  • CGEventTap 回调在独立线程运行,watchdog 定时重建被系统禁用的 tap
  • 处理 Electron 应用的输入法「假切换」:白名单内做焦点刷新
  • 模拟修饰键使用 hidSystemState 事件源,释放时只清对应位并检查残留
Swift · SwiftPM · CGEventTap详细介绍 →相关文章

开发者工具与 Raycast 扩展

已开源的 Raycast 扩展均为自装形态(clone 后本地安装),未上架 Raycast Store;个别工具仓库尚未公开,以各条目标注为准。

QuickGPT活跃维护(2023 年至今)

把提示词当代码管理的 Raycast 扩展

提示词散落在备忘录和聊天记录里无法迭代。QuickGPT 用 HJSON 文件加 Git 管理提示词库(个人维护 300 多条),配合动态占位符让提示词像系统级工具一样随处调用。

  • 占位符系统:{{selection}}、{{clipboard}}、{{diff}}、{{file:路径}}、{{option:key}} 与 fallback 链 {{selection|clipboard}}
  • 数据边界:读目录上下文时叠加 .quickgptignore 与 .gitignore,忽略规则不为「上下文更完整」而绕过
  • Deeplink 可直达任意提示词并携带参数,被 FinderLink 等工具复用
  • 嵌套 subprompt 属性继承、拼音搜索、临时目录 7 天自动过期
TypeScript · Raycast API · HJSON详细介绍 →GitHub相关文章

Chat Any可用,低频维护

把任意内容一键送进 Cursor 的上下文聚合工具

日常开发频繁把各种文本、文件复制进 AI 编辑器。Chat Any 把选中文本、剪贴板、文件和文件夹聚合成统一的 context.md 并直接唤起 Cursor——「文件夹即上下文」。README 里的自嘲定位:To be a better Copy-Paste Engineer。

  • 内容收集、集中编辑、软链接模式(symlink 直接编辑原文件)三种能力
  • 与 QuickGPT 构成「上下文进、提示词出」的工作流组合
TypeScript · Raycast API详细介绍 →GitHub

个人 AI 基建

跑在自己机器上、为自己的工具服务的一层,平时不产出可见的东西,上面每个工具都靠它少写一遍重复代码。

Sub2API 与个人 Skill 库自用运行中

把订阅统一成接口,把工作流写成 Skill 分发进各 Agent

两层各解决一类重复劳动:Sub2API 把手上的模型订阅统一包装成 OpenAI 兼容接口,跑在本机 Docker 里、经 Cloudflare Tunnel 对外,个人工具只需要一个 base URL 就能用上模型,不必每个都接一遍;Skill 库把可复用的工作流和判断标准写成 Skill,集中在单一 Git 仓库维护,通过软链接安装同步到 Claude Code、Codex、Cursor 等多个 Agent——一处修改,处处生效。

Docker · Cloudflare Tunnel · Git · 软链接安装详细介绍 →

开源与历史项目

时间跨度较早的作品,保留在这里作为路径的一部分。

Coze Diagrams 插件2023 年

Coze Plugin Hackathon 参赛作品(2023)

在 Coze 平台的 Plugin Hackathon 上开发的图表生成插件,获「入选官方 Plugin 奖」,服务 3000 多个 bot。

Coze Plugin

ZZStoryboardReference2017 年,归档

iOS 9 之前 Storyboard Reference 的替代实现(2017)

用占位 ViewController 加命名约定实现跨 Storyboard 跳转,并让场景跳转可以被单元测试守护——场景挪动后忘改配置时测试直接报错。发布到 CocoaPods。

Objective-C · CocoaPodsGitHubCocoaPods