트렌딩 딥다이브 · 2026-07-19 · TrendShift Daily 소진 → OSSInsight #52

1weiho/open-slide 딥다이브
"슬라이드를 말로 설명하면" AI 에이전트가 React로 써 주는 발표 프레임워크

open-slide"X 주제로 슬라이드 만들어줘"라는 한 줄 지시를 코딩 에이전트(Claude Code·Codex·Cursor…)가 받아 React 코드로 발표 자료를 써 내려가게 만드는 오픈소스 슬라이드 런타임이다. 사람은 채팅창을 떠나지 않고, 에이전트는 내용에만 집중한다. 핵심 아이디어는 단순하다 — 모든 페이지는 고정 1920×1080 캔버스 위의 그냥 React 컴포넌트이고, 캔버스 스케일링·페이지 네비게이션·핫리로드·발표 모드·내보내기(HTML/PDF/PPTX)라는 "귀찮은 배관"은 전부 프레임워크가 떠맡는다. 제약된 DSL(전용 문법)이 아니라 진짜 코드라서, 에이전트가 잘하는 일(코드 쓰기)과 딱 맞아떨어진다. 기술적으로 재미있는 지점은 "사람이 화면 요소를 클릭해 남긴 코멘트를 어떻게 소스코드 안 마커로 저장하고 에이전트가 되받아 적용하는가"와 "Vite 가상 모듈로 슬라이드를 어떻게 발견·핫리로드하는가" — 인스펙터·Babel AST 편집 엔진과 가상 모듈 플러그인이 이 저장소의 진짜 볼거리다.

(저장소: 1weiho/open-slide · TypeScript · MIT · pnpm+Turbo 모노레포 · @open-slide/core v1.16.0 · Vercel OSS Program · 2026-07-18 릴리스 기준)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 주목받는가 — reveal.js·Slidev와 뭐가 다른가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 — 가상 모듈·인스펙터·편집 엔진
  5. 디렉토리 구조 해부
  6. 학습 포인트 — 여기서 훔쳐올 설계
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

"에이전트가 슬라이드를 코드로 쓰게 하고, 나머지 배관은 프레임워크가 맡는다"
한 문장으로

open-slide = "발표 자료용 Next.js" + "에이전트가 운전대를 잡는 편집기"

당신이 /create-slide 로 "쿠버네티스 입문 5장 만들어줘"라고 말하면, 에이전트는 주제·분량·글 밀도·모션 4가지를 물어본 뒤 slides/k8s-intro/index.tsx에 페이지들을 React로 써 넣는다. open-slide는 그 파일을 자동으로 발견해 브라우저에 1920×1080 캔버스로 띄우고, 저장할 때마다 핫리로드한다.

발표할 땐 전체화면·발표자 모드(다음 장 미리보기·노트·타이머)가 준비돼 있고, 끝나면 서버 없이 열리는 정적 HTML 한 파일이나 PDF·PPTX로 내보낼 수 있다.

슬라이드 제작 도구는 크게 셋으로 나뉜다. ① PowerPoint·Keynote 같은 GUI 편집기, ② reveal.js·Slidev·Marp 같은 "마크다운/HTML로 쓰는" 개발자용 도구, 그리고 ③ open-slide가 개척하는 "에이전트가 코드로 쓰는" 도구다. open-slide의 관점은 명쾌하다 — "슬라이드는 결국 시각적인 코드다. 에이전트는 코드를 잘 쓴다. 그렇다면 사람이 슬라이드를 손으로 만들 이유가 없다."

그래서 open-slide는 "예쁜 템플릿"이 아니라 런타임(runtime)을 판다. 에이전트가 자유롭게 React를 쓸 수 있도록 캔버스 크기·스케일링·라우팅·핫리로드·발표 모드·내보내기라는 반복적이고 지루한 인프라를 대신 처리해주는 것이 이 프로젝트의 본질이다. 저장소에는 프레임워크 코어(@open-slide/core, TS/TSX 소스 164개), 스캐폴더 CLI, 데모 슬라이드 19벌, 그리고 Next.js 기반 문서 사이트가 함께 들어 있다.

