vibe-learn
Open-source learning environment
Courses that run on your desktop, built around your goals
A self-contained desktop app: lessons, exercise workspaces, spaced repetition, and a
bundled Go toolchain that grades your code with real tests — offline, no accounts.
Describe the audience and outcome, let an AI coding tool generate the content.
$ gh repo clone jmilne22/vibe-learn
$ npm run new-course -- python
$ claude "Create a Python course"
$ npm run build
Get the desktop app
Every build bundles the course, clean exercise workspaces, vendored modules, and the Go
toolchain — nothing to install, works offline.
All releases →
Preview the courses in your browser
The browser preview covers lessons and flashcards. Test-graded exercises need the
desktop app (or a local checkout running vibe watch).
How it works
01
Scaffold
Create a course directory with the right lesson, exercise, and asset structure.
npm run new-course -- python
02
Generate
Give your AI tool the starter prompt, learner profile, and target outcome.
claude "Create a Python course"
03
Build and ship
Compile markdown and YAML into a static site that can be deployed anywhere.
npm run build
What you get
>_
Lessons & code comparisons
Markdown with syntax highlighting and side-by-side code comparisons. Show the same concept in two languages.
[ ]
Exercises & challenges
Warmups, challenges, multiple variants, difficulty modes, progressive hints, and annotated solutions.
SRS
Spaced repetition & flashcards
FSRS scheduling surfaces exercises and flashcards when you're about to forget. Review, discover, and weak-spot modes.
|||
Analytics & progress
Mastery dashboard with health cards, heatmaps, streaks, action items, and full data export. All local, no accounts.
Zero config
Content files drive features — no registries, no config files, no wiring.
Drop files in the right place and the build figures out the rest.
→
Drop a course folder — it appears on the site
The build scans courses/ for any directory with a course.yaml. Add a folder, rebuild, done.
courses/python/ + course.yaml → auto-discovered
→
Add a content file — the feature activates
Each plugin declares a content pattern. If a course has matching files, it gets the feature. No files? No dead links.
content/flashcards/flashcards.yaml → flashcards page active