TrendShift · 2026.05.23 · 21위

RapidRAW 딥다이브
— 18세 개발자가 만든 GPU 가속 오픈소스 라이트룸

RAW 사진 파일을 32비트 GPU 파이프라인으로 처리하고, AI 자동 마스킹과 비파괴 편집 워크플로를 갖춘 데스크탑 사진 편집기. 5.8k 별, AGPL-3.0, Windows·macOS·Linux 모두 지원. Rust + Tauri + WGPU + React 19로 빌드되었고, 2025년 6월 13일 빈 폴더에서 시작해 14일 만에 핵심 기능을 완성한 1인 프로젝트다.
목차
  1. 한줄 요약
  2. 왜 지금 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어/시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1한줄 요약

한 문장으로 무엇을 하는 프로젝트인가
한 문장 정리

RAW 사진 한 장을 GPU의 32비트 부동소수점 파이프라인에 통째로 올려, 슬라이더 한 번 움직일 때마다 픽셀 수억 개를 즉시 다시 계산해 보여주는 — Adobe Lightroom의 오픈소스 대안.

"라이트룸과 비슷한데 무료고, 가볍고, 코드를 통째로 들여다볼 수 있다"가 핵심 가치다. 실제로 사용자가 슬라이더를 움직일 때마다 원본 픽셀은 절대 손대지 않고 .rrdata라는 사이드카 파일에 "이 슬라이더를 +30 했다"는 기록만 남긴다. 화면에 보이는 결과물은 매 프레임 GPU에서 새로 합성된 미리보기다.

친숙한 비유

일반 사진 앱이 "도자기에 그림을 그리는 것"이라면, RapidRAW(또는 라이트룸 같은 비파괴 편집기)는 "도자기 위에 투명 셀로판지를 여러 장 겹치는 것"이다. 도자기(원본 RAW)는 평생 그대로다. 셀로판지에 적힌 메모(.rrdata 사이드카)만 바꿔서 결과를 무한히 되돌릴 수 있다.

그리고 셀로판지를 통과한 빛(최종 픽셀)을 계산하는 일을 CPU가 아니라 수천 개 코어가 동시에 같은 식을 푸는 GPU에 떠넘긴 것이 RapidRAW의 "Rapid"다.

2왜 지금 주목받는가

트렌딩 이유와 경쟁 제품 대비 장점

1. Adobe Lightroom의 "오픈소스 + 무료" 대안 자리가 비어있었다

사진 RAW 편집 시장은 사실상 Adobe Lightroom Classic이 표준이고, 무료 대안은 darktable(C 코드, 강력하지만 UX가 어려움)과 RawTherapee(같은 계열)뿐이었다. 두 제품 모두 강력하지만 "디자인이 90년대 같다"는 평가가 일관됐다. RapidRAW는 현대적인 UI + 빠른 GPU 응답성 + 비파괴 편집이라는 라이트룸의 핵심을 그대로 가져오면서, 코드는 누구나 들여다볼 수 있게 만들었다.

2. 18세 개발자의 "빈 폴더 → 14일 만에 동작" 스토리

저자(Timon Käch)는 README에 직접 적어놨다 — "18살이고 도제 교육을 받으며 짬내서 만들었다." 2025년 6월 13일 Day 1부터 6월 27일까지 14일 동안 매일 진척 로그를 공개했다. Day 1에 Tauri 셋업과 brightness/contrast 셰이더, Day 8에 RAW 파일 지원, Day 13에 비트맵 기반 마스크 시스템 재작성까지의 속도가 트위터/Hacker News에서 화제가 됐다.

3. AGPL-3.0 — "공짜로 가져다 상용 클로즈드 제품으로 못 만든다"

저자는 라이선스 선택 이유를 명시했다: "RapidRAW와 그 파생물이 영원히 오픈소스로 남게 하기 위해 AGPL을 골랐다." 즉 코드를 가져다 SaaS로 만들거나 클로즈드 데스크탑 제품에 끼워 팔 수 없다. 카피레프트가 가장 강한 라이선스 중 하나라서, "내가 만든 개선이 다시 본가에 환원될 거라는 확신"이 컨트리뷰터 유입에 유리하게 작동했다.

4. GPU 가속 + AI 마스킹 + ComfyUI 연동까지 한 통에 묶었다

경쟁 무료 제품(darktable)에는 AI 자동 마스킹이 없다. RapidRAW는 로컬 CLIP 모델로 자동 태깅, ONNX Runtime으로 피사체·하늘·전경 자동 분리 마스크, 그리고 ComfyUI 서버 연동을 통한 생성형 채우기(Generative Replace)까지 한 앱에 넣었다. "라이트룸 대안"을 넘어 "라이트룸 + Photoshop의 생성형 채우기" 영역까지 한 번에 노린다.

