Not in the top 1,000 by GitHub stars
cclank/lanshu-html2video-skill
Turn web articles into polished 1080p videos with Codex and Remotion
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → a19000c9c5d7
No earlier version was observed for comparison.
Heat
2.5- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
html2video
When your agent uses it
Turn a web article URL into a polished 1920x1080 edited video (MP4) — code-driven editing with Remotion, not AI video generation. Use this whenever the user wants an article, blog post, research page or changelog made into a video, or says 文章转视频, 网页转视频, 把这篇做成视频, article-to-video, url-to-video, or asks for an explainer or montage cut of written content. It harvests the page's real structure, full-resolution figures and design tokens, mines the content for what matters (including the caveats most tools skip), commits to a reviewable storyboard.json, then renders through a hardened Chinese-typography shot library. Has a 口播 (spoken) mode — ask for 口播, 配音稿, a narration script or voice-over and it re-times the cut to speech and writes a recordable script with timecodes. Also use it to re-render or retune an existing storyboard.json, adjust crops or pacing, or pull stills.
What it loads into context
Frontmatter
234 tokensAlways available to the agent
SKILL.md
3,048 tokensWhen the skill is activated
Reference documents
16,689 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- The pipeline
- 1. HARVEST
- 2. READ
- 3. STORYBOARD
- 4. RENDER
- Iterating on the visuals
- Constraints that are not negotiable
- Typography
- Requirements
- Resources
Scripts executed separately
assets/template/package.jsonassets/template/remotion.config.tsassets/template/src/Root.tsxassets/template/src/Video.tsxassets/template/src/demo-storyboard.tsassets/template/src/index.tsassets/template/src/lib/WaitForFonts.tsxassets/template/src/lib/art.tsassets/template/src/lib/audio.tsassets/template/src/lib/design.tsassets/template/src/lib/easing.tsassets/template/src/lib/move.tsassets/template/src/lib/sandbox.tsassets/template/src/lib/scene-context.tsassets/template/src/lib/shots/KenBurnsImage.tsxassets/template/src/lib/shots/primitives.tsxassets/template/src/lib/speech.tsassets/template/src/lib/timeline.tsassets/template/src/lib/transitions.tsassets/template/src/lib/type/fit-cjk.tsassets/template/src/lib/type/fonts.tsassets/template/src/schema/storyboard.tsassets/template/src/shots/FigureShots.tsxassets/template/src/shots/TextShots.tsxassets/template/src/shots/index.tsassets/template/studio-scripts/make-script.tsassets/template/studio-scripts/selftest-math.tsassets/template/studio-scripts/validate-storyboard.tsscripts/build_fonts.mjsscripts/check_glyph_coverage.mjsscripts/harvest.pyscripts/lint_render_safety.mjsscripts/render.mjsscripts/sync.shscripts/verify_determinism.mjs
Files
.gitignoreasset179 bytesLICENSEasset1,063 bytesREADME.mddoc6,190 bytesSKILL.mdcore12,466 bytesSKILL.mdcore12,466 bytesSKILL.mdcore12,466 bytesSKILL.mdcore12,466 bytesSKILL.mdcore12,466 bytesSKILL.mdcore12,466 bytesassets/template/package.jsonruns834 bytesassets/template/remotion.config.tsruns2,570 bytesassets/template/src/Root.tsxruns3,252 bytesassets/template/src/Video.tsxruns4,323 bytesassets/template/src/demo-storyboard.tsruns3,301 bytesassets/template/src/index.tsruns109 bytesassets/template/src/lib/WaitForFonts.tsxruns1,430 bytesassets/template/src/lib/art.tsruns5,732 bytesassets/template/src/lib/audio.tsruns2,099 bytesassets/template/src/lib/design.tsruns8,384 bytesassets/template/src/lib/easing.tsruns764 bytesassets/template/src/lib/move.tsruns6,199 bytesassets/template/src/lib/sandbox.tsruns1,349 bytesassets/template/src/lib/scene-context.tsruns5,992 bytesassets/template/src/lib/shots/KenBurnsImage.tsxruns8,909 bytesassets/template/src/lib/shots/primitives.tsxruns10,257 bytesassets/template/src/lib/speech.tsruns4,106 bytesassets/template/src/lib/timeline.tsruns13,359 bytesassets/template/src/lib/transitions.tsruns2,632 bytesassets/template/src/lib/type/fit-cjk.tsruns8,206 bytesassets/template/src/lib/type/fonts.tsruns3,517 bytesassets/template/src/schema/storyboard.tsruns13,896 bytesassets/template/src/shots/FigureShots.tsxruns21,154 bytesassets/template/src/shots/TextShots.tsxruns20,840 bytesassets/template/src/shots/index.tsruns786 bytesassets/template/studio-scripts/make-script.tsruns6,608 bytesassets/template/studio-scripts/selftest-math.tsruns12,366 bytesassets/template/studio-scripts/validate-storyboard.tsruns8,429 bytesassets/template/tsconfig.jsonasset518 bytesreferences/cjk-type.mddoc7,932 bytesreferences/editorial.mddoc6,687 bytesreferences/narration.mddoc5,549 bytesreferences/pitfalls.mddoc12,062 bytesreferences/shots.mddoc9,255 bytesreferences/storyboard.mddoc14,475 bytesscripts/build_fonts.mjsruns7,502 bytesscripts/check_glyph_coverage.mjsruns4,840 bytesscripts/harvest.pyruns19,929 bytesscripts/lint_render_safety.mjsruns5,108 bytesscripts/render.mjsruns6,869 bytesscripts/sync.shruns906 bytesscripts/verify_determinism.mjsruns5,978 bytes
Read SKILL.md
# html2video
Produce a 1920x1080 H.264 video from a web article. Chinese output by default;
English sources get translated during the reading stage.
The hard part is not rendering. It is deciding what deserves to be on screen —
and the thing that separates this from a slideshow is treating a page's figures
and figure captions as primary material rather than decoration.
## The pipeline
```
HARVEST ──→ READ ──→ STORYBOARD ──→ RENDER
scripts you storyboard.json libraryView the complete source on GitHubSkills included
- html2video
Repository facts
- License
- MIT
- Created
- Aug 25, 2026
- Last pushed
- Aug 25, 2026
- Forks
- 5
- Open issues
- 0
- Project activity
- Slowing
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 5 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 55 network referencesin 8 files: README.md:3 scripts/harvest.py:62 assets/template/src/demo-storyboard.ts:13 and 5 more
- No hidden or obfuscated text
- No instruction overrides
- 35 executable scriptsin 35 files: assets/template/package.json:1 assets/template/remotion.config.ts:1 assets/template/src/Root.tsx:1 and 32 more
- 1 reference to secretsin 1 file: scripts/harvest.py:322
- No requests to vote in Hot
Show all 91 signals by file
README.md
- Network accessline 3
[](./SKILL.md) - Network accessline 4
[](./SKILL.md) - Network accessline 5
[](https://www.remotion.dev/) - Network accessline 6
[](#requirements) - Network accessline 7
[](#requirements) - Network accessline 8
[](./LICENSE) - Network accessline 9
[](https://github.com/cclank/lanshu-html2video-skill/stargazers) - Network accessline 44
git clone https://github.com/cclank/lanshu-html2video-skill.git ~/.codex/skills/html2video - Network accessline 50
用 html2video 把 https://example.com/article 做成一个 60 秒中文视频。 - Network accessline 60
网页抓取依赖 [baoyu-url-to-markdown](https://github.com/JimLiu/baoyu-skills#baoyu-url-to-markdown)。请先按该项目说明安装对应 Skill,并确保 `bun` 可用。 - Network accessline 83
# 1. 抓取网页 python3 scripts/harvest.py \ --url "https://example.com/article" \ - Network accessline 84
python3 scripts/harvest.py --url "https://example.com/article" - Network accessline 85
--url "https://example.com/article" \ - Network accessline 142
- [Remotion](https://github.com/remotion-dev/remotion/blob/main/LICENSE.md) 使用独立许可证,部分组织需要购买 Company License;使用前请核对其最新条款。 - Network accessline 143
- 首次运行下载的 [Noto CJK](https://github.com/notofonts/noto-cjk) 字体使用 SIL Open Font License 1.1,字体文件未包含在本仓库中。
SKILL.md
- Network accessline 42
python3 scripts/harvest.py --url "https://example.com/article" --out ./work/myrun - Network accessline 71
python3 scripts/harvest.py --url URL --out DIR --cdp-url http://localhost:9222 - Network accessline 156
**Use `--concurrency 3` or lower** if a render dies with `Visited "http://localhost:3001/index.html" but got no response`. Measured on this - Network accessline 157
"http://localhost:3001/index.html" but got no response`. Measured on this
assets/template/package.json
- Executable scriptline 1
Executable file
assets/template/remotion.config.ts
- Executable scriptline 1
Executable file
assets/template/src/Root.tsx
- Executable scriptline 1
Executable file
assets/template/src/Video.tsx
- Executable scriptline 1
Executable file
assets/template/src/demo-storyboard.ts
- Executable scriptline 1
Executable file - Network accessline 13
version: 1, meta: { sourceUrl: "https://example.com/demo", - Network accessline 14
meta: { sourceUrl: "https://example.com/demo", sourceTitle: "html2video demo board", - Network accessline 15
sourceUrl: "https://example.com/demo", - Network accessline 44
}, motion: { seed: "https://example.com/demo", - Network accessline 45
motion: { seed: "https://example.com/demo", pace: "measured", - Network accessline 46
seed: "https://example.com/demo",
assets/template/src/index.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/WaitForFonts.tsx
- Executable scriptline 1
Executable file
assets/template/src/lib/art.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/audio.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/design.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/easing.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/move.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/sandbox.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/scene-context.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/shots/KenBurnsImage.tsx
- Executable scriptline 1
Executable file
assets/template/src/lib/shots/primitives.tsx
- Executable scriptline 1
Executable file
assets/template/src/lib/speech.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/timeline.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/transitions.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/type/fit-cjk.ts
- Executable scriptline 1
Executable file
assets/template/src/lib/type/fonts.ts
- Executable scriptline 1
Executable file
assets/template/src/schema/storyboard.ts
- Executable scriptline 1
Executable file
assets/template/src/shots/FigureShots.tsx
- Executable scriptline 1
Executable file
assets/template/src/shots/TextShots.tsx
- Executable scriptline 1
Executable file
assets/template/src/shots/index.ts
- Executable scriptline 1
Executable file
assets/template/studio-scripts/make-script.ts
- Executable scriptline 1
Executable file
assets/template/studio-scripts/selftest-math.ts
- Executable scriptline 1
Executable file - Network accessline 171
version: 1, meta: { sourceUrl: "https://example.com/a", sourceTitle: "t", author: "", publishedAt: "", - Network accessline 172
meta: { sourceUrl: "https://example.com/a", sourceTitle: "t", author: "", publishedAt: "", lang: "zh-Hans", coreMessage: "核心", arc: "claim-evidence-implication", - Network accessline 173
sourceUrl: "https://example.com/a", sourceTitle: "t", author: "", publishedAt: "", - Network accessline 181
}, motion: { seed: "https://example.com/a", pace: "measured", easeFamily: "editorial", - Network accessline 182
motion: { seed: "https://example.com/a", pace: "measured", easeFamily: "editorial", panBias: "ltr", revealStyle: "mask-up", transitionVocab: ["cut", "fade"], gridEnergy: 0.22, - Network accessline 183
seed: "https://example.com/a", pace: "measured", easeFamily: "editorial",
assets/template/studio-scripts/validate-storyboard.ts
- Executable scriptline 1
Executable file
references/pitfalls.md
- Network accessline 67
**`delayRender()`'s 30-second default timeout is never mentioned.** This project allows exactly three `delayRender` sites — the font handle, `<Img>` decode, and `<Audio>` in voice mode — and forbids `http://` or `https://` anywhere in `src/ - Network accessline 68
allows exactly three `delayRender` sites — the font handle, `<Img>` decode, and `<Audio>` in voice mode — and forbids `http://` or `https://` anywhere in `src/` or in any `asset.src`, so nothing in the render waits on the network. That - Network accessline 69
`<Audio>` in voice mode — and forbids `http://` or `https://` anywhere in `src/` - Network accessline 99
Error: Visited "http://localhost:3001/index.html" but got no response.
references/storyboard.md
- Network accessline 18
"version": 1, // literal 1 "meta": { "sourceUrl": "https://…", // required, must parse as a URL - Network accessline 19
"meta": { "sourceUrl": "https://…", // required, must parse as a URL "sourceTitle": "…", // required, non-empty - Network accessline 20
"sourceUrl": "https://…", // required, must parse as a URL
scripts/build_fonts.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 37
sans: { file: "NotoSansSC-VF.otf", url: "https://github.com/notofonts/noto-cjk/raw/main/Sans/Variable/OTF/Subset/NotoSansSC-VF.otf", - Network accessline 38
file: "NotoSansSC-VF.otf", url: "https://github.com/notofonts/noto-cjk/raw/main/Sans/Variable/OTF/Subset/NotoSansSC-VF.otf", out: "h2v-sans.woff2", - Network accessline 39
url: "https://github.com/notofonts/noto-cjk/raw/main/Sans/Variable/OTF/Subset/NotoSansSC-VF.otf", - Network accessline 45
serif: { file: "NotoSerifSC-VF.otf", url: "https://github.com/notofonts/noto-cjk/raw/main/Serif/Variable/OTF/Subset/NotoSerifSC-VF.otf", - Network accessline 46
file: "NotoSerifSC-VF.otf", url: "https://github.com/notofonts/noto-cjk/raw/main/Serif/Variable/OTF/Subset/NotoSerifSC-VF.otf", out: "h2v-serif.woff2", - Network accessline 47
url: "https://github.com/notofonts/noto-cjk/raw/main/Serif/Variable/OTF/Subset/NotoSerifSC-VF.otf",
scripts/check_glyph_coverage.mjs
- Executable scriptline 1
#!/usr/bin/env node
scripts/harvest.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 62
"""Structure and text via baoyu-fetch (Defuddle, with Readability fallback).""" - Network accessline 93
sys.exit( f"only {len(md)} characters extracted — the page is probably JS-rendered or " f"bot-blocked. Retry with --cdp-url http://localhost:9222 to reuse a logged-in Chrome." - Network accessline 94
f"only {len(md)} characters extracted — the page is probably JS-rendered or " f"bot-blocked. Retry with --cdp-url http://localhost:9222 to reuse a logged-in Chrome." ) - Network accessline 95
f"bot-blocked. Retry with --cdp-url http://localhost:9222 to reuse a logged-in Chrome." - Network accessline 134
def download(url: str, dest: Path) -> bool: req = urllib.request.Request(url, headers={"User-Agent": UA}) - Network accessline 135
req = urllib.request.Request(url, headers={"User-Agent": UA}) - Network accessline 136
try: with urllib.request.urlopen(req, timeout=60) as r, open(dest, "wb") as f: shutil.copyfileobj(r, f) - Network accessline 137
with urllib.request.urlopen(req, timeout=60) as r, open(dest, "wb") as f: - Access to secretsline 322
[Credential-related source omitted] - Network accessline 363
ap.add_argument("--skip-tokens", action="store_true") ap.add_argument("--cdp-url", default=None, help="reuse a running Chrome, e.g. http://localhost:9222") - Network accessline 364
ap.add_argument("--cdp-url", default=None, help="reuse a running Chrome, e.g. http://localhost:9222") a = ap.parse_args() - Network accessline 365
help="reuse a running Chrome, e.g. http://localhost:9222")
scripts/lint_render_safety.mjs
- Executable scriptline 1
#!/usr/bin/env node
scripts/render.mjs
- Executable scriptline 1
#!/usr/bin/env node
scripts/sync.sh
- Executable scriptline 1
#!/usr/bin/env bash
scripts/verify_determinism.mjs
- Executable scriptline 1
#!/usr/bin/env node
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Signal confidence: 91 facts
- Network access in prose of documentationREADME.md:3Low confidence
- Network access in prose of documentationREADME.md:4Low confidence
- Network access in prose of documentationREADME.md:5Low confidence
- Network access in prose of documentationREADME.md:6Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:8Low confidence
- Network access in prose of documentationREADME.md:9Low confidence
- Network access in code of documentationREADME.md:44Low confidence
- Network access in code of documentationREADME.md:50Low confidence
- Network access in prose of documentationREADME.md:60Low confidence
- Network access in code of documentationREADME.md:83Low confidence
- Network access in code of documentationREADME.md:84Low confidence
- Network access in code of documentationREADME.md:85Low confidence
- Network access in prose of documentationREADME.md:142Low confidence
- Network access in prose of documentationREADME.md:143Low confidence
- Network access in code of the SKILL.mdSKILL.md:42High confidence
- Network access in code of the SKILL.mdSKILL.md:71High confidence
- Network access in prose of the SKILL.mdSKILL.md:156Low confidence
- Network access in prose of the SKILL.mdSKILL.md:157Low confidence
- Executable script in code of a file that runsassets/template/package.json:1High confidence
- Executable script in a comment of a file that runsassets/template/remotion.config.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/Root.tsx:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/Video.tsx:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/demo-storyboard.ts:1Low confidence
- Network access in code of a file that runsassets/template/src/demo-storyboard.ts:13High confidence
- Network access in code of a file that runsassets/template/src/demo-storyboard.ts:14High confidence
- Network access in code of a file that runsassets/template/src/demo-storyboard.ts:15High confidence
- Network access in code of a file that runsassets/template/src/demo-storyboard.ts:44High confidence
- Network access in code of a file that runsassets/template/src/demo-storyboard.ts:45High confidence
- Network access in code of a file that runsassets/template/src/demo-storyboard.ts:46High confidence
- Executable script in code of a file that runsassets/template/src/index.ts:1High confidence
- Executable script in a comment of a file that runsassets/template/src/lib/WaitForFonts.tsx:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/art.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/audio.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/design.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/easing.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/move.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/sandbox.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/scene-context.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/shots/KenBurnsImage.tsx:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/shots/primitives.tsx:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/speech.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/timeline.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/transitions.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/type/fit-cjk.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/lib/type/fonts.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/schema/storyboard.ts:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/shots/FigureShots.tsx:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/shots/TextShots.tsx:1Low confidence
- Executable script in a comment of a file that runsassets/template/src/shots/index.ts:1Low confidence
and 41 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.