Write Markdown β Get beautiful presentations.
Powered by Slidev, Go Task, and Node.js.
Write a .md file, run one command, get a presentation. No PowerPoint. No dragging boxes around. Just text.
- π¨ Custom local themes β multiple themes to choose from, applied per presentation
- ποΈ Organised by subfolders β
slides/work/q2.md,slides/school/math.md, etc. - π Live preview β edit Markdown, see slides update instantly in the browser
- π Export to PDF or PPTX β one command, open instantly with
-o - βοΈ Config injection β set your name, company, date once in
config.json, injected everywhere - π Manage presentations β list, rename, duplicate from the terminal
Open PowerShell as Administrator:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expressionscoop install tasknpm i -g pnpm
pnpm setup
β οΈ Close and reopen PowerShell after runningpnpm setupso PATH is updated.
git clone <your-repo-url>
cd presentationstask setupThis installs all dependencies (including local themes), approves Playwright build scripts, and installs the Chromium browser used for PDF/PPTX export.
Edit config.json in the project root. These values are automatically injected into every new presentation:
{
"theme": "my-theme-name",
"author": "Your Name",
"date": "01.01.2026",
"subject": "Presentation Subject",
"company": "Your Company / School"
}themeβ default theme used when not=is passed totask new- All other fields appear in the header, footer, cover slide, and thank-you slide automatically
presentations/
βββ Taskfile.yml β all commands live here
βββ config.json β your name, date, subject, company, default theme
βββ template.md β base template for new presentations (with examples)
βββ template_empty.md β minimal blank template
βββ package.json
βββ pnpm-workspace.yaml β registers all themes/ as local packages
β
βββ themes/ β your custom Slidev themes
β βββ emerald-theme/
β β βββ package.json β declares name
β β βββ global-top.vue
β β βββ global-bottom.vue
β β βββ styles/
β β βββ index.css
β βββ lightblue-theme/
β βββ package.json
β βββ global-top.vue
β βββ global-bottom.vue
β βββ styles/
β βββ index.css
β
βββ slides/ β your .md source files
β βββ my-talk.md
β βββ react/
β βββ hooks.md
β
βββ output/ β built files land here (gitignored)
β
βββ scripts/ β internal Node scripts
βββ new.cjs
βββ inject.cjs
βββ inject_theme.cjs
βββ list.cjs
βββ rename.cjs
βββ duplicate.cjs
All commands use short single-letter parameters β no long flags to remember.
| Parameter | Meaning | Example |
|---|---|---|
n= |
presentation name / path | n=react/hooks |
t= |
theme name | t=custom-slidev-theme-1 |
o=true |
open file after export | o=true |
doc=false |
skip documentation template | doc=false |
s= |
source (for rename/duplicate) | s=old-name |
to= |
to (for rename/duplicate) | to=new-name |
task new n=my-talk
task new n=subfolder/my-talk
task new n=my-talk t=custom-slidev-theme-1
task new n=my-talk doc=false
task new n=my-talk t=custom-slidev-theme-1 doc=false- Creates
slides/my-talk.mdfromtemplate.md(with usage examples) - Pass
doc=false(ordoc=0/doc=f) to usetemplate_empty.mdinstead β a clean blank slate with no documentation - Pass
t=theme-nameto override the default theme fromconfig.json - Injects all values from
config.jsonautomatically
task watch n=my-talk
task watch n=subfolder/my-talk
task watch n=subfolder/my-talk t=custom-slidev-theme-1Opens a browser at http://localhost:3030. Edit the .md file and slides update instantly in the browser.
Useful browser shortcuts while presenting:
| Key | Action |
|---|---|
β / Space |
Next slide / animation |
β |
Previous slide |
P |
Presenter mode (notes + timer) |
O |
Slides overview |
F |
Fullscreen |
task pdf n=my-talk
task pdf n=subfolder/my-talk
task pdf n=my-talk o=true
task pdf n=my-talk o=true t=custom-slidev-theme-1Output: output/my-talk.pdf
Pass o=true to open the file immediately after export.
task pptx n=my-talk
task pptx n=my-talk o=true
task pptx n=my-talk o=true t=custom-slidev-theme-1Output: output/my-talk.pptx
Slides are exported as images β layout is pixel-perfect but not editable in PowerPoint.
Pass o=true to open the file immediately after export.
task listPrints a table of all presentations with their subject, author, date, theme, and which exports already exist.
If you update config.json while task watch is running, open a second terminal and run:
task inject n=my-talk
task inject n=my-talk t=custom-slidev-theme-1The browser will hot-reload automatically.
task rename s=old-name to=new-name
task rename s=react/hooks to=react/hooks-v2Renames the .md file and any existing output files (PDF, PPTX, HTML folder) to match.
task duplicate s=source-talk to=new-talk
task duplicate s=react/hooks to=vue/hooksCopies the source .md to a new path and injects fresh config values into it.
Themes live in the themes/ folder. Each is a local Slidev theme β a small npm package registered via pnpm-workspace.yaml.
Set the default in config.json:
{
"theme": "custom-slidev-theme-1"
}Or override per presentation when creating:
task new n=my-talk t=custom-slidev-theme-2Each theme has its own CSS variables in themes/your-theme/styles/index.css:
:root {
--c-bg: #F8FAFC; /* slide background */
--c-primary: #0F766E; /* headings, accents */
--c-secondary: #0D9488; /* sub-headings */
--c-text: #0F172A; /* body text */
--c-muted: #CCFBF1; /* borders, dividers */
--c-accent: #F0FDFA; /* subtle backgrounds */
}The header (global-top.vue) and footer (global-bottom.vue) inside each theme folder control what is shown on every slide. Changes take effect immediately in task watch without restarting.
- Copy an existing theme folder and rename it
- Update
namein the theme'spackage.jsonto match the folder name - Run
pnpm installfrom the project root to register it - Use it with
t=your-theme-name
pnpm not found after install
Run pnpm setup, then close and reopen PowerShell completely.
task not found in VS Code terminal
Press Ctrl+Shift+P β Terminal: Select Default Profile β choose PowerShell. Reopen the terminal.
PDF/PPTX export fails with Playwright error
pnpm approve-builds # select playwright-chromium
pnpm exec playwright install chromiumTheme not applying (no styling, no header/footer)
Run pnpm install from the project root β this registers all local theme packages. Then restart task watch.
Config values not updating on slides
Run task inject n=your-talk in a second terminal while watch is running.
Slidev tries to install theme from npm and fails
Your theme name in config.json or the slide frontmatter doesn't match the folder name in themes/. Check that the name field in themes/your-theme/package.json exactly matches what you have in config.json.
| Tool | Role |
|---|---|
| Slidev | Markdown β presentations |
| Go Task | Task runner / automation |
| pnpm | Package manager with workspace support |
| Playwright | Headless browser for PDF/PPTX export |
| Node.js | Config injection and management scripts |
MIT