항목RapidRAWAdobe Lightroomdarktable
가격완전 무료월 ~$10 구독완전 무료
라이선스AGPL-3.0독점GPLv3
GPU 가속WGPU+WGSL (Vulkan/DX12/Metal/OpenGL)OpenCL/MetalOpenCL (선택적)
UI 모던함React 19 + Tauri네이티브, 표준GTK, 옛 느낌
AI 자동 마스킹O (로컬 ONNX)O (클라우드)X
생성형 채우기O (ComfyUI 연동)O (Firefly 클라우드)X
RAW 파일 지원rawler (dnglab 기반)광범위, 최고 수준광범위
설치 크기수십 MB (Tauri)2GB+~200MB

3기술 스택 전체 지도

백엔드 / 프런트엔드 / GPU / AI 각각 상세히

백엔드 — Rust + Tauri 2.11 (src-tauri/Cargo.toml)

RapidRAW의 무거운 작업(파일 IO, RAW 디코딩, GPU 호출, AI 추론)은 전부 Rust에서 돌아간다. 핵심 의존성을 카테고리별로 정리한다:

카테고리크레이트역할
데스크탑 셸tauri 2.11웹뷰 + Rust 백엔드 묶음. macos-private-api + rustls-tls 기능 활성
tauri-plugin-*dialog · fs · shell · process · os · single-instance 6종 플러그인
GPU 처리wgpu 29WebGPU 표준 추상화 — Vulkan/DX12/Metal/OpenGL 백엔드 자동 선택
bytemuck 1.25Rust 구조체 ↔ GPU 버퍼 바이트 변환 (derive 매크로로 zero-copy)
RAW · 이미지rawlerRAW 디코딩 (dnglab 프로젝트의 핵심, Canon CR3/Sony ARW/Nikon NEF 등)
image 0.25 · imageproc · image-hdr일반 이미지 처리, HDR 합성
mozjpeg-rs · webp · jxl-oxide · jxl-encoderJPEG (mozjpeg 최적화) · WebP · JPEG XL 인코더/디코더
AI 추론ort 2.0.0-rc.10ONNX Runtime의 Rust 바인딩 — CLIP, 마스킹 모델 추론
tokenizers 0.23 · ndarray 0.16Hugging Face 토크나이저 + N차원 배열 (CLIP 텍스트 입력용)
동시성rayon 1.12"data-parallel for 루프" — CPU 코어 전부에 자동 분산
tokio 1async 런타임 (full features) — 파일 IO, 네트워크
메모리mimalloc 0.1Microsoft의 빠른 할당자, 기본 시스템 malloc 대체
memmap2 0.9대용량 RAW 파일을 디스크에서 메모리에 직접 매핑 (복사 0회)
수학nalgebra 0.34일반 선형대수 — 변환 행렬, 색 공간 변환
glam 0.32게임/그래픽용 SIMD 가속 벡터·행렬 (셰이더 입력 준비용)
메타데이터kamadak-exif 0.6 · little_exif 0.6EXIF 읽기/쓰기 — 카메라 모델, 셔터/조리개 등
quick-xml 0.40XMP 메타데이터 (Adobe 표준 사이드카 포맷) 처리
해시·식별blake3 · sha2 · image_hasher썸네일 캐시 키, 이미지 지문 (perceptual hash)
유틸trash 5 · walkdir · tempfile · chronoOS 휴지통, 폴더 재귀, 임시 파일, 시간
용어
크레이트(crate)
Rust의 패키지 단위. npm의 "패키지", Python의 "pip 모듈"에 해당. Cargo.toml에 적힌 의존성 한 줄이 곧 크레이트 하나다.

프런트엔드 — React 19 + TypeScript 6 + Tauri (package.json)

UI는 일반 웹 앱과 거의 똑같다. Tauri가 운영체제의 웹뷰(macOS=WebKit, Windows=WebView2, Linux=WebKitGTK)에 React 앱을 실어주고, JS에서 호출한 명령은 IPC로 Rust 함수에 도달한다.

카테고리패키지역할
코어react 19.2 + react-dom 19.2최신 React (Compiler, Actions 시대)
typescript 6TS 6 — 신형 컴파일러
빌드vite 8 + @vitejs/plugin-react 6 + esbuild 0.28초고속 dev 서버 + 프로덕션 번들
스타일링tailwindcss 4.3 + @tailwindcss/viteTailwind 4 (Lightning CSS 엔진)
상태관리zustand 5Redux 대안, 훨씬 가벼움 — 사진 편집 슬라이더 값들이 다 여기에
@dnd-kit/core 6.3패널 드래그앤드롭 (라이트룸식 분할 화면)
캔버스·이미지konva 10 + react-konva 19HTML5 Canvas 위 마스킹 브러시·기울기 그리기
react-image-crop 11크롭 박스 UI
react-window 2썸네일 그리드 가상화 (1만 장 폴더도 60fps)
애니메이션framer-motion 12.38패널 슬라이드, 페이드 전환
색 픽커@uiw/color-convert · @uiw/react-color-wheel색 변환 + 컬러 휠 (색조정용)
유틸lodash.debounce · lodash.throttle · uuid · clsx슬라이더 throttling, 사이드카 UUID
인증@clerk/react 6.6"옵셔널 클라우드 구독" 로그인 — 본체 기능과 분리
알림 · 아이콘react-toastify 11 · lucide-react 1.14 · simple-icons토스트 + 아이콘셋
React 19 + Tauri의 의미

웹 개발자가 데스크탑 사진 편집기를 만들 수 있는 시대가 됐다는 뜻이다. 같은 React 컴포넌트가 웹 브라우저(개발 모드 npm run dev) → 그리고 데스크탑 OS 네이티브 윈도우(npm start = tauri dev) 양쪽에서 똑같이 동작한다. 핫 리로드도 그대로 살아있다.

GPU 처리 — WGPU + WGSL 셰이더

"32-bit GPU 파이프라인"이라는 README의 표현이 핵심이다. 일반 사진 앱은 8비트(0~255) 정수로 픽셀을 들고 다닌다. RapidRAW는 RAW 디코딩 직후부터 모든 픽셀을 RGBA 각 32비트 부동소수점으로 들고 있다. 그리고 모든 연산(노출, 톤, 색조정, 마스크 합성)을 WGSL 셰이더로 작성해 GPU의 수천 코어가 동시에 픽셀에 적용한다.

용어
WGPU / WGSL
WGPU는 WebGPU 표준의 Rust 구현. 같은 Rust 코드가 Windows에서는 DirectX 12, Linux에서는 Vulkan, macOS에서는 Metal으로 자동 매핑된다. WGSL(WebGPU Shading Language)은 그 위에서 동작할 셰이더(GPU 코어가 픽셀마다 실행하는 작은 프로그램)를 쓰는 언어. 기존 GLSL/HLSL/MSL을 한 자리에 통합한 것.
용어
32-bit float per channel (HDR)
일반 JPEG는 R/G/B 각 8비트 (0~255, 256단계)다. RapidRAW의 내부 파이프라인은 R/G/B/A 각 32비트 부동소수점이다. 톤 매핑·색조정을 거치면서 반올림 오차가 누적되지 않고, 명부/암부가 잘리지 않는다. 마지막 export 단계에서 8/16비트로 양자화한다.

인프라 · 배포

4아키텍처 심화 분석

시스템 구조도 + 핵심 설계 패턴

전체 시스템 구조도

┌────────────────────────────────────────────────────────────────┐ │ OS Window (Tauri) │ │ │ │ ┌─────────────────────────────────────┐ ┌──────────────┐ │ │ │ WebView (system browser engine) │ │ │ │ │ │ ┌───────────────────────────────┐ │ │ Rust │ │ │ │ │ React 19 + TS 6 App │ │ │ Backend │ │ │ │ │ │ │ │ │ │ │ │ │ ┌──────────┐ ┌───────────┐ │ │ │ ┌────────┐ │ │ │ │ │ │ Filmstrip│ │ Sliders │ │ │ │ │ RAW │ │ │ │ │ │ │ (react- │ │ Panels │ │ │ │ │ Decode │ │ │ │ │ │ │ window) │ │ (zustand) │ │ │ │ │(rawler)│ │ │ │ │ │ └──────────┘ └───────────┘ │ │ │ └───┬────┘ │ │ │ │ │ │ │ │ │ f32 │ │ │ │ │ ┌─────────────────────────┐ │ │ │ ▼ │ │ │ │ │ │ Canvas + Konva │ │ │ │ ┌────────┐ │ │ │ │ │ │ (Mask drawing, crop) │ │ │ │ │ WGPU │ │ │ │ │ │ └─────────────────────────┘ │ │ │ │ +WGSL │ │ │ │ │ └──────────────┬────────────────┘ │ │ │ Shader │ │ │ │ │ │ invoke() │ │ │ Pipeline│ │ │ │ │ │ IPC │ │ └───┬────┘ │ │ │ └──────────────────┼──────────────────┘ │ │ f32 │ │ │ │ │ ▼ │ │ │ └───────────────────────▶ ┌────────┐ │ │ │ │ Preview│ │ │ │ │ PNG │ │ │ │ └────────┘ │ │ │ │ ┌────────┐ │ │ │ │ │ ONNX │ │ │ │ │ │ (ort) │ │ │ │ │ └────────┘ │ │ │ └─────────────┘ │ │ │ │ ┌──────────────────────────────┐ │ │ │ File System │ │ │ │ ┌──────────┐ ┌───────────┐ │ │ │ │ │ IMG_001 │ │ IMG_001 │ │ │ │ │ │ .CR3 │ │ .rrdata │ │ │ │ │ │ (RAW) │ │ (sidecar) │ │ │ │ │ └──────────┘ └───────────┘ │ │ │ └──────────────────────────────┘ │ └────────────────────────────────────────────────────────────────┘ │ ▼ (옵션, AI 생성형 편집 시에만) ┌────────────────────────┐ │ ComfyUI Server │ │ + RapidRAW-AI- │ │ Connector │ │ (Diffusion Model) │ └────────────────────────┘

설계 패턴 1 — 비파괴 편집 (Non-destructive editing) + 사이드카 패턴

