npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@adelie/lesson-video

v0.6.6

Published

Narrated vertical lesson videos (1080x1920) from a script: an HTML slide deck driven by time, edge-tts voice-over with word-level timing, Playwright frame capture, ffmpeg mux, cover art and publishing copy.

Readme

lesson-video

Narrated vertical lesson videos (1080×1920, Douyin / Reels ready) from a written script — plus the cover art and the publishing copy that goes with them.

The whole thing rests on one idea: the picture is a pure function of time t. You write what is said, edge-tts speaks it and hands back word-level timings, and every frame is then computed from that timeline. Voice, subtitles and slides line up by construction, so there is nothing to edit afterwards.

script.json  ──tts.py──▶  narration.wav + lesson.json  ──render.mjs──▶  30fps JPEG frames  ──build.py──▶  mp4 + srt
covers.json  ──cover.mjs──▶  1080×1920 video cover + 1080×1440 profile cover

Why it exists

  • Safe areas for real phones. App buttons and status bars cover the edges of a portrait screen, so the layout keeps the sides and the top empty by design: content lives inside 745 × 1170 px, and the subtitle band starts at y = 1470.
  • A pre-render self-check. render.mjs --check fails before spending minutes on frames: content past the subtitle safe line, code lines clipped by the card, and titles left with a one-character orphan line.
  • No editing software, no GPU. Headless Chrome + imageio-ffmpeg; a three-minute episode renders in about five minutes on CPU, and re-rendering after a script fix is one command.
  • No baked-in branding. Watermark, brand mark, CTA and every caption come from the data files — the templates ship with nothing of anyone's hard-coded.

What's inside

| Path | What it is | | --- | --- | | skills/lesson-video/SKILL.md | The skill: script schema, the three commands, the layout rules, the pitfalls | | skills/lesson-video/kit/ | The toolkit — tts.py, render.mjs, build.py, deck.html, cover.mjs, cover.html; copy it into a project as lib/ | | skills/lesson-video/example/ | A skeleton script.json (four scene types) and covers.json |

Requirements

| Need | Install | | --- | --- | | Python packages | pip install edge-tts imageio-ffmpeg (the ffmpeg binary comes with the second one) | | Playwright core | any usable playwright-core; point PLAYWRIGHT_MODULE at it | | A browser | any Chrome / Chromium; point CHROME_PATH at it |

Quick start

cp -r <skill>/kit/* <project>/lib/
mkdir -p <project>/lessons/ep01

# 1. write <project>/lessons/ep01/script.json   (see the skill for the schema)

PYTHONUTF8=1 python lib/tts.py lessons/ep01
node lib/render.mjs --dir lessons/ep01 --check          # 10s: safe area, clipped code, orphan titles
PLAYWRIGHT_MODULE=… CHROME_PATH=… node lib/render.mjs --dir lessons/ep01
PYTHONUTF8=1 python lib/build.py lessons/ep01           # out/ep01.mp4 + out/ep01.srt

License

Apache-2.0