Your clipboard follows you. The data stays yours.

让剪贴板跟着你跨设备

菜单栏里留着你复制过的文字和图片。搜到一条,回车就粘回刚才那个应用。 换电脑时,同步进你自己的私有 Gist 或私有仓库;不想上传,就只留在这台机器上。

当前已发布的安装包是 macOS,大约 4.9 MB。给公开仓库打上 v 开头的标签后,发布流程会同时打出 Windows 安装包,先放进草稿;草稿发布前,这里仍是 macOS。Linux 从源码构建。 截图文字识别只在 macOS。

  • 免费开源
  • macOS 12+
  • Windows 10–11
  • MIT

菜单栏弹窗的暗色界面。图片行会留下识别出的第一行,悬浮时能看到尺寸和体积。

  • 菜单栏常驻默认没有 Dock 图标,也可以改成仅 Dock,或两者都留。
  • 闲置近零 CPUmacOS 先读 changeCount。轮询 0.6 秒 → 1.5 秒 → 3 秒。
  • 约 4.9 MBTauri 2 + Rust + React + TypeScript,跟着系统走暗色模式。
  • 开机自启macOS 用 SMAppService,必要时回退到 LaunchAgent。

Features

复制之后,它具体做了什么

下面每一条都是现在就能用的行为,不是路线图。

01 · 历史

按时间排好,重复的会合并

文字和图片自动进历史,新的在上面。同一段内容再复制一次,不会多出一条:合并回原来那条,命中次数加一,并把它挪到最前。

搜索是即时的,打两个字列表就收窄。图片在行首是缩略图,鼠标停上去能看到大图,以及像素尺寸和体积。macOS 上,图里认出的字也参与这次过滤。

02 · 粘贴

选中一条,直接回到刚才的应用

光标还在原来的输入框时,按 ⌘⇧V 打开列表(Windows 是 Ctrl+Alt+V)。回车、点击,或 ⌘1–9,会把那一条写回系统剪贴板,再模拟一次粘贴键送回去。

设置里有一项「选中后自动粘贴」,关掉之后就只复制、不替你按键。macOS 需要辅助功能权限;没授权时会提示「自动粘贴失败:需要辅助功能权限」,旁边可以打开系统设置。另有一组直达键 ⌘⇧⌥1–9:不弹出窗口,直接粘贴最近第 N 条。

03 · 片段

常用回复放在另一棵树里

地址、工单回复、代码模板和历史分开存。Tab 在「历史 / 片段」之间切换。⌘E 打开独立编辑器(Windows 为 Ctrl+E),用文件夹管理;这个快捷键可以改,留空就关掉。

某一条可以停用,停用后不会出现在粘贴列表。整棵树能导出 JSON,也能再导入。清空历史不会动片段。

04 · 截图识别

图里的字,也能被搜到

macOS 上,截图进历史之后,本机 Vision 框架识别图中的中文和英文。识别不联网,也不经过别的服务器。结果的第一行显示在列表里,所以搜「证书」可以命中一张报错截图。

这项只在 macOS。Windows 和 Linux 仍然会保存图片、显示缩略图,只是还不能按图中文字搜索。

05 · 同步

数据在你的 GitHub 上,不在别人的服务器

三种后端:私有 Gist、私有仓库的 data 分支、仅本地。Personal Access Token 只进操作系统钥匙串——macOS Keychain 或 Windows 凭据管理器,service 是 ClipSync,account 是 github_pat。同步时才读取,不写进任何配置文件。

两台机器合并时,updatedAt 更新的那条胜出;置顶取并集;命中次数相加。图片按内容寻址存成 blob,同一张图不会存两份。data 分支是 orphan:每次同步 force-push 一个没有父提交的根 commit,分支上始终只有这一次提交,仓库体积约等于当前数据量。

06 · 来源忽略

密码管理器里复制的,默认不记

设置里的「忽略来源」每行一条,末尾 * 表示前缀匹配。默认包含 1Password、LastPass、KeePassXC、Bitwarden 的 bundle id 和 Windows 进程名,命中的复制不进历史,也不会被同步。

macOS 拿 bundle id 对来源应用,默认就能跳过 1Password、LastPass、KeePassXC 和 Bitwarden。Windows 比的是前台进程名,默认包含 1Password*、KeePass*、Bitwarden*、LastPass*。Linux 目前拿不到来源。

Shortcuts

默认快捷键

