# QR File Transfer

> ネットもケーブルも不要。画面に流れるQRコードをカメラで読むだけでファイルを転送。Fountain codeで読み逃しに強く、CRC-32で検証。何もアップロードされません。

- URL: https://bytescope.dev/ja/qr-file-transfer/
- Locale: ja · Also: [en](https://bytescope.dev/en/qr-file-transfer.md) · [zh-Hant](https://bytescope.dev/zh-Hant/qr-file-transfer.md)
- Runs: ファイルの分割・符号化・表示はすべてブラウザ内で行われます。アップロードは一切ありません。
- Requires: Any modern browser with camera access, desktop and mobile. Nothing is sent anywhere; frames are processed locally.
- Updated: 2026-09-08

## What it does

送信側の端末でファイルを選ぶと、このページはそれをブロックに分割し、Luby Transform方式のfountain codeで符号化して、毎秒5〜20フレームのQRコードのアニメーションとして画面に流し続けます。受信側の端末では同じページを開き、カメラを相手の画面に向けるだけ。フレームがデコードされるたびにプログレスバーが進み、必要なブロックが揃った瞬間にファイルを組み立て、`CRC-32`チェックサムで検証してダウンロードとして差し出します。2台の間を渡るのは光だけです。ネットワークも、サーバーも、ペアリングも、ケーブルも、アカウントも要りません。だからOSの組み合わせも問いません——Webページさえ表示できれば、それで足ります。

### フレームを読み逃しても何も失われない理由

このチャネルは完全な一方通行で、受信側から「37番のフレームをもう一度」と頼む手段がありません。fountain codeは、まさにこの状況のために作られた符号です。ブロックを1番、2番、3番と順に送るのではなく、どのQRフレームも複数のブロックをランダムに混ぜ合わせたものになっていて、十分な数のフレームさえ集まれば——どのフレームだったかは問わず——ファイル全体が復元できます。カメラがブレた、オートフォーカスが迷った、一瞬画面から目を離した。それで失われるものは何もなく、次のフレームが同じ情報を別の組み合わせで運んできます。フレームの4割を落としても転送は完了します。少し余計に時間がかかるだけです。送信側が延々とループし続けるのも同じ理由です。受信側が何を拾えたかを知るすべはありませんが、fountain codeなら知る必要もないのです。

### 正直な数字——向いている用途と、向いていない用途

これは細いチャネルです。毎秒数KBから数十KB程度で、上限を決めているのはカメラのシャッターと画面のリフレッシュレートです。設定ファイル、SSH鍵、証明書、ウォレットのシード、小さなドキュメント——数MBまでのテキスト系にはちょうどよく、写真ライブラリや動画にはまったく向きません。本領を発揮するのは、同じ部屋にあるのに他の手段では繋がらない2台です。共有Wi-Fiがない、何もインストールできないロックダウンされた業務PC、エアギャップ環境のマシン、頑なに会話を拒む異なるOS同士。送信側はどのブラウザでも動きます（canvasにQRコードを描いているだけです）。受信側は`BarcodeDetector` APIを持つChromium系——Chrome、Edge、Opera、Android版Chrome——が最速で、それ以外はJavaScriptのQRデコーダーにフォールバックするぶん遅くなります。そして意図的な制限をひとつ。転送サイズには上限があり、バッチ処理や自動化モードはありません。放置できて無制限の画面→カメラのチャネルは、エアギャップ環境からデータを持ち出す経路そのものであり、そのための洗練されたツールを作るつもりはないからです。

## Limits

Does not transfer large files quickly (QR bandwidth is a few KB/s); use device-transfer for anything above a few hundred kilobytes.

## FAQ

### 実際どのくらいのサイズを、どのくらいの時間で送れますか？

毎秒数KB〜数十KBを目安にしてください。上限を決めているのは符号ではなく、変化し続ける画面をカメラがどれだけ速く正確に捉えられるかです。40KBの設定ファイルなら数秒、数百KBの証明書の束なら1〜2分、数MBが実用上の上限で、ツール側にもハードなサイズ上限があります。それより大きいもの——写真、動画、アーカイブ——にはこのツールは不向きです。1時間プログレスバーを眺めてもらうより、先にそう言っておくほうが誠実だと考えています。

### 受信側はもう完了したのに、送信側がQRコードを流し続けるのはなぜですか？

送信側には知るすべが本当にないからです。このチャネルは一方通行で、光は画面からカメラへ進むだけで、何も戻ってきません。だから送信ページは、止められるまでfountain code化したフレームをループし続けます。これはバグではなく、ペアリングなしで成立させるための設計そのものです。受信側にダウンロード完了が出たら、好きなタイミングで送信を止めてください。

### ファイルはどこかにアップロードされますか？

いいえ。「サーバー側で削除します」という意味の「いいえ」ではありません。経路上にサーバーが存在しないのです。ファイルは送信側のブラウザで読み込まれて分割・符号化され、光として渡り、受信側のブラウザで組み立てられます。両端のDevToolsのNetworkタブで確認できます。ファイルそのものも、その名前も、端末から出ることはありません。サイト側の解析が記録するのは、転送が行われたという事実と、おおまかなサイズの区分だけです。

### 受信側が自分のブラウザで動かないのはなぜですか？

カメラ側はChromium系だけが実装する`BarcodeDetector` APIで最速に動きます。デスクトップのChrome、Edge、Opera、そしてAndroid版Chromeです。FirefoxとSafariではJavaScriptのQRデコーダーにフォールバックするため、動きはしますが毎秒読めるフレーム数が減り、転送に時間がかかります。カメラの使用許可も必要です。送信側にはそうした条件はありません。canvasにQRコードを描くだけなので、どのブラウザでも動きます。

### これは安全ですか？他人のカメラにも読まれてしまうのでは？

読まれます。はっきり言っておきます。画面が見える人は、誰でもこのファイルを取得できます。QRフレームは暗号化されておらず、このチャネルのプライバシーは、いまいる部屋の物理的なプライバシーそのものです。鍵、シード、認証情報のような重要なファイルは、送る前に暗号化してください（`age`ファイル、パスワード付き7z、GPGなど）。パスフレーズは別の経路で渡すこと。なお、サイズ上限と自動化モードの不在も意図的なものです。放置できる画面→カメラのチャネルは、エアギャップ環境からの持ち出しツールになってしまうので、私たちはそれを作りません。
