Skip to content
Back to skills

Lesson Publish

ASecurity

Publish a finished lesson MP4 from ~/Movies/lpm-lessons/<slug>/ to the lpm YouTube channel through Chrome (YouTube Studio): search-optimized title and description with chapters, tags, category, the title-card thumbnail, Public, then added to the lesson playlist. Use when the user asks to upload, publish or post a lesson video to YouTube. Vertical videos from ~/Movies/lpm-lessons/tiktok/ go to YouTube Shorts through short-publish instead.

  • 152 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 7, 2026
developmentgonode

Works with

  • claude code
  • terminal
  • cli
  • mcp

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned October 7, 2026

npx -y skills add gug007/lpm --skill lesson-publish --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Lesson Publish?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Lesson Publish
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/gug007-lesson-publish/badge)](https://www.skillsdirectory.com/skills/gug007-lesson-publish)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: lesson-publish
version: 1.2.0
argument-hint: "<lesson-slug>"
description: "Publish a finished lesson MP4 from ~/Movies/lpm-lessons/<slug>/ to the lpm YouTube channel through Chrome (YouTube Studio): search-optimized title and description with chapters, tags, category, the title-card thumbnail, Public, then added to the lesson playlist. Use when the user asks to upload, publish or post a lesson video to YouTube. Vertical videos from ~/Movies/lpm-lessons/tiktok/ go to YouTube Shorts through short-publish instead."
---

Upload a lesson video to YouTube and publish it.

- run `node scripts/prepare.js <slug or lesson folder> <scratchpad-dir>` first. It refuses a lesson whose checks failed or are older than the MP4 (`qa/report.json`, written by lesson's `make.js`); show the user the FAIL lines, and only with their go-ahead pass `--accept "<their reason>"`. It copies the MP4 into the scratchpad under the video title (the file name becomes the initial title in Studio; it warns when that dropped a ":" to retype), the thumbnail (the opening card, rendered by `make.js`), the captions (`<slug>.srt`), and writes `<slug>-description.txt` and `<slug>-tags.txt`, and prints the chapters. Chrome's `file_upload` only accepts files inside the scratchpad and under 10,000,000 bytes; when the master is larger, prepare.js writes a 1080p HEVC two-pass copy that fits instead (H.264 at that bitrate smears terminal text). YouTube gets the smaller copy; the master stays in the lesson folder.
- the description and tags come from `lesson.json` `"youtube": { "hook": [two lines], "learn": [...], "tags": [...], "hashtags": [...] }`: write that block first when the lesson has none (prepare.js says so), then run prepare.js again, so a replacement upload reuses the same words.
- captions: in the Details step's "Subtitles" (or later under Subtitles in Studio), Add language → English → Add subtitles → Upload file → With timing → the `.srt` from the scratchpad → Publish. They carry the script's own words (`lpm`, `Claude Code`, `Codex`), which YouTube's auto-captions get wrong. In the current dialog Subtitles sits under Video elements and its Add stays greyed until Details → Show more → Video language is set (English); after "With timing", do not press Continue (it opens the macOS file picker): `file_upload` the `.srt` into the `#captions-file-loader` input, then Done.
- thumbnail: the lesson's own `thumbnail.jpg`, never YouTube's auto-pick: with a `cover` in `lesson.json` it is that cover (words beside a crop of the take on the card canvas, approved 2026-09-30), otherwise the opening title card; prepare.js copies it and it is uploaded in the Thumbnail step. A new channel gets a few custom thumbnails a day; past that the upload answers "Build your channel history" and nothing is set: leave the video a private draft (untick the playlist so no private row shows) and publish the next day with the thumbnail, unless the user says otherwise.
- title: the lesson title from `lesson.json`, nothing appended (no "(Mac Tutorial)"), brand is lowercase `lpm`, 100 characters max.
- description: prepare.js assembles it in this order: a two-line keyword hook (what the video shows, for whom), one line on what lpm is (starts, stops, duplicates and switches between local dev projects on a Mac, with a built-in terminal for AI coding agents such as Claude Code and Codex), the link `https://lpm.cx` (never the demo link `lpm.cx/demo`, user rule 2026-09-19), "What you'll learn" bullets, "Chapters" (first at 0:00, at least three, each 10 s or longer: topic cards and `"chapter"` narration lines in lesson.json), one series line, 5–6 hashtags (#lpm #macOS #devtools …). No `@` anywhere (it opens a mention popup) and no next-lesson teaser.
- tags: 15–20 comma-separated (lpm, lpm.cx, the lesson's own verbs and nouns, Claude Code, Codex, mac dev tools, tutorial), under 500 characters. Category Science & Technology. Audience "No, it's not made for kids". Visibility Public. Playlist: the one in `YOUTUBE_PLAYLIST.md` (repo root: heading = playlist title, then its URL, then the lesson titles in series order).
- browser (Claude in Chrome MCP on the user's logged-in Chrome; channel "LPM"): `navigate https://www.youtube.com/upload` → `find` the file input → `file_upload` the MP4 → wait ~5 s → `find` the title and description textboxes, click + `type` → Thumbnail "Upload file" input → `file_upload` the JPEG → Audience radio → "Show more" → Tags textbox (type a comma after every tag) → Category: open the menu, take a full-scale screenshot, click the option by coordinate and `zoom` to verify (a click by `find` ref lands on the hovered row) → Playlists box (coordinate click) → tick the playlist → Done → Next ×3 → Public radio → Publish → copy the link from the "Video published" dialog.
- replacing a published lesson: YouTube cannot swap the file on an existing video, so upload the new cut as a new video (same title, description recipe and thumbnail), then set the old one to Private on `studio.youtube.com/video/<id>/edit` (Visibility box → Private → Done → Save; the Save button stays active until the change is saved). Deleting the old video is the user's call.
- never press Escape inside the upload dialog: it closes the dialog. The upload is already saved as a private draft; reopen it with "Edit draft" on the row. Later edits go through `studio.youtube.com/video/<id>/edit`, then Save.
- playlist, after Publish: the video must end up in the playlist from `YOUTUBE_PLAYLIST.md`, at the position its title has in that list. Preferred path is inside the upload dialog's Details step: the Playlists box ("Select") sits under the description; open it with a coordinate click (a ref click after `scroll_to` did not open it), tick the playlist, Done. If it was skipped, use `studio.youtube.com/video/<id>/edit` → Playlists → tick → Done → Save. The playlist is manually sorted and a new video is appended last, so uploading in series order needs nothing more; otherwise open `https://www.youtube.com/playlist?list=<id>` on the logged-in account, and use the row's ⋮ menu (Move to top / Move to bottom) or drag the ≡ handle until the order matches the file. Then run `node scripts/register.js <slug> <youtu.be link>`: it records the upload in the lesson folder (`published.json`), puts the link on the lesson's line in `YOUTUBE_PLAYLIST.md` (appending the line when it is missing; move it to its series position if needed) — that file is the order of record — and prints the entry for `website/lib/youtube-lessons.ts`; add it there and link it from the page about that feature. Studio's playlist page (`studio.youtube.com/playlist/<id>/videos`) lists and removes videos but cannot reorder them.
- verify before reporting: the row in Channel content shows Public, the thumbnail is the beige title card, the title has no suffix, and the playlist page shows the video in the right position. Report the youtu.be link, the title, the description text and the playlist position. External links stay plain text until the channel completes YouTube's one-time verification (a phone step only the user can do); say so once.

Files in this skill

  • SKILL.md7 KB
  • scripts/prepare.js9.5 KB
  • scripts/register.js2.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…