TRENDSHIFT #5 딥다이브 · 2026-06-04

OpenCut-app/OpenCut 딥다이브
— 브라우저에서 도는 오픈소스 CapCut 대안 영상 편집기

영상 편집을 하려고 파일을 클라우드에 올렸더니, 기본 기능마저 유료라 막힌 경험이 있나요? OpenCut브라우저 탭 하나에서 도는 무료·오픈소스 영상 편집기입니다. 영상이 내 컴퓨터를 떠나지 않고(로컬 처리), 워터마크·구독료도 없습니다. ⭐50k가 넘는 인기 속에 지금은 Rust 코어로 통째 다시 쓰는 대공사(rewrite) 중이라 더 주목받고 있죠. (저장소: OpenCut-app/OpenCut · 재작성판: TypeScript 98% · 클래식: TypeScript 92.6% / Rust 5.9% / WGSL 0.5% · ⭐55k · MIT 라이선스 · 재작성 진행 중)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

한 문장으로: "영상을 클라우드에 올리지 않고 브라우저 안에서 자르고 합치고 내보내는, 무료·오픈소스 CapCut 대안."

요즘 숏폼·유튜브 영상을 편집할 때 많이 쓰는 게 CapCut(캡컷)입니다. 쉽고 강력하지만, 영상을 회사 서버에 올려야 하고 기본 기능마저 점점 유료로 잠기고 있죠. OpenCut은 정확히 그 불만에서 출발한 프로젝트입니다 — "편집기는 쉬워야 하고, 무료여야 하고, 내 영상은 내 기기에 있어야 한다."

핵심은 모든 처리가 브라우저 안에서 일어난다는 점입니다. 보통의 온라인 편집기는 영상을 서버로 업로드해 거기서 렌더링하지만, OpenCut은 자르기·합치기·자막·내보내기까지 전부 사용자 컴퓨터에서 처리합니다. 그래서 업로드 대기 시간도, 프라이버시 걱정도 없습니다. 이걸 가능하게 하는 게 최신 브라우저의 미디어 처리 능력(WebCodecs)과 Rust를 브라우저에서 돌리는 기술(WASM)입니다 — 뒤에서 차근차근 풀어드릴게요.

영웅 비유

"통째로 들고 다니는 1인용 편집 스튜디오 — 필름을 밖으로 내보내지 않는 암실"

옛날 사진관에는 필름을 현상하는 암실이 있었습니다. 필름을 외부 업체에 맡기지 않고 그 방 안에서 직접 현상했죠. OpenCut이 바로 그 암실입니다. 영상(필름)을 클라우드(외부 업체)로 보내지 않고, 브라우저라는 방 안에서 직접 자르고 색을 입히고 완성본을 뽑아냅니다. 방 밖으로 원본이 나가지 않으니 안전하고, 업체에 돈을 낼 일도 없습니다. 게다가 이 암실은 설치가 필요 없어서, 웹 주소만 열면 바로 작업대가 펼쳐집니다.

먼저 알아둘 것 · 지금 저장소 상태
메인 저장소(main)는 "완성된 편집기"가 아니라 "재작성 초기 단계"입니다

이 글에서 다루는 OpenCut-app/OpenCut는 2026년 현재 처음부터 다시 쓰는(ground-up rewrite) 대공사 중입니다. 지금 main 브랜치를 클론하면 풀 기능 편집기가 아니라 막 시작한 골격(스캐폴드)만 들어 있습니다. 실제로 동작하는, 50k 스타를 모은 그 편집기는 opencut-app/opencut-classic(아카이브됨)에 있습니다. 그래서 이 딥다이브는 두 가지를 함께 다룹니다 — ① 유명해진 클래식 편집기의 구조(배울 게 많음)와 ② 새 재작성판의 야심 찬 설계(어디로 가는가). 이 구분을 머릿속에 깔고 읽으면 헷갈리지 않습니다.

용어
클라이언트 사이드 처리 (Client-side / 로컬 처리)
작업을 서버가 아니라 사용자 기기(브라우저)에서 직접 하는 방식. OpenCut은 영상 디코딩·편집·인코딩을 전부 내 컴퓨터에서 합니다. 장점은 프라이버시(원본이 안 나감)·즉시성(업로드 대기 없음)·서버비 절감. 대가는 내 컴퓨터의 성능을 쓴다는 것. "음식을 식당에 시키지 않고 내 부엌에서 직접 해 먹는 것"과 같습니다.

2왜 주목받는가

