TrendShift 딥다이브 · 2026-07-16 · Daily #13

oso95/scroll-world 딥다이브
— 스크롤 한 번에 "세계 속으로 날아드는" 랜딩페이지를 굽는 에이전트 스킬

scroll-world는 방문자가 마우스 휠을 굴리면 미리 렌더해 둔 카메라가 장면 바깥에서 안으로 날아 들어가고, 컷(cut) 없이 다음 장면으로 그대로 이어지는 "스크롤 스크럽(scroll-scrub)" 랜딩페이지를 만들어 주는 Claude Code · Codex 스킬이다. 화면 예술은 AI 영상 도구 Higgsfield로 뽑고, 웹페이지는 그 영상을 스크롤 위치에 맞춰 프레임 단위로 감았다 풀었다(scrub) 할 뿐이다. 스스로도 밝히듯 이 저장소의 값어치는 "프레임워크가 아니라 Higgsfield 파이프라인 · 프롬프트 · 이음매(seam) 봉합 방법"에 있다. 구성은 의외로 단출하다 — 의존성 0의 순수 바닐라 JS 스크럽 엔진 442줄 + 절차서 SKILL.md 535줄 + 플러그인 매니페스트 + ffmpeg 프레임 추출 + PIL 배경 제거 스크립트. 이 문서는 README를 넘어 scrub-engine.js·pipeline.md·prompts.md까지 뜯어 "여기서 무엇을 배울 수 있는가"를 정리한다. (저장소: oso95/scroll-world · 파일 11개 / 1,615줄 · MIT © cyw · v0.2.0 · 최신 커밋 2026-07-09 · TrendShift Daily #13 · #AI skills)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 지금 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 · 파일 구조 해부
  6. 학습 포인트
  7. 시스템 · 실행 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

이름부터 뜯어보기 — "scroll-world" = 스크롤을 굴리면 펼쳐지는 하나의 세계(world) 속을 카메라가 비행한다

scroll-world"어떤 브랜드·업종이든 스크롤로 그 세계 속을 훑고 지나가는 몰입형 랜딩페이지를 자동으로 만들어 주는 에이전트 스킬"이다. 사용자가 원하는 것은 대개 이런 히어로(hero) 화면이다 — 물류 회사라면 창고 바깥에서 시작해 스크롤을 내리는 순간 카메라가 문을 통과해 컨베이어·선반·트럭 사이를 날아다니고, 이어서 매끄럽게 다음 층(배송·데이터·고객)으로 흘러간다. 마치 축소 모형(디오라마) 세계를 손끝으로 여행하는 느낌이다. scroll-world는 이 경험 전체 — 인터뷰 → 장면 그림 생성 → 카메라 클립 생성 → 재생 엔진 배선 — 를 하나의 절차서(SKILL.md)로 묶어 에이전트가 대신 만들게 한다.

핵심 동작 원리는 딱 한 문장이다. 미리 렌더한 영상을 "스크롤 위치 = 재생 시각"으로 감아 돌린다. 스크롤을 20% 내리면 영상의 20% 지점 프레임을, 50% 내리면 50% 지점 프레임을 보여 준다. 영상이 저절로 재생되는 게 아니라 당신의 스크롤이 곧 재생 헤드(playhead)가 되는 것 — 이것을 스크롤 스크럽(scroll-scrubbing)이라 부른다. Apple 제품 페이지에서 스크롤할 때 제품이 회전·분해되는 그 기법이다.

핵심 용어
scroll-scrubbing (스크롤 스크럽) · scrub engine (스크럽 엔진)
스크럽은 원래 영상 편집기에서 타임라인을 손으로 앞뒤로 문질러(scrub) 원하는 프레임을 찾는 동작이다. scroll-world는 그 "문지르는 손"을 스크롤바로 바꾼다. 스크롤 y좌표를 계산해 video.currentTime(영상 재생 시각)에 대입하면, 스크롤을 올렸다 내렸다 할 때마다 영상이 앞뒤로 감긴다. 이 변환을 담당하는 442줄짜리 순수 자바스크립트 파일이 references/scrub-engine.js — 저장소가 말하는 "휴대 가능한(portable) 스크럽 엔진"의 실체다. 라이브러리 의존성이 0이라 순수 HTML·Next.js·Vue 어디에나 그대로 얹힌다.
핵심 용어
Agent Skill (에이전트 스킬) · SKILL.md
scroll-world는 실행되는 앱이 아니라 에이전트에게 "이렇게 만들어라"를 가르치는 절차서다. Claude Code·Codex 같은 에이전트가 읽는 SKILL.md(535줄)에는 YAML 머리말(무엇을·언제 쓰는지)과, 사용자 인터뷰 질문 → Higgsfield 프롬프트 → ffmpeg 명령 → 엔진 배선까지의 8단계 절차가 담겨 있다. 즉 사람이 아니라 AI가 이 문서를 읽고 손발이 되어 장면을 굽고 페이지를 조립한다. 이 "코드가 아니라 잘 쓴 지시서가 결과물"이라는 점이 2026년 스킬 생태계의 핵심 흐름이다.
한 문장 비유

"놀이공원의 다크라이드(실내 라이드) — 레일 위 차에 앉으면 세트장 사이를 스르륵 통과하는데, 그 '차의 속도'를 당신의 스크롤이 쥐고 있다"

디즈니 다크라이드는 관람차가 어두운 실내를 지나며 정교한 디오라마 세트를 하나씩 보여 준다. scroll-world의 랜딩페이지가 바로 이것이다 — 다만 레일을 굴리는 모터가 스크롤바다. 손을 멈추면 차도 멈추고, 되감으면 방금 지난 세트로 되돌아간다.

세트(장면)는 AI 영상 도구 Higgsfield로 미리 지어 두고, 세트와 세트 사이 "터널"은 앞 장면의 마지막 프레임과 뒷 장면의 첫 프레임을 이어 붙여 이음매가 안 보이게 봉합한다. 이 "미리 굽기 + 스크롤로 재생 + 프레임 봉합"의 삼박자가 이 저장소의 전부다(§4).

2왜 지금 주목받는가

TrendShift Daily #13 · #AI skills — "Apple급 스크롤 시네마틱을 3D 아티스트 없이 채팅으로"

2026년 TrendShift 상위권은 온통 에이전트·스킬이다. scroll-world는 그 흐름 안에서도 "보기에 화려한 결과물을 뽑는 스킬"이라 눈길을 끈다. 문제 정의가 명확하다 — 스크롤에 반응해 3D 세계 속을 나는 히어로 화면은 원래 WebGL/Three.js를 다루는 3D 아티스트나 값비싼 영상 프로덕션이 있어야 만들 수 있었다. scroll-world는 그 전체 파이프라인(프롬프트 + 생성 스크립트 + 재생 엔진)을 스킬로 포장해, 에이전트가 한 번의 인터뷰만으로 만들어 내게 한다. 실제로 plugin.json의 키워드에 webgl-alternative(WebGL 대체재)가 박혀 있다.

포인트내용
정체스킬 이자 플러그인. Claude Code 플러그인(.claude-plugin/) 안에 스킬(skills/scroll-world/)이 들어 있는 구조. npm install하는 런타임 라이브러리가 아니다.
배포 3경로① Claude Code 플러그인 ② Vercel skills CLI(npx skills add oso95/scroll-world) ③ Codex·Cursor 등 20+ 에이전트. 7/9 커밋이 ②③을 추가.
차별점진짜 어려운 건 화면이 아니라 "이음매를 프레임 단위로 똑같이 맞추는 것"(seamless chain). 이 봉합법이 스킬의 핵심 자산.
이식성출력 엔진이 의존성 0의 바닐라 JS라, 순수 HTML/Next.js/Vue/서버 렌더 페이지 어디든 드롭인.

주목 포인트 1 — "프레임워크가 아니라 방법을 판다"는 정직함

scroll-world의 문서에서 인상적인 건 스스로 값어치의 위치를 못 박는 태도다. "이 스킬의 가치는 프레임워크가 아니라 Higgsfield 파이프라인·프롬프트·이음매 방법이다"라고 명시한다. 실제로 재생 엔진(scrub-engine.js)은 442줄에 불과하고, 정작 분량과 노하우가 몰린 곳은 어떻게 장면을 일관되게 굽고, 어떻게 이음매를 안 보이게 봉합하느냐를 적은 SKILL.md(535줄)·pipeline.md·prompts.md다. "코드"가 아니라 "노하우"가 상품인 셈이다.

주목 포인트 2 — 두 개의 "연속성"이라는 물리 문제

AI로 만든 짧은 클립 여러 개를 이어 붙여 끊김 없는 한 편처럼 보이게 하려면, 두 가지가 동시에 맞아야 한다. scroll-world가 문서로 가르치는 이 구분이 이 저장소의 지적 핵심이다.

┌──────────────────────────────────────────────────────────────────┐ │ 끊김 없는 비행을 만드는 두 가지 연속성 │ │ │ │ ① 위치 연속성 (position) │ │ 앞 클립의 "마지막 프레임" = 뒷 클립의 "첫 프레임" │ │ → 실제로 렌더된 프레임을 뽑아 start/end 이미지로 물려서 해결 │ │ │ │ ② 속도 연속성 (velocity) │ │ 이음매를 넘어갈 때 카메라가 "방향을 뒤집으면" 안 된다 │ │ → 뒤집히는 순간 "되감기 스터터(rewind stutter)"로 보임 │ │ │ │ 결론: 한 클립 안에서는 카메라가 자유(궤도·크레인업)롭게 놀아도, │ │ 마지막 ~1초엔 반드시 "앞으로 흐르는" 상태로 안착해야 한다 │ │ (= 모션 핸드오프 계약, motion handoff contract) │ └──────────────────────────────────────────────────────────────────┘

정리하면 scroll-world의 진짜 상품은 "예쁜 영상"이 아니라, 여러 AI 클립을 물리적으로 자연스럽게 잇는 규칙이다. 이 규칙을 모르고 그냥 클립을 붙이면 이음매마다 화면이 "툭" 튀거나 되감기처럼 보인다 — scroll-world가 문서 절반을 이 실패를 막는 데 쓰는 이유다.

중요 · 오해 방지 — "엔진"이라는 말에 속지 말 것
이건 실행되는 앱·라이브러리가 아니다. 스킬 정의 + 참조용 JS 한 장이다

"scrub-engine"이라는 이름 때문에 대단한 런타임을 떠올리기 쉽지만, 실행 가능한 앱도, 서버도, npm 패키지도, 테스트도, CI도 없다. 저장소는 파일 11개 / 1,615줄이 전부이고, scrub-engine.js는 "당신 프로젝트에 복사해 넣는 참조 코드"다(편의를 위해 window.mountScrollWorld로 노출은 됨).

게다가 생성된 영상 에셋(.mp4/.webp)은 저장소에 없다. README도 "프로젝트마다 만들어지는 것이라 여기 넣지 않았다"고 밝힌다. 즉 저장소만 클론해서는 동작하는 데모를 볼 수 없다 — Higgsfield로 직접 장면을 구워야 비로소 완성된다. 이 "스킬 = 지시서, 결과물 = 사용자가 생성"이라는 구조를 이해하는 게 첫걸음이다.

3기술 스택 전체 지도

첫 번째 반전 — package.json이 없다. "앱 스택"이 아니라 "에셋을 굽는 절차 + 재생기 한 장"이다

보통 "스킬"이라 하면 Node/Python 프로젝트를 떠올리지만, scroll-world엔 빌드도 node_modules도 없다. 대신 두 개의 세계가 공존한다 — (A) 빌드 타임에 외부 CLI들(Higgsfield·ffmpeg·PIL)로 에셋을 굽는 파이프라인, (B) 런타임에 브라우저에서 도는 의존성 0의 재생 엔진. 이 둘의 경계가 스택 지도의 뼈대다.

레이어내용
스킬 정의SKILL.md(535줄) — YAML 머리말 + 8단계 절차. allowed-tools: Bash, Read, Write, Edit, AskUserQuestion, Skill.
플러그인 매니페스트.claude-plugin/plugin.json(v0.2.0) + marketplace.json(스키마 anthropic.com/claude-code/marketplace.schema.json, 카테고리 design).
스크럽 엔진references/scrub-engine.js — 바닐라 JS 442줄, 의존성 0. DOM을 스스로 만들고 CSS를 @layer sw 캐스케이드 레이어로 주입.
이미지 생성Higgsfield gpt_image_2(아이소메트릭 디오라마 스틸, 3:2, 2k). 대안 nano_banana_2(→ nano_banana_pro 별칭).
영상 생성Higgsfield 이미지→영상. 기본 seedance_2_0, 로스터에 kling3_0·seedance_2_0_mini. 선택 규칙: --start-image--end-image를 둘 다 받는 모델이어야 이음매를 프레임 고정.
Higgsfield 연동HTTP API/SDK가 아니라 higgsfield CLI로. 인증 higgsfield auth login, 생성 higgsfield generate create ... --wait --json, 결과 URL은 .[0].result_url. 별도 higgsfield-generate 스킬에 CLI 설치를 의존.
미디어 툴링ffmpeg/ffprobe로 프레임 추출(-sseof=끝 프레임)·인코딩(libx264, crf 20, -g 8, faststart, unsharp).
선택 · 파이썬references/knockout.py — 순수 PIL/Pillow(numpy 없음). 테두리 연결 플러드필로 배경 제거해 디오라마를 "떠 있게".
템플릿references/index-template.html(73줄) — 엔진을 마운트하는 최소 독립 페이지.

SKILL.md YAML 머리말 (실제 원문)

# skills/scroll-world/SKILL.md
name: scroll-world
description: >
  Build an immersive scroll-scrubbed "fly through the world" landing page for any
  industry or brand using Higgsfield. As the visitor scrolls, a pre-rendered camera
  flies from outside each scene into its interior, then flows on to the next scene
  with NO cuts — one continuous connected flight (Emons-style isometric diorama
  world, or any art direction you pick). The skill interviews the user for the topic,
  the story beats/sections, and brand kit, then generates cohesive scenes + seamless
  camera clips with Higgsfield and wires a portable, framework-agnostic scroll-scrub
  engine. Use when the user wants a "3D world" / "browse-through-the-industry" hero,
  a scroll cinematic, a diorama landing, or to turn a business into a scrollable world.
allowed-tools: Bash, Read, Write, Edit, AskUserQuestion, Skill

allowed-tools가 재미있다. 이 스킬은 Bash(higgsfield·ffmpeg 실행)·Read/Write/Edit(파일 조립)·AskUserQuestion(사용자 인터뷰)·Skill(다른 스킬 higgsfield-generate 호출)을 요구한다. 즉 스킬 스스로 "나는 셸을 돌리고, 사용자에게 질문하고, 다른 스킬을 부른다"고 선언한 것 — 스킬의 권한 명세가 곧 그 스킬의 행동 요약이다. (머리말에 version 필드는 없다. 버전 번호는 plugin.json0.2.0이 유일.)

핵심 용어 · 왜 "빌드 타임 vs 런타임" 구분이 중요한가
generation pipeline (생성 파이프라인) ↔ playback engine (재생 엔진)
scroll-world를 오해 없이 이해하려면 두 시점을 갈라야 한다. 생성 파이프라인은 에이전트가 개발자 컴퓨터에서 한 번 돌리는 것 — Higgsfield로 그림·영상을 굽고 ffmpeg로 인코딩한다(외부 CLI·유료 크레딧·인터넷 필요). 재생 엔진은 그렇게 구운 영상을 담아 방문자 브라우저에서 매번 도는 것 — 여기엔 외부 의존성이 0이고 인터넷도 필요 없다. "무겁고 유료인 부분(생성)"과 "가볍고 공짜인 부분(재생)"을 분리했기에, 완성된 페이지는 정적 호스팅만으로 배포된다.

4아키텍처 심화 분석

인터뷰 → 장면 → 클립 → 봉합 → 인코딩 → 배선의 파이프라인, 그리고 브라우저에서 스크롤을 프레임으로 바꾸는 재생 엔진

4-1. 전체 파이프라인 — 입력 한 번에서 랜딩페이지까지

scroll-world를 이해하는 가장 빠른 길은 "장면 N개"가 어떻게 "끊김 없는 한 편의 비행"이 되는지를 따라가는 것이다. 에이전트는 먼저 사용자를 인터뷰해 주제·장면 순서·브랜드 키트를 받고, 각 장면을 공통 스타일 서두(style preamble)로 일관되게 굽는다. 그다음이 이 저장소의 묘미인 이음매 봉합이다.

[인터뷰] 주제 · 브랜드킷 · 아트디렉션 · 순서 있는 장면들 · 모바일 여부 │ ├─> ② 장면 스틸 N장 (gpt_image_2, 공통 "스타일 서두" = 일관성) ├─> ③ (선택) knockout.py 디오라마를 투명 배경 위에 띄우기 ├─> ④ "다이브인" 클립 N개 카메라가 장면 밖→안으로 파고듦 ├─> ⑤ 커넥터 클립 N-1개 장면 i에서 떠올라 → 넘어가 → 장면 i+1로 하강 │ └─ 이음매 봉합: 커넥터.start = dive_i의 "실제 마지막 프레임", │ 커넥터.end = dive_{i+1}의 "실제 첫 프레임" ├─> ⑥ ffmpeg 인코딩 네이티브 1080p, crf20, -g 8, faststart, 무음 └─> ⑦ scrub-engine.js 배선(config 주입) → 하나로 이어지는 비행

여기서 반드시 지켜야 할 규칙 하나 — 이음매 프레임은 "스틸 그림"이 아니라 "실제 렌더된 영상"에서 뽑아야 한다. 그림을 그대로 물리면 미묘하게 어긋나 이음매가 "툭" 튄다. 그래서 파이프라인은 dive 클립을 렌더한 뒤, 그 영상의 마지막/첫 프레임을 ffmpeg로 추출해 커넥터의 start/end 이미지로 되먹인다.

4-2. 두 개의 카메라 아키텍처 — 품질을 가르는 최대 레버

scroll-world는 콘텐츠 성격에 따라 두 가지 카메라 설계 중 하나를 고르라고 가르친다. 이 선택이 결과물의 자연스러움을 좌우한다.

방식언제 · 어떻게
A) 연속 전진 테이크
(권장·현실적 walkthrough)
오직 앞으로만 미끄러지는 카메라 하나. 각 구간(leg)을 순차 생성하되, 매 구간의 --start-image=직전 구간의 실제 마지막 프레임, --end-image는 안 씀(끝 이미지를 주면 카메라가 뒤로 당겨져 스터터의 주범). 커넥터가 아예 없다 — 구간들이 곧 여정.
B) 다이브인 + 공중 커넥터
(디오라마·미니어처 전용)
각 장면으로 파고든 뒤(dive), 커넥터가 위로 빠져나와 다음 장면으로 난다. 이음매마다 카메라 방향이 뒤집히므로, 지도 같은 미니어처 미감에서만 자연스럽게 읽힌다.