용어
에이전트 네이티브 (agent-native)
"사람이 쓰기 편한" 게 아니라 "AI 에이전트가 쓰기 편한" 것을 1순위로 설계했다는 뜻. open-slide는 저장소 안에 에이전트용 설명서(.claude/skills/, AGENTS.md)를 미리 깔아두고, 편집 결과를 소스코드 파일로 주고받는다. 사람이 브라우저에서 클릭한 코멘트조차 소스 안 마커로 저장돼 에이전트에게 넘어간다.

2왜 주목받는가 — reveal.js·Slidev와 뭐가 다른가

"AI가 슬라이드를 만든다"는 흐름의 인프라 자리를 노린다

2026년 트렌딩 목록을 보면 "에이전트가 만드는 슬라이드"가 하나의 카테고리로 자리 잡았다 — open-slide 외에도 hugohe3/ppt-master(문서→네이티브 PPT), 1weiho 본인의 다른 슬라이드 실험, 각종 "슬라이드 스킬"이 동시에 떠오르고 있다. open-slide가 이 무리에서 눈에 띄는 이유는 "결과물(예쁜 PPT)"이 아니라 "제작 루프(agent loop) 자체"를 제품으로 잡았기 때문이다.

기존 개발자용 도구와의 결정적 차이

reveal.js / Slidev / Marpopen-slide
작성 방식사람이 Markdown/HTML을 직접 작성에이전트가 React(.tsx)를 작성, 사람은 지시·검토
페이지 표현력Markdown 문법 + 제한된 커스터마이즈임의의 React 컴포넌트 — 문법 제약 없음
편집 루프코드 수정 → 새로고침화면 클릭 코멘트 → 스킬이 소스 자동 편집
에이전트 지원없음 (사람이 프롬프트 관리)스킬 5종·설계 레퍼런스 저장소에 내장
내보내기HTML(주로), 일부 PDF정적 HTML·PDF·PPTX 전부 클라이언트에서
비유

reveal.js가 "워드프로세서"라면, open-slide는 "받아쓰기 비서를 붙인 워드프로세서"다. 문서 편집기 자체(캔버스·저장·인쇄)는 둘 다 있지만, open-slide는 옆에 앉은 비서(에이전트)가 당신 말을 듣고 타이핑을 대신 해준다. 당신은 "이 제목 더 크게", "이 박스 빨간색"만 말하면 된다.

그리고 그 "말"을 비서에게 전달하는 통로가 바로 인스펙터 코멘트 마커다 — 화면에서 요소를 클릭해 메모를 남기면, 그 메모가 소스코드 안에 주석으로 심겨 비서(에이전트)가 읽어간다.

주목 포인트 4가지

① 진짜 React라서 상한선이 없다. Markdown 기반 도구는 "표현하기 어려운 레이아웃"에서 막힌다. open-slide는 페이지가 그냥 컴포넌트라 <Steps>로 단계별 등장, MorphElement로 Keynote식 "매직 무브"(요소가 다음 장으로 이어지며 변형), 임의의 CSS 애니메이션까지 전부 가능하다.

② 사람의 손맛과 에이전트의 자동화가 한 루프에 있다. 발표 → 화면 클릭으로 코멘트 → /apply-comments → 반복. 이 왕복이 open-slide의 킬러 UX다.

③ 서버가 필요 없는 배포. 출력이 순수 정적 빌드라 Vercel·Cloudflare Pages·Netlify·Zeabur 어디든 원클릭. 발표 파일 하나를 자기완결 HTML로 공유할 수도 있다.

④ Vercel OSS Program 배지를 달고 있어 최소한의 신뢰 신호가 있다. 라이선스는 MIT로 상업적 이용도 자유롭다.

3기술 스택 전체 지도

프레임워크 코어 · 스캐폴더 CLI · 문서 사이트 3덩어리, 그리고 빌드 툴체인

저장소는 pnpm + Turborepo 모노레포다. 하나의 저장소 안에 서로 다른 npm 패키지·앱이 여러 개 들어 있고, Turbo가 이들 사이의 빌드 순서·캐시를 관리한다.

