증상: SMB(네트워크) 소스 + 자료 많음 상태에서 재실행하면 창이 백지 + "응답 없음". 원인: setup()가 메인 스레드에서 watcher.refresh()를 동기 호출 → 각 로컬 소스에 debouncer.watch(경로, Recursive)를 등록하는데, 재실행 직후 SMB 공유가 느리거나 재연결 중이면 watch()가 블로킹 → 메인 스레드(이벤트 루프)가 멈춰 창이 안 그려짐. (처음 열 땐 소스가 없어 no-op이라 정상이었고, 소스 추가는 워커 스레드에서 refresh해 안 멈췄음 — 재실행 때만 메인 스레드에서 SMB를 건드려 멈춤.) 수정: 워처 매니저는 즉시 등록하되 refresh(watch 등록)는 백그라운드 스레드로, 시작 썸네일 백필(enqueue_pending)도 백그라운드로 이동. setup()가 SMB를 동기로 건드리지 않으므로 창이 즉시 렌더되고 응답 유지. 검증(로컬): 소스 있는 상태 재실행 → 창 ~0.7초에 렌더(사이드바+그리드 30셀), 새 파일 추가 시 워처가 3초 내 감지해 재스캔(31셀). 회귀 없음. (실제 SMB 블로킹은 로컬 재현 불가 — 메인 스레드에서 SMB를 건드리는 유일한 지점을 제거.) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Archive
수만 개의 사진·영상을 빠르게 조회·재생하면서 삭제/태그/이동으로 관리하고, 중복(완전 동일 + 유사)을 찾아 제거하는 크로스플랫폼 데스크톱 앱.
- 플랫폼: Windows x64 / Windows ARM64 / macOS (Intel + Apple Silicon)
- 배포: 포터블(무설치) 우선 — exe 옆
data/폴더가 있으면 포터블 모드로 동작 - 스택: Tauri v2 (Rust) + SolidJS + SQLite + ffmpeg 사이드카
- 소스: 로컬 디스크, OS 마운트 드라이브(UNC/SMB), 앱내 FTP/SFTP/WebDAV (시놀로지 등)
개발
요구사항: Node 22+, Rust stable(1.95+), (Windows) WebView2 런타임 — Win10/11 기본 탑재.
이 PC 주의사항: VS Community 2026에는 MSVC 데스크톱 라이브러리가 없어 rustc가 링크에 실패한다(LNK1104: msvcrt.lib). 반드시 VS Build Tools 2026의 vcvars64 환경에서 cargo를 실행해야 하며, 아래 스크립트가 이를 대신 처리한다.
npm install
scripts\dev.cmd :: 개발 실행 (vcvars64 + tauri dev)
scripts\test.cmd :: 코어 크레이트 헤드리스 테스트 (vcvars64 + cargo test)
Windows ARM64 크로스컴파일은 로컬에 ARM64 MSVC 라이브러리가 없어 CI에서만 검증된다. 로컬에서 하려면 VS Installer에서 "MSVC ARM64/AArch64 빌드 도구" 컴포넌트를 설치할 것.
구조
src/ SolidJS 프론트엔드 (3-pane UI, 가상 그리드)
src-tauri/ Tauri 셸 (커맨드, 데이터 디렉터리, 미디어 서버 기동)
crates/
archive-db SQLite 스키마·마이그레이션·단일 writer 스레드
archive-vfs VFS 추상화 (local / sftp / ftp / webdav)
archive-indexer 스캔·해시·썸네일·중복탐지 엔진
archive-media localhost HTTP 미디어 서버 (Range 스트리밍, ffmpeg 잡)
배포
Windows 포터블 (무설치)
scripts\fetch-ffmpeg.ps1 -Target win64 :: ffmpeg 사이드카 다운로드
npm run tauri build -- --no-bundle :: 릴리스 빌드
scripts\package-portable.ps1 -Target x64 :: Archive-<ver>-windows-x64.zip 생성
zip을 풀고 Archive.exe를 실행하면 됩니다. exe 옆 data\ 폴더에 인덱스·썸네일이
저장되므로 폴더째 옮겨도 동작합니다. WebView2 런타임(Win10/11 기본 탑재)이 필요합니다.
macOS (universal)
CI(macos-14)에서 scripts/fetch-ffmpeg-macos.ps1로 arm64+x64 ffmpeg를 lipo 결합한 뒤
tauri build --target universal-apple-darwin으로 .dmg를 만듭니다. 배포 시 Apple
Developer ID 서명·공증이 필요하며, 미서명 빌드는 첫 실행 시 우클릭 → 열기로 Gatekeeper를
통과시켜야 합니다.
Windows ARM64: CI에서 크로스컴파일로 검증됩니다(로컬은 ARM64 MSVC 툴체인 필요).
유지보수
앱 시작 시 백그라운드로 DB 백업(archive.db.bak, VACUUM INTO), 30일 지난 삭제 항목
하드 퍼지, 썸네일 캐시 LRU 정리(기본 상한 4GB)를 수행합니다.
설계 문서: 계획서 참조 (~/.claude/plans/reflective-watching-toucan.md).