A modern, static single-page web application for learning any topic through practical examples. Built with Vue 3, this platform features interactive lessons with audio pronunciation, progress tracking, and a clean, responsive interface.
- π Topic-Based Learning: Organized lessons with sections and examples for any subject
- π Multi-Language Interface: Learn any topic in your preferred language
- π Audio Reading: Pre-recorded MP3 audio with variable speed and lock screen controls
- π Progress Tracking: Mark vocabulary items as learned with LocalStorage persistence
- β Interactive Assessments: Text input, multiple-choice, and single-select with auto-validation (click-to-save)
- π€ Coach Integration: Optional batch forwarding of assessment answers to external coach services
- π External Workshops: Add remote content sources hosted on GitHub Pages, IPFS, or any CDN
- πΎ Export / Import: Per-topic backup and restore of progress and assessment data
- π Dark Mode: Toggle between light and dark themes
- π± Responsive Design: Works seamlessly on desktop and mobile devices
- π Static Deployment: No backend required β easy deployment to GitHub Pages
- π YAML-Based Content: Simple, human-readable lesson format
- Framework: Vue 3.4+ (Composition API with SFCs)
- Routing: Vue Router 4.6+ (hash-based routing)
- Build Tool: Vite 5.0
- Styling: Tailwind CSS 3.4
- Package Manager: pnpm
- Data Format: YAML (parsed with js-yaml 4.1)
- Markdown: Marked 17.0 for explanations
- Testing:
- Vitest 1.0 (unit tests)
- Playwright 1.40 (E2E tests)
- Node.js 18+
- pnpm (installed automatically via packageManager field)
# Clone the repository
git clone https://github.com/openlearnapp/openlearnapp.github.io.git
cd openlearnapp.github.io
# Install dependencies
pnpm install
# Start development server
pnpm devVisit http://localhost:5173 to see the app running.
# Development server with hot reload
pnpm dev
# Build for production
pnpm build
# Preview production build locally
pnpm preview
# Run unit tests (Vitest)
pnpm test
# Run unit tests with UI
pnpm test:ui
# Run E2E tests (Playwright)
pnpm test:e2eopenlearnapp.github.io/
βββ src/
β βββ main.js # Application entry point
β βββ App.vue # Root component with navigation
β βββ style.css # Custom styles (imports Tailwind)
β βββ router/
β β βββ index.js # Vue Router configuration
β βββ views/ # Page components
β β βββ Home.vue # Topic selection
β β βββ LessonsOverview.vue # Lessons grid
β β βββ LessonDetail.vue # Lesson viewer
β β βββ LearningItems.vue # Learning items browser
β β βββ Settings.vue # Settings panel
β βββ composables/ # Reusable composition functions
β β βββ useLessons.js # Lesson loading logic
β β βββ useSettings.js # Settings persistence
β β βββ useProgress.js # Progress tracking
β β βββ useAudio.js # Audio playback system
β βββ utils/
β βββ formatters.js # Display name formatting
βββ public/
β βββ lessons/ # YAML lesson content
β βββ index.yaml # Root index
β βββ deutsch/ # German learning content
βββ tests/ # Test files
βββ docs/ # Documentation
β βββ lesson-schema.md # YAML schema reference
β βββ yaml-schemas.md # Index file schemas
β βββ audio-system.md # Audio system docs
βββ dist/ # Production build output
- Navigate to the appropriate folder:
public/lessons/<language>/<workshop>/ - Create a new lesson folder:
public/lessons/<language>/<workshop>/##-lesson-name/ - Create
content.yamlin the lesson folder following the schema (seedocs/lesson-schema.md) - Add the folder name to
lessons.yaml - Optionally generate audio files with
./generate-audio.sh
number: 1
title: "Basic Verbs"
description: "Essential verbs for daily conversation"
sections:
- title: "Common Verbs"
explanation: |
These are the most commonly used verbs.
examples:
- q: "Ich bin Student"
a: "I am a student"
labels: ["Present"]
rel:
- ["bin", "am", "to be"]- Create folder structure:
public/lessons/<learning>/<workshop>/ - Add workshop to
public/lessons/<learning>/workshops.yaml - Create
lessons.yamlwith lesson folder names - Add lesson folders with
content.yamlfiles
For complete schema documentation, see docs/lesson-schema.md.
Located in tests/, run with:
pnpm testLocated in tests/e2e/, run with:
pnpm test:e2eThe application is configured for GitHub Pages deployment using GitHub Actions.
# Build the project
pnpm build
# The dist/ folder is ready for deploymentPush to the main branch triggers automatic deployment via GitHub Actions (.github/workflows/static.yml).
Note: Vite is configured with base: '/' for custom domain deployment at open-learn.app.
- SFC Pattern: Single File Components with Composition API
- Composables: Shared logic via composition functions
- Singleton Settings: Centralized settings management
- Dynamic Routing: Hash-based routing for static hosting
#/- Home (workshop selection)#/:learning/:workshop/lessons- Lessons overview#/:learning/:workshop/lesson/:number- Lesson detail#/:learning/:workshop/items/:number?- Learning items#/settings- Settings panel#/add?source=URL- Add external workshop
- Load
lessons/index.yamlβ get available interface languages - Load
lessons/{lang}/workshops.yamlβ get workshops - Load
lessons/{lang}/{workshop}/lessons.yamlβ get lesson folders - Load lesson content dynamically with js-yaml
- Render with Vue components
Community workshops hosted on open-learn.app:
| Workshop | Description | Link |
|---|---|---|
| Portugiesisch | 10 lessons β 30 core Portuguese verbs (DE) | Start Β· Repo |
| Englisch | 10 lessons β 30 core English verbs (DE) | Start Β· Repo |
| Farsi | 5 lessons β key words and phrases (DE/EN/FA) | Start Β· Repo |
| Arabisch | 5 lessons β key words and phrases (DE/EN/AR) | Start Β· Repo |
| KI im Journalismus | Workshop zum Einsatz von KI-Tools in der journalistischen Praxis | Start Β· Repo |
Want to create your own workshop? See the External Workshop Guide.
- Follow semantic commit conventions
- Create feature branches (never push to
main) - Include tests and documentation
- Create pull requests for review
See LICENSE file for details.
For detailed development guidance and architecture information, see CLAUDE.md.