唤出弹窗的全局快捷键、片段编辑器快捷键都可以在设置里改。macOS 默认 ⌘⇧V。Windows 默认 Ctrl+Alt+V,避开输入法用来切换布局的 Ctrl+Shift;这个组合被占用时,自动退回 Ctrl+Shift+V。直达粘贴是固定的 ⌘⇧⌥1–9。

操作 macOS Windows
唤出 / 隐藏弹窗 ⌘⇧V CtrlAltV占用则CtrlShiftV
选中第 1–9 条并粘贴 ⌘1–9 Ctrl1–9
不弹窗,直达粘贴第 N 条 ⌘⇧⌥1–9 CtrlShiftAlt1–9
置顶 / 取消置顶 ⌘P CtrlP
历史 / 片段 Tab Tab
打开片段编辑器 ⌘E CtrlE
上下移动 ↑↓ ↑↓
选中当前条 Enter Enter
关闭 Esc 先清搜索,再隐藏 同左

Install

安装,然后接上同步

macOS 可以一行命令装好。Windows 安装包由发布标签生成,发布之前仍可从源码构建。Linux 从源码构建。

macOS · 推荐

一键安装

脚本会按芯片下载最新的 .app.tar.gz,放进 /Applications,去掉隔离属性,做 ad-hoc 签名,然后启动。

curl -fsSL https://junhey.github.io/clipsync-app/install.sh | bash
脚本实际做了这些
  1. 确认是 macOS,识别 arm64 或 x86_64
  2. 向 GitHub Releases API 要最新版本和安装包地址
  3. 如果 ClipSync 已在运行,先退出
  4. 下载到临时目录并解压
  5. 安装到 /Applications/ClipSync.app
  6. xattr -dr com.apple.quarantine 去掉隔离属性
  7. codesign --sign - 做 ad-hoc 签名
  8. 启动应用

脚本源码:install.sh

手动安装 macOS

从 Releases 下载 ClipSync_*_aarch64.app.tar.gz(Intel 是 x64.app.tar.gz),解压后放进「应用程序」。

第一次打开前如果被 Gatekeeper 拦住,在终端执行:

xattr -dr com.apple.quarantine /Applications/ClipSync.app

Windows

给公开仓库推送 v* 标签后,发布流程会打出 NSIS 安装包,先放进 Release 草稿。草稿发布之前,最新 Release 里还是 macOS 安装包,这时用旁边的源码构建。安装包没有代码签名,SmartScreen 可能提示未知发布者。

Windows 不需要辅助功能权限,也不需要剪贴板隐私授权。唤出快捷键是 Ctrl+Alt+V。注册失败时会提示并退回 Ctrl+Shift+V。截图识别目前没有。密码管理器默认按进程名跳过,例如 1Password*、KeePass*。

自己构建

需要 Rust 1.77+ 和 Node 20+。macOS、Windows、Linux 是同一套代码。Linux 目前没有一键安装脚本。

git clone https://github.com/junhey/clipsync-app.git
cd clipsync-app
npm install
npm run tauri:build
# macOS 产物:
# src-tauri/target/release/bundle/macos/ClipSync.app

接上 GitHub 同步

菜单栏图标 → 设置 → 同步。默认后端是私有仓库。

  1. 生成 fine-grained PAT。仓库名留空时,token 需要能新建仓库;已经填了 owner/repo,就只给那个仓库打开 Contents 读写。经典 token 则勾选 repo。
  2. 把 PAT 贴进设置,点「检查连接」。仓库名留空时使用 你的用户名/clipsync,还没有就尝试新建私有仓库。填了别的名字就不会另建。Gist 需要一条已经存在的 ID。
  3. PAT 写入 macOS Keychain 或 Windows 凭据管理器,不会落成文件。检查失败时,同一处会写明是 PAT、权限、仓库还是网络。
  4. 通过之后,当前历史写到仓库的 data 分支,或那条私有 Gist 的 history.json。默认同步间隔 60 秒。

macOS 第一次粘贴

  1. 装好后照常复制一段文字
  2. 在要粘贴的地方按 ⌘⇧V
  3. 若提示「自动粘贴失败:需要辅助功能权限」,点旁边的入口,到「隐私与安全性 → 辅助功能」里允许 ClipSync。设置里未授权时也有「系统设置」按钮
  4. 暂时不想授权,就关掉「选中后自动粘贴」,选中后只复制,再自己按 ⌘V

