Turn the Skool communities you're a member of into a local, searchable knowledge base you can ask questions — instead of scrolling feeds and watching hours of video.
It scrapes the posts, lessons, and comments from your communities, pulls transcripts for every video (free captions where they exist, Whisper transcription where they don't), and drops it all into a folder of plain-text markdown. Then you point an AI coding agent (Claude Code, Codex, Cursor, …) at that folder and ask real questions:
"Has anyone covered TikTok Shop affiliate approval timelines?" → searches the transcripts + posts, reads the hits, and answers with the source filenames so you can go straight to the original video or post.
Deliberately boring by design: no vector database, no embeddings, no RAG pipeline. Even 50+ hours of video is only a few MB of text — an agent greps and reads its way to answers faster than you could build a retrieval stack.
You don't have to read this README. Clone the repo and paste this to Claude Code or Codex inside it:
Read AGENTS.md and set this project up with me. Ask me for whatever you need.
The agent will walk you through everything — which cookies to export and how, whether to add a Groq key, and then it runs the pipeline for you. That's what AGENTS.md is for: a script for the agent so onboarding is a conversation, not a manual.
Prefer to do it by hand? See the Manual quickstart and the full docs/RUNBOOK.md.
- Scrape post / lesson / comment text from communities you're logged into, to markdown.
- Collect every video link (YouTube, Loom, Vimeo, Wistia, and native Skool).
- Grab free captions for YouTube/Vimeo videos (no transcription cost or time).
- Transcribe the rest via Groq Whisper (fast, ~$0.04/audio-hour) or local
faster-whisperon CPU (free, slower). - Produce a clean, de-duplicated, plain-text knowledge base + an
INDEX.mdmap. - Account for every video —
kb/VIDEO_REPORT.mdshows how many videos are in the KB vs missing, broken down by community, source (feed post / classroom lesson), and provider. Native videos it can't auto-download are listed by title inkb/MISSING_VIDEOS.md, and./add_native.shadds any in a minute. - Re-run incrementally: already-downloaded audio and existing transcripts are skipped.
- Access content you're not a member of. It uses your logged-in session. It is not a way around paywalls or private communities you haven't joined.
- Auto-download native Skool-hosted videos. Skool serves those via Mux HLS with short-lived signed tokens, so they can't be grabbed headless. But you're never left guessing: every one is listed by title in
kb/MISSING_VIDEOS.md, and./add_native.shadds any of them in ~1 minute from a browser-captured URL. See docs/NATIVE_VIDEOS.md. - Guarantee YouTube downloads from a cloud server / VPS. As of 2026, YouTube aggressively bot-checks datacenter IPs ("Sign in to confirm you're not a bot"). Logged-in cookies help but are not a guaranteed bypass. Run this on your own computer (residential IP) for best results. See Troubleshooting.
- Bypass Skool's Terms. This is for personal use of content you legitimately have access to. See Legal & ethics.
communities.txt ─┐
│ skool_dump.py yt-dlp transcribe.py srt2txt.py
cookies.txt ─────┼─▶ scrape __NEXT_DATA__ ─▶ captions + audio ─▶ Whisper (Groq/CPU) ─▶ clean text ─▶ kb/
│ posts + video URLs (free subs first) (only caption-less) dedupe
.env (Groq) ─────┘
kb/ ─▶ cd kb && claude
Skool is a Next.js app, so every page embeds its full data as JSON in a __NEXT_DATA__ blob. skool_dump.py walks that JSON generically (it doesn't assume a schema, so it degrades gracefully if Skool changes shape), writing post/lesson text to kb/posts/*.md and every video URL to video_urls.txt / native_videos.txt.
run.sh orchestrates the passes: scrape → captions → audio → transcribe → clean → index → report. Each is also runnable on its own (./run.sh <step>).
Prerequisites: Python 3.10+, git, and ffmpeg (for transcription). macOS: brew install ffmpeg. Ubuntu: sudo apt install ffmpeg.
git clone https://github.com/iantinney/skool-kb.git
cd skool-kb
./bootstrap.sh # venv + deps + Deno + config filesThen three quick edits:
communities.txt— add the Skool community URLs you're a member of (one per line).cookies.txt— export your logged-in browser session → see docs/COOKIES.md.- (optional)
.env— addGROQ_API_KEYfor fast transcription (free key). Skip it to use local CPU Whisper.
Build it, then query it:
./run.sh # scrape → captions → audio → transcribe → clean → index
cd kb && claude # or: codex — then ask your questionsEverything is resumable — re-run ./run.sh any time to pick up new content in minutes.
| Option | Speed | Cost | Setup |
|---|---|---|---|
Groq API (default if GROQ_API_KEY set) |
~100x realtime | ~$0.04/audio-hour¹ | free key from console.groq.com/keys |
| faster-whisper (fallback, CPU) | ~1–2x realtime | free | nothing extra |
| mlx-whisper (Apple Silicon, optional) | very fast on M-series | free | pip install mlx-whisper |
Most YouTube/Vimeo videos already have captions, which cost zero transcription either way — so the transcription backend only matters for Loom, native, and caption-less videos. Details: docs/TRANSCRIPTION.md.
¹ Approximate; Groq bills a 10-second minimum per request and prices change — check groq.com/pricing.
| Symptom | Cause / fix |
|---|---|
no __NEXT_DATA__ (login wall?) |
Cookies are missing or stale. Re-export cookies.txt (see docs/COOKIES.md). |
YouTube: Sign in to confirm you're not a bot |
The IP is bot-flagged (common on VPS/datacenter). Add fresh cookies; run on your home machine if possible. Heavy cases may need a PO-token provider — still not guaranteed. |
YouTube: Only images are available / no audio |
yt-dlp needs a JS runtime for YouTube. ./bootstrap.sh installs Deno; the audio pass uses --remote-components ejs:github. |
| Native Skool videos didn't download | Expected — they need signed HLS tokens. They're listed in kb/MISSING_VIDEOS.md; add any with ./add_native.sh (docs/NATIVE_VIDEOS.md). |
| Transcription is slow | You're on local CPU Whisper. Add a GROQ_API_KEY, or set WHISPER_MODEL=base in .env. |
This tool is for personal use of content you already have legitimate access to — communities you pay for or have joined. A few ground rules baked into the design and the docs:
- It only ever uses your own logged-in session; it cannot reach content you can't.
- Don't redistribute scraped content. The
.gitignorekeeps yourkb/, cookies, and keys out of git by default — keep it that way. - Scraping sits against Skool's Terms of Service even for content you can access; the polite request delay is on by default. Use responsibly and at your own risk.
- This project is not affiliated with Skool, Google/YouTube, Groq, or Mux.
See SECURITY.md for how the tool handles your cookies and keys.
Issues and PRs welcome — see CONTRIBUTING.md and our Code of Conduct. Good first contributions: more video hosts, better native-video handling, Windows support notes, additional languages for caption grabbing.
MIT © 2026 Ian Tinney. Built on the shoulders of yt-dlp, faster-whisper, and Groq.