open-slide (모노레포 루트) │ package.json · turbo.json · pnpm-workspace.yaml · biome.json │ ├─ packages/ │ ├─ core/ ← @open-slide/core (v1.16.0) ★ 런타임+CLI+Vite플러그인, 핵심 │ └─ cli/ ← @open-slide/cli (v1.3.3) npx로 워크스페이스 생성 │ ├─ apps/ │ ├─ demo/ ← @open-slide/core 를 쓰는 예제 워크스페이스 (슬라이드 19벌) │ └─ web/ ← 문서 사이트 (Next.js + Fumadocs), open-slide.dev │ └─ .agents/skills/ ← 에이전트가 읽는 공용 스킬(shadcn, React 최적화 등)

① 프론트엔드 / 런타임 (packages/core)

브라우저에서 슬라이드를 그리고 편집하는 SPA다. 코어가 의존하는 주요 라이브러리:

레이어선택왜 이걸 썼나
UI 프레임워크React 18 + react-router-dom 7페이지=컴포넌트 모델. /s/:id·/presenter·/themes 등 라우팅
번들러/개발서버Vite 5 + @vitejs/plugin-react빠른 HMR·플러그인 API가 이 프로젝트의 심장(4장)
스타일Tailwind CSS 4 + tw-animate-css@tailwindcss/vite 플러그인으로 통합
UI 컴포넌트shadcn + @base-ui/react다이얼로그·팝오버·슬라이더 등 접근성 프리미티브
드래그앤드롭@dnd-kit (core·sortable)슬라이드/폴더 순서 재배치
코드 편집(핵심)@babel/parser + @babel/types.tsx를 AST로 파싱해 안전하게 수정 (4장)
내보내기html-to-image · fflateDOM→이미지, ZIP 압축으로 자기완결 HTML/PPTX
기타lucide-react(아이콘)·next-themes(다크모드)·sonner(토스트)·emoji-picker-react·react-image-crop편집 UI 부품들
용어
HMR (Hot Module Replacement · 핫 모듈 교체)
개발 중 파일을 저장하면 페이지 전체를 새로고침하지 않고 바뀐 모듈만 브라우저에서 갈아끼우는 기능. 슬라이드를 편집할 때 스크롤 위치·현재 페이지를 잃지 않고 즉시 반영된다. Vite가 기본 제공하지만, open-slide는 "슬라이드 파일"이라는 특수 대상에 맞춰 이걸 정교하게 커스터마이즈했다(4장).

② 스캐폴더 CLI (packages/cli)

npx @open-slide/cli init my-slide 한 줄이 하는 일. 의존성은 commander(명령 파싱)·prompts(대화형 질문)·chalk(색 출력)뿐인 가벼운 패키지다. template/ 폴더를 복사하고, 패키지 매니저를 감지해 설치하고, git 초기 커밋을 만든 뒤, 에이전트 스킬 폴더(.agents/skills)를 .claude/skills로 심볼릭 링크(윈도우면 복사)해 Claude Code가 바로 인식하게 만든다. AGENTS.mdCLAUDE.md도 같은 방식으로 이어준다.

③ 문서 사이트 (apps/web)

Next.js + Fumadocs로 만든 open-slide.dev. MDX로 문서를 쓰고, llms.txt·llms-full.txt 라우트를 제공해 "AI가 읽기 좋은 문서"까지 챙긴다. 랜딩 페이지 안에는 실제 슬라이드 플레이어를 임베드한다.

④ 빌드·품질 툴체인

tsdown(라이브러리 번들·타입 생성) · Biome 2(린트+포맷, ESLint+Prettier 대체) · Vitest(테스트) · Changesets(버전·체인지로그·npm 배포 자동화) · Turbo(모노레포 태스크 오케스트레이션). 최신 감성의 "Rust/Go 기반 빠른 툴" 조합을 그대로 보여주는 좋은 표본이다.

4아키텍처 심화 — 가상 모듈·인스펙터·편집 엔진

"파일 시스템 ↔ 브라우저 ↔ 에이전트"를 잇는 3개의 다리

