한 문장으로 이 프로젝트가 뭘 하는지부터.
html-video = "영상 제작을, 영상 편집기가 아니라 '코딩 에이전트'에게 시키는 오케스트레이션 도구". 보통 모션 그래픽 영상을 만들려면 After Effects를 배우거나, Remotion·Motion Canvas 같은 코드 기반 영상 엔진의 고유한 작성법(DSL)을 익혀야 한다. html-video는 그 사이에 에이전트라는 한 겹을 끼워 넣어, 사람은 자연어로 지시만 하고 실제 "어떤 엔진으로, 어떤 템플릿에, 어떤 내용을 채울지"는 에이전트가 결정하게 한다. 결과물은 웹 화면이 아니라 디스크에 떨어지는 실제 .mp4 파일이다.
당신이 "우리 깃허브 스타 추이를 보여주는 30초 영상 만들어줘"라고 말하면, PD(에이전트)가 알아서 어울리는 촬영장(템플릿)을 고르고, 대본(스토리보드)을 쓰고, 장면마다 자막·데이터를 채운 뒤, 실제 카메라 장비(렌더 엔진)로 찍어 한 편의 영상으로 편집해 건넨다.
여기서 진짜 영리한 부분은 '촬영 장비'를 바꿔 끼울 수 있다는 점이다. 오늘은 Hyperframes(HTML+GSAP) 장비로 찍지만, 내일 Remotion(React) 장비를 들여놔도 당신의 기획·대본·PD는 그대로다. 장비 교체는 PD 뒤편의 '어댑터' 한 칸만 갈아끼우면 끝난다.
핵심을 한 번 더 못 박자. html-video가 파는 가치는 "또 하나의 영상 엔진"이 아니라 ① 여러 엔진을 갈아끼울 수 있는 어댑터 구조, ② 코딩 에이전트를 영상 제작의 두뇌로 쓰는 워크플로, ③ 글/레포 링크 한 줄을 통째로 영상으로 바꾸는 '소스→영상' 파이프라인이다. 모든 게 내 컴퓨터에서 돌아가고(로컬), 렌더링 횟수당 과금이 없으며, Apache-2.0이라 상업 작업에 넣어도 된다.
기존 방식 = 영상 엔진 하나를 골라 그 작성법을 배우고, 거기에 평생 묶임. 엔진을 바꾸면 처음부터 다시.
html-video = 에이전트에게 말로 시키고, 엔진은 '구현 디테일'로 뒤에 숨김. 엔진을 바꿔도 템플릿·스토리보드·에이전트 루프는 그대로 재사용.
TrendShift 일간 23위 — 갓 공개된 신생 레포가 급부상한 배경.
공개 직후 빠르게 성장 중인 신생 프로젝트인데도 트렌딩에 올랐다. 별 개수가 아니라 '개념의 신선함'과 'AI 코딩 에이전트 생태계의 흐름'에 정확히 올라탄 케이스다. 다섯 가지로 정리한다.
2025~2026년은 코딩 에이전트(Claude Code·Cursor·Codex)가 폭발한 시기다. html-video는 이 에이전트들을 코드가 아니라 '영상'을 뽑는 도구로 재활용한다. "내가 이미 쓰는 에이전트에게 영상까지 시킬 수 있다"는 메시지가 개발자 타임라인에서 즉시 먹혔다.
가장 많이 쓰는 기능은 "기사·레포 링크를 던지면 해설 영상이 나온다"이다. 서버가 URL을 대신 가져와(server-side fetch) 본문을 마크다운으로 펴고, 그걸 영상의 실제 재료로 쓴다. 위챗 공중계정(WeChat 公众号)처럼 로그인 없이 서버 렌더되는 글도 그대로 처리된다. "복붙도 필요 없다"는 점이 강력하다.
상용 HTML→영상 서비스(클라우드 렌더 + 클립당 과금)와 정면으로 대비된다. html-video는 렌더가 전부 내 머신에서 일어나고, 시트(좌석) 제한·기여자 협약·렌더당 요금이 없다. 영상 양산이 잦은 팀에게 비용 구조가 매력적이다.
제작사 nexu-io는 디자인 영역에서 에이전트 메타레이어를 표방한 Open Design, 정적 HTML 산출물용 HTML Anything을 운영하는 팀이다. html-video는 그 같은 철학("에이전트 + 다(多)엔진 메타레이어")을 영상이라는 새 축으로 확장한 자매 프로젝트라, 기존 생태계의 관심을 자연히 흡수했다.
기본 엔진은 Hyperframes이며, Remotion 어댑터(adapter-remotion)는 실제 구현 코드가 존재하나 README에는 아직 Planned로 표시된다(2026-06-05 기준). Motion Canvas·Manim 어댑터는 로드맵 항목이다. 어댑터 하나를 추가하면 모든 템플릿·에이전트·스튜디오가 공짜로 그 엔진을 얻는 구조라, "엔진 전쟁에서 어느 편에 설지" 고민하는 사람들에게 안전한 선택지로 비친다.
| 구분 | 상용 HTML→영상 SaaS | 단일 오픈 엔진(예: Remotion) | html-video |
|---|---|---|---|
| 실행 위치 | 클라우드 | 로컬 | 로컬 |
| 비용 | 렌더당 과금 | 무료~유료(인원 제한) | 무과금(Apache-2.0) |
| 작성 방식 | 웹 UI | 그 엔진 고유 DSL 학습 | 에이전트에게 자연어 |
| 엔진 교체 | 불가 | 불가(엔진에 묶임) | 어댑터 교체로 가능 |
| 소스→영상 | 제한적 | 직접 구현 | 링크/레포 붙여넣기 기본 제공 |
화제성과 별개로, 이 레포는 버전 0.x의 갓 태어난 프로젝트다. 기본으로 작동하는 엔진은 Hyperframes이고, Remotion은 adapter-remotion 패키지에 구현 코드가 있으나 README에는 Planned로 표시된다. Motion Canvas·Manim은 아직 로드맵 항목이다(README의 "In html-video" 열이 공식 지원 기준). 또 영상 제작의 품질은 결국 붙인 에이전트의 실력과 템플릿의 완성도에 크게 좌우된다. "다(多)엔진"은 현재 약속이지 완성된 기능이 아니라는 점을 분명히 알고 접근하는 게 정확하다.
package.json · pnpm-workspace.yaml · 8개 패키지에서 뽑아낸 실제 구성.
html-video는 웹 백엔드+프론트엔드가 한 저장소에 섞인 TypeScript 모노레포(monorepo)다. 언어 구성은 HTML 89.7%(=대부분이 템플릿 영상 파일), TypeScript 6.6%, JavaScript 3.6%로, "코드보다 콘텐츠(템플릿)가 많은" 도구형 레포의 전형이다. 크게 ⓐ 모노레포 토대 ⓑ 코어 도메인 ⓒ 에이전트 런타임 ⓓ 렌더 엔진 어댑터 ⓔ 스튜디오 UI ⓕ 외부 서비스 여섯 축으로 읽으면 된다.
| 구성요소 | 버전 | 역할 |
|---|---|---|
| Node.js | ≥ 20 | 전체 런타임. 스튜디오 HTTP 서버·CLI·에이전트 spawn이 모두 Node 위에서 돈다. |
| pnpm | ≥ 9 (9.15.0 고정) | 패키지 매니저 겸 워크스페이스 관리자. packages/*와 templates/*를 하나의 작업공간으로 묶어, 패키지끼리 workspace:*로 서로 참조한다. |
| TypeScript | ≥ 5.7 | 전 패키지 공통 언어. tsconfig.base.json을 각 패키지가 상속. |
| Biome | ^1.9 | ESLint+Prettier를 한 번에 대체하는 린트+포맷 통합 도구(Rust 기반, 빠름). biome.json 한 파일로 전 저장소 스타일 통제. |
pnpm -r build는 "모든(recursive) 패키지를 빌드"라는 뜻.| 패키지 | 핵심 의존성 | 역할 |
|---|---|---|
| @html-video/core | ajv, ajv-formats, yaml | 도메인 타입(Project·Asset·ContentGraph), 템플릿 레지스트리, 에셋 저장소, 스토리보드 오케스트레이터, MiniMax 오디오 mux. ajv로 템플릿 manifest의 JSON 스키마를 검증. |
| @html-video/content-graph | (무의존, 순수 TS) | 다중 프레임 영상의 중간 표현(IR). 노드(entity/data/text)+엣지(sequence/contrast/dependency) 그래프와 validate·topoSort·totalDurationSec 함수. |
@html-video/runtime은 사용자 PATH에 깔린 코딩 에이전트 CLI를 감지(detect)·실행(spawn)·스트리밍(stream)한다. README 기준 14개 백엔드를 지원하며, 아래는 대표 6개다(전체 목록: Windsurf CLI·Trae CLI·Gemini CLI·Grok Build·Qwen Code·OpenCode·GitHub Copilot CLI·Aider 등 포함).
| 에이전트 | 감지 방법 | 호출 방식 |
|---|---|---|
| Open Design (Vela) | vela / Open Design 앱 내장 | ACP over stdio — 한 번 로그인, 여러 모델 선택 |
| Claude Code | claude | claude --print, 프롬프트는 stdin |
| Cursor Agent | cursor-agent | cursor-agent --print |
| Codex CLI | codex | codex exec, 프롬프트는 stdin |
| Hermes | hermes | Hermes ACP CLI |
| Anthropic API | BYOK(키 직접 입력) | Messages API 직접 호출(CLI 불필요) |
| 구성요소 | 버전 | 역할 |
|---|---|---|
| Playwright | ^1.49 | 헤드리스 크로미움을 띄워 애니메이션 HTML을 한 프레임씩 녹화. 영상화의 '카메라'. |
| hyperframes | ^0.4 (peer, optional) | 실제 렌더 패러다임(HTML+CSS+GSAP)을 제공하는 상위 엔진. peerDependency라 선택 설치. |
| ffmpeg | 외부 바이너리 | 녹화된 webm을 libx264 MP4로 인코딩하고 여러 프레임을 concat. 오디오 mux도 담당. |
@html-video/cli는 html-video 명령어와 스튜디오 HTTP 서버 + 소스 페칭(URL/레포 가져오기)을 담는다. @html-video/project-studio는 브라우저에서 도는 스튜디오 UI(채팅·템플릿 갤러리·프레임 편집·사운드트랙·내보내기)다. 스튜디오는 http://127.0.0.1:3071에서 열린다.
영상에 음악·내레이션을 입히는 MiniMax(배경음 생성 + TTS)는 옵션이다. Settings → Audio에서 키를 넣으면 export 시 ffmpeg가 음성 아래로 음악을 깔아(ducking) MP4에 섞는다. 키가 없어도 나머지 기능은 그대로 작동한다.
"pnpm 모노레포라는 작업장 안에서, core가 규칙을 잡고, content-graph가 대본 형식을 정의하고, runtime이 에이전트를 불러 대본·HTML을 받아오고, adapter-hyperframes가 Playwright로 화면을 녹화해 ffmpeg로 MP4를 굽고, project-studio가 이 모든 걸 브라우저 UI로 보여준다." — 외부에 빌려 쓰는 건 '두뇌(코딩 에이전트)'와 선택적 '음향(MiniMax)'뿐, 영상화의 본체는 이 레포 안에 다 있다.
README의 How-it-works + content-graph 스키마 기반 — 링크 한 줄이 MP4가 되는 전 과정.
html-video의 파이프라인은 여섯 단계로 이뤄진다. 소스 페칭 → 에이전트 루프 → 콘텐츠 그래프 → 프레임별 HTML → 엔진 렌더 → ffmpeg. 이 중 ②~④가 '메타레이어'의 심장이다 — 에이전트는 '무슨 장면을(스토리보드)'을 정하고, 엔진은 '어떻게 그릴지(렌더)'만 정해서, 둘이 서로의 영역을 침범하지 않는다.
단일 프레임 영상은 콘텐츠 그래프를 건너뛰는 빠른 경로(fast path)를 탄다 — 템플릿 하나, HTML 하나, 곧장 렌더. 네트워크 호출은 ①의 소스 페칭과 ⑥의 사운드트랙 둘뿐이고, 나머지는 전부 로컬이다.
이 프로젝트의 설계 정수는 하나의 render(input, ctx) 계약이다. 어떤 렌더 백엔드든 이 인터페이스만 만족하면 어댑터가 된다. 그래서 새 엔진을 추가하면 모든 템플릿·모든 에이전트·스튜디오 전체가 그 엔진을 공짜로 얻는다. 위 파이프라인에서 ⑤번 박스만 갈아끼우면 ②~④(스토리보드·에이전트 루프)는 손대지 않아도 된다.
render(input, ctx)라는 같은 콘센트에 꽂힌다.다중 장면 영상의 핵심 자료구조다. 에이전트의 1라운드가 이 그래프를 만들고, 2라운드가 그걸 읽어 프레임 HTML을 그린다. 스키마는 단순하다.
interface ContentGraph {
schemaVersion: 1;
intent: 'single-frame' | 'explainer' | 'data-viz'
| 'promo' | 'comparison' | 'other';
synopsis?: string;
nodes: Array<EntityNode | DataNode | TextNode>;
edges: Array<{ from: string; to: string;
kind: 'sequence' | 'contrast' | 'dependency';
reason?: string }>;
}
여기서 영리한 부분은 엣지의 종류마다 의미가 다르다는 점이다.
| 엣지 종류 | 강제력 | 역할 |
|---|---|---|
| dependency | 하드 제약 | "A가 끝나야 B가 의미 있다" — 위상정렬의 반드시 지켜야 할 순서. |
| sequence | 소프트 선호 | 서로 독립인 노드들 사이의 권장 순서(동률일 때 tie-break). |
| contrast | 순서 무관 | "이건 저것과 대비된다"는 의미만 전달 — 프레임 구성기가 시각 대비에 활용, 순서엔 영향 없음. |
콘텐츠 그래프는 방향이 있는 비순환 그래프(DAG)다. topoSort(graph)는 이 그래프를 한 줄의 프레임 재생 순서로 변환한다. dependency 엣지는 반드시 지키고, sequence 엣지는 가능하면 따르고, contrast는 무시한다. 그 결과로 "1,500자 기사 → 장면마다 한 논점을 담은 다중 장면 해설 영상"이 만들어지고, 모든 줄이 원문의 무언가로 추적된다.
스튜디오는 에이전트에게 단일 프레임 빠른 경로와 다중 프레임을 모두 가르친다. 다중 프레임일 때 에이전트는 두 종류의 코드 블록을 내보낸다: json#content-graph(스토리보드 1개)와 노드마다 html#<nodeId>(프레임 HTML). 서버는 이를 파싱해 자동으로 writeContentGraph + writeFrameHtml을 호출한다. 그래프가 없으면 단일 프레임 경로로 우아하게 되돌아간다(graceful fallback).
에이전트는 스토리(콘텐츠 그래프)만 책임지고, 엔진은 그림(렌더)만 책임진다. 둘이 서로의 내부로 새지 않으니, ① 엔진을 바꿔도 스토리는 재사용되고, ② 같은 스토리를 다른 템플릿으로 다시 뽑을 수 있고, ③ 프레임 텍스트만 인라인으로 고쳐 재렌더할 수 있다. 좋은 추상화 경계가 어떻게 유연성을 만드는지 보여주는 교과서적 사례다.
packages/ 8개가 각각 파이프라인의 어느 부품인지.
레포 루트에는 모노레포 설정(package.json·pnpm-workspace.yaml·tsconfig.base.json·biome.json), 두 언어의 README, 그리고 흥미롭게도 CLAUDE.md(코딩 에이전트용 작업 메모)가 있다. 알맹이는 packages/ 8개와 templates/ 21개이며, 패키지 이름만 봐도 4절의 파이프라인과 맞아떨어진다.
| 패키지 | 한 줄 역할 | 핵심 export |
|---|---|---|
| core | 도메인의 '지휘자'. 타입·검증·오케스트레이션이 모두 여기. | writeContentGraph · writeFrameHtml · exportMp4 |
| content-graph | 스토리보드 IR. 순수 TS라 의존성 0. | validate · topoSort · totalDurationSec |
| runtime | PATH의 에이전트를 찾아 띄우고 출력 스트림. | 에이전트 감지·spawn 인터페이스 |
| adapter-hyperframes | Playwright로 HTML 녹화 → ffmpeg MP4. | render(input, ctx) 구현 |
| cli | 진입점. studio·doctor·search-templates. | bin.js |
| project-studio | 로컬 브라우저 UI 전체. | 스튜디오 프런트엔드 |
21개 템플릿은 잡동사니가 아니라, 각자 template.html-video.yaml manifest로 자기를 설명하는 자기완결 단위다. 스튜디오가 시작할 때 이 manifest들을 스캔한다. manifest에는 ① 용도(category·tags·best_for), ② 출력 사양(해상도·종횡비·fps·길이), ③ 입력 슬롯(inputs JSON 스키마), ④ 라이선스 출처(SPDX id + attribution 플래그)가 담긴다. 그래서 에이전트는 HTML을 열지 않고도 manifest만 보고 템플릿을 고르고 채울 수 있다.
packages/content-graph/README.md → packages/content-graph(스키마·topoSort) → packages/core(오케스트레이터) → packages/adapter-hyperframes(render 구현) → packages/cli(진입점) 순서로 보면, "대본 형식이 어떻게 생겼나 → 그게 어떻게 순서로 펴지나 → core가 그걸 어떻게 엮나 → 엔진이 어떻게 그리나 → CLI가 어떻게 시작하나"가 자연스럽게 이어진다. 설계 의도는 research/의 RFC를 곁들이면 깊어진다.
이 레포의 루트에는 CLAUDE.md가 있다 — 이 프로젝트 자체가 코딩 에이전트로 개발되고 있다는 흔적이다. "에이전트로 영상을 만드는 도구"를 "에이전트로 만든다". 자기 도구를 자기 방법론으로 만드는, 요즘 AI 개발 생태계의 자기참조적 풍경을 잘 보여준다.
이 레포를 교재 삼아 무엇을, 어떻게 배울 수 있나.
"하나의 인터페이스, N개의 백엔드"는 실무에서 가장 자주 쓰는 확장 설계다. 이 레포는 render(input, ctx) 한 계약으로 엔진을 갈아끼우는 깔끔한 예제를 제공한다.
실습 아이디어: adapter-hyperframes가 어떤 입력을 받아 어떤 출력을 내는지 타입을 추적하고, "내가 새 엔진을 붙이려면 최소 무엇을 구현해야 하나"를 한 페이지로 정리해 보기.
콘텐츠 그래프는 "비정형 텍스트 → 구조화된 그래프 → 순서가 있는 산출물"이라는, 컴파일러·데이터 파이프라인에 두루 통하는 패턴이다. content-graph 패키지는 의존성이 0이라 순수 알고리즘 학습용으로 최적이다.
실습 아이디어: topoSort를 직접 다시 구현해 보고, dependency/sequence/contrast 세 엣지의 처리 차이를 단위 테스트로 검증. DAG에 사이클을 일부러 넣어 validate가 어떻게 막는지 확인.
Playwright로 크로미움을 띄워 화면을 프레임 단위로 잡고, ffmpeg로 webm→mp4(libx264) 인코딩·concat·오디오 mux를 하는 흐름은 '화면을 영상으로 만드는' 모든 작업의 토대다. 스크린샷 자동화, E2E 테스트 녹화에도 그대로 응용된다.
실습 아이디어: 간단한 GSAP 애니메이션 HTML 한 장을 만들고, Playwright로 N프레임 캡처 → ffmpeg로 mp4 만들기를 처음부터 손으로 해보기(이 레포의 어댑터를 안 쓰고).
runtime 패키지는 외부 CLI(claude --print, codex exec 등)를 자식 프로세스로 띄우고 stdin/stdout으로 대화하는 실전 코드다. "LLM을 API가 아니라 로컬 CLI로 부린다"는 요즘 패턴의 좋은 표본.
실습 아이디어: Node의 child_process.spawn으로 아무 CLI나 띄워 stdin에 프롬프트를 흘리고 stdout을 스트리밍 받아 보기. 그다음 ACP가 이걸 어떻게 표준화하는지 비교.
workspace:* 상호 참조, pnpm -r build 일괄 빌드, tsconfig.base.json 상속, Biome 단일 설정 — 여러 패키지를 한 저장소로 굴리는 실전 셋업이 한눈에 보인다.
실습 아이디어: 패키지 2개짜리 미니 모노레포를 만들어 한쪽이 다른 쪽을 workspace:*로 참조하게 하고, 루트에서 한 번에 빌드·타입체크가 도는지 확인.
각 템플릿 manifest에 SPDX id와 attribution 플래그를 박아 "라이선스 클린을 구조적으로 보장"하는 접근은 오픈소스 운영의 좋은 모범이다. 단순 주석이 아니라 기계가 읽는 메타데이터로 출처를 추적한다.
GPU는 필요 없다 — 대신 'CLI 환경'이 핵심.
이미지 생성 모델과 달리 html-video는 GPU가 필요 없다. 신경망을 직접 돌리지 않고, 브라우저 렌더와 ffmpeg 인코딩이 작업의 무게중심이라 평범한 노트북에서도 충분하다. 대신 '환경 세팅' 항목이 몇 가지 있다.
| 항목 | 요구 | 비고 |
|---|---|---|
| Node.js | ≥ 20 | 런타임 필수. |
| pnpm | ≥ 9 | 빌드·워크스페이스 관리. |
| 헤드리스 크로미움 | Playwright가 설치 | playwright install로 브라우저 바이너리를 받는다. |
| ffmpeg | 시스템에 설치 | 없으면 MP4 export 단계에서 친절한 에러로 안내. brew install ffmpeg 등. |
| 코딩 에이전트 | 1개 이상(선택) | PATH의 claude/codex 등 자동 감지. 없으면 Anthropic 키로 대체. |
| Anthropic API 키 | 선택(BYOK) | CLI가 하나도 없을 때의 폴백 백엔드. |
| MiniMax 키 | 선택 | 배경음·내레이션을 쓸 때만. |
pnpm install
pnpm -r build
node packages/cli/dist/bin.js studio # http://127.0.0.1:3071 에서 스튜디오 열림
CLI 점검 명령도 있다. doctor는 깔린 에이전트·엔진을 감지하고, search-templates는 의도로 템플릿을 찾는다.
node packages/cli/dist/bin.js doctor
node packages/cli/dist/bin.js search-templates --intent "github stars race" --top 3
MP4 export는 ffmpeg에 의존한다. ffmpeg가 PATH에 없으면 조용히 0바이트 파일을 만들지 않고 친절한 에러로 알려 준다(초기 버전 노트 기준). 또 에이전트 백엔드가 하나도 감지되지 않고 Anthropic 키도 없으면 생성이 시작되지 않으니, doctor로 "에이전트·ffmpeg·브라우저"가 다 잡히는지부터 확인하는 게 빠르다. 기본 렌더 엔진은 Hyperframes이며, Remotion 어댑터는 코드가 구현돼 있으나 README 기준 아직 Planned 상태다. Motion Canvas·Manim은 로드맵 항목으로 현재 동작하지 않는다.
난이도별 5개 — 클론만으로 끝내지 말고 손을 움직여 보자.
pnpm install && pnpm -r build 후 studio를 열고, 갤러리에서 단일 프레임 템플릿(예: frame-glitch-title)을 골라 텍스트만 바꿔 MP4로 export한다. ffmpeg·브라우저가 제대로 잡혔는지 doctor로 먼저 확인.
좋아하는 기술 블로그 글이나 GitHub 레포 주소를 스튜디오 채팅에 붙여넣고, 에이전트가 만든 콘텐츠 그래프(스토리보드)를 graph viewer로 열어 본다. 프레임이 원문의 어느 논점에 대응하는지 짚어 보고, 프레임 텍스트를 인라인으로 고쳐 재렌더.
기존 템플릿 하나를 복제해 template.html-video.yaml의 inputs 스키마·best_for·category를 새로 채운다. search-templates --intent "..."로 내 의도가 새 템플릿에 매칭되는지 확인. SPDX·attribution 필드도 정직하게 기재.
render(input, ctx) 계약을 만족하는 아주 단순한 어댑터를 새로 쓴다. 예: 정적 HTML을 Playwright로 단일 프레임만 캡처해 PNG 시퀀스→mp4로 굽는 최소 구현. Hyperframes 어댑터를 참조 삼아 "최소 무엇을 구현하면 도는가"를 체득.
content-graph 스키마에 새 노드 타입(예: media)이나 엣지 종류를 추가하고, validate·topoSort·totalDurationSec와 에이전트 프롬프트(2라운드 프로토콜)까지 일관되게 갱신한다. 스키마 변경이 파이프라인 전체에 어떻게 전파되는지 끝까지 추적해 보는 게 핵심.
이 레포를 제대로 씹어먹기 위한 4주 코스.
| 주차 | 주제 | 구체적 목표 |
|---|---|---|
| 1주차 | TypeScript 모노레포 | pnpm 워크스페이스·workspace:*·tsconfig 상속·Biome를 익힌다. 미니 2-패키지 모노레포를 직접 만들어 일괄 빌드까지. 이 레포의 루트 설정 파일들을 줄별로 읽기. |
| 2주차 | 헤드리스 브라우저 + ffmpeg | Playwright로 화면 캡처, ffmpeg로 webm→mp4(libx264)·concat·오디오 mux. "HTML 애니메이션 한 장 → 영상" 파이프라인을 어댑터 없이 손으로 구현해 보기. |
| 3주차 | 에이전트 오케스트레이션 & ACP | child_process로 CLI를 띄워 stdin/stdout으로 대화하는 패턴, 스트리밍 파싱, ACP의 표준화 의의. runtime 패키지의 감지/spawn 흐름 분석. |
| 4주차 | 어댑터 패턴 & IR 설계 | "하나의 인터페이스, N개 백엔드"와 DAG·위상정렬. content-graph를 다시 구현하고, 새 엔진 어댑터 스텁을 끼워 "무엇을/어떻게의 분리"를 체득. |
비교 대상으로 Remotion(React로 영상), Motion Canvas / Revideo(TS 제너레이터), Manim(수학 애니메이션), 그리고 이 레포가 실제로 쓰는 Hyperframes(HTML+CSS+GSAP)를 나란히 보면, "같은 HTML→영상이라도 작성 모델이 얼마나 다른지"와 "왜 메타레이어가 필요한지"가 선명해진다. 자매 프로젝트 Open Design·HTML Anything도 같은 '에이전트 메타레이어' 철학을 다른 도메인에 적용한 사례라 함께 읽으면 좋다.
이 문서·레포에 등장한 용어를 한자리에.
| 용어 | 뜻 |
|---|---|
| 메타레이어 | 여러 엔진/도구를 하나의 공통 인터페이스로 감싸는 상위 계층. 아래 엔진을 몰라도 위 사용법은 동일. |
| HTML→영상 | 웹 기술로 한 장면을 만든 뒤 프레임 단위로 녹화해 동영상으로 인코딩하는 방식. |
| 어댑터 패턴 | 서로 다른 구현을 같은 모양의 인터페이스로 감싸 호출 쪽이 차이를 모르게 하는 설계. |
| render(input, ctx) | 모든 렌더 엔진이 만족해야 하는 단일 계약. 이것만 구현하면 어떤 엔진이든 어댑터가 된다. |
| 콘텐츠 그래프 | 다중 프레임 영상의 '대본'을 노드+엣지로 표현한 IR. 에이전트 1라운드 산출물. |
| IR (중간 표현) | 최종 산출물 전에 의미를 구조화해 담는 중간 단계. 검증·재사용·교체를 쉽게 함. |
| 노드(entity/data/text) | 콘텐츠 그래프의 한 장면 단위. 개체·데이터·텍스트 세 종류. |
| 엣지(sequence/contrast/dependency) | 노드 간 관계. 순서 선호(soft)·대비(순서무관)·순서 강제(hard)로 의미가 다름. |
| 위상정렬 (topological sort) | DAG를 의존성을 지키며 한 줄 순서로 펴는 알고리즘. 여기선 프레임 재생 순서 결정. |
| DAG | 방향이 있고 사이클이 없는 그래프. 의존 관계 표현의 기본 자료구조. |
| 헤드리스 크로미움 | 화면 없이 백그라운드로 도는 크롬. Playwright가 띄워 HTML 애니메이션을 녹화. |
| Playwright | 브라우저 자동화 라이브러리. 여기선 영상화의 '카메라' 역할. |
| ffmpeg / libx264 | 영상 인코딩 도구와 H.264 인코더. webm→mp4 변환·concat·오디오 mix 담당. |
| GSAP | JS 애니메이션 라이브러리. Hyperframes 템플릿이 움직임을 만드는 데 사용. |
| Hyperframes | 현재 유일하게 실제 렌더되는 엔진. HTML+CSS+GSAP 패러다임. |
| ACP (Agent Client Protocol) | 에이전트와 호출 앱이 stdio 위 표준 메시지로 대화하는 규약. |
| 모노레포 / pnpm 워크스페이스 | 여러 패키지를 한 저장소에서 함께 관리. workspace:*로 상호 참조, pnpm -r로 일괄 작업. |
| Biome | Rust 기반 린트+포맷 통합 도구(ESLint+Prettier 대체). |
| manifest (template.html-video.yaml) | 템플릿이 자기 용도·입력·출력·라이선스를 선언하는 메타데이터 파일. |
| SPDX | 오픈소스 라이선스를 식별하는 표준 ID 체계. 템플릿 출처 추적에 사용. |
| MiniMax | 배경음 생성 + TTS(내레이션)를 제공하는 외부 서비스(선택). |
| BYOK | Bring Your Own Key. CLI 없이 본인 API 키로 모델을 직접 호출하는 방식. |
원문으로 더 깊이 파고들 때.