핵심 통찰은 "방향 반전은 오직 하늘에서 내려다보는 미니어처 세계에서만 용서된다"는 것이다. 현실적인 1인칭 walkthrough에서 이음매마다 카메라가 뒤로 튀면 시청자는 즉시 "되감기"로 인식한다. 그래서 대부분의 경우 방식 A(커넥터 없는 연속 전진)가 안전하다.

4-3. 재생 엔진의 심장 — 스크롤을 프레임으로 (scrub-engine.js)

브라우저 쪽 원리는 단순하다. requestAnimationFrame 루프가 매 프레임 "지금 스크롤 목표값"을 향해 현재값을 부드럽게 보간(lerp)하고, 그 값을 video.currentTime으로 찍는다. 스크롤을 홱 내려도 영상이 톡 끊기지 않고 스르륵 따라오는 이유다.

// scrub-engine.js — 스크롤→재생시각 보간 루프(핵심)
function raf() {
  const eps = isMobile() ? 0.02 : 0.008;   // 폰에선 거친 스텝 = 디코딩 절약
  for (let i = 0; i < NSEG; i++) {
    const s = SEGMENTS[i];
    if (!s.hasClip || !s.ready || !s.video) continue;
    if (s.video.seeking) continue;        // 아직 seek 중이면 새 seek 안 넣음(멈춤 방지)
    if (!s.visible && Math.abs(s.cur - s.target) < 0.002) continue;
    s.cur += (s.target - s.cur) * (reduce ? 1 : 0.18);   // 스크롤 목표로 보간
    const dur = s.video.duration || 1;
    const t = clamp(s.cur, 0, 0.999) * dur;
    if (Math.abs(s.video.currentTime - t) > eps) {
      try { s.video.currentTime = t; } catch (e) {}
    }
  }
  requestAnimationFrame(raf);
}
핵심 용어 · 이 저장소에서 가장 영리한 트릭
Blob-URL seek trick (블롭 URL 시크 우회)
스크럽이 되려면 브라우저가 영상의 아무 시각으로나 순간이동(seek)할 수 있어야 한다. 그런데 python -m http.server 같은 단순 정적 호스트나 일부 CDN은 HTTP 바이트 범위 요청(byte-range)을 안 받는다. 그러면 video.seekable[0,0]으로 굳어 스크럽이 완전히 얼어붙는다. scroll-world의 해법: 영상을 <video src>로 바로 틀지 않고, fetch()로 통째 받아 Blob으로 만든 뒤 URL.createObjectURL로 메모리 URL을 만들어 재생한다. 메모리에 통째 올라온 블롭은 언제나 완전히 seek 가능하므로, 서버의 바이트 범위 지원 여부와 무관해진다. (전(全)-인트라 인코딩도 불필요.)
// scrub-engine.js — 클립을 Blob으로 받아 seek 가능하게 + iOS 안전 노출
const url = (isMobile() && s.clipM) ? s.clipM : s.clip;
fetch(url).then(r => r.ok ? r.blob() : Promise.reject(new Error('404')))
  .then(blob => {
    const v = document.createElement('video');
    v.muted = true; v.playsInline = true; v.preload = 'auto';
    v.src = URL.createObjectURL(blob);          // 블롭은 항상 완전 seek 가능
    v.addEventListener('loadedmetadata', () => { s.ready = true; read(); });
    // 진짜 프레임이 그려진 뒤에야 스틸 포스터를 숨김(iOS 빈 영상 버그 회피)
    v.addEventListener('seeked', () => { s.el.classList.add('has-clip'); }, { once: true });
    s.el.appendChild(v); s.video = v; s.hasClip = true;
  }).catch(() => { s.loading = false; });