open-slide의 진짜 설계를 이해하려면 세 가지 질문에 답하면 된다. (A) 브라우저는 slides/ 폴더의 슬라이드들을 어떻게 발견하고 핫리로드하나? (B) 사람이 화면에서 클릭한 코멘트는 어떻게 소스코드로 돌아가나? (C) 에이전트/도구는 어떻게 .tsx를 부수지 않고 수정하나?

[ 파일 시스템 ] [ 브라우저 SPA ] [ 에이전트 ] slides/<id>/index.tsx React 캔버스 1920×1080 Claude Code / Codex │ │ │ (A) Vite 가상 모듈 ────────────────────▶ import(loadSlide(id)) │ virtual:open-slide/slides 핫리로드(토큰 캐시버스트) │ │ │ │ │ (B) 인스펙터 클릭 ◀──── comment-widget │ ▼ │ │ {/* @slide-comment ... */} ◀── /vite/routes/comments.ts 가 소스에 삽입 │ │ └──────────── (C) /apply-comments 스킬이 읽어 편집 ──────────▶ Edit Babel AST(edit-ops) 로 set-text/set-style 적용

(A) Vite 가상 모듈 — 슬라이드를 "발견"하는 법

사용자의 slides/ 폴더는 코어 앱 바깥에 있다. 브라우저 코드가 이걸 정적으로 import할 수는 없으니, open-slide는 가상 모듈(virtual module)이라는 Vite 기법을 쓴다.

용어
가상 모듈 (virtual module)
디스크에 실제 파일로 존재하지 않지만, Vite 플러그인이 "그런 파일이 있는 척" 코드를 즉석에서 만들어 주는 모듈. open-slide는 virtual:open-slide/slides를 import하면, 플러그인이 slides/*/index.tsx를 glob으로 훑어 loadSlide(id) 함수와 slideIds 목록을 담은 JS 코드를 생성해 돌려준다. 슬라이드를 추가/삭제하면 이 가상 모듈만 무효화하면 되니 깔끔하다.

open-slide-plugin.ts가 하는 일을 뜯어보면:

영리한 디테일
발표자 노트 저장이 화면을 리마운트하지 않게

노트를 저장하면 슬라이드 파일 자체가 쓰인다. 그대로 두면 위의 slide-changed가 발동해 캔버스가 다시 그려진다. 그래서 notes-plugin이 "방금 이 파일을 노트 때문에 썼다"를 recent-writes.ts에 기록하고, handleHotUpdate에서 hasRecentWrite(file)이면 broadcast를 건너뛴다. 진짜 소스 편집은 기록되지 않으니 정상 HMR을 유지한다 — "의도한 쓰기"와 "사용자 편집"을 구별하는 작은 상태 머신이다.

(B) 인스펙터 — 클릭을 소스코드 마커로

발표/편집 화면에서 요소를 클릭하면 코멘트 위젯이 뜬다. "이거 빨갛게"라고 적으면, 그 메모가 소스코드 안 JSX 주석 마커로 저장된다:

{/* @slide-comment id="c-1a2b3c4d" ts="2026-07-19T..." text="<base64url(JSON)>" */}

text{"note":"make this red","hint":"..."}를 base64url로 인코딩한 값이다. 마커는 항상 대상 JSX 요소의 첫 자식으로 삽입된다 — 이유가 재밌다: () => ( <Foo/> )처럼 JSX 바깥에 주석을 넣으면 빈 객체 리터럴로 파싱돼 표현식이 깨지기 때문에, 반드시 컨테이너 안쪽에 넣어야 안전하다.

이 마커를 소스에 심는 쪽은 브라우저가 아니라 Vite 개발서버의 API 라우트(src/vite/routes/comments.ts)다. 즉 브라우저는 "여기에 이런 코멘트"라고 요청만 하고, 실제 파일 쓰기는 Node 쪽에서 Babel로 정확한 위치를 계산해 수행한다.

(C) 편집 엔진 — .tsx를 부수지 않고 고치기

