oso95/scroll-world는 브랜드·산업을 스크롤 기반의 3D world landing page로 바꾸는 에이전트 스킬이다. 에이전트가 브랜드와 장면을 인터뷰한 뒤, 일관된 diorama still과 프레임 고정형 camera-flight 영상을 생성하고, 스크롤 위치를 영상 시간으로 매핑하는 portable vanilla-JS 엔진을 연결한다.
한눈에 보기
- 프로젝트 성격: Claude Code plugin/marketplace와
SKILL.md호환 에이전트용 작업 절차. - 주 결과물: 장면별 still, 장면에 진입하는 dive/leg 영상, 장면 사이를 잇는 connector, 그리고 스크롤로 전체 영상을 탐색하는 landing page.
- 고정 기준:
main의71cc36d3bb150248ae36a2c552f9cbf88802a79c(docs: seam QA calibration — judge composition, not raw PSNR, 2026-07-29). - 메타데이터 스냅샷: JavaScript 저장소, 7,759 stars, 880 forks, 9 open issues, GitHub API 라이선스
MIT License, 비아카이브 상태. 수치는 2026-08-08 KST의 변동 가능한 스냅샷이다. - 릴리스 메타데이터: plugin version
0.8.0, authorcyw,license: MIT. - 라이선스: 루트
LICENSE와 plugin metadata 모두 MIT를 표시한다. 생성된 영상·이미지 asset과 외부 생성 서비스의 이용 조건까지 MIT라고 확장하지 않는다. - 구현 핵심: framework-agnostic vanilla JavaScript, zero runtime dependency, 자체 DOM/CSS 생성, Blob 기반 video seek,
requestAnimationFrame기반currentTimescrub. - 검증 상태: source inspection과 정적 해시 검증은 완료했지만, plugin 설치, 외부 CLI 인증, 실제 이미지·영상 생성, 웹 페이지 실행, 모바일·seam QA는 하지 않았다.
저장소 구성
고정 커밋의 recursive tree는 총 15개 entry이며 11개 파일·4개 디렉터리다. 전용 tests/ 경로는 확인되지 않았다.
.claude-plugin/marketplace.json— marketplace metadata와./skills/scroll-worldplugin 연결.claude-plugin/plugin.json— plugin 이름, 설명, version, author, homepage, license, keywordsREADME.md— 설치법, 요구사항, 기능, 비용·운영 주의사항LICENSE— MIT Licenseskills/scroll-world/SKILL.md— 전체 인터뷰·생성·체인·QA 절차와 gotchasskills/scroll-world/references/prompts.md— intake checklist와 still/dive/connector prompt templateskills/scroll-world/references/pipeline.md— bash 3.2 호환 생성·프레임 추출·인코딩 스크립트skills/scroll-world/references/scrub-engine.js— portable scroll-scrub engineskills/scroll-world/references/index-template.html— 최소 standalone HTML mounting 예제skills/scroll-world/references/knockout.py— 배경 연결 flood-fill 방식의 투명화 helper
전체 소스는 위키에 중복 저장하지 않고, fixed commit URL과 선별 파일 해시를 raw source: github-oso95-scroll-world에 기록했다.
에이전트 인터뷰와 산출물 계약
references/prompts.md와 SKILL.md의 intake는 생성 전에 다음을 수집하도록 설계되어 있다.
SUBJECT— 사업/브랜드와 한 줄 pitchBRAND_NAME— 표시 이름PALETTE— 4–6개의 색상과 장면 배경·primary accentTONE,STYLE— 분위기와 미술 방향SECTIONS[]— 장면 순서, 대상, eyebrow, title, body, tags. 마지막은 hero product와 CTACAMERA— fly-through(architecture B), walkthrough(architecture A), locked-isometricMOBILE— native 9:16 portrait chain을 만들지 여부. 선택하면 영상 생성량이 대략 2배가 된다고 안내VIDEO_TIER— Monid Seedance 2.0 기본 경로 또는 Higgsfield의 draft/standard/alternate 경로STILLS_SOURCE— Higgsfieldgpt_image_2또는 Codeximage_gen
비용과 생성 티어를 먼저 설명하고 사용자의 승인을 받은 뒤 외부 생성에 들어가도록 절차가 구성되어 있다. 이것은 skill의 설계 규칙이며, 이번 ingest에서 실제 비용·승인 UI·잔액 검증을 실행한 것은 아니다.
핵심 설계: seam을 프레임으로 고정하기
이 저장소의 핵심 규칙은 장면 설명이 아니라 실제로 렌더된 이웃 영상의 경계 프레임을 다음 영상의 입력으로 넘기는 것이다.
architecture A: 한 방향의 continuous forward take.- 첫 leg는 첫 장면 still에서 시작한다.
- 다음 leg의
--start-image는 이전 leg의 실제 마지막 프레임이다. --end-image와 connector 없이 legs 자체를 순차 연결한다.- 카메라가 seam을 가로질러 뒤로 되돌아가지 않도록 마지막 약 1초를 느리고 안정적인 forward drift로 마무리하고 다음 leg도 같은 drift로 시작한다.
architecture B: diorama/miniature world용 dive-in + aerial connector.- 각 dive의 실제 마지막 프레임을 connector의 start image로 사용한다.
- 다음 dive의 실제 첫 프레임을 connector의 end image로 사용한다.
- connector가 위로 빠져나와 다음 장면으로 이동하므로, grounded walkthrough에서는 forward dive 뒤의 pull-back이 rewind/stutter처럼 읽힐 수 있다고 경고한다.
- connector가 없어도 engine은
nullconnector를 허용하고 두 dive를 직접 crossfade하여 페이지를 완성할 수 있다. - Seedance 계열의 end frame은 같은 구성을 가리켜도 pixel-perfect하지 않을 수 있으므로, 실제 frame handoff를 유지하면서 짧은 crossfade를 보험으로 사용한다.
이는 이미지 still을 반복해서 넘기는 단순 reference conditioning과 구분되는 설계다. 저장소는 seam을 유지하려면 모델이 start-image를 지원해야 하고 connector에는 end-image도 필요하다고 명시한다.
모델·백엔드 경로
저장소 문서가 제시하는 roster와 역할은 다음과 같다.
seedance_2_0— 기본 chain 모델. start/end image를 지원하는 full-chain 경로.kling3_0— full-chain 대안.--resolution을 사용하지 않고--sound off를 지정하는 별도 flag branch.seedance_2_0_mini— frame-locking을 유지하는 저비용 previz tier.kling3_0_turbo와minimax_hailuo— connector를 만들 수 없거나 별도 wiring이 필요한 architecture-A 전용 후보로 설명된다.
문서상 default biller는 Monid의 bytedance /v1/video/seedance-2.0이다. 저장소는 2026-07-25 qualification probe에서 첫 frame의 PSNR, connector end composition, cost.value를 확인했다고 기록하고, Higgsfield를 fallback biller 또는 Higgsfield-only 모델 경로로 둔다. 이 수치·가격·endpoint schema는 외부 서비스의 현재 상태에 의존하므로 위키에서는 저장소 문서에 적힌 검증 이력으로만 기록한다.
Monid 경로의 I/O 규칙으로 문서는 다음을 강조한다.
- 이미지 데이터를 inline base64로 보내지 않고
sfs파일 시스템을 거쳐 public URL로 전달 - desktop
16:9, mobile9:16을ratio로 명시 - 각 run의 실제 비용을
cost.value로 확인 - polling timeout은 서버 작업 중단과 다를 수 있으므로 run ID를 다시 poll
- 결과 URL은 유효기간이 짧으므로 즉시 다운로드
생성 파이프라인
references/pipeline.md는 macOS 기본 bash 3.2에서도 동작하도록 작성된 copy-paste 스크립트를 제공한다.
gpt_image_2또는 Codeximage_gen으로 장면 still 생성- 필요하면
knockout.py로 단색 배경을 border-connected flood fill하여 투명화 - still을 webp로 변환하고 사이트용 poster로 보존
- 각 장면의 dive/leg 영상 생성
- 렌더된 영상에서
ffmpeg로 첫 프레임과 마지막 프레임 추출 - 인접 장면 사이 connector 생성
- 영상 인코딩
- engine config에 sections와 connectors 연결
- headless browser에서 seam과 seekability QA
desktop 인코딩 권장값은 native resolution, crf 20, -g 8, yuv420p, +faststart, audio 제거, 가벼운 unsharp다. all-intra로 파일을 크게 만들지 말고, HTTP byte-range 지원 여부에 scrub을 의존하지 않도록 engine이 Blob으로 전체 clip을 fetch한다.
모바일 경로
모바일을 선택한 경우 저장소가 권장하는 것은 landscape 영상의 단순 center crop이 아니라 완전한 native 9:16 chain이다.
- 모든 dive와 connector를 9:16으로 다시 렌더링
- portrait chain 자체의 실제 frame으로 seam을 고정
clipMobile,connectorsMobile,stillMobile을 config에 연결- portrait clip을
scale=720:-2,-g 4, crf 23 수준으로 인코딩 - 각 portrait dive의 첫 frame을 portrait poster로 사용
pipeline의 centre-crop -m.mp4는 credits가 부족할 때의 fallback일 뿐이며, 그 경우 사용자에게 명시해야 한다고 적혀 있다.
scrub-engine.js 구현
mountScrollWorld(container, config)는 DOM과 CSS를 스스로 구성하며 다음 요소를 interleave한다.
- section dive clip
- 선택적인 connector clip
- 다음 section의 still/poster
- copy layer, route rail, top navigation, scrollbar, scroll hint, atmosphere/particles
설정은 brand, diveScroll, connScroll, crossfade, sections, connectors, connectorsMobile을 받는다. section은 still, clip, optional mobile variants, accent, copy text, tags, CTA, per-section scroll·linger를 가진다.
시간·스크롤 처리는 다음과 같다.
- 각 segment에 viewport-height 기준 길이를 배정
- scroll position을 segment local progress로 변환
linger가 있으면 seam의 0과 1은 보존한 채 중간 구간에 dwell을 배치requestAnimationFrameloop가target으로cur를 보간- decoder가 이전 seek를 처리 중이면 새
currentTime을 큐에 쌓지 않음 - 모바일에서는 더 큰 epsilon으로 seek 횟수를 줄임
- 인접 scene을 lazy fetch하여 Blob object URL로 video 생성
- 실제 frame이 paint되기 전에는 still poster를 계속 표시
- 짧은 opacity crossfade로 seam을 완화
모바일과 접근성 처리는 별도 config 없이 기본 활성화된다.
- coarse pointer 또는 860px 이하에서
clipMobile·connectorsMobile사용, 없으면 desktop clip fallback - 빠른 flick에서 seek를 coalesce하여 decoder가 멈추지 않도록 함
- 첫 touch에서 muted play→pause로 iOS video를 prime
prefers-reduced-motion이면 clip을 로드하지 않고 still만 사용- 모바일 URL bar에 따른 height-only resize를 무시해 scroll jump 방지
- safe-area inset과
dvh로 copy가 notch/home indicator에 가려지지 않도록 함 - 모바일에서는 particle을 제거하고 route rail의 touch target을 키움
문서의 esc()는 copy 필드를 HTML escape한 뒤 innerHTML을 구성한다. 다만 이 engine은 사용자의 project에 복사되는 portable 코드이므로, 실제 배포에서는 CTA URL·asset URL의 허용 scheme과 CSP/CORS를 애플리케이션 경계에서 별도로 검토하는 편이 안전하다. 이는 코드 inspection에 따른 운영 권고이며 취약점 재현 결과가 아니다.
QA 규칙
저장소가 가장 중요하게 보는 QA는 시각적 seam continuity다.
- 각 seam 직전·직후를 headless browser로 캡처
- dive 마지막 frame과 connector 첫 frame, connector 마지막 frame과 다음 dive 첫 frame의 composition을 비교
- raw PSNR만으로 판정하지 말고 prop·구성·공간 관계가 바뀌었는지 확인
video.seekable.end(0) > 0과 console error를 확인- scroll band에서
currentTime이 실제로 따라오는지 확인 - reduced-motion에서 영상·particle 없이 still fallback이 되는지 확인
- mobile opt-in이면 CPU 4–6× throttling, 빠른 scroll, iOS Safari blank scene, native portrait
videoWidth < videoHeight, URL-bar resize, rotation, safe-area를 확인
저장소의 고정 커밋 메시지도 seam QA calibration을 다루지만, 위키 ingest에서는 이 QA를 실행하지 않았다. 따라서 “seam QA 통과”나 “모바일 호환 확인”으로 표현하지 않는다.
운영·보안 검토 포인트
- 외부 실행면: Monid CLI/API, Higgsfield CLI, optional Codex CLI,
ffmpeg/ffprobe,curl,jq, Python/Pillow - README는 Monid API key와 balance, Higgsfield 인증 및 credits를 요구한다고 적는다. 인증값은 위키에 저장하지 않았다.
- image/video generation은 실제 비용이 발생하며, mobile native chain은 생성량이 증가한다.
- result URL과 signed public URL은 외부 서비스가 발급하는 단기 URL이므로 asset을 즉시 프로젝트 storage로 옮겨야 한다.
- blob fetch 방식은 static host의 byte-range 미지원 문제를 피하지만, 실제 웹 배포에서는 asset URL의 CORS·Content-Type·용량·메모리 사용량을 검토해야 한다.
SKILL.md와 README에 표시된 외부 서비스 가격·모델 schema·성능 수치는 시점 의존적이다. 매 빌드 전 endpoint inspect와 cheap qualification probe를 다시 하라는 것이 저장소의 운영 규칙이다.- 생성된
.mp4/.webp는 저장소에 포함되지 않으므로, 이 repo 자체는 생성 asset repository가 아니라 생성 절차·engine template repository다.
공식 확인·해석·미검증 범위
고정 커밋에서 직접 확인한 것
- Claude Code marketplace와
SKILL.md설치 경로 - plugin version/author/license metadata
- intake checklist와 camera architecture A/B 규칙
- actual rendered frame을 이용한 connector handoff 규칙
- Monid/Higgsfield/Codex/ffmpeg 기반 pipeline 문서
scrub-engine.js의 Blob loading, lazy load,currentTimescrub, crossfade, reduced-motion, mobile hardeningindex-template.html의 standalone mounting 구조knockout.py의 이미지 배경 처리 목적- 고정 recursive tree에 dedicated tests 경로가 없다는 사실
저장소가 주장하지만 이번 환경에서 재현하지 않은 것
- Monid/Higgsfield의 실제 frame-lock과 가격
- 2026-07-25 qualification probe의 PSNR·비용 수치
- 어떤 산업/브랜드에도 적용되는 생성 품질
- seam이 시각적으로 seamless하다는 결과
- iOS Safari·저사양 모바일의 scrub 성능
- 외부 provider의 현재 schema와 credit race 처리
이번 ingest에서 하지 않은 것
npx skills add, Claude Code plugin install, Codex skill install- Monid/Higgsfield 로그인 및 API key 설정
- 이미지·영상 generation과 실제
.mp4/.webp다운로드 ffmpegencoding pipeline 실행- 실제 HTML mounting, browser/Playwright/headless QA
- mobile portrait QA와 seam screenshot 비교
- benchmark, 비용 측정, 보안 테스트
관련 메모
- 정식 raw provenance: raw source:
github-oso95-scroll-world - 같은 프로젝트를 다룬 커뮤니티 secondary source: 2026-07-16-pytorchkr-topic-11268-scroll-world
- AI agent / skill 관점: moc-ai-agents
- AI coding / plugin·에이전트 실행 관점: moc-ai-coding
- 영상·스크럽·멀티미디어 관점: moc-multimedia