by gongnyang
Scroll-driven presentation decks: one continuous timeline, beats that turn into the next, six concept packs and 80 moves.
# Add to your Claude Code skills
git clone https://github.com/gongnyang/awesome-html-scrolline-deckGuides for using ai agents skills like awesome-html-scrolline-deck.
See how awesome-html-scrolline-deck compares with popular alternatives.
awesome-html-scrolline-deck is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by gongnyang. Scroll-driven presentation decks: one continuous timeline, beats that turn into the next, six concept packs and 80 moves. It has 62 GitHub stars.
awesome-html-scrolline-deck's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/gongnyang/awesome-html-scrolline-deck" and add it to your Claude Code skills directory (see the Installation section above). awesome-html-scrolline-deck ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
awesome-html-scrolline-deck is primarily written in JavaScript. It is open-source under gongnyang on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh awesome-html-scrolline-deck against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
awesome-html-scrolline-deck vs everything claude code
See comparison
decks/<id>/ 덱 1개(브라우저 발표용) + out/export/<id>.mp4(선택)cd ~/.claude/skills/scrolline-deck 등). 모든 명령은 레포 루트 기준plan/CONTRACTS.md(인터페이스), 사용 문서 docs/*.md. 이 파일과 문서가 다르면 CONTRACTS가 우선deck.yaml에는 내용과 move 이름·params만. 덱을 위해 engine·moves 코드를 고치지 않는다. 덱 고유 장면이 꼭 필요하면 decks/<id>/sequences/<use>.js(type: sequence)moves.allow 밖 move는 쓰지 않는다(불가피하면 override: "<사유>"). 컨셉 moves.signature move는 덱에서 1회 이상 사용link move로 잇는다. link가 B를 다 그리면 B의 enter는 engine:nonesample: false)은 number·chart·quote·photo·값 있는 compare마다 source 필수, sources[]에 url·확인일. 가상 회사면 sample: true(화면에 「표본」 표기)data-depth 층으로만| 이야기 구조 | 컨셉 | signature move |
|---|---|---|
| 시간 순서로 사건이 이어짐(연혁·로드맵) | rail |
rail-advance era-shift counter-handoff |
| 수치·차트가 변하며 주장을 쌓음(실적·시장 분석) | data |
dot-multiply mark-morph annotation-pin |
| 제품 하나를 공개(신제품·신기능) | launch |
lit-from-dark sticky-scrub-link number-slam |
| 전체에서 원인 하나로 파고듦(진단·TAM-SAM-SOM) | zoom |
zoom-dive zoom-surface depth-ladder |
| 여러 영역을 지도 위에서 순회(피치덱·전략 지도) | canvas |
arc-flight establish-crane atlas-pullback |
| 문장이 무대(강의·키노트·선언) | kinetic |
word-door slot-pick phrase-fold |
concepts/<id>/concept.json. 참고 덱: 컨셉마다 decks/ 예제 1편npm run deck -- new <deckId> --concept <concept>
npm run deck -- moves --family <family> --role <role> # 쓸 수 있는 move 목록
decks/<deckId>/main.js의 boot({...})에 mode: import.meta.env.SCROLLINE_MODE가 있는지 확인(없으면 추가. MP4 내보내기 필수 조건)deck.yaml 필드: docs/writing-a-deck.md. beat type별 필수 필드·part: CONTRACTS C4moves/<family>/<id>.js의 params(doc·min·max). 범위 밖 값은 검증 실패repeat: intended(의도된 리듬일 때만)npm run frames -- <in.mp4> decks/<id>/assets/frames/<name> 후 mode: scrub + frames. 재생 = mode: play|loop. 스톡은 라이선스와 출처를 decks/<id>/assets/CREDITS.md에 기록(docs/media.md)npm run deck -- plan <deckId>
<beat>/<step>) 위치hold·move duration, 너무 길면 timing.unit·overlap 조정npm run dev -- --port 5190 # 별도 터미널
node tools/smoke.mjs <deckId> --driver chrome --shots
out/smoke/<deckId>/report.json, stop-XX.png, sheet.pngsheet.png를 직접 열어 정지점마다 원칙 5(초점 1개·위계·메타 캡션) 판정npm run export -- <deckId> --dry-run # 길이·발표 경로 확인
npm run export -- <deckId> # out/export/<deckId>.mp4
npm run capture -- <deckId> --stops # 정지점 PNG, out/capture/<deckId>/
exportHold(초), 기본 1.6초| 게이트 | 확인 방법 | 기준 |
|---|---|---|
| 스키마·내용 감사 | 브라우저 로드(boot의 validateDeck) 또는 npm test(덱 deck.test.js가 있을 때) |
오류 0. 자리표(TODO·TBD·lorem·???·{{·자리표 등)·빈 문자열·출처 누락·허용 밖 move 차단 |
| 정지점 | npm run deck -- plan <deckId> |
계획한 정지점이 순서대로 존재 |
| 브라우저 | node tools/smoke.mjs <deckId> --driver chrome --shots |
errors·empty·overlaps·clipped·tiny 전부 0 |
| 컨셉 문법 | deck.yaml 대조 |
signature move 1회 이상, 같은 move 반복은 repeat: intended만 |
| 저장소 | npm run ci |
녹색(엔진·move·덱 테스트 + 의존·테스트 존재·state·move 정적 규칙) |
| 화면 판정 | smoke sheet.png 육안 |
정지점마다 초점 1개, 위계 3단 이내, 메타 캡션·장식 3D 없음 |
| 내보내기(요청 시) | npm run export -- <deckId> |
exit 0, out/export/<deckId>.mp4 생성 |
engine/·moves/·concepts/ 수정(필요하면 별도 작업으로 분리, docs/moves.md·docs/concepts.md 절차)tl.from·Math.random·Date.now·tween 값 안 var((move 작성 시)capture·smoke 경로만)docs/getting-started.md: 설치부터 MP4까지docs/writing-a-deck.md: deck.yaml 필드·beat type·내용 감사docs/concepts.md: 컨셉 팩 6종·새 컨셉 추가docs/moves.md: move 계약·작성·테스트docs/media.md: 프레임 시퀀스·영상·마스크docs/export.md: 내보내기·캡처·smokedocs/architecture.md: 층 구조·timeline 모델·개발 원칙·state 기록You write a deck.yaml. Scrolline lays every beat on one paused GSAP timeline, the mouse wheel scrubs it, presenter keys jump between stops, and the same timeline renders to MP4.
Adding video? Issue your own Pexels or Pixabay API key first and keep it in
.env(git-ignored, blocked bynpm run check). See docs/media.md.
Six decks, one per concept. Decks marked sample use a fictional company and say so on screen. The others use real data with a source list in deck.yaml.
| Deck | Concept | Typical use | Signature moves |
|---|---|---|---|
rail-ai-decade · Generative AI, 2017 to 2026 |
rail · horizontal time rail |
company history, roadmap, an industry's decade | rail-advance era-shift counter-handoff |
data-ev-shift · How far the EV shift has come |
data · data journalism |
quarterly results, market analysis | dot-multiply mark-morph annotation-pin |
launch-orbit-note · Minute product launch (sample) |
launch · product launch |
product or feature launch | lit-from-dark sticky-scrub-link number-slam |
zoom-root-cause · Q3 revenue diagnosis (sample) |
zoom · infinite zoom drill-down |
root cause, TAM-SAM-SOM, org structure | zoom-dive zoom-surface depth-ladder |
canvas-pitch · Seed pitch on a map (sample) |
canvas · camera flythrough |
pitch deck, strategy map, process | arc-flight establish-crane atlas-pullback |
kinetic-next-word · How AI writes an answer |
kinetic · kinetic type lecture |
lecture, keynote, statement | word-door slot-pick phrase-fold |
The decks are in Korean. See docs/concepts.md for what each concept allows.
Requires Node.js 22 or newer. ffmpeg is needed only to cut frame sequences, and the HyperFrames CLI (fetched by npx) only to export MP4.
git clone https://github.com/gongnyang/awesome-html-scrolline-deck.git
cd awesome-html-scrolline-deck
git checkout v2
npm install
npm run dev
Open http://localhost:5173/decks/rail-ai-decade/ and scroll, or press →.
Start your own deck from a concept:
npm run deck -- new my-review --concept data # decks/my-review/{deck.yaml,index.html,main.js,assets/}
# write beats in decks/my-review/deck.yaml
npm run deck -- plan my-review # stops and timings, computed in node
npm run export -- my-review # out/export/my-review.mp4
The full walkthrough is in docs/getting-started.md, and every deck.yaml field is in docs/writing-a-deck.md.
deck.yaml- id: b-trend
type: chart
kind: bar
categories: ["Q1", "Q2", "Q3"]
series:
- { name: "Revenue ($M)", values: [3.1, 3.6, 4.2] }
title: "Each quarter added about $0.5M"
states:
- name: steps
notes:
- { index: 1, text: "+0.5" }
- { index: 2, text: "+0.6" }
place: { slot: full }
steps:
- { name: steps, move: annotation-pin } # a stop after the step
Beats hold content and moves hold motion. A beat renderer draws only the finished state. The concept supplies default moves, and each beat can name its own enter, exit, link, steps, camera or ambient move.
flowchart TD
site["site/ (gallery)"] --> decks
decks["decks/<id>: deck.yaml, main.js, assets/, sequences/"] --> concepts
concepts["concepts/<id>: concept.json, tokens.css"] --> moves
moves["moves/<family>/<id>.js: enter, exit, link, step, camera, ambient"] --> engine
engine["engine/: stage, plan + build, scroll, presenter, handoff, media, export"]
tools["tools/: cli, check, export, capture, smoke"] -.-> decks
tools -.-> engine
timing, deterministic build, no tl.from, no clock or Math.random. Each move ships with a test.sequences/.Imports only go downward, and npm run check blocks upward imports, cycles and imports across sibling folders. See docs/architecture.md.
| Key | Action |
|---|---|
| → ↓ Space PageDown | next stop |
| ← ↑ Shift+Space PageUp | previous stop |
| Home End | first, last stop |
| b . | blackout |
| f | fullscreen |
The wheel and the keys move the same scroll position. A key press travels to the next stop in 0.9 to 2.6 s, depending on distance. With reduced motion, or with ?motion=reduce, the jump is instant and moves fall back to fades of the same length, so every stop lands at the same time.
| Need | How | Beat |
|---|---|---|
| Video that scrubs with the scroll | image sequence drawn on a canvas, cut with npm run frames |
type: video, mode: scrub |
| Live footage inside a beat | <video muted playsinline> that plays while the beat is active |
type: video, mode: play or loop |
| Video inside letters or a shape | text mask applied by a move (mask-word-in), or a clip-path shape |
mask: { type: text, text: "10년" } |
Scrubbed video uses frames rather than video.currentTime so that seeking is exact in both directions on every browser. See docs/media.md.
npm run export -- rail-ai-decade # out/export/rail-ai-decade.mp4
npm run export -- rail-ai-decade --dry-run # print the timeline map and path only
npm run capture -- rail-ai-decade --stops # one PNG per stop in out/capture/rail-ai-decade/
Export replaces scrolling with a presentation path. It travels from stop to stop, holds 1.6 s on each one (exportHold per beat), and renders the paused timeline through HyperFrames at 1920×1080. Because the timeline depends only on time, the MP4 shows the same frames as the browser. See docs/export.md.
npm test # vitest + happy-dom: engine modules, every move, every deck
npm run check # dependency rules, a test next to every module, state schemas, move static rules
npm run ci # both; the merge condition
Move tests run a shared contract check: seek determinism, rewind to the initial state, no blur or 3D under reduced motion, and handoff landing within 1 px. GitHub Actions runs npm ci, npm test and npm run check on every push to main and v2, and on every pull request.
SKILL.md makes this repository a Claude Code skill named scrolline-deck. It takes you from a brief to a concept, then deck.yaml, a smoke run and the MP4. Link the checkout into your skills folder:
ln -s "$PWD" ~/.claude/skills/scrolline-deck
engine/ stage, timeline plan/build, scroll, presenter, handoff, media, export, beat renderers
moves/ move library by family (reveal, type, morph, camera, rail, data, media, assemble, emphasis)
concepts/ concept packs: concept.json + tokens.css
decks/ example decks: deck.yaml + main.js + assets/
tools/ cli, checks, export, capture, smoke, frame extraction
site/ gallery
docs/ guides
plan/ design source of truth (Korean): PLAN, ARCHITECTURE, CONTRACTS
state/ board.json + runs.jsonl build-state log
See CONTRIBUTING.md. In short, keep commits small, put a test next to every module, keep each commit to one hat (Hat: feature or Hat: refactor), and run npm run ci before a pull request.
Code: MIT © gongnyang.
sources, using slugs from awesome-ai-motion.