Claudemy

I built a course generator. The hard part was stopping it from inventing sources.

Claudemy is a free Claude Code skill that makes 2-minute audio lessons, and a citation checker that refuses any lesson citing a page the research never read.

Why 40-hour courses never get finished

You wanted to learn negotiation. You got a 40-hour course, a syllabus someone wrote years ago, and a tab you never reopened.

I think the format is the problem. So I built Claudemy, an open-source Claude Code skill that does the opposite. You type this:

> teach me negotiation

It researches the web and hands back about 12 audio lessons, 2 minutes each. Two hosts talking. Each lesson has a card with one small thing to try.

Claudemy demo: type a topic, get 2-minute audio lessons, each with a card, one thing to try and a rule to keep

Making the audio was the smaller problem. The hard part was trust.

The problem with AI-generated courses and fake citations

Ask a model to teach you something and cite its sources. You will get citations. Some will point at pages that do not exist. A confident link to a Harvard page that was never published looks exactly like a real one.

I measured a version of this on the first full test. Search models suggested 34 URLs for the reading list. 12 of them were dead.

A course built on that is worse than no course. You would learn a claim, trust it because it had a source, and never find out the source was invented.

What the skill does, step by step

Claudemy runs as a Claude Code skill. The steps:

  1. Maps the topic into 12 to 18 sub-topics, after searching for how the topic is usually taught.
  2. Researches the web. 20 to 40 pages from practitioners, official docs, research summaries and a few dissenting views. No more than 3 pages from one site, so no single voice dominates.
  3. Reads and compares. Reader agents take cited notes. One agent merges them into themes with agreement counts.
  4. Plans the course in arcs of about 4 lessons, foundations first.
  5. Makes one sample lesson and waits for your reaction. Then it writes and records the rest.

Step 5 exists because fixing the format on one lesson is cheap. Fixing it on twelve is not.

The citation checker

Before any audio renders, a script called check_lessons.py reads each lesson.

It fails the lesson if the card cites a URL that is not in the pages the research actually saved. Not "looks wrong". Not on disk, fails.

It also checks the word band for a 2-minute lesson (280 to 350 words), banned phrases, and that every card section is present. The same script fails the lesson plan if the plan cites a URL that is not on disk.

The scraper does its part. It names every page it could not save and why: an HTTP error, a paywalled teaser, a thin or JavaScript-only page. While fewer than 20 pages are saved, the skill searches again.

The rule underneath is one line. A citation must be a page on disk. That is the whole defense against invented sources.

What the checker does not catch

This is the part most write-ups skip, so here it is.

It cannot tell whether the page says what the lesson claims. The checker matches URLs against files. That is all it does. On the first full test I checked the plan by hand and found 3 stories credited to the wrong page. The URLs were real and on disk, so the script passed them. A real page attached to the wrong claim is still a bad citation.

That was one full test, so treat it as an observation, not a rate. It is also why the skill tells the agent to send every story and number in the plan back to the note it came from, and the note back to its page.

It said "ok" when there was nothing to check. The plan check printed "ok" on a plan that cited no URLs at all. Nothing to check was reading as a pass. It now prints skip, with the reason. A check that passes on empty input is theater.

The packager lied about size. The script that zips the audio printed decimal MB against a cap measured in MiB. A zip of 24.8 MiB read 26.0 against a limit of 25. It looked over the cap when it was under. Units matter when a number is the whole message.

The first is a limit of the design. The other two were bugs in the scripts. That is the honest state of it.

What a course actually comes out as

The demo is a real negotiation course. Lesson 1 is "Your Walk-Away", 2:27 of two hosts talking. The card next to it gives you:

Across the course you also get:

Everything for one class lives in a folder under ./claudemy/<topic-slug>/: the saved pages, the notes, the agreement map, each lesson's script, card and audio. The pages are saved for your private study. Do not republish them.

A 12-lesson course is a long-running Claude Code session. Research, reading, writing, and about 25 minutes of generated audio.

You can also build a class from one person's work: teach me negotiation from <name>'s writing. It finds their Substack or blog and builds the lessons from that. If their archive cannot be read, it says so and offers research mode instead.

How to install Claudemy

In Claude Code:

/plugin marketplace add assafkip/claudemy
/plugin install claudemy@claudemy

Or copy skills/claudemy/ into ~/.claude/skills/, or download dist/claudemy.skill from the repo.

Then ask for any topic: teach me <topic>.

What you need:

The skill is MIT licensed. You pay only for what you already use: your Claude plan, and ElevenLabs credits if you want the premium voices.

Health, legal and financial topics get a note where the advice depends on your situation. It works best on anything people write about well on the open web: negotiation, public speaking, sourdough, pricing, SQL, music theory.

Tell me where it breaks

Repo: github.com/assafkip/claudemy

I know it breaks on a claim attached to the wrong page. I do not yet know which topics make it fall over. If you run it, tell me which ones, in the repo issues or in a GitHub issue.

More