ncakanghanandClaude Opus 5 8aa74c1a8d
CI / windows-x64 (push) Canceled after 0s
CI / windows-arm64-cross (push) Canceled after 0s
CI / windows-arm64-native (push) Canceled after 0s
CI / macos (push) Canceled after 0s
영상 중복 탐지 완성 + 간단 편집(회전·자르기) + 동시 재생 + 별점·태그 세트
중복 탐지
- 이미지 근접쌍 밴드 색인 + 스트리밍 클러스터, 후보 검증(타일 다수결·크롭 해시)
- 색 지문으로 색만 다른 오탐 제거, 회전·반전본 탐지(8변형 질의, 선택 옵션)
- 오디오 지문(chromaprint)을 같은 디코드 패스에서 뽑아 레터박스 사본을 잡는다.
  배경음만 같은 남남은 시각 확인 패스(트림 축 프레임 거리)로 걸러낸다 — 실측 9 vs 29.
- 비교 재생(CompareView): 여러 사본을 offset 정렬해 나란히 재생
- 지문 생성 속도 조절(느림·보통·빠름) — 재시작 없이 반영

간단 편집 (원본을 직접 고침, Ctrl+Z로 되돌림)
- 회전·반전: JPEG은 EXIF 방향 태그 2바이트만, MP4는 회전 행렬만 — 화질 손실 0.
  방향값 전이표는 군의 성질(90도x4=제자리)로 검산하고, 실제 화소를 transpose=1과
  비교해 "시계 방향"이 정말 시계인지 확인한다.
- 자르기: 화면 좌표 기준(회전 메타가 붙어 있어도 어긋나지 않는다)
- 구간 자르기: 스트림 복사라 무손실. 필름스트립 타임라인 + 손잡이 끌기 + 구간 미리보기.
- 되돌릴 수 없는 편집(자르기·반전)은 원본을 .archive_trash/edits로 옮겨 보관
- 편집이 수정시각을 바꾸지 않는다 — 기본 정렬이 촬영일이라 항목이 튀면 다시 찾아야 한다

동시 재생
- 고른 영상을 최대 9개 격자에 놓고 함께 재생. 소리는 한 칸만.
- 실시간 변환이 필요한 코덱은 2개까지만 — 그 이상은 ffmpeg가 기계를 멈춘다

그 외
- 별점(스냅샷 flags 남는 비트에 얹어 항목당 바이트 증가 0)
- 태그: 검색 없이 클릭으로 붙이기, 세트+단축키, 이름 수정 시 붙은 항목에 전파
- 파일 로깅(tracing-appender) — 릴리스는 콘솔이 없어 stdout만으로는 원인을 못 찾았다
- ARM64 크로스 컴파일 스크립트(관리자 권한 없이 VS 카탈로그에서 조립)
- DB 마이그레이션 v7~v10

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 16:18:24 +09:00

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).

S
Description
No description provided
Readme
893 KiB
Languages
Rust 58.9%
TypeScript 32.9%
CSS 3.8%
PowerShell 3.4%
JavaScript 0.7%
Other 0.3%