4-4. 이음매 프레임 추출 — 왜 세계가 "이어져" 보이는가 (pipeline.md)

커넥터가 앞뒤 장면과 딱 맞물리는 비결은 결국 두 줄의 ffmpeg 명령이다. 스틸이 아니라 렌더된 영상에서 경계 프레임을 뽑는 게 규칙의 전부다.

# pipeline.md — 커넥터의 start=dive_i의 마지막 프레임, end=dive_{i+1}의 첫 프레임
# 첫 프레임(도입부 establishing):
ffmpeg -v error -ss 0 -i "$WORK/dive_$n.mp4" -frames:v 1 -q:v 2 "$WORK/first_$n.png"
# 마지막 프레임(장면 내부, 끝에서 0.15초 지점):
ffmpeg -v error -sseof -0.15 -i "$WORK/dive_$n.mp4" -frames:v 1 -q:v 2 "$WORK/last_$n.png"
핵심 용어
GOP · keyframe (키프레임 간격) · -g 8
영상은 완전한 그림(키프레임)과 "직전 대비 차이"만 담은 프레임으로 이뤄진다. 임의 시각으로 seek하면 브라우저는 그 지점 직전 키프레임부터 다시 디코딩해야 하므로, 키프레임이 드물면 스크럽이 버벅인다. scroll-world는 인코딩 시 -g 8(데스크톱)/-g 4(모바일)로 키프레임을 촘촘히 박아, 어느 시각으로 튀어도 디코딩 비용을 낮춘다. 스크럽 영상이 일반 영상보다 파일이 커지는 대가로 "어디로 감아도 즉시 반응"을 산다. 여기에 faststart로 메타데이터를 앞으로 당겨, 받자마자 재생·seek이 가능하게 한다.
한눈 정리 · 아키텍처가 지키는 4대 원칙
미리 굽기 · 스크롤=재생헤드 · 프레임 봉합 · 무의존 재생

