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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit a19000c9c5d7a40819149578e11c851d13ecf7e3

19GitHub stars
2stars in 7 days
1skill in this repository
0commits in 30 days

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

Oct 25, 2026Nov 3, 202619

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 tokens

Always available to the agent

SKILL.md

3,048 tokens

When the skill is activated

Reference documents

16,689 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. The pipeline
  2. 1. HARVEST
  3. 2. READ
  4. 3. STORYBOARD
  5. 4. RENDER
  6. Iterating on the visuals
  7. Constraints that are not negotiable
  8. Typography
  9. Requirements
  10. Resources

Scripts executed separately

  • assets/template/package.json
  • assets/template/remotion.config.ts
  • assets/template/src/Root.tsx
  • assets/template/src/Video.tsx
  • assets/template/src/demo-storyboard.ts
  • assets/template/src/index.ts
  • assets/template/src/lib/WaitForFonts.tsx
  • assets/template/src/lib/art.ts
  • assets/template/src/lib/audio.ts
  • assets/template/src/lib/design.ts
  • assets/template/src/lib/easing.ts
  • assets/template/src/lib/move.ts
  • assets/template/src/lib/sandbox.ts
  • assets/template/src/lib/scene-context.ts
  • assets/template/src/lib/shots/KenBurnsImage.tsx
  • assets/template/src/lib/shots/primitives.tsx
  • assets/template/src/lib/speech.ts
  • assets/template/src/lib/timeline.ts
  • assets/template/src/lib/transitions.ts
  • assets/template/src/lib/type/fit-cjk.ts
  • assets/template/src/lib/type/fonts.ts
  • assets/template/src/schema/storyboard.ts
  • assets/template/src/shots/FigureShots.tsx
  • assets/template/src/shots/TextShots.tsx
  • assets/template/src/shots/index.ts
  • assets/template/studio-scripts/make-script.ts
  • assets/template/studio-scripts/selftest-math.ts
  • assets/template/studio-scripts/validate-storyboard.ts
  • scripts/build_fonts.mjs
  • scripts/check_glyph_coverage.mjs
  • scripts/harvest.py
  • scripts/lint_render_safety.mjs
  • scripts/render.mjs
  • scripts/sync.sh
  • scripts/verify_determinism.mjs

Files

  • .gitignoreasset179 bytes
  • LICENSEasset1,063 bytes
  • README.mddoc6,190 bytes
  • SKILL.mdcore12,466 bytes
  • SKILL.mdcore12,466 bytes
  • SKILL.mdcore12,466 bytes
  • SKILL.mdcore12,466 bytes
  • SKILL.mdcore12,466 bytes
  • SKILL.mdcore12,466 bytes
  • assets/template/package.jsonruns834 bytes
  • assets/template/remotion.config.tsruns2,570 bytes
  • assets/template/src/Root.tsxruns3,252 bytes
  • assets/template/src/Video.tsxruns4,323 bytes
  • assets/template/src/demo-storyboard.tsruns3,301 bytes
  • assets/template/src/index.tsruns109 bytes
  • assets/template/src/lib/WaitForFonts.tsxruns1,430 bytes
  • assets/template/src/lib/art.tsruns5,732 bytes
  • assets/template/src/lib/audio.tsruns2,099 bytes
  • assets/template/src/lib/design.tsruns8,384 bytes
  • assets/template/src/lib/easing.tsruns764 bytes
  • assets/template/src/lib/move.tsruns6,199 bytes
  • assets/template/src/lib/sandbox.tsruns1,349 bytes
  • assets/template/src/lib/scene-context.tsruns5,992 bytes
  • assets/template/src/lib/shots/KenBurnsImage.tsxruns8,909 bytes
  • assets/template/src/lib/shots/primitives.tsxruns10,257 bytes
  • assets/template/src/lib/speech.tsruns4,106 bytes
  • assets/template/src/lib/timeline.tsruns13,359 bytes
  • assets/template/src/lib/transitions.tsruns2,632 bytes
  • assets/template/src/lib/type/fit-cjk.tsruns8,206 bytes
  • assets/template/src/lib/type/fonts.tsruns3,517 bytes
  • assets/template/src/schema/storyboard.tsruns13,896 bytes
  • assets/template/src/shots/FigureShots.tsxruns21,154 bytes
  • assets/template/src/shots/TextShots.tsxruns20,840 bytes
  • assets/template/src/shots/index.tsruns786 bytes
  • assets/template/studio-scripts/make-script.tsruns6,608 bytes
  • assets/template/studio-scripts/selftest-math.tsruns12,366 bytes
  • assets/template/studio-scripts/validate-storyboard.tsruns8,429 bytes
  • assets/template/tsconfig.jsonasset518 bytes
  • references/cjk-type.mddoc7,932 bytes
  • references/editorial.mddoc6,687 bytes
  • references/narration.mddoc5,549 bytes
  • references/pitfalls.mddoc12,062 bytes
  • references/shots.mddoc9,255 bytes
  • references/storyboard.mddoc14,475 bytes
  • scripts/build_fonts.mjsruns7,502 bytes
  • scripts/check_glyph_coverage.mjsruns4,840 bytes
  • scripts/harvest.pyruns19,929 bytes
  • scripts/lint_render_safety.mjsruns5,108 bytes
  • scripts/render.mjsruns6,869 bytes
  • scripts/sync.shruns906 bytes
  • scripts/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   library
View the complete source on GitHub

Skills 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 shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 91 signals by file

README.md

  • Network accessline 3
    [![Version](https://img.shields.io/badge/version-1.0.0-2563eb.svg)](./SKILL.md)
  • Network accessline 4
    [![Codex Skill](https://img.shields.io/badge/Codex-Skill-111827.svg?logo=openai&logoColor=white)](./SKILL.md)
  • Network accessline 5
    [![Remotion](https://img.shields.io/badge/Remotion-4.0.409-0b84f3.svg)](https://www.remotion.dev/)
  • Network accessline 6
    [![Node.js](https://img.shields.io/badge/Node.js-%E2%89%A520-339933.svg?logo=nodedotjs&logoColor=white)](#requirements)
  • Network accessline 7
    [![Platform](https://img.shields.io/badge/platform-macOS-111111.svg?logo=apple&logoColor=white)](#requirements)
  • Network accessline 8
    [![License](https://img.shields.io/github/license/cclank/lanshu-html2video-skill)](./LICENSE)
  • Network accessline 9
    [![GitHub stars](https://img.shields.io/github/stars/cclank/lanshu-html2video-skill?style=flat)](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

and 41 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.