CapCut 유료화에 대한 반작용 + "내 영상은 내 기기에"라는 프라이버시 가치 + 50k 스타의 화제성 + Rust 코어로 통째 재작성한다는 과감한 베팅.

OpenCut이 트렌딩 상위에 오른 이유는 한 가지가 아닙니다. 가장 직접적인 동력은 CapCut의 유료화입니다. 무료로 쓰던 기본 기능들이 하나둘 구독 뒤로 잠기자, "그럼 오픈소스로 만들자"는 흐름이 생겼고 OpenCut이 그 깃발이 됐습니다. README가 내세우는 세 단어가 정확히 이 지점을 찌릅니다 — 프라이버시 · 무료 · 단순함.

두 번째는 프라이버시입니다. 영상은 종종 개인적이거나 미공개 콘텐츠인데, 그걸 모르는 회사 서버에 올리는 게 불편한 사람이 많습니다. OpenCut은 영상이 기기를 떠나지 않는다는 점 하나로 이 불안을 해소합니다. 세 번째는 화제성 — 짧은 기간에 ⭐50k를 넘기며 "오픈소스 CapCut"의 대명사가 됐고, Vercel·fal.ai 같은 곳의 후원도 받았습니다.

그리고 지금 가장 뜨거운 네 번째 이유는 과감한 재작성 선언입니다. 단순히 기능을 더하는 게 아니라, 편집기의 심장을 TypeScript에서 Rust로 옮기고, 그 Rust 코어 하나로 웹·데스크탑·모바일을 모두 굴리겠다는 계획입니다. 플러그인 우선 구조, AI 에이전트용 MCP 서버, 자동화를 위한 헤드리스 모드까지 로드맵에 담겨 있어, "오픈소스 편집기가 어디까지 갈 수 있나"를 보여주는 사례로 관심을 끕니다.

대안방식 / 특징OpenCut과의 차이
CapCut쉽고 강력하지만 클라우드 업로드 + 기능 유료화OpenCut은 로컬 처리·완전 무료·오픈소스
Premiere / DaVinci전문가용 데스크탑 설치 프로그램OpenCut은 설치 없이 브라우저에서 바로, 입문 친화적
Canva / Clipchamp웹 기반이지만 서버 처리 + 계정·구독OpenCut은 기기 내 처리라 프라이버시·오프라인성에 강함
OpenCut Classic실제 동작하는 Next.js 편집기(아카이브)main은 이걸 Rust 코어로 재작성하는 차세대판
흔한 오해
"지금 main을 클론하면 바로 풀 편집기를 쓸 수 있다"

아닙니다. 앞서 짚었듯 현재 main재작성 초기 스캐폴드라 타임라인·내보내기 같은 편집 기능이 아직 없습니다. README도 "외부 기여를 받을 준비가 안 됐다"고 명시합니다. 당장 영상을 편집하고 싶다면 opencut.app(클래식 호스팅판)을 쓰거나 opencut-classic 저장소를 봐야 합니다. "트렌딩=완성품"이라는 가정이 여기선 틀립니다.

그래서 좋은 점
"작동하는 버전"과 "실험 중인 버전"을 솔직하게 분리해 둠

OpenCut 팀은 클래식판을 지우지 않고 opencut-classic으로 남겨 사용자가 계속 쓸 수 있게 하고, 재작성판은 new.opencut.app이라는 별도 주소에서 준비합니다. "지금 쓸 것"과 "곧 올 것"을 명확히 구분해 혼란을 줄인 거버넌스는 오픈소스 프로젝트가 큰 방향 전환을 할 때 참고할 만한 모범입니다.

3기술 스택 전체 지도

OpenCut은 사실상 두 개의 스택입니다 — 실제 동작하는 "클래식"(Next.js 기반)과, 지금 짓고 있는 "재작성판"(Vite·TanStack·Rust 코어). 둘을 나눠서 봅니다.

이 프로젝트를 이해하는 열쇠는 "무거운 미디어 연산을 어디서 처리하느냐"입니다. 영상 편집은 디코딩·합성·인코딩이 전부 연산 폭탄이라, 자바스크립트만으로는 버겁습니다. 그래서 OpenCut은 브라우저 미디어 API + Rust→WASM 코어를 끌어와 무거운 일을 떠넘깁니다. 아래 표에서 각 라이브러리가 "편집기의 어느 근육"인지 짚어 보세요.

① 클래식판 (opencut-classic · 실제로 동작하는 편집기)

