Skip to content

Repository files navigation

skool-kb

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.

License: MIT Python 3.10+ PRs welcome Agent-ready

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.


The easiest way to use this: just ask your agent

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.


What it can and cannot do

✅ It can

  • 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-whisper on CPU (free, slower).
  • Produce a clean, de-duplicated, plain-text knowledge base + an INDEX.md map.
  • Account for every videokb/VIDEO_REPORT.md shows 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 in kb/MISSING_VIDEOS.md, and ./add_native.sh adds any in a minute.
  • Re-run incrementally: already-downloaded audio and existing transcripts are skipped.

❌ It cannot (be honest with yourself)

  • 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.sh adds 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.

How it works

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>).


Manual quickstart

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 files

Then three quick edits:

  1. communities.txt — add the Skool community URLs you're a member of (one per line).
  2. cookies.txt — export your logged-in browser session → see docs/COOKIES.md.
  3. (optional) .env — add GROQ_API_KEY for 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 questions

Everything is resumable — re-run ./run.sh any time to pick up new content in minutes.


Transcription: Groq vs. local

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.


Troubleshooting

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.

Legal & ethics

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 .gitignore keeps your kb/, 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.


Contributing

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.

License

MIT © 2026 Ian Tinney. Built on the shoulders of yt-dlp, faster-whisper, and Groq.

About

Turn your Skool communities into a searchable, AI-queryable knowledge base — scrape posts, transcribe videos, then just ask an agent.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages