Show HN: ShadowCat – 브라우저에서 QR 코드로 파일 전송

발행: (2026년 5월 22일 PM 08:11 GMT+9)
4 분 소요

출처: Hacker News

두 장치 간에 QR 코드를 이용해 데이터를 옮길 수 있는 완전 오프라인, 단일 파일 HTML 페이지 — 라디오(BLE, NFC 등)는 작동하지 않지만 카메라와 브라우저는 여전히 사용할 수 있는 구형 휴대폰을 위한 것입니다.

Tabs

  • Generate — 텍스트를 하나의 QR 코드로 인코딩합니다.

  • Scan — 카메라를 이용해 단일 QR 코드를 디코딩합니다.

  • Send file — 파일을 선택하고, 청크 크기 / FPS / ECC를 정한 뒤 Start를 누릅니다. [header, chunk1…chunkN] 순서대로 선택한 FPS에 맞춰 무한히 순환합니다. Pause / Resume / Stop 기능이 있습니다.

  • Start from — 원하는 프레임 인덱스에서 루프를 시작합니다. 이후 정상적으로 진행되며 헤더로 다시 돌아갑니다.

  • Show frame + Show / / + — 특정 프레임을 정적으로 하나만 표시합니다. 누락된 청크를 재전송할 때 사용합니다. 번호는 수신 측의 “missing‑chunks” 그리드에 표시된 청크 인덱스와 일치합니다(0 = 헤더).

  • Receive file — 카메라를 켜고 송신기 화면을 비춥니다. 헤더를 자동 감지하고 진행 바가 채워지며, 누락된 청크 그리드에 아직 도착하지 않은 청크가 표시됩니다. 전송이 완료되면 파일 CRC를 검증하고 Download 버튼이 나타납니다.

Protocol

  • Header: QRX1|H||||

  • Data: QRX1|D|| (1부터 시작)

  • Base64 알파벳에 | 문자가 없으므로 파싱은 단순히 split('|') 하면 됩니다.

  • 수신자는 인덱스로 청크를 추적하고, 중복은 무시하며, 헤더는 CRC로 중복 제거합니다.

Practical notes for old phones

  • 카메라는 HTTPS 또는 localhost가 필요합니다 — file:// 로는 getUserMedia 권한을 부여받을 수 없습니다. python3 -m http.server 8000 으로 서버를 실행하고 로컬 네트워크에서 http://<IP>:8000/qrcode.html 로 접속하세요. iOS Safari는 기기 간 접근을 위해 HTTPS가 추가로 필요합니다 — LAN 환경에서는 caddy 나 자체 서명 인증서를 사용하면 도움이 됩니다.

  • 프레임 렌더링에 실패하면(“code length overflow”) 청크 크기나 ECC 레벨을 낮추세요.

  • 500자 × 3 fps ≈ 1.1 KB/s (base64) ≈ 0.83 KB/s (raw). 100 KB 파일은 한 루프당 약 2분 정도 걸리며, 수신자는 보통 1~2번 루프를 거칩니다.

  • 구형 기기가 디코딩에 어려움을 겪는다면 FPS를 낮추고, ECC를 Q 수준으로 올리며, 청크를 약 300자 정도로 축소하세요 — 이렇게 하면 QR 코드가 작아지고 밀도가 낮아집니다.

0 조회
Back to Blog

관련 글

더 보기 »