
Themodernsoftware Notebooklm
- 6 installs
- Updated February 25, 2026
- hamsterider-m/themodernsoftware-notebooklm-skill
Crawls weekly course materials from themodernsoftware.dev, ingests them into NotebookLM, and generates bilingual lesson plans, lecture notes, and video overviews.
About
An agent-controlled workflow that crawls a course site, loads materials into NotebookLM, and produces deep-study outputs tracked through state files. A developer uses it to turn a syllabus and slides that lack lecture videos into structured study artifacts.
- State-file driven pipeline (course.yaml/weeks.json) with discovered/ingested/completed statuses
- Strict failure policy: aborts the run if the source site is unreachable
Themodernsoftware Notebooklm by the numbers
- 6 all-time installs (skills.sh)
- Ranked #1,691 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/hamsterider-m/themodernsoftware-notebooklm-skill --skill themodernsoftware-notebooklmAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 6 |
|---|---|
| Last updated | February 25, 2026 |
| Repository | hamsterider-m/themodernsoftware-notebooklm-skill ↗ |
What it does
Crawls weekly course materials from themodernsoftware.dev, ingests them into NotebookLM, and generates bilingual lesson plans, lecture notes, and video overviews.
Files
TheModernSoftware NotebookLM
Overview
Run an agent-first workflow where Codex is the controller. Crawl weekly course materials from themodernsoftware.dev, ingest them into NotebookLM, and produce deep-study outputs without requiring a custom standalone agent service.
The workflow is deterministic through state files and templates:
- Use
templates/course.yamlandtemplates/weeks.jsonas the single source of run state. - Use
agent-browserfor page crawling and link extraction. - Use
notebooklmfor source ingestion and output generation.
Workflow
Step 0: Initialize runtime workspace
Create a runtime folder and copy templates:
./themodernsoftware-notebooklm/scripts/init-workspace.sh ./runtimeThis creates:
./runtime/course.yaml./runtime/weeks.json./runtime/prompts/*.prompt.md
Step 1: Preflight checks
Verify required tools before crawling:
agent-browser --help
notebooklm status --jsonIf notebooklm status --json fails, run notebooklm login.
Step 2: Crawl weekly materials (Codex-controlled)
Open https://themodernsoftware.dev/ with agent-browser and recursively discover week pages.
For each week, extract and classify links into:
syllabuspptreference
Persist each discovered week entry into weeks.json with status: "discovered".
Use crawl and classification rules from references/crawl-rules.md.
Step 3: Ingest into NotebookLM
For each status: discovered week: 1. Ensure notebook exists (from course.yaml.notebook_id; create once if empty). 2. Add all URLs/files for the week to NotebookLM sources. 3. Wait for source processing. 4. Write source_ids back into weeks.json. 5. Move status to ingested.
Use generation behavior and retries from references/notebooklm-deep-mode.md.
Step 4: Generate deep outputs
For each status: ingested week: 1. Generate bilingual lesson plan using prompts/lesson-plan.prompt.md. 2. Generate bilingual lecture notes using prompts/lecture-notes.prompt.md. 3. Generate video overview task using prompts/video.prompt.md. 4. Wait for video artifact completion. 5. Download video to local output path. 6. Update week status:
draftedafter document outputsvideo_pendingwhile video is generating/downloadingcompletedonly when all required artifacts exist
Step 5: Failure policy
Apply strict policy from references/failure-handling.md:
- If
themodernsoftware.devis unreachable: fail the current run immediately. - No automatic fallback source.
- Keep failure reason in
weeks.json.errorfor the affected week/run.
Output Contract
Each completed week must include:
lesson_plan_pathlecture_notes_pathvideo_artifact_idvideo_local_pathstatus: completed
Do not mark completed if video generation is unfinished.
Resources
references/crawl-rules.md: URL discovery and week classification rules.references/notebooklm-deep-mode.md: source ingestion, output generation, language and quality requirements.references/failure-handling.md: stop/retry/error recording policy.references/execution-checklist.md: runbook checklist.templates/course.yaml: runtime config template.templates/weeks.json: runtime state template.templates/weeks.schema.json: structure contract for state validation.templates/prompts/*.prompt.md: prompt templates.scripts/init-workspace.sh: initialize runtime workspace.scripts/verify-week-state.sh: validateweeks.jsonstructure.
Common mistakes
- Running generation before source processing finishes.
- Marking week as completed before video download succeeds.
- Losing state by not persisting
source_idsand artifact IDs. - Mixing unrelated links into week assets.
interface:
display_name: "TheModernSoftware NotebookLM"
short_description: "抓取课程周资料并生成NotebookLM深度学习产物"
default_prompt: "Use $themodernsoftware-notebooklm to crawl TheModernSoftware weekly resources and produce bilingual lesson plans, lecture notes, and video overviews with NotebookLM."
policy:
allow_implicit_invocation: true
Crawl Rules
Scope
Target domain: https://themodernsoftware.dev/
Only keep links likely related to weekly course content and supporting learning materials.
Discovery strategy
1. Start from homepage and course navigation pages. 2. Collect candidate URLs from anchors and visible page text. 3. Normalize URLs:
- Keep
httpsabsolute links. - Remove fragment-only duplicates.
- Deduplicate by normalized URL string.
Week identification
Classify page/link into a week candidate when any of these match:
- URL path includes
week,wk, or a numeric week segment. - Page heading includes
Week <N>. - Neighboring nav text indicates week progression.
Generate week_id as week-XX with zero padding.
Asset classification
Classify assets by URL/text hints:
syllabus: containssyllabus,outline,scheduleppt: contains.ppt,.pptx,slides,deckreference: all other supporting external links
If classification is ambiguous:
- Prefer
pptwhen slide/deck hints exist. - Prefer
syllabusfor course-structure pages. - Otherwise assign
reference.
Required minimum for processing
A week is eligible for NotebookLM ingest when:
- at least one
syllabusor onepptexists.
If neither exists, keep week in discovered with error note.
Execution Checklist
1. Run workspace init script. 2. Confirm agent-browser and notebooklm availability. 3. Confirm NotebookLM auth (notebooklm status --json). 4. Crawl and classify weekly assets. 5. Persist discovery state into weeks.json. 6. Ingest week assets into NotebookLM. 7. Generate lesson plan and lecture notes. 8. Generate and download video overview. 9. Validate state file with scripts/verify-week-state.sh. 10. Confirm completed weeks satisfy full quality gate.
Failure Handling
Hard stop conditions
Stop the run immediately when:
themodernsoftware.devis unreachable (DNS/network failure)- NotebookLM authentication is invalid and cannot be refreshed
No automatic fallback source is used.
Week-level failures
Mark only the affected week as failed when:
- one or more sources cannot be ingested
- generation command returns failure
- video download fails after artifact completion
Store failure details in:
weeks[].errorweeks[].last_attempt_at
Retry policy
On rerun, prioritize weeks in:
failedvideo_pending
Never overwrite completed outputs unless user explicitly requests regeneration.
NotebookLM Deep Mode
Language policy
Generate outputs in bilingual mode:
- Primary explanation in Simplified Chinese.
- Keep key terms and section labels with English counterparts.
Ingestion protocol
1. Ensure notebook_id exists in course.yaml. 2. Add each week asset as a source using URL or local file path. 3. Record returned source IDs to weeks.json. 4. Wait until all week sources are ready before generation.
Required outputs per week
1. Lesson plan (lesson-plan.zh-en.md) 2. Lecture notes (lecture-notes.zh-en.md) 3. Video overview artifact and downloaded overview.mp4
Suggested generation order
1. Lesson plan first (provides structure) 2. Lecture notes second (expand structure) 3. Video last (reference the first two outputs)
Quality gate
A week is complete only when all outputs exist and video is downloaded locally.
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <runtime-dir>" >&2
exit 1
fi
RUNTIME_DIR="$1"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
TEMPLATE_DIR="${SKILL_DIR}/templates"
mkdir -p "${RUNTIME_DIR}"
mkdir -p "${RUNTIME_DIR}/prompts"
cp "${TEMPLATE_DIR}/course.yaml" "${RUNTIME_DIR}/course.yaml"
cp "${TEMPLATE_DIR}/weeks.json" "${RUNTIME_DIR}/weeks.json"
cp "${TEMPLATE_DIR}/weeks.schema.json" "${RUNTIME_DIR}/weeks.schema.json"
cp "${TEMPLATE_DIR}/prompts/"*.prompt.md "${RUNTIME_DIR}/prompts/"
cat <<MSG
Initialized runtime workspace:
${RUNTIME_DIR}/course.yaml
${RUNTIME_DIR}/weeks.json
${RUNTIME_DIR}/weeks.schema.json
${RUNTIME_DIR}/prompts/*.prompt.md
MSG
#!/usr/bin/env bash
set -euo pipefail
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <weeks.json>" >&2
exit 1
fi
WEEKS_FILE="$1"
if ! command -v jq >/dev/null 2>&1; then
echo "ERROR: jq is required" >&2
exit 1
fi
jq -e '
.course_id | type == "string"
' "${WEEKS_FILE}" >/dev/null
jq -e '
.weeks | type == "array"
' "${WEEKS_FILE}" >/dev/null
jq -e '
all(.weeks[]?; has("week_id") and has("title") and has("source_urls") and has("assets") and has("status"))
' "${WEEKS_FILE}" >/dev/null
jq -e '
all(.weeks[]?; (.status | IN("discovered", "ingested", "drafted", "video_pending", "completed", "failed")))
' "${WEEKS_FILE}" >/dev/null
echo "State validation passed: ${WEEKS_FILE}"
course_id: themodernsoftware
base_url: https://themodernsoftware.dev/
mode: deep
languages:
- zh-Hans
- en
notebook_id: ""
completion_gate: sources+lesson_plan+lecture_notes+video_done
Create detailed bilingual lecture notes (zh-Hans + English terms) based on this week's syllabus/slides/reference materials.
Requirements: 1. Expand each core concept with examples and counterexamples. 2. Include likely student misconceptions and correction guidance. 3. Add a short Q&A section with model answers. 4. Keep technical terms bilingual.
Output format:
- Markdown
- Structured by teaching segments
Generate a bilingual (zh-Hans + English terms) lesson plan for this week.
Requirements: 1. Include learning objectives, prerequisite knowledge, core concepts, and in-class activities. 2. Use Chinese as the primary explanation language, with English term labels. 3. Include a 90-minute session timeline and assessment checkpoints. 4. Cite source materials when possible.
Output format:
- Markdown
- Sectioned headings
- Actionable instructor notes
Based on this week's materials, generate a bilingual Chinese-first video overview script and structure.
Requirements: 1. Follow the lesson-plan structure. 2. Keep Chinese narrative natural for spoken explanation. 3. Preserve critical English technical terms. 4. Include short intro, concept walkthrough, and recap.
Style:
- Instructor-led, clear pacing, suitable for self-study learners.
{
"course_id": "themodernsoftware",
"weeks": []
}
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "TheModernSoftware Week State",
"type": "object",
"required": ["course_id", "weeks"],
"properties": {
"course_id": {"type": "string"},
"weeks": {
"type": "array",
"items": {
"type": "object",
"required": [
"week_id",
"title",
"source_urls",
"assets",
"status"
],
"properties": {
"week_id": {"type": "string"},
"title": {"type": "string"},
"source_urls": {
"type": "array",
"items": {"type": "string"}
},
"assets": {
"type": "array",
"items": {
"type": "object",
"required": ["type", "url"],
"properties": {
"type": {
"type": "string",
"enum": ["syllabus", "ppt", "reference"]
},
"url": {"type": "string"},
"local_path": {"type": "string"},
"hash": {"type": "string"}
}
}
},
"notebook_id": {"type": "string"},
"source_ids": {
"type": "array",
"items": {"type": "string"}
},
"lesson_plan_path": {"type": "string"},
"lecture_notes_path": {"type": "string"},
"video_artifact_id": {"type": "string"},
"video_local_path": {"type": "string"},
"status": {
"type": "string",
"enum": [
"discovered",
"ingested",
"drafted",
"video_pending",
"completed",
"failed"
]
},
"error": {"type": "string"},
"last_attempt_at": {"type": "string"}
}
}
}
}
}