모든 편집 결과는 원본 파일에 절대 쓰지 않는다. 대신 같은 폴더에 IMG_001.CR3가 있으면 IMG_001.rrdata라는 작은 사이드카 파일을 만들어 "노출 +0.3, 섀도우 +25, 마스크 1번에 색온도 +10..." 같은 편집 명령 목록만 적는다. 화면에 보이는 결과물은 매번 GPU에서 새로 합성된 프리뷰다.

왜 이게 중요한가
하드디스크가 깨져도 원본은 안전, undo가 무한, 프리셋 공유가 자유롭다

실수로 너무 강하게 보정해도 원본은 그대로다. 1년 뒤에 봐도 똑같은 .rrdata 파일을 적용하면 같은 결과가 나온다. 그리고 .rrdata 파일을 친구에게 보내면 친구는 자기 RAW에 그 "레시피"를 적용할 수 있다 — 이것이 Lightroom의 프리셋 시장이 생긴 원리다.

설계 패턴 2 — Tauri 2-프로세스 모델 (WebView + Rust)

Tauri는 Electron과 달리 Node.js를 번들하지 않는다. 대신 운영체제가 이미 갖고 있는 WebView(시스템 브라우저 엔진)를 빌려 쓰고, 백엔드는 컴파일된 Rust 바이너리 한 개로 끝낸다. 결과: 설치 크기 수십 MB(Electron 앱은 100MB+), 메모리 사용량 절반.

// 프런트(JS) → 백엔드(Rust) 호출 예
// React 컴포넌트 안에서
import { invoke } from '@tauri-apps/api/core';
const preview = await invoke('apply_exposure', {
  imageId: 'uuid-xxx',
  exposure: 0.3
});

// Rust 측 (src-tauri/src/commands.rs 안에 이런 식)
#[tauri::command]
async fn apply_exposure(image_id: String, exposure: f32)
    -> Result<String, String> {
    // WGPU에 셰이더 uniform 업데이트
    // 결과를 base64 PNG로 반환
}

설계 패턴 3 — GPU 셰이더 파이프라인 (32-bit float)

한 장의 사진을 보정하는 흐름:

  1. RAW 디코딩 — rawler 크레이트가 Canon CR3/Sony ARW/Nikon NEF 등을 R/G/G/B 베이어 패턴 → RGB f32 배열로 변환 (CPU, 1회).
  2. GPU 텍스처 업로드 — 이미지 데이터를 GPU 메모리에 한 번 올림.
  3. 셰이더 체인 실행 — 사용자가 만진 슬라이더 값을 uniform 버퍼로 GPU에 전달. WGSL 셰이더가 각 픽셀에 노출 → 톤 매핑 → 색조정 → 마스크 합성 순서로 적용. 슬라이더 1pt 움직일 때마다 이 전체가 다시 돈다.
  4. 프리뷰 표시 — 결과 텍스처를 화면 해상도로 다운샘플링해 WebView에 PNG로 전송.
  5. Export — 위 과정을 풀해상도로 다시 한 번 돌리고 결과를 JPEG/PNG/WebP/JPEG XL로 인코딩.

설계 패턴 4 — AI 마스킹은 백그라운드 + 로컬

"피사체만 자동 선택"을 클릭하면 화면이 멈추면 안 된다. RapidRAW는 ONNX Runtime(ort 크레이트)을 통해 로컬에 미리 받아둔 세그멘테이션 모델을 별도 Tokio 태스크에서 돌린다. 결과 마스크는 다시 비트맵으로 변환되어 GPU 셰이더의 입력 텍스처가 된다.

왜 굳이 ONNX인가

ONNX는 "다른 프레임워크(PyTorch, TensorFlow)에서 학습한 모델을 한 가지 표준으로 저장하는 포맷"이다. 저자는 모델을 직접 학습한 게 아니라 이미 공개된 무료 세그멘테이션 모델을 ONNX로 변환해 사용한다. Rust 앱이 PyTorch 런타임을 통째로 들고 다닐 필요 없이 ONNX Runtime 하나면 추론을 돌릴 수 있다는 점이 매력.

설계 패턴 5 — ComfyUI 브리지 (선택적, 생성형 AI 분리)

"생성형 채우기" 같은 무거운 작업은 RapidRAW 본체가 직접 안 한다. 대신 RapidRAW-AI-Connector라는 별도 미들웨어가 로컬 ComfyUI 서버에 붙어서 처리한다. 똑똑한 점은 원본 이미지는 한 번만 업로드해서 캐싱하고, 이후 편집할 때마다 마스크 + 텍스트 프롬프트만 보낸다는 것. 4K 사진을 매번 다시 전송하지 않아 응답성이 살아남는다.

5디렉토리 구조 해부

