A simple tool to convert Markdown lectures into self-contained HTML presentations with text-to-speech narration.
- New Feature: Choose between auto-play and manual navigation modes
- Problem Solved: Slides advancing too fast on Linux/Chromium when speech fails
- User Control: Students can now select their preferred playback mode before starting
- Platform Hint: Manual mode recommended for Linux + Chrome users
- Removed ZIP Export: Simplified to single HTML file export only
- Robust Voice Loading: Better handling of browser voice initialization
- Manual Controls: Students can now navigate slides manually with buttons or keyboard
- Progress Indicator: Shows current slide number (e.g., "Slide 3 of 10")
- Error Handling: Clear status messages and graceful fallbacks
- Better UI: Loading spinner, status messages, improved mobile support
The previous ZIP export required students to:
- Extract the ZIP file
- Run a local web server (or deal with CORS errors)
- Have specific browser permissions enabled
The new single HTML export is much simpler:
- ✅ Students just double-click the HTML file
- ✅ Works offline from file:/// URLs
- ✅ No server or special setup needed
- ✅ Works even if text-to-speech is unavailable
-
Open
index.htmlin a web browser -
Write or paste your Markdown lecture
- Use
#for titles (these create new slides) - Use
##and###for subtitles - Include lists, code blocks, images, etc.
- See
test-lecture.mdfor examples
- Use
-
Preview the lecture
- Click "Play Preview" to test the narration
- Adjust voice, rate, and pitch as desired
-
Export for students
- Click "Export for Students"
- Save the
presentation.htmlfile - Share this single file with your students
-
Download the HTML file your teacher shared
-
Double-click to open in any modern web browser
- Chrome, Firefox, Edge, Safari all work
-
Choose your playback mode:
- Auto-play with voice: Slides advance automatically with narration (recommended for Windows/Mac)
- Manual navigation: You control slide advancement with buttons (recommended for Linux + Chrome)
-
Customize settings (auto-play mode only):
- Select preferred voice
- Adjust speed (rate) and tone (pitch)
-
Click "Start Presentation" or "Start (Manual Navigation)"
-
Navigation Options:
- Auto mode: Listen to narration, slides advance automatically
- Use Next/Previous to skip or review
- Manual mode: Click Next to advance at your own pace
- Keyboard shortcuts (both modes):
- Spacebar or → arrow: Next slide
- ← arrow: Previous slide
- Esc: Stop speech (auto mode)
- Auto mode: Listen to narration, slides advance automatically
Each heading level 1 (#) or level 2 (##) creates a new slide:
# Introduction
Welcome to the lecture!
## Main Topic
This becomes slide 2
### Subtopic
This is still part of slide 2
## Another Topic
This becomes slide 3**Bold text** for emphasis
*Italic text* for subtle emphasis
`inline code` for technical terms
- Bullet point 1
- Bullet point 2
1. Numbered item
2. Another item

Use triple backticks for code:
```python
def hello():
print("Hello, students!")
```- Voice: Select your preferred narration voice
- Rate: Adjust speed (0.6 = slower, 1.3 = faster)
- Recommended: 0.9-1.0 for teaching
- Pitch: Adjust tone (usually leave at 1.0)
Students can also adjust these settings before starting the presentation.
- Symptom: Slides move every 1-2 seconds, no time to read
- Cause: Speech synthesis unavailable on Linux/Chromium from file:/// URLs
- Solution:
- When opening the lecture, select "Manual navigation" mode
- Use Next/Previous buttons to control pace at your own speed
- Alternative: Use Firefox instead (has better Linux speech support)
- Solution: Wait 3-5 seconds, then click "Start Anyway"
- The browser will use its default voice
- Better option: Switch to manual navigation mode
- This is normal on some Linux systems or older browsers
- Check: Is your system volume on?
- Check: Does your browser support text-to-speech?
- Solution: Use manual navigation mode - no voice needed
- Fallback: Use the Next/Previous buttons for manual navigation
- Check: Make sure you opened the HTML file in a browser
- Try: Right-click → Open With → Browser name
- Check: Browser console for errors (F12 → Console tab)
Modern browsers should work fine with file:/// URLs for this tool. If you encounter issues:
- Try a different browser (Chrome/Firefox recommended)
- Or serve via a simple HTTP server
- Chrome/Chromium: ✅ Excellent support (Windows/Mac),
⚠️ Use manual mode on Linux - Firefox: ✅ Excellent support (all platforms including Linux)
- Safari: ✅ Good support
- Edge: ✅ Excellent support
- Mobile browsers:
⚠️ Limited voice selection, manual mode recommended
- Small lecture (10 slides): ~50-100 KB
- Medium lecture (30 slides): ~150-300 KB
- Large lecture (100 slides): ~500KB-1MB
Images are NOT embedded, only referenced by URL.
- ✅ Works completely offline
- ✅ No external dependencies after export
- ✅ No tracking or analytics
- ✅ No internet connection required
Uses the Web Speech API (speechSynthesis) built into modern browsers:
- Free and built-in
- Quality depends on your operating system
- Windows/Mac have excellent voices
- Linux voices may be more robotic
- Frontend only: No backend server needed
- ES5 compatible: Works in older browsers
- No build step: Plain HTML/CSS/JS
- Self-contained exports: Everything in one file
index.html: Main application interfaceapp.js: Application logic and export functionalitystyle.css: (Optional) Additional stylingtest-lecture.md: Example lecture for testing
- Marked.js: Markdown parsing
- FileSaver.js: File download
See plan-export-fix.md for the detailed implementation plan.
Possible improvements:
- Pause/Resume button during playback
- Jump to specific slide
- Embedded images (base64 encoding)
- PDF export option
- Slide notes (visible to teacher only)
- Timer/duration estimates
This project is free to use for educational purposes.
If students or teachers encounter issues:
- Check the Troubleshooting section above
- Try the
test-lecture.mdexample - Test in a different browser
- Check browser console for error messages (F12)
Version: 2.1.0 (October 2025)
Status: Production ready
Latest Feature: Manual mode toggle for platform compatibility
Tested on: Chrome 119, Firefox 120, Edge 119 (Linux/Windows/Mac)