레이어기술 / 버전역할
프레임워크Next.js 16 + Turbopack · React 19웹앱 골격·라우팅·서버 기능. Turbopack으로 빠른 개발 서버
미디어 엔진mediabunny 1.29핵심. 브라우저에서 영상 디먹싱·디코딩·인코딩(내보내기)
네이티브 코어opencut-wasm 0.2 (Rust→WASM)무거운 합성·효과 연산을 Rust로 짜서 브라우저에 주입
오디오wavesurfer.js · soundtouchjs파형 시각화(타임라인) · 속도/피치 변경
브라우저 ML@huggingface/transformers 3.8기기 내 AI(자막·배경 처리 등)를 서버 없이 실행
상태 관리zustand 5타임라인·프로젝트·재생 상태를 가벼운 스토어로
타임라인 UX@hello-pangea/dnd · react-window클립 드래그앤드롭 · 수천 프레임 가상 렌더(성능)
데이터·인증drizzle-orm + postgres · better-auth프로젝트 메타·계정. upstash redis로 레이트리밋
UIradix-ui · Tailwind 4 · sonner · motion접근성 컴포넌트 · 스타일 · 토스트 · 애니메이션
배포OpenNext on CloudflareNext.js를 Cloudflare 엣지에서 구동(Vercel도 후원)

② 재작성판 (현재 main · 짓고 있는 차세대 골격)