src/editing/는 이 저장소에서 가장 배울 게 많은 폴더다. 문자열 치환(replace)로 코드를 고치면 같은 텍스트가 여러 군데 있을 때 엉뚱한 곳이 바뀐다. open-slide는 대신 AST(추상 구문 트리) 기반으로 편집한다.

용어
AST (Abstract Syntax Tree · 추상 구문 트리)
코드를 "글자"가 아니라 "구조"로 본 나무 모양 표현. <div style={{color:'red'}}>를 파싱하면 "JSX요소 > 여는태그 > 속성 style > 객체 > color:red" 식의 노드 트리가 된다. Babel이 각 노드의 소스 내 시작/끝 위치(start/end)를 알려주므로, "이 노드의 이 범위만" 정확히 잘라 바꿔치기(splice)할 수 있다.

edit-ops.ts가 정의하는 편집 연산(EditOp)들:

각 연산은 { from, to, text } 형태의 Splice(소스 범위 잘라 바꾸기)로 환원된다. 여러 마커를 처리할 땐 파일 아래쪽(줄 번호 큰 것)부터 역순으로 적용한다 — 위에서부터 고치면 길이가 바뀌어 아래 마커의 줄 번호가 어긋나기 때문이다. 이 "역순 적용"은 텍스트 일괄 편집의 정석이라 그대로 훔쳐올 가치가 있다.

스텝·트랜지션·모프 — 발표 연출 프리미티브

코어는 @open-slide/core에서 몇 가지 연출 부품을 export한다.

모프 레퍼런스 문서에는 "실전 덱에서 하나씩 얻어낸 규칙" 7개가 있는데, 그중 useIsActivePage()"지금 관객이 보는 인스턴스에서만 인트로 애니메이션을 재생"하게 막는 규칙이 인상적이다. 전환 중엔 나가는 페이지·썸네일·발표자 미리보기까지 여러 인스턴스가 동시에 마운트되므로, 그것들이 애니메이션을 다시 틀면 스냅샷이 엉킨다. React의 "같은 컴포넌트가 여러 문맥에서 산다"는 현실을 정면으로 다룬 좋은 예다.

5디렉토리 구조 해부

어디를 먼저 열어봐야 하나 — 읽는 순서 포함
packages/core/ ★ 여기가 90% 다 ├─ src/ │ ├─ index.ts 공개 API(export): Steps, MorphElement, design 유틸 │ ├─ config.ts OpenSlideConfig 타입(포트·디렉토리·base 등) │ │ │ ├─ vite/ ← (A) 빌드/개발서버 통합. 먼저 읽어라 │ │ ├─ open-slide-plugin.ts ★ 슬라이드 발견 + 가상 모듈 + HMR │ │ ├─ config.ts createViteConfig — 코어 앱을 root로 세팅 │ │ ├─ notes-plugin.ts 발표자 노트 저장 처리 │ │ ├─ design-plugin.ts 디자인 패널 ↔ 소스 동기화 │ │ ├─ recent-writes.ts "의도한 쓰기" 추적(리마운트 방지) │ │ └─ routes/ 개발서버 API: comments·edit·slides·assets·svgl… │ │ │ ├─ editing/ ← (C) 코드 편집 엔진. 두 번째로 읽어라 │ │ ├─ comments.ts @slide-comment 마커 파싱/삽입 │ │ ├─ edit-ops.ts ★ EditOp → Splice (set-style/set-text…) │ │ ├─ slide-ops.ts 슬라이드 생성/삭제/이름변경, SLIDE_ID_RE │ │ └─ babel-walk.ts AST 순회 도우미 │ │ │ ├─ cli/ open-slide dev/build/preview 명령 │ │ ├─ dev.ts ★ 자식 프로세스 감독(자가 재시작) │ │ └─ run.ts, build.ts, preview.ts, sync.ts │ │ │ ├─ files/ · http/ 폴더/에셋 파일 IO, 요청 가드(SSRF성 방어) │ ├─ locale/ en·ja·zh-cn·zh-tw 4개 언어 │ │ │ └─ app/ ← 브라우저 SPA (React). 세 번째로 읽어라 │ ├─ main.tsx, routes/ home·slide·presenter·themes·assets │ ├─ lib/ sdk.ts(CANVAS_WIDTH/HEIGHT), design.ts, │ │ export-html/pdf/pptx.ts, inspector/* │ └─ components/ player·slide-canvas·inspector·present·sidebar… │ ├─ skills/ ← 에이전트용 설명서(핵심 자산) │ ├─ create-slide/SKILL.md 덱 작성 워크플로(질문 4종) │ ├─ slide-authoring/ ★ 기술 레퍼런스(캔버스·타입스케일·모프·스텝…) │ ├─ apply-comments/SKILL.md 인스펙터 코멘트 적용 │ ├─ create-theme/ · current-slide/ │ └─ bin.js open-slide 실행 진입점 │ packages/cli/ npx @open-slide/cli init 스캐폴더 │ ├─ src/init.ts ★ 템플릿 복사 + 스킬 심볼릭링크 + git 커밋 │ └─ template/ 생성될 워크스페이스의 원본 apps/demo/slides/ 19개 예제 슬라이드(실전 패턴 카탈로그) apps/web/ Next.js 문서 사이트(open-slide.dev)
읽는 순서 추천

이 저장소를 처음 여는 사람에게: vite/open-slide-plugin.ts(어떻게 슬라이드를 찾고 핫리로드하나) → editing/edit-ops.ts + comments.ts(어떻게 코드를 안전하게 고치나) → skills/slide-authoring/(에이전트가 실제로 뭘 읽고 쓰나) → apps/demo/slides/*/index.tsx(완성된 슬라이드 실물). 이 4곳만 봐도 프로젝트의 80%가 손에 잡힌다.

