From aradotso-trending-skills-37
Generates interactive single-page HTML courses from any codebase with animations, quizzes, plain-English translations, and progress tracking to teach code structure to non-technical users.
npx claudepluginhub joshuarweaver/cascade-ai-ml-agents-misc-1 --plugin aradotso-trending-skills-37This skill uses the workspace's default tool permissions.
```markdown
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
---
name: codebase-to-course
description: Generate beautiful, interactive single-page HTML courses from any codebase using Claude Code — teaching non-technical vibe coders how their code works through animations, quizzes, and plain-English translations.
triggers:
- "turn this codebase into a course"
- "explain this codebase interactively"
- "make a course from this project"
- "teach me how this code works"
- "interactive tutorial from this code"
- "generate a course from this repo"
- "create an HTML course for this project"
- "make this codebase learnable"
---
# Codebase to Course
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
A Claude Code skill that turns any codebase into a beautiful, self-contained single-page HTML course. Designed for "vibe coders" — people who build with AI tools and want to understand their own codebase well enough to steer AI better, debug more effectively, and talk to engineers confidently.
## What it produces
A **single HTML file** with zero dependencies that works offline, containing:
- Scroll-based modules with progress tracking and keyboard navigation
- Code ↔ Plain English side-by-side translations using real code from the repo
- Animated visualizations — data flow, component group chats, architecture diagrams
- Interactive quizzes testing *application* ("which files change if you add favorites?"), not memorization
- Glossary tooltips on hover for every technical term
- Warm, distinctive design (not the typical purple-gradient AI aesthetic)
## Installation
### As a Claude Code skill
```bash
# Clone the repo
git clone https://github.com/zarazhangrui/codebase-to-course
# Install the skill
cp -r codebase-to-course/codebase-to-course ~/.claude/skills/
The skill folder structure after install:
~/.claude/skills/codebase-to-course/
├── SKILL.md # Main skill instructions Claude reads
└── references/
├── design-system.md # CSS tokens, typography, colors, layout rules
└── interactive-elements.md # Quiz, animation, visualization code patterns
Open any project in Claude Code and say one of the trigger phrases. Claude will read SKILL.md and the reference files before generating the course.
Open a project in Claude Code and say any of:
"Turn this codebase into an interactive course"
"Teach me how this code works"
"Make a course from this project"
"Explain this codebase interactively"
Claude will:
course.html file in the project rootClaude reads and synthesizes:
main.py, index.js, app.py, server.ts, etc.)By default, the course is saved as course.html in the project root. You can specify a different location:
"Turn this into a course and save it as docs/tutorial.html"
Each course follows this module pattern:
Module 1: What Does This App Actually Do?
→ The "user journey" — what happens when someone uses it
→ Architecture overview diagram (animated)
Module 2: The Pieces (Components/Files/Services)
→ What each major piece does in plain English
→ How they talk to each other (group chat visualization)
Module 3: The Data
→ What gets stored, where, in what shape
→ Data flow animation (user action → processing → storage → response)
Module 4: [Feature-specific modules]
→ Real code snippets with side-by-side plain English
→ Quizzes on applying the concept
Module 5: Now You Can...
→ What you can now do better (steer AI, debug, talk to engineers)
→ Glossary of all technical terms used
references/design-system.md)Claude follows strict design rules when generating courses:
/* Core design tokens Claude uses */
:root {
--bg: #faf9f7; /* Warm off-white background */
--text: #1a1916; /* Near-black text */
--accent: #d4651f; /* Warm orange accent */
--accent-light: #f5e6d8; /* Light accent for highlights */
--mono: 'JetBrains Mono', monospace;
--sans: 'Inter', system-ui, sans-serif;
}
Key layout rules:
references/interactive-elements.md)<!-- Claude generates quizzes like this — testing application, not memory -->
<div class="quiz-block" data-quiz-id="unique-id">
<p class="quiz-question">
A user reports stale data after switching pages. Where would you look first?
</p>
<div class="quiz-options">
<button class="quiz-option" data-correct="false">
The database schema
</button>
<button class="quiz-option" data-correct="true">
The cache invalidation logic in <code>src/hooks/useData.ts</code>
</button>
<button class="quiz-option" data-correct="false">
The CSS for the loading spinner
</button>
</div>
<div class="quiz-feedback quiz-feedback--hidden">
<p class="quiz-explanation">
Stale data across page switches usually means the cache isn't being
cleared when it should be. The <code>useData</code> hook controls
when data gets refreshed.
</p>
</div>
</div>
<!-- Claude generates SVG animations showing data moving through the system -->
<div class="flow-animation" data-flow="user-request">
<svg viewBox="0 0 800 200">
<!-- Nodes: Browser → API → Auth → DB → Response -->
<g class="flow-node" data-step="1">
<rect x="20" y="80" width="120" height="40" rx="8"/>
<text x="80" y="104">Browser</text>
</g>
<!-- Animated path between nodes -->
<path class="flow-path" d="M 140 100 L 220 100"
stroke-dasharray="80" stroke-dashoffset="80">
<animate attributeName="stroke-dashoffset"
from="80" to="0" dur="0.5s"
begin="flow-step-1.end"/>
</path>
<!-- ... more nodes ... -->
</svg>
<div class="flow-caption">
<span class="flow-step-label" data-step="1">
You click "Submit" — your browser packages the form data
</span>
</div>
</div>
<!-- Technical terms get automatic tooltips -->
<span class="glossary-term"
data-definition="A function that runs when data changes —
like a notification that says 'hey, update yourself'">
useEffect
</span>
<!-- Real code on the left, plain English on the right -->
<div class="translation-block">
<div class="translation-code">
<pre><code class="language-typescript">
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const id = searchParams.get('id')
const item = await db.items.findUnique({ where: { id } })
if (!item) return NextResponse.json({ error: 'Not found' }, { status: 404 })
return NextResponse.json(item)
}
</code></pre>
<p class="code-source">From: <code>app/api/items/route.ts</code></p>
</div>
<div class="translation-english">
<p>
When someone asks for a specific item by ID, look it up in the database.
If it doesn't exist, say "not found" (404). If it does, send it back.
</p>
<p>
This is the <strong>API endpoint</strong> — the door your frontend
knocks on to get data.
</p>
</div>
</div>
"Make a course from this project — I want to understand it well enough
to add a user favorites feature with AI help"
"Turn this into a course focused on the authentication flow —
I keep breaking login when I add features"
"Make a course from this, but skip the payment processing parts —
focus on the core CRUD operations"
"Make this into a course assuming I know what an API is but have
never touched a database before"
"Just generate the data flow module for this codebase —
I already understand the architecture"
Each concept gets a unique metaphor that fits it specifically:
| Concept | Metaphor Claude might use |
|---|---|
| Database | Library with a card catalog |
| Auth/JWT | Wristband from a bouncer — proves you paid to get in |
| API | A restaurant menu — you can only order what's listed |
| Cache | Sticky note on your monitor vs. going to the filing cabinet |
| Webhook | A friend who texts you when something happens vs. you calling to check |
| Environment variables | The settings hidden behind a panel — not in the blueprint |
❌ Bad: "What does API stand for?"
✅ Good: "You want to add a 'favorites' feature. Based on what you learned, which files would you need to change?"
❌ Bad: "What HTTP method does GET use?"
✅ Good: "A user says their profile changes aren't saving. You check the network tab and see a 200 OK response. Where would you look next?"
Problem: Claude generated a course that could apply to any project.
Fix: Tell Claude to read specific files first:
"Before making the course, read src/app/page.tsx, lib/db.ts, and
api/routes/index.ts — the course should be specific to how THIS app works"
Problem: Explanations still feel like documentation.
Fix: Redirect Claude's tone:
"Regenerate the course — explain everything as if you're texting a
smart friend who has never coded but uses apps all day"
Problem: Something important to the codebase isn't covered.
Fix: Be explicit:
"The course is missing how the real-time updates work (Socket.io).
Add a module between Module 3 and 4 that explains that with an animation"
Problem: Very large codebases produce a very large HTML file.
Fix: Scope the course:
"Make a focused course — just the authentication system and the main
data models. Skip third-party integrations."
Problem: Quiz questions are testing recall not application.
Fix:
"The quizzes feel like trivia. Regenerate them so every question
starts with a scenario: 'A user reports that...' or 'You want to add...'"
If Claude drifts from the design philosophy, remind it:
"Remember: every screen should be at least 50% visual.
If you wrote three paragraphs in a row, turn one into a diagram."
"Code snippets must be exact copies from the actual files —
don't simplify or modify the real code."
"Quizzes test doing, not knowing.
No definition questions — only scenario questions."
~/.claude/skills/codebase-to-course/