Windows 第一次使用

  1. 安装后照常复制
  2. 按 Ctrl+Alt+V 打开历史
  3. 回车或 Ctrl+1–9 会模拟 Ctrl+V 粘回去
  4. 不需要辅助功能,也不需要剪贴板隐私授权

Privacy

剪贴板只该在你手里

ClipSync 没有账号,也没有自己的服务器收历史。内容只可能在两个地方:这台电脑的应用数据目录,以及你自己的 GitHub。选「仅本地」时,第二个地方也不存在。

Token 不出钥匙串

PAT 存在 macOS Keychain 或 Windows 凭据管理器,service 为 ClipSync,account 为 github_pat。应用只在同步时读取,不写进配置文件,也不进历史记录。

来源可以整段跳过

macOS 上,默认的 bundle id 会跳过 1Password、LastPass、KeePassXC 和 Bitwarden。Windows 用同一张表里的进程名,默认包含 1Password*、KeePass*、Bitwarden*、LastPass*。末尾星号是前缀匹配。Linux 还没有来源信息。

识别发生在本机

截图文字用 macOS 自带的 Vision,在这台电脑上完成。没有识别请求要发出去。关掉这项能力的平台——Windows 和 Linux——本来就不会做这一步。

仅本地可以断网

同步后端选「仅本地」、不填写 PAT 之后,历史、片段和图片 blob 都留在本机,不会创建 Gist,也不会往 data 分支推送。

FAQ

常见问题

Token 存在哪里,安全吗?

存在操作系统钥匙串里:macOS Keychain,或 Windows 凭据管理器。条目的 service 是 ClipSync,account 是 github_pat。ClipSync 只在同步时读取,不会把 token 写进应用数据目录或 Git 仓库。建议用 fine-grained PAT,权限只开给那个私有仓库。

GitHub 仓库会不会越同步越大?

不会跟着提交次数涨。data 分支是 orphan,每次同步 force-push 一个没有父节点的根 commit,分支上永远只有这一次提交。仓库体积约等于当前历史加上图片 blob。图片按内容寻址,相同的图共用一个 blob,不会重复占空间。

Windows 和 Linux 能用吗?

能。macOS、Windows、Linux 是同一套 Tauri 2 代码。Windows 10 / 11 不需要辅助功能,也不需要剪贴板隐私授权。第一次启动的快捷键是 Ctrl+Alt+V,注册失败时退回 Ctrl+Shift+V,并提示「热键被占用」。截图文字识别只在 macOS。密码管理器在 Windows 上默认按进程名跳过。Windows 安装包随版本标签生成,发布前可用源码构建。Linux 需要自己构建,还没有一键安装脚本。

怎么让某个应用的复制不进历史?

打开设置,找到「忽略来源」,每行写一条。末尾的 * 表示前缀匹配。默认同时有 macOS bundle id 和 Windows 进程名,例如 com.agilebits.onepassword* 和 1Password*。改完保存即可;已经进历史的旧条目不会因此被删掉。

如何彻底卸载?
  1. 退出 ClipSync。
  2. macOS:把 /Applications/ClipSync.app 拖进废纸篓。Windows:用系统的应用卸载。
  3. 删掉本机数据。macOS 路径是 ~/Library/Application Support/dev.junhey.clipsync。
  4. 在钥匙串或凭据管理器里删掉 service 为 ClipSync、account 为 github_pat 的条目。
  5. 如果开过同步,自行删除 GitHub 上的私有仓库,或那条 Gist。
可以完全离线、只留在这台电脑吗?

可以。设置 → 同步 → 选「仅本地」。不要填写 PAT。历史和片段都写在本机应用数据目录,不会创建 Gist,也不会往 data 分支推送。换电脑时这份数据不会自己跟过去。

选中之后没有自动粘贴?

macOS 上,模拟 ⌘V 需要辅助功能权限。失败时会看到「自动粘贴失败:需要辅助功能权限」,并可以打开系统设置。设置里的「选中后自动粘贴」关掉之后,选中只写入剪贴板,粘贴键由你自己按。未授权时,这项旁边也会出现「系统设置」。Windows 没有这项权限门槛。

重复复制和图片会把历史撑爆吗?

同一内容再次复制会合并成一条,命中次数累加,不会无限新增。图片以内容哈希为地址存储,相同像素只留一份 blob。列表里能看到缩略图;悬浮时显示宽高和体积。历史条数在设置里有上限,超出后优先留下置顶项。

下次复制完,按一下就能找回来

macOS 用 ⌘⇧V,Windows 用 Ctrl+Alt+V。同步要不要开,装好再决定。