레이어기술 / 버전역할
모노레포Turborepo + Bun 1.3.11apps/* 워크스페이스를 한 저장소에서 빌드·관리
빌드·프레임워크Vite 8 + TanStack StartNext.js 대신 Vite 기반 풀스택 React로 전환
라우팅TanStack Router (파일 기반)타입 안전 라우팅. routeTree.gen.ts 자동 생성
UIReact 19.2 · Tailwind 4 · shadcn · Base UI · Radix컴포넌트·디자인 시스템(템플릿 단계)
배포Cloudflare Workers (@cloudflare/vite-plugin + wrangler)엣지에서 SSR. 빌드 산출물을 워커로 배포
품질 도구TypeScript 6 · Vitest 4최신 타입 · 단위 테스트 (린트 미설정)
계획된 코어rust/ (WGPU 컴포지터 · WASM 바인딩) · GPUI 데스크탑로드맵: 한 Rust 코어로 웹·데스크탑·모바일 공유
용어
mediabunny (미디어버니)
브라우저에서 영상·오디오를 읽고(디코딩) 쓰는(인코딩) 순수 자바스크립트/WebCodecs 기반 미디어 라이브러리. 예전엔 ffmpeg.wasm(거대한 C 라이브러리를 통째로 WASM화)을 썼지만, 그건 무겁고 느렸습니다. mediabunny는 브라우저가 이미 가진 하드웨어 디코더(WebCodecs)를 직접 불러 더 빠르고 가볍게 처리합니다. "영상 파일을 풀었다 다시 묶는 만능 가위·풀"이라고 보면 됩니다.
용어
WASM (WebAssembly · 웹어셈블리)
C·Rust 같은 빠른 언어로 짠 코드를 브라우저에서 거의 네이티브 속도로 돌리는 기술. 자바스크립트가 버거워하는 무거운 연산(영상 합성·필터)을 Rust로 짜서 WASM으로 컴파일하면, 브라우저 탭 안에서도 빠르게 돕니다. OpenCut의 opencut-wasm이 바로 이것. "통역(JS) 대신 현지어(기계어)로 바로 말하게 하는 것"과 비슷합니다.

4아키텍처 심화 분석

먼저 클래식 편집기의 전체 그림(임포트→상태→프리뷰→내보내기)을 본 뒤, "클립을 끌어다 놓고 내보내기"라는 흐름 한 줄기를 따라갑니다. 그다음 재작성판이 그리는 새 그림을 봅니다.

전체 그림 — 브라우저 안의 편집 파이프라인

핵심은 모든 단계가 브라우저 한 탭 안에서 돈다는 것입니다. 영상은 서버로 가지 않고, 브라우저의 로컬 저장소(OPFS)에 들어간 뒤, 상태 스토어(zustand)가 "어떤 클립이 몇 초에 놓였는지"를 들고, 프리뷰는 그 상태를 그려내고, 내보내기는 그 상태대로 새 영상을 인코딩합니다.

[ 브라우저 탭 한 개 안에서 모두 처리 — 서버로 안 나감 ] 사용자가 영상 임포트 │ ▼ OPFS / IndexedDB 에 로컬 저장 ──(원본은 기기에만) │ ▼ mediabunny 가 디코딩 → 썸네일·프레임 추출 │ ▼ zustand 스토어 : 타임라인 상태(클립 위치·길이·효과) │ "진실의 원천(single source of truth)" ├─────────────┬───────────────┐ ▼ ▼ ▼ 타임라인 UI 프리뷰 렌더러 속성 패널 (DnD·가상화) (canvas / WASM (자르기·자막· 컴포지터) 색보정 설정) │ ▼ (내보내기 누름) 스토어 상태대로 프레임 합성 → mediabunny 로 재인코딩 │ ▼ 완성본 .mp4 를 로컬 다운로드
용어
OPFS (Origin Private File System)
브라우저가 사이트마다 따로 내주는 비공개 파일 저장소. 일반 다운로드 폴더와 달리 그 사이트만 접근할 수 있고, 큰 영상 파일도 빠르게 읽고 쓸 수 있습니다. OpenCut은 여기에 원본·중간 결과를 둬서 "기기를 안 떠난다"를 지킵니다. "내 책상 서랍에만 있는, 남이 못 여는 작업 폴더"라고 보면 됩니다.

흐름 한 줄기 추적 — "클립을 타임라인에 끌어다 놓고 내보내기"

초보자가 가장 궁금해하는 "내가 마우스로 한 동작이 코드에서 어떻게 흐르나"를 해피패스(정상 경로)만 따라가 봅니다. 클래식 편집기 기준의 개념 흐름입니다.

// ① 미디어 패널에서 클립을 타임라인으로 드래그
//    @hello-pangea/dnd 가 "어디에 놓였나(트랙·시각)"를 알려줌
onDrop(clip, trackId, startTime)

// ② 상태 스토어에 "이 클립이 여기 놓였다"를 기록 (진실의 원천)
timelineStore.addClip({ id, trackId, start, duration })

// ③ 스토어가 바뀌면 → 구독 중인 UI들이 자동으로 다시 그림
//    타임라인 막대, 프리뷰 화면, 속성 패널이 동시에 갱신
preview.render(timelineStore.state, currentTime)

// ④ '내보내기'를 누르면 스토어 상태를 처음부터 끝까지 재생하며
//    각 프레임을 합성 → mediabunny 가 새 영상으로 인코딩
for (t of timeline) { frame = compose(state, t); encoder.add(frame) }
const mp4 = await encoder.finalize()   // 로컬 다운로드

풀어 쓰면 이렇습니다. 드래그앤드롭 라이브러리가 "클립이 어느 트랙 몇 초에 놓였는지"를 좌표로 알려줍니다. 그 사실을 zustand 스토어에 적습니다 — 여기서 중요한 설계가 "화면이 아니라 상태가 진실"이라는 원칙입니다. 스토어가 바뀌면 그걸 구독하던 타임라인·프리뷰·속성 패널이 알아서 다시 그립니다(리액트의 반응형 렌더링). 내보내기는 그 상태를 시간 순서대로 재생하며 프레임을 합성하고, mediabunny가 새 영상으로 묶습니다. 화면을 "녹화"하는 게 아니라 상태를 다시 계산해 깨끗하게 렌더한다는 점이 핵심입니다.

비유

이 구조는 "악보와 연주"의 관계와 같습니다. zustand 스토어가 악보(어느 음을 언제 칠지)이고, 프리뷰 화면은 그 악보를 실시간으로 연주하는 것입니다. 내보내기는 같은 악보를 처음부터 끝까지 정확히 연주해 음반으로 녹음하는 셈이죠. 악보(상태) 하나만 잘 관리하면, 연주(프리뷰)와 녹음(내보내기)이 항상 같은 결과를 냅니다 — 이게 편집기에서 "프리뷰와 결과물이 일치"하는 비결입니다.

재작성판이 그리는 새 그림 — "한 Rust 코어, 모든 화면"

main의 야심은 편집기의 두뇌(컴포지터·효과·마스크)를 Rust로 한 번만 짜서 모든 플랫폼이 공유하는 것입니다. 웹에서는 그 Rust를 WASM으로, 데스크탑에서는 GPUI(네이티브 GPU UI)로, 모바일에서도 같은 코어로 돌립니다. TypeScript에 흩어져 있던 로직을 Rust 코어로 모으는 중이라 README가 "비즈니스 로직을 여기로 이전 중"이라고 적은 겁니다.

┌──────────────────────────────┐ │ rust/ (플랫폼 무관 코어) │ │ GPU 컴포지터 · 효과 · 마스크 │ │ = WGSL 셰이더로 GPU 합성 │ └──────────────────────────────┘ │ │ │ WASM 바인딩 GPUI 연결 (모바일) ▼ ▼ ▼ 웹 (Vite+ 데스크탑 모바일 TanStack, (네이티브 앱) (한 코드베이스) Cloudflare) │ ├─ 플러그인 우선 구조 (서드파티 확장) ├─ MCP 서버 (AI 에이전트가 편집 조작) └─ 헤드리스 모드 (자동 일괄 렌더링)
용어
WGPU / WGSL (WebGPU · WebGPU Shading Language)
브라우저·네이티브에서 GPU(그래픽카드)를 직접 부리는 차세대 표준과 그 전용 셰이더 언어. 영상 합성(여러 레이어 겹치기·필터)은 GPU가 압도적으로 빠른데, WGPU는 그 GPU 연산을 웹과 데스크탑에서 같은 코드로 쓰게 해 줍니다. WGSL은 "GPU에게 픽셀을 이렇게 칠해라"라고 적는 작은 프로그램. 저장소 언어 통계에 WGSL 0.5%가 잡히는 이유입니다.
용어
GPUI
코드 에디터 Zed를 만든 팀이 개발한 Rust용 GPU 가속 UI 프레임워크. 화면을 GPU로 그려 아주 부드럽고 빠른 네이티브 앱을 만들 수 있습니다. OpenCut 데스크탑판이 이걸 쓰려는 이유는, 영상 편집처럼 화면이 끊임없이 갱신되는 앱에서 성능이 생명이기 때문입니다. "일반 UI가 손으로 그리는 그림이면, GPUI는 그래픽카드가 그리는 그림"인 셈이죠.

5디렉토리 구조 해부

현재 main은 모노레포 골격(apps/web 한 칸)만 있습니다. 클래식 편집기의 구조는 라이브러리 구성으로 개념적으로 파악합니다.

현재 main — 재작성 골격 (실측)

지금 main은 Turborepo 모노레포이고, 안에 apps/web(TanStack Start 스캐폴드) 하나가 들어 있습니다. rust/·apps/desktop·docs/는 README가 예고한 계획이지, 아직 코드 트리에는 거의 없습니다(Cargo.toml·docker-compose.yml도 아직 없음).

OpenCut/ # 모노레포 루트 (Turborepo + Bun) ├── package.json # workspaces:["apps/*"], turbo dev/build/deploy ├── turbo.json # 태스크 파이프라인(build·dev·deploy 캐시 규칙) ├── bun.lock / bunfig.toml # Bun 패키지 관리자 잠금·설정 └── apps/ └── web/ # ★ 유일한 앱 (TanStack Start 스캐폴드) ├── vite.config.ts # Vite 8 + TanStack Start + Cloudflare + Tailwind ├── wrangler.jsonc # Cloudflare Workers 배포 설정 ├── components.json # shadcn 컴포넌트 설정 ├── .cta.json # "create TanStack App" 부트스트랩 흔적 └── src/ ├── router.tsx # 라우터 인스턴스 생성 ├── routeTree.gen.ts # 파일 기반 라우트 자동 생성물 ├── routes/ │ ├── __root.tsx # 전체 레이아웃(루트 라우트) │ └── index.tsx # 첫 화면(현재는 거의 빈 페이지) ├── components/ui/ # shadcn UI 50여 개(button·dialog·sidebar…) ├── hooks/ # use-mobile 등 └── lib/utils.ts # cn() 등 유틸
위치역할
package.json (루트)모노레포 진입점. turbo dev로 모든 앱을 한 번에 구동
turbo.json빌드·배포 의존 순서와 캐시 정의(^build = 의존 패키지 먼저)
apps/web/vite.config.ts스택의 심장. Vite에 TanStack Start·Cloudflare·Tailwind 플러그인 결합
src/routes/파일 하나가 곧 URL 하나. TanStack Router가 트리를 자동 생성
src/components/ui/shadcn으로 깔아 둔 디자인 시스템 부품(편집기 UI의 토대)

클래식 편집기 — 서브시스템 지도 (라이브러리로 추론)

클래식의 실제 폴더명을 일일이 옮기기보다, 어떤 라이브러리가 어떤 기능을 맡는지로 구조를 잡는 게 초보자에겐 더 쓸모 있습니다(라이브러리 구성은 package.json으로 실측).

서브시스템담당 기술 · 무슨 일
미디어 입출력mediabunny — 임포트 시 디코딩, 내보내기 시 인코딩
합성·효과opencut-wasm(Rust→WASM) — 무거운 프레임 합성·필터
상태 스토어zustand — 타임라인·프로젝트·재생 상태(진실의 원천)
타임라인 UI@hello-pangea/dnd(클립 끌기) + react-window(가상화)
오디오wavesurfer.js(파형) · soundtouchjs(속도·피치)
AI 기능@huggingface/transformers — 기기 내 추론(서버 불필요)
저장·계정drizzle-orm+postgres, better-auth, upstash redis

6학습 포인트 (기술별)

이 한 프로젝트에 "현대 웹이 어디까지 무거운 일을 하나"의 알짜가 다 들어 있습니다 — 각각 "뭘 배우나 + 어떻게 해보나".
학습 1 · 브라우저에서 영상 인코딩

WebCodecs와 mediabunny로 서버 없이 영상 처리

"영상 처리는 서버에서 한다"는 통념을 깨는 지점입니다. 최신 브라우저는 WebCodecs API로 하드웨어 디코더/인코더에 직접 접근할 수 있고, mediabunny가 그 위에 편한 껍데기를 씌웁니다. 영상 파일을 풀어 프레임을 꺼내고, 편집한 뒤 다시 mp4로 묶는 전 과정을 브라우저에서 배웁니다.

📖 한 줄 풀이: 무거운 일(코덱)은 브라우저·GPU에 맡기고, 자바스크립트는 "지휘"만 한다는 분업이 핵심입니다.

학습 2 · Rust → WASM로 핵심 옮기기

성능이 필요한 부분만 Rust로 짜서 웹에 주입

OpenCut의 큰 베팅은 opencut-wasm — 합성·효과 같은 무거운 연산을 Rust로 짜서 WASM으로 컴파일해 브라우저에 넣는 것입니다. "전부 다시 쓰는 게 아니라 병목만 Rust로" 옮기는 점진적 전략을 실물로 볼 수 있습니다. wasm-pack으로 빌드하고 npm 패키지처럼 링크하는 워크플로우까지 익힙니다.

학습 3 · 복잡한 에디터 상태 관리

zustand로 "진실의 원천" 하나 두기

편집기는 상태가 끔찍하게 복잡합니다 — 트랙·클립·재생 헤드·선택·실행취소까지. OpenCut은 무거운 Redux 대신 가벼운 zustand로 이걸 다룹니다. "화면이 아니라 상태가 진실"이라는 원칙(프리뷰와 결과물 일치의 비결)을 코드로 배우고, 실행취소(undo)를 상태 스냅샷으로 구현하는 감각을 기릅니다.

학습 4 · 타임라인 성능

드래그앤드롭 + 가상화로 수천 프레임 부드럽게

타임라인은 클립이 수십 개, 파형이 수천 점이라 그냥 그리면 버벅입니다. OpenCut은 @hello-pangea/dnd로 끌어다 놓기를, react-window화면에 보이는 것만 그리는 가상화를 씁니다. "보이지 않는 건 그리지 않는다"는 웹 성능의 핵심 기법을, 영상 타임라인이라는 실전 맥락에서 배웁니다.

학습 5 · 모노레포와 Bun·Turborepo

여러 앱을 한 저장소에서 빠르게 빌드

재작성판은 apps/web·apps/desktop을 한 저장소에 두는 모노레포입니다. Bun(빠른 패키지 매니저·런타임)과 Turborepo(빌드 캐시·의존 순서)를 함께 써, 큰 프로젝트를 어떻게 쪼개고 묶는지 배웁니다. turbo.json^build 같은 표기가 "의존 패키지를 먼저 빌드하라"는 뜻임을 이해하면 모노레포가 덜 무섭습니다.

학습 6 · TanStack Start + 엣지 배포

Vite 기반 풀스택 React를 Cloudflare로 보내기

재작성판은 Next.js를 떠나 Vite + TanStack Start를 택했습니다. 파일 기반 타입 안전 라우팅(TanStack Router), Vite 플러그인 조립, 그리고 @cloudflare/vite-plugin+wranglerCloudflare Workers 엣지에 배포하는 현대적 스택을 한 번에 경험합니다. "왜 Next를 떠났나"를 고민해 보는 것 자체가 좋은 아키텍처 공부입니다.

7시스템 요구사항

쓰는 데는 최신 브라우저면 충분하고(로컬 처리라 PC 성능을 씀), 개발하려면 Bun과 Node 환경이 필요합니다.
항목요구사항
사용 환경(브라우저)WebCodecs·OPFS·(가능하면)WebGPU를 지원하는 최신 브라우저 — Chrome·Edge 계열 권장. 로컬 처리라 RAM·CPU가 넉넉할수록 큰 영상이 쾌적
개발 — 공통Bun(클래식 1.2.18 / 재작성 1.3.11), Node 환경. 의존성 설치 bun install, 개발 서버 bun dev:web
개발 — 클래식 DBDocker + Docker Compose(선택) — 로컬 Postgres·Redis 구동용. 프론트만 만지면 생략 가능
개발 — 재작성판현재 main은 웹만 켜면 됨(bun installbun dev:web → Vite 개발 서버)
WASM 코어 빌드rust/wasm을 직접 고칠 때만: Rust 툴체인 + wasm-pack + cargo-watch
데스크탑(예정)GPUI 기반 — Rust 툴체인 + 데스크탑 네이티브 의존성(opt-in, 웹만 할 거면 불필요)
셀프호스팅(클래식)docker compose up -dlocalhost:3100에서 프로덕션 빌드 구동
주의 · 브라우저 의존성
"로컬 처리"는 곧 "내 브라우저·기기 성능에 좌우된다"

서버가 대신 일하지 않으므로, 4K 같은 큰 영상은 내 컴퓨터의 메모리·GPU가 감당해야 합니다. 또 WebCodecs·OPFS·WebGPU는 비교적 새 기능이라 사파리·구형 브라우저에선 일부가 빠지거나 다르게 동작할 수 있습니다. "어디서나 똑같이"가 아니라 "최신 크로미엄에서 가장 잘"이라는 전제를 깔고 접근하세요.

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

읽기만 하면 안 남습니다. 실제로 띄워 보고, 브라우저 미디어 처리·상태 관리를 손으로 재현해 보세요.
실습 A

클래식 편집기를 직접 띄워 영상 편집해 보기 난이도 ★☆☆ 입문

실제로 동작하는 편집기를 먼저 만져보는 게 출발점입니다. 가장 쉬운 길은 opencut.app에 접속하는 것이고, 소스를 보고 싶다면 클래식 저장소를 로컬에서 띄웁니다.

# 💡 하는 일: 클래식 소스 받아 로컬 개발 서버 띄우기
git clone https://github.com/opencut-app/opencut-classic
cd opencut-classic
bun install
bun dev:web               # http://localhost:3000 에서 편집기 열림

안심하세요 — 영상은 브라우저 안에서만 처리되니 시스템이 바뀌지 않습니다. DB가 필요하면 README의 docker compose up -d db redis를 먼저 돌리면 됩니다.

실습 B

재작성판 골격 띄워 새 스택 구경하기 난이도 ★☆☆ 입문

현재 main을 띄워 보면 "재작성이 어디까지 왔나"를 눈으로 확인할 수 있습니다. Vite·TanStack Start가 어떻게 켜지는지 보세요.

# 💡 하는 일: 재작성판 main 클론 → Vite 개발 서버
git clone https://github.com/OpenCut-app/OpenCut
cd OpenCut
bun install
bun dev:web               # Vite + TanStack Start 개발 서버 구동

src/routes/index.tsx를 열어 첫 화면을 고쳐보면, 파일 기반 라우팅이 어떻게 화면과 연결되는지 바로 체감됩니다.

실습 C

브라우저에서 영상 트랜스코딩 미니 데모 난이도 ★★☆ 중급

OpenCut의 심장인 "브라우저 미디어 처리"를 작게 재현합니다. mediabunny(또는 WebCodecs)로 영상 하나를 읽어 길이를 자르고 다시 mp4로 내보내는 30줄짜리 데모를 만들어 보세요. "서버 없이도 영상이 가공된다"를 직접 확인하는 게 목표입니다.

📖 핵심 포인트: 입력 디코딩 → 프레임 조작 → 출력 인코딩의 3단계가 모든 영상 편집의 뼈대입니다.

실습 D

zustand로 미니 타임라인 상태 만들기 난이도 ★★☆ 중급

편집기의 두뇌를 축소판으로 짜봅니다. zustand 스토어에 "클립 추가·이동·삭제"와 "재생 헤드 위치"를 두고, 그 상태를 구독하는 간단한 타임라인 막대 UI를 그려보세요. 상태를 바꾸면 화면이 따라오는 단방향 흐름을 손으로 익히는 게 핵심입니다. 여유가 되면 상태 스냅샷으로 실행취소(undo)까지 붙여 보세요.

실습 E

Rust → WASM 빌드 체험하기 난이도 ★★★ 고급

"Rust 코드를 브라우저에서 돌린다"를 직접 경험합니다. 작은 Rust 함수(예: 이미지 픽셀 밝기 조정)를 wasm-pack으로 빌드해 웹앱에서 호출해 보세요. OpenCut README의 로컬 WASM 워크플로우(build:wasmbun link)를 따라 하면 "왜 무거운 일을 Rust로 옮기는지"가 성능 차이로 체감됩니다.

# Rust 툴체인 + wasm-pack 설치 후
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install wasm-pack
wasm-pack build --target web   # .wasm + JS 바인딩 생성

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

이 저장소를 발판으로 "브라우저 미디어 엔지니어 / 크로스플랫폼 앱 개발자"로 뻗어가는 4주 계획.
주차주제학습 자료 / 키워드
1주브라우저 미디어 기초WebCodecs, mediabunny, OPFS·File System Access, 컨테이너(mp4)·코덱(H.264) 개념
2주React 에디터 상태·성능zustand(스토어·미들웨어), react-window(가상화), 드래그앤드롭, undo/redo 패턴
3주Rust → WASM + GPU 합성wasm-pack, wasm-bindgen, WebGPU·WGSL 셰이더, 이미지/영상 합성(compositor)
4주모노레포·배포·크로스플랫폼Turborepo·Bun, Vite·TanStack Start, Cloudflare Workers·wrangler, GPUI(Zed) 맛보기
비유

이 4주는 "영상 편집기를 쓰는 사람"에서 "영상 편집기를 만드는 사람"으로 넘어가는 다리입니다. OpenCut은 브라우저 미디어 API, 상태 관리, Rust/WASM, GPU 셰이더, 모노레포·엣지 배포라는 현대 웹의 어려운 주제들이 한 제품에 모여 있는 드문 교재입니다. 각 주제를 따로 배우면 추상적이지만, "영상 편집기"라는 구체적 목표에 묶으면 왜 그 기술이 필요한지가 또렷해집니다.

10핵심 키워드 사전

이 글과 저장소에 나온 주요 용어를 한자리에.
용어의미
CapCut바이트댄스의 인기 영상 편집 앱. 유료화·클라우드 의존이 OpenCut 등장 배경
클라이언트 사이드 처리서버가 아닌 사용자 브라우저/기기에서 직접 처리(프라이버시·즉시성)
WebCodecs브라우저가 하드웨어 코덱(디코더·인코더)에 직접 접근하게 하는 API
mediabunnyWebCodecs 위에서 영상 디코딩·인코딩을 쉽게 해 주는 JS 미디어 라이브러리
WASM (WebAssembly)Rust·C 코드를 브라우저에서 네이티브에 가깝게 돌리는 기술
opencut-wasmOpenCut의 Rust→WASM 코어(합성·효과 등 무거운 연산 담당)
WGPU / WGSL웹·네이티브에서 GPU를 부리는 표준과 셰이더 언어(영상 합성 가속)
컴포지터(Compositor)여러 영상·이미지 레이어를 겹쳐 한 프레임으로 합성하는 엔진
OPFS사이트 전용 비공개 브라우저 파일 저장소(큰 영상 로컬 보관)
zustand가볍고 단순한 React 상태 관리 라이브러리(편집기 상태의 진실원)
react-window화면에 보이는 항목만 렌더하는 가상화 라이브러리(타임라인 성능)
Turborepo여러 패키지/앱을 한 저장소에서 빌드·캐시하는 모노레포 도구
Bun빠른 자바스크립트 런타임 겸 패키지 매니저(npm·node 대체)
TanStack StartVite 기반 풀스택 React 프레임워크(재작성판이 Next.js 대신 선택)
GPUIZed 에디터 팀의 Rust용 GPU 가속 UI 프레임워크(데스크탑 예정)
MCPModel Context Protocol. AI 에이전트가 도구(편집기)를 조작하는 표준 통로
헤드리스 모드화면(UI) 없이 명령으로만 일괄 렌더링·자동화하는 실행 방식
OpenNextNext.js 앱을 Cloudflare 등 서버리스 엣지에서 돌리는 어댑터(클래식 배포)
Biome / UltraciteRust로 만든 초고속 린터·포매터와 그 위의 엄격 규칙 세트. 클래식 저장소 루트에 biome.json이 있으나, 재작성판(main)에는 아직 미도입
transformers.js브라우저에서 AI 모델을 서버 없이 돌리는 허깅페이스 라이브러리

11참고 링크