6학습 포인트 — 여기서 훔쳐올 설계

슬라이드에 관심 없어도 배울 값어치가 있는 것들
패턴 1 · VITE 플러그인 개발

가상 모듈 + 파일 감시 + HMR 커스터마이즈

resolveId/load로 존재하지 않는 모듈을 즉석 생성하고, configureServer에서 chokidar 감시자를 추가하고, handleHotUpdate로 HMR 동작을 세밀 제어하는 완결된 Vite 플러그인 실전 예제다. "빌드 도구 위에 프레임워크를 얹는" 방법을 배우기에 이보다 좋은 교재가 드물다.

패턴 2 · 코드를 데이터로 다루기

Babel AST 기반 안전한 코드 편집

정규식 치환의 위험을 AST로 넘어서는 법. 노드 위치(start/end)로 Splice를 만들고, 여러 편집을 역순 적용하고, JSX 주석을 컨테이너 첫 자식으로만 삽입해야 하는 파싱 함정까지 — 코드 생성/리팩터링 툴을 만들 사람이라면 반드시 볼 폴더다.

패턴 3 · 사람↔에이전트 인터페이스

"소스코드를 공용 언어로" 삼은 협업 루프

사람의 클릭을 소스 안 마커로 직렬화(base64url JSON)하고, 에이전트가 그걸 읽어 편집하고, 마커를 지운다. GUI의 직관성과 텍스트의 버전관리성(git diff)을 동시에 얻는 영리한 절충. AI 협업 도구를 설계할 때 참고할 만한 인터페이스 아이디어다.

패턴 4 · 프로세스 관리

자기 자신을 재시작하는 개발 서버

cli/dev.ts는 개발 서버를 자식 프로세스로 fork하고, 앱 안에서 코어를 업데이트하면 RESTART_EXIT_CODE로 종료 → 감독 프로세스가 새 버전으로 재spawn한다. 시그널(SIGINT/SIGTERM)을 자식에 전달해 고아 프로세스를 막는 처리까지 있다. Node CLI 도구 설계의 좋은 표본.

패턴 5 · 모던 모노레포 표준 구성

pnpm workspace + Turbo + Changesets + Biome + tsdown

2026년식 TS 라이브러리/모노레포를 새로 셋업할 때 그대로 베껴올 수 있는 레퍼런스 조합. changeset으로 버전·체인지로그·npm publish를 자동화하고, tsdown으로 라이브러리를 번들+타입 생성하고, biome 하나로 린트+포맷을 통일하는 흐름을 package.json scripts에서 통째로 읽을 수 있다.