주요 폴더와 파일의 역할
RapidRAW/ ├── src/ ← React 19 + TS 6 프런트엔드 │ ├── components/ ← UI 컴포넌트 (패널, 슬라이더, 캔버스) │ ├── store/ ← Zustand 상태 (현재 편집값, 선택 이미지) │ ├── hooks/ ← undo/redo, debounce, throttle 등 커스텀 훅 (invoke 호출 포함) │ ├── context/ ← React context │ ├── utils/ ← 유틸리티 함수 │ └── window/ ← 창 관련 모듈 │ ├── src-tauri/ ← Rust 백엔드 │ ├── src/ ← 평면 .rs 파일 집합 (서브디렉토리 최소) │ │ ├── main.rs ← Tauri 앱 시작 스텁 (fn main() { rapidraw_lib::run(); } 4줄) │ │ ├── lib.rs ← 실제 앱 빌더 + 명령 등록 (진입점 로직) │ │ ├── gpu_processing.rs ← GPU 셰이더 파이프라인 (wgpu 호출) │ │ ├── raw_processing.rs ← rawler 래퍼, 카메라별 보정 │ │ ├── export_processing.rs ← JPEG/PNG/WebP/JPEG XL 인코더 │ │ ├── ai_processing.rs · ai_commands.rs · ai_connector.rs ← ONNX/CLIP AI │ │ ├── app_state.rs ← .rrdata 사이드카·앱 상태 관리 │ │ ├── shaders/ ← WGSL 셰이더 소스 (노출, 톤, 마스크 합성) │ │ ├── panorama_utils/ ← 파노라마 유틸 │ │ └── tagging_utils/ ← 태깅 유틸 │ ├── Cargo.toml ← Rust 의존성 (40+ 크레이트) │ └── tauri.conf.json ← 윈도우 크기, 권한, 번들 설정 │ ├── data/ ← Linux 패키징 메타데이터 (Flatpak .desktop, AppStream .metainfo.xml) ├── packaging/ ← Flatpak/AUR/.deb 메타데이터 ├── public/ ← 정적 에셋 ├── .github/ ← 액션 워크플로 (멀티 OS 빌드, 릴리스) ├── .vscode/ ← 추천 익스텐션, 디버그 설정 │ ├── package.json ← 프런트엔드 의존성 (29개 + dev 17개) ├── vite.config.js ← Vite 8 설정 + tailwindcss() 플러그인 (Tailwind 4 config 파일 불필요) ├── tsconfig.json ← TS 6 strict 모드 ├── eslint.config.js ← ESLint 9 flat config └── .gitmodules ← rawler/dnglab 서브모듈
용어
서브모듈 (.gitmodules)
다른 git 레포를 내 레포 안에 "참조"로 끼워 넣는 기능. RapidRAW는 rawler(RAW 디코더) 크레이트의 fork 버전(CyberTimon/RapidRAW-DngLab)을 서브모듈로 연결한다. git clone --recurse-submodules를 깜빡하면 빌드가 깨지는 흔한 함정.

핵심 진입점 3개

6학습 포인트 (기술별)

각 기술에서 무엇을 배울 것 + 실습 아이디어

① Rust + Tauri 데스크탑 앱 만들기

이 레포의 가장 큰 학습 가치다. Tauri는 "Electron의 더 가벼운 후속작" 포지션인데, 막상 처음 만들려고 하면 JS↔Rust IPC, 명령 시그니처, 권한 설정, 번들링·코드사이닝까지 학습 비용이 꽤 있다. RapidRAW는 src-tauri/src/commands/ 폴더를 보면 명령을 어떻게 모듈로 쪼개는지, tauri.conf.json에서 윈도우/권한/번들을 어떻게 설정하는지 실전 예시가 모두 있다.

실습 아이디어

"파일 카운터" Tauri 앱을 만들어보자 — 폴더를 드래그하면 안의 파일 수를 세서 보여주는 미니 앱. JS에서 invoke('count_files', { path })를 호출하고 Rust에서 walkdir로 카운트하면 끝. Tauri의 IPC, 파일 시스템 권한, 번들링까지 한 번에 경험한다.

② WGPU + WGSL 셰이더 작성

