大家好,我是何三,独立开发者。
你见过用 二维码传文件 的吗?
不是扫码付款,不是扫码加好友。是那种——你手机蓝牙坏了、NFC 坏了、数据线也没带,但急于把一张照片传到另一台设备上——然后你打开一个网页,对着屏幕扫啊扫,硬生生把文件通过 一帧一帧的 QR 码 传了过去。
听起来很离谱对吧?我第一次看到这个项目的时候也是这个表情。
ShadowCat 到底是什么
一个单文件 HTML。没错,就一个 .html 文件。
打开它,你会看到四个标签页:Generate(生成文本二维码)、Scan(扫码解码)、Send file(发送文件)、Receive file(接收文件)。

发送方选好文件,设置好每块的大小和帧率,点 Start——屏幕上就开始滚动播放二维码。
接收方打开摄像头,对着屏幕扫。扫够了,文件自动重组,点下载完事。
不需要装任何 App,不需要注册账号,不需要连云端,不需要在同一局域网。
只要两个设备的摄像头和屏幕还能用,就能传。
说白了,这就是 拿屏幕当数据线、拿摄像头当接收器。
这玩意儿怎么工作的
我尽量用大白话说清楚。
ShadowCat 把文件切成一堆小块,每块转成一个 QR 码,然后按顺序在屏幕上循环播放。接收端用摄像头一帧一帧地扫,扫到一块记一块,直到凑齐所有块。
它用了一个叫 QRX1 的协议,结构超级简单:
- 第一帧是 头部(文件名、大小、CRC 校验值)
- 后面的帧是 数据块(序号 + Base64 编码的内容)
接收端收到头部就知道"哦,要传一个 100KB 的叫 photo.jpg 的文件",然后开始收数据块。收完以后算一遍 CRC,对得上就弹出下载按钮。

Header: QRX1|H|<总块数>|<文件名>|<大小>|<CRC>
Data: QRX1|D|<块序号>|<Base64数据>
说实话,协议这块我看完觉得作者有点东西——用 | 做分隔符,而 Base64 编码里不会有 | 字符,所以直接 split('|') 就能解析。简洁到有点优雅。
但代价也是明显的——传输速度慢得让人回到拨号时代。
速度有多慢?我帮你算笔账
每帧 QR 码大约能塞 500 个字符,按 3 帧/秒的速度播放,换算下来:
500 chars × 3 fps ≈ 1.1 KB/s(Base64 编码后) 实际有效数据 ≈ 0.83 KB/s
传一个 100KB 的文件,一轮完整播完大约 2 分钟。而且通常要 1-2 轮才能收齐(因为接收端可能会漏掉几帧)。
——这个速度,怎么说呢,就是…就是那种…
你最好去泡杯咖啡再回来。
不过话说回来,你要真想传大文件,也不会打开这个项目对吧。
适合谁用?什么场景?
这个我琢磨了一下,觉得它的定位特别有意思。
它不是要取代 AirDrop、LocalSend、ShareIt 这些工具。它要解决的问题是:你的设备已经破到连这些工具都跑不动了,但摄像头和浏览器还能用。
比如:
- 你柜子里翻出一台 iPhone 4s,里面有你十年前的照片,想导出来。蓝牙连不上、App Store 登录不了、数据线找不到了——但 Safari 还能打开网页
- 你有一台 Windows XP 的老笔记本,没有 Wi-Fi、USB 口也松了——但浏览器还能跑
- 出差在外,两台手机之间想传个文件,但一个没流量、一个没蓝牙
这些场景下,ShadowCat 就是救命稻草。
说到老设备,我突然想起来。我前阵子翻出一台 2011 年的三星平板,就是那种厚得像砖头、边框能停航母的 Galaxy Tab。充电还能亮屏,但 App Store 早就废了,WiFi 模块也半死不活。
当时我想把里面存的几本 PDF 导出来,折腾了一晚上没搞定。
要是当时有这个项目——我直接开个网页,拿另一台手机扫二维码就完事了。
唉,生不逢时啊。
怎么跑起来
因为它是一个纯前端的单文件 HTML,不需要后端、不需要数据库、不需要 Docker。
下载下来,用 HTTP 服务器托管就行:
# Python 一行命令启动
python3 -m http.server 8000
# 然后访问 http://你的IP:8000/ShadowCat.html
注意:不能用 file:// 直接打开,因为浏览器不允许 file:// 协议访问摄像头。
如果你在 iOS 设备上跨设备访问,还需要 HTTPS。作者给了两个方案: - 用 Caddy 自动签发证书 - 或者自己签一个自签名证书
旧手机如果解码困难,可以调低 FPS、提高 ECC(纠错等级)、缩小每块大小到 300 字符。这样生成的 QR 码更稀疏、更容易被老旧摄像头识别
如果你觉得 QR 码传文件太慢了(确实慢),但 ShadowCat 这种"不依赖任何基础设施"的思路很对你胃口,还有几个类似的工具:
- LocalSend:开源跨平台传文件,基于局域网,速度快很多,但需要两端都装 App
- Snapdrop / PairDrop:浏览器对浏览器传文件,通过 WebRTC,也不需要装东西,但需要网络连接
- KDE Connect:功能最全,支持剪贴板共享、远程输入、文件传输,但要装客户端
ShadowCat 和它们的最大区别是:它是唯一一个完全离线、纯光学的方案。没有网络层,就没有网络安全问题,没有防火墙阻挡,没有兼容性困扰。
项目地址
GitHub: github.com/unprovable/ShadowCat
现在 Star 还不多,但这玩意儿的思路真的值得一看。作者 unprovable 就写了这一个 HTML 文件,没有任何依赖,没有 Node_modules,没有 package.json。
单文件。打开即用。
总结
ShadowCat 注定不会成为主流传输工具——它太慢了、太原始了。
但它解决了一个真实存在、却被大多数人忽略的问题:当所有现代传输方式都失效时,你还能用什么?
答案是一张 QR 码,和一台还能亮的屏幕。
这大概就是开源社区最迷人的地方——总有人愿意为一个看似已经解决的问题,提供一个你从没想过的方案。
本文使用 MGO 编辑并发布
关注"何三笔记",回复"mgo" 免费下载使用