패턴 6 · 클라이언트 사이드 문서 생성

서버 없이 HTML/PDF/PPTX 내보내기

export-html.ts는 페이지를 렌더한 뒤 html-to-image로 에셋 URL을 수집하고 fetch로 바이트를 받아 fflate로 묶어 자기완결 파일을 만든다. "브라우저 안에서 완결되는 문서 파이프라인"을 어떻게 짜는지 볼 수 있다.

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

평범한 노트북이면 충분하다 — GPU 불필요

open-slide는 로컬 개발 서버형 도구라 무거운 요구사항이 없다. LLM은 당신이 쓰는 코딩 에이전트(Claude Code 등) 쪽에서 돌아가고, open-slide 자체는 Vite 개발 서버와 브라우저만 필요하다.

항목요구/권장
Node.js18 이상 (engines.node >=18). 코어는 20/22 LTS 권장
패키지 매니저pnpm(권장, 저장소가 pnpm 10 사용) · npm/yarn/bun도 CLI가 감지
OSmacOS·Linux·Windows. 윈도우는 심볼릭 링크 대신 복사로 폴백
브라우저모던 크로미움/파이어폭스(캔버스·BroadcastChannel 발표자 채널 사용)
GPU불필요
포트개발 서버 기본 5173 (Vite)
배포정적 호스팅(Vercel·Cloudflare Pages·Netlify·Zeabur) — 서버 런타임 없음

단, 실제로 "에이전트가 슬라이드를 써 주는" 경험을 온전히 누리려면 Claude Code / Codex / Cursor 같은 코딩 에이전트가 별도로 있어야 한다. open-slide 없이 손으로 slides/<id>/index.tsx를 직접 편집해도 잘 동작한다.

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

난이도별로, 손을 움직이며 배우는 순서

과제 1. 첫 덱 만들고 발표·내보내기 난이도 ★☆☆

npx @open-slide/cli init my-slide && cd my-slide && pnpm dev로 워크스페이스를 띄운다. slides/getting-started/index.tsx를 열어 제목 텍스트를 바꿔보고, 저장 시 브라우저가 현재 페이지를 유지한 채 갱신되는지 확인한다. 발표 모드(P 등)로 들어가 발표자 뷰를 보고, 마지막에 정적 HTML로 내보내 파일 하나만으로 열리는지 검증한다.

과제 2. 인스펙터 코멘트 → 소스 마커 관찰 난이도 ★★☆

개발 화면에서 한 요소를 클릭해 "make this bigger" 코멘트를 남긴 뒤, slides/<id>/index.tsx를 열어 @slide-comment 마커가 어느 위치(어느 JSX 요소의 첫 자식)에 심겼는지 확인한다. text 값을 base64url 디코드해 {"note":...} JSON을 눈으로 확인해보라. 인스펙터가 사람 입력을 어떻게 직렬화하는지 체감할 수 있다.

과제 3. 가상 모듈 출력 들여다보기 난이도 ★★☆

vite/open-slide-plugin.tsgenerateSlidesModule이 생성하는 코드를 console.log로 찍어보거나, 브라우저 devtools의 Sources에서 virtual:open-slide/slides를 찾아 loadSlideswitch문과 ?t=토큰 캐시버스트를 확인한다. 슬라이드를 하나 추가/삭제하며 목록이 어떻게 바뀌는지 본다.

과제 4. 나만의 EditOp 추가 난이도 ★★★

editing/edit-ops.ts에 새 연산(예: set-attr-number — 숫자 속성 변경)을 추가하고, AST에서 대상 속성을 찾아 Splice를 만들어 반환하도록 구현한다. edit-ops.test.ts에 케이스를 더해 vitest로 통과시켜본다. AST 편집의 핵심 감각을 얻는 과제다.

과제 5. MorphElement로 매직 무브 난이도 ★★★

인접한 두 페이지에 같은 id<MorphElement>를 두고, 위치·크기·색이 다른 사각형이 부드럽게 변형되게 만든다. slide-authoring/references/morph.md의 7가지 규칙(특히 useIsActivePage() 게이팅, transform 금지)을 지키며 "한 번의 자신 있는 제스처"로 읽히게 튜닝해본다.

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

