MacCV 图标

快、轻、
私密的剪贴板

原生 macOS 剪贴板保真,Rust 引擎驱动 —— 并且可以选择完全不经过剪贴板来粘贴。

通用二进制 · 需要 macOS 15 或更高版本 · Apache-2.0

MacCV 面板:富文本、图片、三个文件的复制,以及打码后的 API 密钥

三个核心理念

具体到可以被验证。凡是 macOS 本身有限制的地方,本页会直说,而不是含糊其辞。

快

速度决定了架构,而不是反过来。Rust 引擎是直接链入应用的静态库:没有 IPC、没有序列化、没有辅助进程。

  • 变更检测耗时 0.53 µs
  • 采用轮询,因此无需事件监听,也就不必为了感知复制而索取辅助功能权限
  • 底层就是直接的 Objective-C 消息发送

轻

闲置的剪贴板管理器应该是不存在的。监听线程在复制发生后以 400 µs 轮询,无变化时退避至 250 ms。

  • UI 层没有任何定时器
  • 历史保存在内存中,条数由你决定
  • Release 包体 1.9 MB

私密

你可以让内容完全不进入剪贴板就完成粘贴,因此其他进程无法观察到它。这是真实的保证 —— 代价也同样真实,列在下方。

  • 被标记为隐藏的条目永不记录
  • 敏感内容在「存储时」即打码,而不只是显示时
  • 数据不离开你的 Mac
0.53 µs
变更检测
9.9 µs
读取纯文本
116 µs
感知外部复制
1.9 MB
Release 包体

数据在 Apple 芯片上实测,并由测试套件断言,而非手工测一次。

「私密」能诚实意味着什么

多数剪贴板管理器在这个问题上夸大了其词。这里是准确的版本。

一个不舒服的事实

内容一旦进入系统剪贴板,Mac 上任何应用都能读取。这不是缺失的功能,而是 macOS 的设计。没有任何 API 可以把内容写进剪贴板而不被他人读取。

NSPasteboardContentsOptionsCurrentHostOnly 阻止的是同步到你的其他设备,不是其他应用。AppKit 里根本没有 concealed 或 transient 标志;org.nspasteboard.ConcealedType 只是靠应用自愿遵守的约定。而 NSPasteboardAccessBehavior 管的是你自己能不能读,从来管不着别人。

所以:不经过剪贴板粘贴

开启该设置后,选择「不经过剪贴板粘贴」,内容会以合成按键直接输入到最前面的应用。内容全程不进入任何共享通道,因此其他进程在物理上无法观察到它。这是唯一能真正兑现这项保证的机制。

它诚实的代价

它需要辅助功能权限 —— 因为向其他应用注入事件正是该权限所管辖的能力。它更慢,事件按打字速度投递。而且它仅限文本:图片没有对应的按键表示,仍需走剪贴板路径。

措施真正保证的是什么
历史记录存在应用容器内其他应用读不到你的历史。共享的永远只有那一次剪贴板写入,而不是整份记录。
跳过隐藏条目密码管理器标记为隐藏的条目永不记录 —— 这是尊重明确意图,而不是猜测。
敏感内容打码卡号、API 密钥、JWT、私钥、带凭据的连接串、邮箱、身份证号,在记录时即打码,而不只是显示时。
替换自身前必须确认下载的更新先校验、再呈现。MacCV 绝不静默改写自己的包体。

MacCV 无法阻止其他应用读取剪贴板 —— 没有东西能做到。如果你需要这个,请使用「不经过剪贴板粘贴」,或者不要把机密放上剪贴板。本页把这点写明,因为一个你无法验证的隐私声明,比没有声明更糟。

剪贴板里的一切,而不只是文本

多数管理器会把内容压扁成字符串:复制一个表格得到制表符分隔的文本,从设计工具复制得到一张位图。MacCV 保留每一种表示,并逐字节回放。

类别类型
文本public.utf8-plain-text、制表符分隔文本
富文本public.rtf、com.apple.flat-rtfd、public.html
图片public.png、public.tiff、com.adobe.pdf
文件public.file-url —— 多文件复制保持多条目
链接public.url
颜色com.apple.cocoa.pasteboard.color,解析为 sRGB
声音com.apple.cocoa.pasteboard.sound
字体、标尺com.apple.cocoa.pasteboard.font、…ruler
其他自定义 UTI,原样保存、原样回放

一次复制可以同时携带多种格式 —— 从 Safari 复制一段文字会同时带来纯文本、RTF 和 HTML —— MacCV 会全部保留,因此无论目标应用要哪种格式都能正确粘贴。

不会报「已损坏」的更新

一个下载自身新版本并替换自己的应用,会从父进程继承隔离属性,而 macOS 拒绝启动被隔离且未公证的包。通常的结果就是那个令人困惑的「MacCV 已损坏,无法打开」对话框。避免它的关键在于操作顺序。

  1. 下载到暂存目录
  2. 校验 SHA-256 —— 不匹配则删除文件并终止
  3. 用 spctl 校验代码签名
  4. 只有此时才清除 com.apple.quarantine
  5. 如实报告每一步的结论

如果在校验之前清除该属性,就等于彻底废掉了它的意义 —— 所以签名校验不通过的更新会被如实报告并保持隔离,而不是悄悄装上。MacCV 同样不会替换自己正在运行的包体:在一个应用运行时做半途而废的替换,比请你手动拖一个文件更糟;因此校验通过的包体会在访达中显示,由你完成最后一步。

自行构建

需要 macOS 27、Xcode 27、Rust 1.85+ 与 XcodeGen。引擎可独立构建与测试;Xcode 工程由单个 YAML 文件生成。

git clone https://github.com/yxxbc/Maccv.git
cd Maccv

cargo test                      # Rust 引擎,109 个测试
cargo build --release -p maccv-ffi

cd apps/mac
xcodegen generate               # project.yml 是工程的事实来源
xcodebuild -scheme MacCV -configuration Release build

每一层都能自检,包括编译出的应用:它会针对进程私有剪贴板端到端验证 Swift → C ABI → Rust 整条链路,因此绝不会动到你真实的剪贴板。

接下来

已交付

全类型保真、自适应监听、多条目复制、菜单栏面板、不经过剪贴板粘贴、敏感内容打码、带签名校验的应用内更新,以及双语界面。

计划中

重启后保留的磁盘历史、全局快捷键、拖放、固定条目与按应用规则。

将来

代码公证,使其打开时不再出现 Gatekeeper 提示。