A CLI (Deno/TypeScript) that downloads an entire Skool classroom: all videos (Skool-native Mux + embedded providers) and lesson attachments, organized into a structured folder tree on disk.
Disclaimer: This tool is meant for archiving content you have legitimate (paid) access to — e.g. making your own courses available offline. Respect the Skool Terms of Service and the copyright of the creators. Do not download or redistribute content you do not have the rights to. Use at your own risk.
- Deno ≥ 2.8
yt-dlpandffmpegin your PATHcookies.txt(Netscape format) exported from a logged-in browser
Run a browser extension like "Get cookies.txt LOCALLY" on www.skool.com and
save the result as ./cookies.txt (must contain auth_token). The cookie
expires — re-export it on auth errors. See cookies.example.txt for the format.
deno task dl <url> [options]
| Option | Default | Description |
|---|---|---|
<url> |
– | Community, classroom, or lesson URL |
--cookies <path> |
./cookies.txt |
Netscape cookie file |
--quality <best|1080|720|480> |
best |
Video quality |
--out <path> |
./downloads |
Output directory |
--lesson-only |
– | Only the lesson addressed via ?md= |
--no-attachments |
– | Videos without documents |
--dry-run |
– | List only, download nothing |
Examples (replace <your-community> with your community slug):
# whole classroom (dry-run first)
deno task dl "https://www.skool.com/<your-community>/classroom" --dry-run
deno task dl "https://www.skool.com/<your-community>/classroom" --quality 720
# single lesson
deno task dl "https://www.skool.com/<your-community>/classroom/<root>?md=<lessonId>" --lesson-onlydownloads/<course>/<module>/NN-<lesson>/video.mp4
Already-downloaded files are skipped (resumable).
- Skool is built on Next.js; page data lives in
<script id="__NEXT_DATA__">. - Classroom tree:
renderData.allCourses[]→ per coursepp.course(modules/lessons). - Per lesson,
/<slug>/classroom/<root>?md=<lessonId>returns the MuxplaybackId+ signedplaybackToken(JWT) inpp.video. Stream:https://stream.mux.com/<id>.m3u8?token=<jwt>, downloaded viayt-dlpwithReferer: https://www.skool.com/.
deno task test
metadata.resources is a JSON string containing
{title, file_id, file_name, file_content_type}. The actual download link is
resolved via POST https://api.skool.com/files/{file_id}/download-url (a signed
files.skool.com URL) and then fetched.
deno run --allow-read --allow-net src/diagnose.ts <slug> [slug...]— finds lessons that should have a video but where the download failed.deno run --allow-read --allow-net src/reconcile.ts <slug> [slug...] --out <dir>— lists videos that exist according to the crawl but are missing as.mp4on disk.
- Embeds (Loom/Vimeo/YouTube/Wistia) are detected from
videoLink+desc. - Sequential download (to be gentle on rate limits). No posts/comments (YAGNI).
MIT — see LICENSE.