이 저장소를 발판 삼아 넓혀갈 4주 코스

1주차 — Vite 플러그인과 빌드 도구

Vite 플러그인 API(resolveId·load·transform·configureServer·handleHotUpdate)를 공식 문서로 익히고, open-slide의 open-slide-plugin.ts를 줄 단위로 읽는다. 가상 모듈·HMR 이벤트·chokidar 감시가 목표. 곁들여 rollup 플러그인 훅과의 관계를 이해한다.

2주차 — 코드를 데이터로: AST와 코드모드

@babel/parser·@babel/types로 JS/TS를 파싱·순회·변형하는 법. editing/ 폴더를 교재 삼아 "노드 위치 기반 Splice"를 손에 익히고, jscodeshift/ts-morph 같은 코드모드 도구로 확장한다. 리팩터링 자동화·린트 룰 작성의 기초.

3주차 — React 렌더링 심화와 애니메이션

"같은 컴포넌트가 여러 문맥에서 마운트된다"는 현실(썸네일·발표자 미리보기·전환 스냅샷)을 다루는 법. useSyncExternalStore, FLIP 애니메이션 원리, useIsActivePage 같은 문맥 게이팅 훅 패턴. 저장소가 참조하는 vercel-react-best-practices 스킬의 규칙들도 함께 읽으면 성능 감각이 는다.

4주차 — 에이전트 스킬과 워크플로 설계

skills/*/SKILL.md가 어떻게 "에이전트가 따를 절차서"로 쓰이는지 분석한다. create-slide의 4가지 질문 설계, slide-authoring의 기술 레퍼런스 분리, apply-comments의 정확한 정규식 명세 — "프롬프트가 아니라 문서로 에이전트를 프로그래밍"하는 감각을 기른다. Claude Code 스킬/플러그인 생태계로 확장.

10핵심 키워드 사전

이 문서에 나온 용어를 한 줄로
에이전트 네이티브
AI 에이전트가 다루기 좋도록 1순위로 설계된 것. 저장소에 스킬·설계문서를 내장하고 소스코드로 결과를 주고받는다.
가상 모듈 (virtual module)
디스크에 없지만 Vite 플러그인이 즉석 생성해 주는 모듈. open-slide는 이걸로 slides/를 발견해 loadSlide(id)를 만든다.
HMR
Hot Module Replacement. 새로고침 없이 바뀐 모듈만 교체. open-slide는 ?t=토큰으로 슬라이드별 캐시버스트를 건다.
AST / Splice
코드를 나무 구조로 본 표현. 노드의 소스 위치를 이용해 {from,to,text}로 정확히 범위만 잘라 바꾸는 편집이 Splice.
@slide-comment 마커
인스펙터가 남긴 코멘트를 담은 JSX 주석. text{note,hint}의 base64url. 대상 요소의 첫 자식으로 삽입.
MorphElement / FLIP
두 페이지의 같은 id 요소를 연속 변형(매직 무브). 두 사각형을 측정해 클론을 오버레이로 애니메이션하는 FLIP 기법.
Steps / Step
한 페이지 안에서 항목을 단계별로 등장시키는 빌드 애니메이션 프리미티브.
DesignSystem / --osd-*
팔레트·폰트·타입스케일·라운드를 담은 객체. CSS 변수(--osd-bg 등)로 변환돼 디자인 패널에서 라이브 조정.
Changesets / tsdown / Biome
각각 버전·체인지로그·npm 배포 자동화 / 라이브러리 번들+타입 생성 / 린트+포맷 통합 도구. 모던 TS 모노레포 3종.
1920×1080 캔버스
모든 페이지가 그려지는 고정 좌표계. 화면 크기에 맞춰 통째로 스케일되므로, 픽셀 상수로 레이아웃해도 어디서나 동일하게 보인다.

11참고 링크

원본부터 배경 지식까지

프로젝트

핵심 소스(먼저 읽을 파일)

기반 기술