[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-78369":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":14,"starSnapshotCount":14,"syncStatus":13,"lastSyncTime":27,"discoverSource":28},78369,"ShadowCat","unprovable\u002FShadowCat","unprovable","Single file optical file transfer using a browser",null,"HTML",337,25,2,0,1,6,144,3,4.24,false,"main",true,[],"2026-06-12 02:03:46","# ShadowCat\n\nA fully offline, single-file HTML page for moving data between two devices via QR codes — intended for old phones whose radios (BLE, NFC, etc.) arevdead but whose cameras and browsers still work.\n\n## Tabs\n\n- **Generate** — encode text into a single QR code.\n- **Scan** — decode a single QR via the camera.\n- **Send file** — pick a file, choose chunk size \u002F FPS \u002F ECC, hit Start. Cycles through `[header, chunk1…chunkN]` forever at the chosen FPS. Pause \u002F Resume \u002F Stop.\n- **Start from** — begin the loop at a chosen frame index; it then continues forward and wraps back to the header normally.\n- **Show frame** + **Show** \u002F **−** \u002F **+** — display exactly one frame static, for resending a specific missing chunk. The number matches the chunk index shown in the receiver's missing-chunks grid (0 = header).\n- **Receive file** — start the camera and point at the sender. Header autodetects, progress bar fills in, missing-chunks grid shows which ones haven't arrived yet. When complete, the file's CRC is verified and a Download button appears.\n\n## Protocol\n\n- Header: `QRX1|H|\u003Ctotal>|\u003Cfilename>|\u003CsizeBytes>|\u003Ccrc32hex>`\n- Data: `QRX1|D|\u003Cidx>|\u003Cbase64chunk>` (1-indexed)\n- Base64 alphabet has no `|`, so parsing is just `split('|')`.\n- Receiver tracks chunks by index, ignores duplicates, dedupes header by CRC.\n\n## Practical notes for old phones\n\n- Camera needs HTTPS or localhost — `file:\u002F\u002F` won't grant `getUserMedia` permission. Serve with `python3 -m http.server 8000` and visit `http:\u002F\u002F\u003Cyour-laptop-ip>:8000\u002Fqrcode.html` over the local network. iOS Safari additionally requires HTTPS for cross-device access — for a LAN setup, `caddy` or a self-signed cert helps.\n- If render fails on a frame (\"code length overflow\"), drop chunk size or drop ECC level.\n- 500 chars × 3 fps ≈ 1.1 KB\u002Fs base64 ≈ 0.83 KB\u002Fs raw. A 100 KB file is roughly 2 minutes per loop; receiver typically needs 1-2 loops.\n- If old devices struggle to decode: lower FPS, raise ECC to Q, shrink chunk to ~300 chars — produces smaller, less dense QRs.\n","ShadowCat 是一个用于通过二维码在两台设备间传输数据的单文件HTML页面，特别适用于那些无线功能已失效但摄像头和浏览器仍可工作的旧手机。该项目的核心功能包括生成文本二维码、扫描解码二维码以及发送和接收文件。用户可以选择文件大小、分块大小、帧率和错误校正级别，并通过二维码循环显示来实现文件传输。此外，它还支持从指定帧开始传输以重发丢失的数据块。ShadowCat 适合在没有其他可用通信手段的情况下进行小文件传输，如旧手机之间共享图片或文档。","2026-06-11 03:56:43","CREATED_QUERY"]