GPU 프로그래밍은 "어렵다"는 평판이 있지만, WebGPU 표준은 OpenGL/Vulkan보다 진입 장벽이 훨씬 낮다. RapidRAW의 src-tauri/src/shaders/*.wgsl은 실전 셰이더 모음이다 — 노출, 톤 매핑, 색 휠, 마스크 합성 같은 익숙한 사진 보정 효과가 GPU 코드로 어떻게 표현되는지 직접 비교할 수 있다.

용어
셰이더 (shader)
GPU의 수천 개 코어가 "각 픽셀에 동시에" 실행하는 작은 프로그램. CPU의 for 루프 "for px in pixels: px.r += 0.3" 대신, 셰이더는 "내 픽셀 한 점에 0.3을 더한다"만 적으면 된다. 나머지 분배는 GPU가 자동으로 한다.
실습 아이디어

WGPU의 공식 튜토리얼 "Learn WGPU"를 따라가며 첫 셰이더(브라이트니스만 조절)를 작성해보자. 그리고 RapidRAW의 brightness.wgsl이 어떻게 다른지 비교. RapidRAW는 8비트 입력을 받지 않고 32비트 float 입력을 받기 때문에 클리핑(잘림)이 없다 — 그 차이를 직접 느껴보면 32비트 파이프라인의 가치가 보인다.

③ React 19 + Zustand 상태관리

편집기 UI는 슬라이더 수십 개가 동시에 움직인다. Redux로 짜면 보일러플레이트 폭증이라 Zustand 같은 가벼운 라이브러리가 사실상 표준이 되어가는 중. RapidRAW의 src/stores/를 읽으면 "여러 슬라이더 값을 어떻게 한 store에 모으고, undo/redo를 어떻게 구현하는지" 실전 답을 얻는다.

④ 비파괴 편집 + 사이드카 패턴

이 패턴은 사진/영상 편집기뿐 아니라 코드 에디터, IDE, 노트 앱에도 응용된다. Git의 stash, VSCode의 .vscode 폴더, Lightroom의 .xmp 파일, RapidRAW의 .rrdata가 다 같은 원리다. "원본은 절대 안 건드리고, 변경 의도만 별도 파일에 저장한다"는 발상.

⑤ ONNX Runtime으로 모델 추론 (PyTorch 없이)

RapidRAW는 PyTorch 한 줄도 의존하지 않으면서 AI 마스킹을 수행한다. ort 크레이트가 ONNX Runtime의 Rust 바인딩이고, tokenizers로 Hugging Face 토크나이저를 들어와 CLIP 입력을 만든다. "PyTorch 학습 → ONNX export → 어디서나 추론"이라는 산업 표준 흐름을 데스크탑 앱 안에서 어떻게 적용하는지 살아있는 사례다.

⑥ Vite 8 + Tauri 핫 리로드 통합

vite.config.jsclearScreen: false, strictPort: true, HMR 포트 설정 같은 Tauri 특유의 깨알 옵션들이 들어있다. "데스크탑 앱에서 핫 리로드가 작동한다"는 건 마법이 아니라 이런 설정의 누적이다.

⑦ 다중 OS 빌드 · 배포 자동화

.github/workflows/의 워크플로를 보면 Windows .msi, macOS .dmg(notarization 포함), Linux .deb + Flatpak + AppImage까지 한 푸시로 다 빌드되는 매트릭스가 있다. 1인 개발자가 4개 OS에 동시 배포할 수 있는 비결.

7하드웨어 / 시스템 요구사항

실제로 돌리려면 무엇이 필요한가
항목최소권장설명
OS — WindowsWindows 10Windows 11DirectX 12 또는 Vulkan 백엔드
OS — macOSmacOS 13 Ventura최신Metal 백엔드 (Apple Silicon에서 가장 좋음)
OS — LinuxUbuntu 22.04+최신Vulkan 또는 OpenGL, WebKitGTK 필요
RAM8 GB16 GB 이상RAW 파일 1장 = 보통 25~60 MB, undo 히스토리·마스크 누적되면 메모리 빠르게 먹음
GPU2015년 이후 통합 그래픽전용 GPU (NVIDIA/AMD/Apple Silicon)Pascal 이전(GTX 9xx 이하) NVIDIA는 README에 "improving speed 우선과제"로 표시됨
저장공간500 MBSSD 권장본체는 가볍지만 사이드카 + 캐시 + 썸네일이 누적
알려진 함정
사진 열자마자 앱이 죽으면 → 백엔드 자동 선택 실패

RapidRAW는 GPU 백엔드를 자동 선택하는데, 종종 시스템과 안 맞는 백엔드가 선택돼서 첫 이미지 진입 시 충돌한다. Settings → Processing → Processing BackendAuto에서 Vulkan / DirectX12 / OpenGL / Metal 중 OS에 맞는 걸로 수동 지정해야 한다. README의 "Common Problems" 섹션에 명시된 1순위 트러블슈팅.

알려진 함정
Linux Wayland + NVIDIA에서 크래시

GNOME + NVIDIA + Wayland 조합에서 WebKit이 충돌한다(저자 잘못이 아니라 WebKit/NVIDIA 드라이버 문제). 우회법:

WEBKIT_DISABLE_DMABUF_RENDERER=1 RapidRAW 또는 WEBKIT_DISABLE_COMPOSITING_MODE=1 RapidRAW로 실행. 또는 X11로 전환하거나 AMD/Intel GPU 사용.

8직접 해볼 수 있는 실습 과제

난이도별 5개 과제 — Beginner부터 Advanced까지

🟢 Beginner 1 — 빌드해보기

"Build from Source"를 따라 실제로 컴파일해보자. git clone --recurse-submodules, npm install, npm start 세 줄이지만 Rust 처음 설치하는 사람이면 30분~1시간 걸린다. 컴파일 동안 Rust 컴파일러가 의존성 200개를 빌드하는 것을 구경하는 경험 자체가 학습이다.

🟢 Beginner 2 — 새 슬라이더 추가

"Sepia(세피아 톤)" 슬라이더를 만들어보자. (1) src-tauri/src/shaders/에 새 WGSL 파일 1개 추가 (2) commands/에 새 명령 1개 등록 (3) React 컴포넌트에서 슬라이더 1개 추가, invoke로 호출. 끝나면 Tauri 앱이 어떻게 layer되는지 한 사이클 완전히 이해하게 된다.

🟡 Intermediate 3 — 새 RAW 포맷 지원

본인 카메라 RAW가 지원 안 되면 rawler 레포(dnglab의 일부)에 카메라 프로파일 PR을 보낸 다음, 그 변경을 RapidRAW의 fork에 동기화해서 직접 빌드한다. README의 "Image format issues" 섹션이 정확히 이 워크플로를 가이드한다. 오픈소스에 첫 기여를 해보는 좋은 핑계.

🟡 Intermediate 4 — 자체 LUT(룩업 테이블) 만들기

3D LUT(예: .cube 파일)는 영화/사진 색보정의 표준 포맷이다. Davinci Resolve나 Photoshop에서 마음에 드는 룩을 만들어 .cube로 export → RapidRAW의 LUT 폴더에 넣고 적용. 그리고 WGSL 셰이더에서 LUT 텍스처가 어떻게 샘플링되는지(data/ 또는 shaders/ 살펴봄) 직접 읽어보면 색보정의 본질이 보인다.

🔴 Advanced 5 — ComfyUI 연동 + 자체 워크플로

로컬에 ComfyUI 설치 → RapidRAW-AI-Connector 미들웨어 실행 → RapidRAW의 Settings에서 연결. 그리고 ComfyUI에서 "흐림 효과 + Lora 적용 + 디퓨전 인페인팅" 같은 커스텀 워크플로를 .json으로 export해 RapidRAW에 import. RAW 사진 한 장에 디퓨전 모델 마법이 붙는 워크플로를 직접 손에 쥐게 된다.

9관련 기술 심화 학습 로드맵

12주 학습 계획 — Tauri + Rust + GPU 동시 입문자용
주차주제목표 산출물
1주Rust 입문 (The Book 1~6장)"hello world", 변수, 소유권 개념 이해
2주Rust 트레이트 · 에러 처리 · asynctokio로 비동기 파일 카운터 CLI 작성
3주Tauri 입문 (Quick Start)"폴더 드래그 → 파일 수 표시" 데스크탑 앱
4주Tauri 명령 · 권한 · 번들링위 앱을 .msi / .dmg / .deb로 빌드
5주React 19 + Zustand 복습슬라이더 상태를 Zustand로 관리하는 미니 앱
6주WebGPU 입문 (Learn WGPU 1~5장)WGSL로 첫 셰이더 — 화면을 빨강으로 칠하기
7주WGSL 셰이더로 이미지 처리JPEG 한 장에 brightness/contrast 적용
8주RapidRAW 클론 + 빌드로컬에서 RapidRAW 빌드 성공, 직접 사진 한 장 편집
9주RapidRAW 셰이더 코드 읽기shaders/*.wgsl 5개 골라 노트 정리
10주RAW 파이프라인 깊이 (rawler, demosaicing)"베이어 패턴 → RGB" 변환의 원리 한 페이지 정리
11주ONNX Runtime + 작은 모델 직접 추론MobileNet ONNX를 ort로 Rust에서 추론하는 미니 앱
12주본인 사진 편집 워크플로를 RapidRAW로 완전 이관Lightroom 없이 한 달 살기 가능 여부 평가

10핵심 키워드 사전

레포에 등장하는 주요 용어 한 줄 정리
RAW
카메라 센서에서 나온 가공되지 않은 데이터
JPEG처럼 카메라 내부에서 색·노출 보정이 적용된 결과물이 아니라, 센서의 각 픽셀이 잡은 빛 강도 그 자체. 정보량이 훨씬 많아서(보통 14비트, 12bit) 후보정 폭이 매우 넓다. 단점: 파일 크기가 JPEG의 3~5배, 그리고 별도 디코딩이 필요.
Demosaicing (디모자이킹)
R/G/G/B 모자이크 → 풀컬러 픽셀로 복원하는 알고리즘
카메라 센서는 한 픽셀에 R 또는 G 또는 B 한 색깔만 잡는다(Bayer 패턴). 디모자이킹은 주변 픽셀을 보고 빠진 색을 추측해서 채워주는 과정. RapidRAW가 "X-Trans demosaicing 알고리즘 개선"을 Priority로 적은 이유는 Fujifilm 카메라가 다른 패턴을 쓰기 때문.
WGPU
WebGPU 표준의 Rust 구현
하나의 Rust 코드가 OS에 따라 Vulkan/DirectX 12/Metal/OpenGL 백엔드로 자동 매핑된다. "한 번 작성, 어디서나 GPU"가 지향점. wgpu-rs 라이브러리가 사실상 사실상의 Rust 진영 표준.
WGSL
WebGPU Shading Language
WGPU 위에서 동작하는 셰이더 언어. GLSL/HLSL/MSL을 통합한 표준. Rust처럼 strict typed, 안전한 문법. .wgsl 파일 안에 @vertex, @fragment, @compute 함수를 정의하면 GPU가 실행.
Tauri
Rust + 시스템 WebView로 데스크탑 앱 만드는 프레임워크
Electron의 경쟁자. Electron이 Chromium + Node.js를 통째로 번들해서 100MB+ 앱이 나오는 반면, Tauri는 OS의 WebView를 빌려 쓰고 백엔드는 Rust 단일 바이너리. 결과: 설치 크기 1/10, 메모리 사용량 절반, 보안 모델도 더 엄격.
Non-destructive editing (비파괴 편집)
원본을 절대 안 건드리고 편집 의도만 기록
사진 RAW 처리의 산업 표준 패턴. Adobe Lightroom의 .xmp 사이드카, RapidRAW의 .rrdata가 같은 원리. undo가 무한, 원본 손실 위험 0, 프리셋 공유 가능. 단점: 디스크에 작은 파일이 하나 더 생긴다는 정도.
Sidecar file (사이드카 파일)
원본 옆에 같은 이름으로 붙어다니는 메타데이터 파일
IMG_001.CR3 옆의 IMG_001.rrdata처럼. "원본을 안 건드리지만 추가 정보를 같이 다닌다"는 패턴. Lightroom .xmp, Premiere .prproj, VSCode .vscode/ 등 광범위하게 응용됨.
Tone Mapping (톤 매핑) · AgX
광대역(HDR) 빛을 디스플레이의 좁은 다이내믹 레인지에 맞추기
현실의 빛은 다이내믹 레인지가 매우 넓은데, 모니터는 256단계(8bit)밖에 못 보여준다. 톤 매핑은 "넓은 빛을 좁은 화면에 우아하게 욱여넣는" 함수다. AgX는 Blender Foundation이 만든 최신 톤 매퍼로, 영화 같은 색감을 살리면서 부자연스러운 채도 폭주를 막는 게 특징. RapidRAW는 이걸 기본 옵션으로 지원.
LUT (Look-Up Table)
"입력 색 → 출력 색" 매핑 테이블 파일
3D LUT은 R/G/B 각 17~64 단계로 색 변환 결과를 미리 계산해 .cube 파일에 적어둔 것. 셰이더는 그냥 LUT에서 값을 찾기만 하면 되니까 영화 같은 룩을 거의 비용 없이 입힐 수 있다. 영화/유튜브 색보정의 핵심 도구.
Mask (마스크) · Bitmap mask
"이 픽셀에는 효과를 얼마나 적용할지" 회색조 지도
검정=0%, 하양=100%, 회색=중간. 라이트룸의 "Radial Filter", "Linear Gradient", "Brush"가 다 마스크 도구다. RapidRAW는 Day 13에 픽셀 단위 비트맵 기반으로 마스크 시스템을 재작성했다 — 처음에는 벡터/수식 기반이었지만 비트맵으로 가야 GPU와 더 잘 맞는다는 결론.
ONNX · ONNX Runtime
학습 프레임워크 무관한 추론용 모델 포맷
PyTorch나 TensorFlow에서 학습한 모델을 .onnx로 export하면 ONNX Runtime이 어디서나 추론을 돌릴 수 있다. RapidRAW는 PyTorch 의존성 없이 ort 크레이트만 들고 와서 마스킹 모델, CLIP 모델을 추론한다 — 데스크탑 앱 배포 크기를 작게 유지하는 핵심 트릭.
CLIP
"이미지 + 텍스트"를 같은 벡터 공간에 묻는 모델
OpenAI가 발표한 비전-언어 모델. "이 사진은 '강아지'에 얼마나 가까운가?"를 점수로 답할 수 있다. RapidRAW는 이걸로 라이브러리 안 사진을 자동 태그/검색한다 — 사용자가 "beach"를 검색하면 해변 사진이 뜨는 식.
ComfyUI
노드 기반 디퓨전 모델 워크플로 빌더
Stable Diffusion 같은 생성 모델을 GUI 노드로 조립해서 돌리는 도구. 로컬 GPU에서 무료로 동작. RapidRAW의 "Generative Replace"는 ComfyUI를 백엔드로 빌려 쓰는 방식이라, 사용자가 가진 어떤 디퓨전 모델/Lora도 RapidRAW 안에서 쓸 수 있다.
Lensfun
렌즈별 왜곡·비네팅·색수차 자동 보정 데이터베이스
"Canon EF 24-70mm f/2.8L II에서 24mm·f/2.8로 찍었을 때 모서리 왜곡은 이렇다"를 모아둔 오픈소스 DB + 보정 라이브러리. RapidRAW는 EXIF에서 카메라/렌즈를 읽어 Lensfun DB에서 자동으로 보정 파라미터를 찾는다 — 사용자가 손댈 일 없음.
AGPL-3.0
"네트워크로 제공해도 소스 공개해야 하는" 카피레프트 라이선스
GPL의 강화 버전. 일반 GPL은 "배포할 때" 소스 공개를 요구하지만, AGPL은 SaaS로 제공해도 소스를 공개해야 한다. 즉 누군가 RapidRAW를 클라우드 서비스로 만들면 그 사람도 코드를 공개해야 함. 클로즈드 상용화 방어용으로 가장 강력한 라이선스 중 하나.

11참고 링크

더 깊이 파고들 자료들

공식 자료

학습용 자매 자료

경쟁/관련 제품