Distribution & Analytics
Self-contained output
Every render produces one folder you can open, copy or host as it is:
my-talk/
index.html ← the presentation (share this)
speaker.html ← speaker view
sync.js ← speaker view sync
*.js ← timer, goto, history, break mode, header/footer, session log
images/ ← copied images
It works straight from disk (file://) or from any web server. Syntax highlighting and Google Fonts (if your theme uses them) load from the internet; everything else works offline.
Sharing options
Zip and email:
zip -r my-talk.zip my-talk/
Web server:
scp -r my-talk/ user@server:/var/www/html/
GitHub Pages — put the output in a docs/ folder or push it to a gh-pages branch.
Presenting from a phone or tablet — host the output on GitHub Pages or a web server, then open the URL on the device. Add #N to the URL to open a specific slide, for example https://example.com/my-talk/#5. See Navigation for touch controls. The live demo is hosted this way.
Local HTTP server (also avoids pop-up blockers for speaker view):
python3 -m http.server 8080
# open http://localhost:8080/my-talk/
PDF export
Browser print — simplest option. Each slide prints on its own landscape page, without the on-screen controls:
- Open
my-talk/index.html File → Print(Ctrl/Cmd + P)- Destination → Save as PDF
Headless Chrome:
chromium --headless --print-to-pdf=my-talk.pdf my-talk/index.html
Speaker notes are in speaker.html — they are not included in the PDF.
Session analytics
While you present, the page records every slide change and how it happened (keyboard, swipe, tap, button, goto, history, speaker view, link), timer pauses and breaks. Nothing is sent anywhere; the record stays in the page until you save it.
-
Present. Open the deck however you like, or with
display:java -jar md-slides.jar display my-talk -
Save the log. Press L at the end (or at any point). The browser saves
my-talk-YYYYMMDD-HHMMSS.log.json, usually to your Downloads folder, and the page confirms it on screen. -
Read the report:
java -jar md-slides.jar report my-talkreportuses the newest log for that deck in the deck's output folder, the current folder, or~/Downloads. To use a specific file:java -jar md-slides.jar report my-talk --log path/to/my-talk-20261017-143000.log.json
The report shows:
- Session length, presenting time and breaks
- Time per slide (breaks excluded), with slide titles and number of visits
- The five longest slides
- The path you took through the deck
- How you navigated (keyboard, swipe, goto, ...)
A log saved part-way through is marked as such. Review after each rehearsal to find the slides that run long.
Smart default
Run MD-Slides with just the deck name:
java -jar md-slides.jar my-talk
- If a saved session log exists, it shows that session's report first.
- It renders the deck if
my-talk.mdchanged since the last render (or was never rendered). - It opens the presentation in your browser.
That makes a rehearsal loop: run it, present, press L, run it again.