미리 굽기: 무겁고 유료인 AI 생성은 빌드 타임 한 번, 방문자는 결과 영상만. ② 스크롤=재생헤드: scrollY → currentTime + rAF 보간으로 부드러운 스크럽. ③ 프레임 봉합: 스틸이 아닌 실제 렌더 프레임을 start/end로 물려 위치 연속성, 방향 반전 금지로 속도 연속성. ④ 무의존 재생: 블롭 URL로 바이트 범위 문제를 우회해, 정적 호스팅만으로 어디서나 동작. 네 원칙 모두 "3D 아티스트 없이 시네마틱 랜딩"이라는 목표에 직결된다.

5디렉토리 · 파일 구조 해부

파일 11개 / 1,615줄 — "플러그인 껍데기 → 스킬 절차서 → 참조 자산(엔진·스크립트·프롬프트)"의 3겹

이 저장소는 작다. 그래서 오히려 스킬/플러그인의 표준 골격을 통째로 보기에 좋은 교보재다. 바깥은 플러그인·마켓플레이스 매니페스트, 안쪽은 절차서 SKILL.md, 그 아래 references/에 실제로 복사·실행할 자산들이 담긴다.

scroll-world/ ├── README.md (103줄) 설치 3경로·요구사항·소개·star history ├── LICENSE ( 21줄) MIT, © 2026 cyw ├── .gitignore ( 2줄) .DS_Store, node_modules/ ├── .claude-plugin/ │ ├── plugin.json ( 21줄) 이름·설명·버전 0.2.0·저자·키워드 — 플러그인 매니페스트 │ └── marketplace.json ( 18줄) 마켓플레이스 항목(카테고리 design) → ./skills/scroll-world └── skills/scroll-world/ ├── SKILL.md (535줄) ★ 절차서: 8단계 + 이음매 규칙 + 카메라 문법 + 함정 └── references/ ├── scrub-engine.js (442줄) ★ 재생기: DOM+CSS+스크럽+블롭+지연로딩+크로스페이드+모바일 ├── pipeline.md (170줄) 복붙용 bash 배치 스크립트(생성→프레임→커넥터→인코딩) ├── prompts.md (141줄) 인터뷰 체크리스트 + 모든 Higgsfield 프롬프트 템플릿 + 스타일 서두 ├── knockout.py ( 89줄) PIL 테두리연결 배경제거(떠 있는 장면용) └── index-template.html ( 73줄) 엔진을 마운트하는 최소 독립 페이지
경로역할
SKILL.md두뇌. 에이전트가 읽는 절차서. 8단계 워크플로 + "이음매는 실제 프레임으로" 규칙 + A/B 카메라 문법 + 실패 함정 모음. 여기만 읽어도 개념이 다 잡힌다.
references/scrub-engine.js심장. 복사해 쓰는 재생기 442줄. 스크롤 보간·블롭 seek·지연 로딩·크로스페이드·모바일 하드닝을 전부 담은 단일 파일.
references/pipeline.md손. bash 3.2 호환 배치 스크립트 — Higgsfield 생성, 프레임 추출, 커넥터 생성, ffmpeg 인코딩을 복붙 가능한 형태로.
references/prompts.md말. 인터뷰 질문지 + 장면·다이브·커넥터별 Higgsfield 프롬프트 템플릿 + 일관성용 "스타일 서두".
references/knockout.py가위. 순수 PIL 플러드필로 배경을 오려내 디오라마를 투명 위에 띄움(선택 단계).
.claude-plugin/*포장. plugin.json(버전·키워드·저자) + marketplace.json(design 카테고리). Claude Code가 "플러그인"으로 인식하게 하는 껍데기.
한눈에 — "레시피 카드 한 장 + 재료 손질법"

이 폴더 구조는 요리 키트에 가깝다. SKILL.md메인 레시피 카드(순서대로 하라), references/손질된 재료와 도구다 — scrub-engine.js는 완성 그릇, pipeline.md는 불 조절표, prompts.md는 양념 배합표, knockout.py는 다듬는 칼. 코드가 적은 대신 "어떻게"가 문서에 촘촘히 적힌, 노하우 중심 저장소의 전형이다.

6학습 포인트

이 저장소에서 "예쁜 랜딩페이지"가 아니라 "웹 미디어 엔지니어링 + 스킬 저작"으로 가져갈 것들

배울 것 1 — 스크롤 구동 영상 스크러빙 (Apple 제품 페이지 기법)

scrollYvideo.currentTime에 매핑하고 requestAnimationFrame으로 부드럽게 보간하는, 고급스러운 스크롤 인터랙션의 정석을 실물로 볼 수 있다. 특히 "seek 가능성(seekable)은 키프레임 밀도와 별개"라는, 실무에서 자주 헷갈리는 지점을 코드로 이해하게 된다.

배울 것 2 — 블롭 URL로 바이트 범위 문제 우회

정적 호스트가 HTTP 바이트 범위를 안 받아 seekable=[0,0]이 되는 실전 함정과, 그것을 fetch → Blob → objectURL로 우아하게 피하는 법. 영상뿐 아니라 "부분 요청이 필요한 모든 미디어"에 적용되는 범용 트릭이다.

배울 것 3 — 프레임 단위로 AI 클립 봉합하기

ffmpeg -sseof(끝 프레임)·-ss 0(첫 프레임)로 경계 프레임을 뽑아 AI 영상의 --start-image/--end-image로 되먹여 이음매 없이 잇는 기법. 짧은 생성 클립들을 긴 시퀀스로 엮는 요즘 AI 영상 워크플로의 핵심 노하우다.

배울 것 4 — 카메라 모션 연속성 이론

"위치 연속성 vs 속도 연속성", 이음매를 넘어 방향을 뒤집으면 되감기처럼 보인다는 통찰. 영상·게임·모션 그래픽 어디서나 통하는 원리를, "왜 대부분은 커넥터 없는 연속 전진이 안전한가"라는 구체적 판단으로 배운다.

배울 것 5 — 모바일 영상 하드닝(hardening)

seek 병합(video.seeking 중엔 새 seek을 안 넣어 얼어붙음 방지), iOS 프라이밍(첫 제스처에 muted play→pause를 걸어야 seek된 muted 영상이 화면에 그려짐), 스틸을 포스터로 유지, URL바만 바뀌는 resize 무시, safe-area 대응 — 모바일 웹 영상의 지뢰밭을 하나하나 밟아 본 흔적이 그대로 교재다.

배울 것 6 — Claude Code 스킬/플러그인 저작 + CSS 캐스케이드 레이어

SKILL.md 머리말(allowed-tools), plugin.json+marketplace.json 스키마, skills CLI로 20+ 에이전트에 배포하는 법. 덤으로 엔진이 쓰는 @layer sw 캐스케이드 레이어 — 사용자 테마 토큰이 항상 엔진 기본값을 이기게 하는(특정성 해킹 없이) 현대 CSS 기법과 color-mix() 테마링.

한 줄 정리 · 재사용 가능한 교훈
"scroll-world는 '3D처럼 보이지만 실은 영상 스크럽' — 무거운 것을 미리 굽고, 가벼운 재생만 사용자에게 넘긴다"

이 저장소가 남기는 큰 교훈은 분명하다. 비싼 계산(AI 생성·3D)은 빌드 타임에 한 번, 사용자 런타임엔 그 산출물만 가볍게 재생하라. 그리고 그 재생을 정적 호스팅 어디서나 안정적으로 돌리려면 블롭 seek·프레임 봉합·모바일 하드닝 같은 웹 미디어의 실전 디테일을 챙겨야 한다. Higgsfield를 안 써도, 스크롤 인터랙션을 만드는 누구에게나 통하는 원칙이다.

7시스템 · 실행 요구사항

두 국면으로 나뉜다 — "생성(무겁고 유료)"과 "재생(가볍고 공짜)"

요구사항은 §3에서 나눈 두 국면을 그대로 따른다. 에셋을 굽는 동안엔 외부 CLI와 유료 크레딧·인터넷이 필요하지만, 완성된 페이지 자체는 브라우저만 있으면 된다.

항목요구/수치
Higgsfield CLI인증(higgsfield auth login) + 유료 크레딧 필요. 장면 N개면 대략 이미지 N회 + 영상 (2N−1)회 생성. 생성 1건당 3~8분 → 백그라운드 실행 후 폴링.
ffmpeg / ffprobePATH에 설치 필수(프레임 추출 + 인코딩).
Python3 + Pillow선택knockout.py(떠 있는 장면)에만. 대안으로 cwebp/sips.
Node버전 요구 없음. 엔진은 의존성 0의 브라우저 JS라 npm 설치 자체가 없다.
브라우저(재생)모던 브라우저 — color-mix(), 캐스케이드 레이어, dvh, env(safe-area-inset-*) 사용.
셸 호환스크립트가 bash 3.2(macOS 기본)에서 돌도록 작성 — declare -A 연관배열 회피.
모바일스크롤 스크럽은 데스크톱 태생 기법 → 모바일 지원은 명시적 베타. 저사양 기기는 버벅일 수 있어, 스킬이 "모바일 생성 전 항상 사용자에게 물어라"를 강제.
한눈 요약 — "부엌은 무겁지만, 접시는 가볍다"

비유하면 요리하는 부엌(생성)엔 값비싼 화덕(Higgsfield 크레딧)과 온갖 도구(ffmpeg·PIL)가 필요하지만, 손님상에 나가는 완성 접시(랜딩페이지)는 브라우저만 있으면 어디서든 먹을 수 있다. 그래서 개발자는 한 번 고생해 굽고, 방문자는 가볍게 스크롤만 하면 된다. 다만 부엌 비용(생성 크레딧·시간)이 실제로 든다는 점은 분명히 알고 시작해야 한다.

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

Higgsfield 없이도 시작 가능 — 난이도별로 "재생 원리 → 프레임 봉합 → AI 생성 → 전체 파이프라인 → 스킬 개조"까지

먼저 스킬 설치. Claude Code 플러그인으로도, 범용 skills CLI로도 된다.

# 설치 (둘 중 하나)
# ① Claude Code 플러그인 마켓플레이스로
# ② 범용 skills CLI (Codex·Cursor 등 20+ 에이전트에도 설치)
npx skills add oso95/scroll-world

# 이후 에이전트에게: "우리 회사 세계를 스크롤 랜딩으로 만들어줘"
실습 1 · 난이도 ★☆☆☆☆

아무 mp4로 스크럽 원리 체험하기 — 재생 엔진만 떼어 보기

Higgsfield 없이 시작한다. 손에 있는 짧은 mp4 하나와 references/index-template.html·scrub-engine.js만으로, 스크롤을 내리면 그 영상이 감겼다 풀렸다 하는 최소 페이지를 만든다. python -m http.server로 띄워 보고, 블롭 로딩을 꺼 보면 왜 스크럽이 얼어붙는지(바이트 범위 문제)를 눈으로 확인할 수 있다.

실습 2 · 난이도 ★★☆☆☆

ffmpeg로 두 클립의 이음매 만들기 — 프레임 봉합 체득

영상 두 개를 준비해, -sseof -0.15로 앞 영상의 마지막 프레임을, -ss 0로 뒷 영상의 첫 프레임을 뽑아 이어 붙여 본다. 그런 다음 일부러 스틸 그림을 이음매로 써 보고 "툭" 튀는 현상을 재현하면, scroll-world가 왜 "실제 렌더 프레임"을 고집하는지 몸으로 이해된다.

실습 3 · 난이도 ★★★☆☆

Higgsfield로 장면 1개 + 다이브인 클립 굽기 — 생성 파이프라인 입문

higgsfield auth loginprompts.md의 스타일 서두를 활용해 gpt_image_2로 아이소메트릭 장면 스틸 1장을 만들고, 그걸 seedance_2_0--start-image로 물려 "밖에서 안으로 파고드는" 다이브인 클립을 뽑는다. 생성이 3~8분 걸리니 --wait --json과 폴링을 어떻게 다루는지 pipeline.md로 확인.

실습 4 · 난이도 ★★★★☆

3장면 "연속 전진 테이크" 완주 — 방식 A로 끊김 없는 비행

커넥터 없이(방식 A) 장면 3개를 순차 생성한다. 매 구간의 --start-image를 직전 구간의 실제 마지막 프레임으로 물리고 --end-image는 쓰지 않는다. 인코딩(-g 8·faststart) 후 엔진에 배선해, 이음매마다 방향이 뒤집히지 않는 매끈한 walkthrough가 나오는지 검증한다.

실습 5 · 난이도 ★★★★★

스킬 자체를 개조하기 — 아트디렉션·모바일 하드닝 확장

SKILL.mdprompts.md를 포크해 다른 아트디렉션(예: 종이공예·네온 사이버펑크)의 스타일 서두를 새로 짜 넣거나, scrub-engine.js의 모바일 분기(eps·seek 병합·iOS 프라이밍)를 저사양 기기용으로 더 강화한다. 바꾼 스킬을 skills CLI로 재설치해 내 손의 스킬이 에이전트에게 먹히는 전 과정을 완주한다.

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

scroll-world를 정복하며 곁들여 익히면 좋은 것들 — 주차별 5단계
주차주제 · 목표
1주차스크롤 인터랙션 기초. scroll 이벤트·requestAnimationFrame·선형 보간(lerp)으로 "스크롤 위치 → 값" 매핑을 손에 익힌다. 목표: scrub-engine.jsraf() 루프를 읽을 수 있게.
2주차HTML5 <video> 심화. currentTime·seekable·seeking 이벤트, HTTP 바이트 범위 요청, Blob·objectURL, 그리고 모바일(iOS) 재생 제약. "왜 스크럽이 얼어붙는가"를 원리로 이해.
3주차ffmpeg 프레임 추출·인코딩. -sseof/-ss로 프레임 뽑기, libx264·-g(GOP)·faststart·crf의 의미. 스크럽에 최적화된 인코딩이 일반 인코딩과 어떻게 다른지 실습.
4주차Claude Code 스킬/플러그인 저작. SKILL.md 머리말(name/description/allowed-tools), plugin.json+marketplace.json 스키마, skills CLI 배포. scroll-world를 교보재로 내 스킬을 하나 만들어 본다.
5주차AI 이미지→영상 생성 + 카메라 연속성. Higgsfield CLI(gpt_image_2·seedance_2_0), --start-image/--end-image 조건부 생성, 그리고 짧은 클립을 긴 시퀀스로 잇는 위치·속도 연속성 이론까지. "미니어처만 방향 반전이 허용된다"를 직접 재현.

10핵심 키워드 사전

이 문서와 저장소에서 반복되는 용어 빠른 참조
용어
scroll-scrubbing스크롤 위치를 영상 재생 시각(currentTime)에 매핑해, 스크롤로 영상을 앞뒤로 감는 기법. scroll-world의 핵심 상호작용.
scrub engine그 매핑을 담당하는 scrub-engine.js(바닐라 JS 442줄, 의존성 0). 프레임워크 무관 드롭인.
dive-in / connector다이브인=장면 밖에서 안으로 파고드는 클립. 커넥터=장면 i에서 빠져나와 i+1로 잇는 클립(방식 B에서만).
seam (이음매)두 클립이 만나는 경계. 앞 클립의 마지막 프레임 = 뒷 클립의 첫 프레임으로 봉합해야 "튀지" 않는다.
position / velocity 연속성이음매에서 지켜야 할 두 가지 — 위치(프레임 일치)와 속도(방향을 뒤집지 않기). 후자가 깨지면 되감기처럼 보임.
Emons-style diorama이 스킬이 기본으로 삼는 미감 — 위에서 내려다보는 아이소메트릭 미니어처(디오라마) 세계.
Higgsfield이미지·영상을 만드는 AI 도구. scroll-world는 SDK가 아니라 higgsfield CLI로 호출(유료 크레딧 필요).
gpt_image_2 / seedance_2_0각각 Higgsfield의 기본 이미지 / 영상 모델. 영상 모델은 --start/--end-image를 받아야 이음매 고정 가능.
seekable / byte-range영상의 임의 시각 이동 가능 여부 / 그걸 가능케 하는 HTTP 부분 요청. 정적 호스트가 안 주면 스크럽이 얼어붙음.
Blob URL 트릭영상을 fetchBlobobjectURL로 메모리에 올려, 바이트 범위 지원과 무관하게 완전 seek 가능하게 만드는 우회.
GOP / -g키프레임 간격. -g 8처럼 촘촘히 박으면 어느 시각으로 seek해도 디코딩이 빨라 스크럽이 매끄럽다(파일은 커짐).
SKILL.md / skills CLI에이전트가 읽는 절차서(YAML 머리말+본문) / npx skills add로 20+ 에이전트에 스킬을 설치하는 범용 도구.
knockout (배경 제거)knockout.py가 순수 PIL 플러드필로 테두리에 연결된 배경만 오려내, 디오라마를 투명 위에 띄우는 선택 단계.

11참고 링크

공식 소스 우선 — 버전·수치는 클론한 소스(v0.2.0, 커밋 f941ef9) 기준

공식
· GitHub 저장소: github.com/oso95/scroll-world (스킬/플러그인 · MIT · © 2026 cyw)
· TrendShift 카드: trendshift.io/repositories/78158 (Daily #13 · #AI skills)
· 설치: npx skills add oso95/scroll-world (범용) 또는 Claude Code 플러그인

저장소 안에서 꼭 읽을 것
· skills/scroll-world/SKILL.md — 8단계 절차 + 이음매 규칙 + 카메라 문법 + 함정(개념의 두뇌)
· references/scrub-engine.js — 스크롤 보간 · 블롭 seek · 모바일 하드닝(재생의 심장)
· references/pipeline.md — 복붙용 bash 배치(생성→프레임→커넥터→인코딩)
· references/prompts.md — 인터뷰 질문 + Higgsfield 프롬프트 템플릿 + 스타일 서두

곁들여 학습
· 이미 분석한 higgsfield-cli 딥다이브 — 이 스킬이 의존하는 영상 생성 CLI
· HTML5 <video> seek·byte-range·Blob URL (MDN)
· ffmpeg 프레임 추출·GOP·faststart 문서
· Claude Code 스킬/플러그인 저작 규격 (SKILL.md · marketplace 스키마)
· CSS 캐스케이드 레이어(@layer) · color-mix()

참고 · 문서와 실제의 차이 (소스 정독으로 발견)
"엔진"이라는 이름과 실제 산출물의 간극에 주의

① 저장소만으로는 동작 데모가 없다 — 생성된 영상 에셋(.mp4/.webp)은 프로젝트마다 만들어지는 것이라 포함돼 있지 않다. Higgsfield로 직접 구워야 완성된다. ② README가 언급하는 /scroll-world 슬래시 명령을 뒷받침하는 commands/ 디렉토리는 없다 — 스킬 호출 자체를 가리키는 표현이다. ③ 모바일은 명시적 베타이고, Higgsfield 영상 필터가 "bed/pool/spa/wine/swim" 같은 무해한 맥락을 오탐(NSFW)하는 알려진 함정이 있어 재시도·모델 폴백·커넥터 null 우회가 문서화돼 있다. ④ 이 문서의 수치는 분석 시점 최신 커밋(2026-07-09, f941ef9) 기준이며, 트렌딩 특성상 지표는 계속 바뀐다.