This extension let you display a reveal.js presentation directly from an opened markdown document.

Full documentation here
The extension targets engines.vscode: ^1.105.0 and keeps @types/vscode aligned to the same API generation.
This baseline matches the current stable extension platform while still allowing patch/minor compatibility updates for contributors and CI.
Open the repository in VS Code and press F5. The workspace will:
src/**/*.ts back to the generated bundle.Use the Run Extension (F5) launch configuration. The existing watch tasks remain available when you want automatic rebuilds while editing.
Create reveal.js presentation directly from markdown file, open or create a new file in markdown and use default slide separator to see slide counter change in the status bar and title appear in the sidebar.
Since Reveal.js use marked to parse the markdown string you can use this in your document:
Fragments can be authored directly in markdown with attributes (no raw HTML needed):
- First point {.fragment}
- Then emphasize this {.fragment .highlight-red}
- Finally this one {.fragment data-fragment-index="2"}
Paragraph shown later {.fragment .fade-up}
To reveal every list item incrementally, set revealjs.incremental to true in VS Code settings or use incremental: true in a deck's front matter.
If you need a sample file you can get it here: https://raw.githubusercontent.com/evilz/vscode-reveal/master/sample.md
As soon as your markdown document has at least two slides, slides counter will appear in the status bar on right.

Clicking on slide counter will launch preview on right, and you can now see the local address of express server used to host Reveal presentation. Clicking on the address will launch presentation in the browser.
You can stop express server when you want by clicking on the red square.
Now in version 2, you can see a list of all your slides on the sidebar. The list will show the first line of text that is found in the slide, most of the time it will be a title, but it can also be an image or something else.
Blue icon is used to show horizontal slide, orange is used for vertical ones.
Clicking on slide name will move the cursor on beginning of the slide in the editor. If the preview is opened it will also show the selected slide on it.

reveal.js comes with a few themes built in:
You can set it using revealjs.theme parameter in Vs code config or in the document itself using front matter.
If you want a custom theme you can do it! Just add custom style to a CSS file in the same folder that your markdown.
example:
if your file name is my-theme.css just add this in the front matter header :
---
customTheme : "my-theme"
---
Note that you can use both theme and custom theme at the same time. Your custom theme will be loaded after to override default reveal.js theme.
Path resolution rules for local assets and export:
customTheme, css, init.js, and init.esm.js are resolved from the markdown document folder when the document is saved (file: and remote vscode-remote: documents).untitled: documents, relative paths resolve from the matching workspace folder (or the first workspace folder if no direct match exists).revealjs.exportHTMLPath keeps absolute paths as-is; relative export paths resolve from the same base folder rules above.You can use code block in your markdown that will be highlighted by highlight.js.
So you can configure the coloration theme by setting revealjs.highlightTheme parameter of VS Code, or set it using front matter.
---
highlightTheme : "other theme"
---
Get the theme list here https://highlightjs.org/
Diagram languages supported by Kroki (for example mermaid, plantuml, graphviz, etc.) can be rendered remotely.
revealjs.diagramServerEnabled (default: true) keeps current behavior and renders diagrams as images.revealjs.diagramServerUrl (default: https://kroki.io) lets you target your own Kroki-compatible endpoint.For a fully local/offline mode, set:
offline: true
In this mode, the extension does not load its CDN-hosted MathJax runtime or seminar socket client, and diagram code blocks are kept as plain code blocks rather than triggering remote diagram requests. Font Awesome and all other extension assets are bundled locally. User-authored remote images, stylesheets, and scripts remain under the presentation author's control.
Place an init.js file next to your markdown file to replace the default Reveal.js initialization script. If your initialization needs ECMAScript modules, use init.esm.js instead; it is loaded as <script type="module">, so it can use standard import statements for files served from the same folder. When both files exist, init.esm.js takes precedence. init.esm.js must be a complete custom initialization script and initialize Reveal itself, just like init.js.
You can customize many setting on for your reveal.js presentation.
Configuration contract notes (validated by unit tests):
author, autoPlayMedia, customHighlightTheme, customTheme, defaultTiming, description, display, enableTitleFooter, fragmentInURL, logLevel, logoImg, notesSeparator, separator, verticalSeparator.hashOneBasedIndex, showSlideNumber.| Name | Description | Default |
|---|---|---|
revealjs.notesSeparator | Revealjs markdown note delimiter | note: |
revealjs.separator | Revealjs markdown slide separator | ^(
?|
)---(
?|
)$ |
revealjs.verticalSeparator | Revealjs markdown vertical separator | ^(
?|
)--(
?|
)$ |
revealjs.theme | Revealjs Theme (black, white, league, beige, sky, night, serif, simple, solarized | black |
revealjs.highlightTheme | Highlight Theme | Zenburn |
revealjs.diagramServerEnabled | Enable remote diagram rendering through a Kroki-compatible server | true |
revealjs.diagramServerUrl | Base URL of the Kroki-compatible diagram server | https://kroki.io |
revealjs.offline | Disable externally hosted extension resources | false |
revealjs.controls | Display controls in the bottom right corner | true |
revealjs.progress | Display a presentation progress bar | true |
revealjs.slideNumber | Display the page number of the current slide | |
revealjs.history | Push each slide change to the browser history | |
revealjs.keyboard | Enable keyboard shortcuts for navigation | true |
revealjs.overview | Enable the slide overview mode | true |
revealjs.center | Vertical centering of slides | true |
revealjs.touch | Enables touch navigation on devices with touch input | true |
revealjs.loop | Loop the presentation | |
revealjs.rtl | Change the presentation direction to be RTL | |
revealjs.shuffle | Randomizes the order of slides each time the presentation loads | |
revealjs.fragments | Turns fragments on and off globally | true |
revealjs.embedded | Flags if the presentation is running in an embedded mode, i.e. contained within a limited portion of the screen | |
revealjs.help | Flags if we should show a help overlay when the questionmark key is pressed | true |
revealjs.showNotes | Flags if speaker notes should be visible to all viewers | |
revealjs.autoSlide | Number of milliseconds between automatically proceeding to the next slide, disabled when set to 0, this value can be overwritten by using a data-autoslide attribute on your slides | |
revealjs.autoSlideMethod | The direction in which the slides will move whilst autoslide is activet | Reveal.navigateNext |
revealjs.autoSlideStoppable | Stop auto-sliding after user input | true |
revealjs.mouseWheel | Enable slide navigation via mouse wheel | |
revealjs.hideAddressBar | Hides the address bar on mobile devices | true |
revealjs.previewLinks | Opens links in an iframe preview overlay | |
revealjs.transition | Transition style (none/fade/slide/convex/concave/zoom) | default |
revealjs.transitionSpeed | Transition speed (default/fast/slow) | default |
revealjs.backgroundTransition | Transition style for full page slide backgrounds (none/fade/slide/convex/concave/zoom) | default |
revealjs.viewDistance | Number of slides away from the current that are visible | 3 |
revealjs.parallaxBackgroundImage | Parallax background image | |
revealjs.parallaxBackgroundSize | Parallax background size (CSS syntax, e.g. 2100px 900px) | |
revealjs.parallaxBackgroundHorizontal | Number of pixels to move the parallax background per slide | |
revealjs.parallaxBackgroundVertical | Number of pixels to move the parallax background per slide | |
You can change settings directly in your markdown file using front matter style. You can change all extention settings like this :
---
theme : "white"
transition: "zoom"
---
Note do not add
revealjs.prefix before setting name.
You can scaffold a new presentation directly from built-in templates:
Revealjs: New presentation from templateMinimal, Code-heavy, Speaker notes, or Custom theme).md fileWhen a template needs local assets (for example Custom theme), the extension creates only the required supporting files next to your presentation.
To display the preview on the right side you can :
Revealjs: Show presentation by sideThe preview will be synchronize with the current cursor position.
To display presentation in the browser you can:
Revealjs: Open presentation in a browserThis uses VS Code's native external URL API by default (same behavior as opening a URL from VS Code).
If revealjs.browserPath is set, the extension uses that executable path to launch the presentation instead of the VS Code default external opener.
To open a dedicated presenter workflow (speaker notes + current/upcoming slide):
Revealjs: Open presenter view in browserRevealjs: Open presentation in a browser, then press SHow it works with the main deck preview:
note: / <aside class="notes">) are shown in the presenter windowSupported execution modes:
revealjs.browserPath): fully supportedTo export your presentation to pdf you can:
Revealjs: Export in PDFThis opens the print URL using the same browser resolution rules as above:
revealjs.browserPath is set and valid, that executable is usedPDF export uses Reveal.js print settings. Set revealjs.pdfSeparateFragments to false to keep fragments on the same exported page, set revealjs.pdfMaxPagesPerSlide to cap slide overflow pages, and use revealjs.slideNumber formats such as h/v when you need formatted slide numbers.
Be sure to set print setting correctly:
To export your presentation to a static website you can:
Revealjs: Export in HTMLThe export runs in the extension host and then opens the export folder using VS Code native APIs.
Folder-open fallback behavior:
revealFileInOS (native reveal in file manager)vscode.env.openExternal with a file:// URI---
enableMenu: false
---
---
enableChalkboard: false
---
---
enableTitleFooter: false
---
---
enableZoom: false
---
---
enableSearch: false
---
Note : The first time, Windows will ask you about the firewall. If you open the port for the application, you can see your presentation remotely.
Please add issues on github.
413 commits
148 commits
27 commits
26 commits
JavaScript
76.2%
TypeScript
12.2%
CSS
10.3%
This extension let you display a reveal.js presentation directly from an opened markdown document.

Full documentation here
The extension targets engines.vscode: ^1.105.0 and keeps @types/vscode aligned to the same API generation.
This baseline matches the current stable extension platform while still allowing patch/minor compatibility updates for contributors and CI.
Open the repository in VS Code and press F5. The workspace will:
src/**/*.ts back to the generated bundle.Use the Run Extension (F5) launch configuration. The existing watch tasks remain available when you want automatic rebuilds while editing.
Create reveal.js presentation directly from markdown file, open or create a new file in markdown and use default slide separator to see slide counter change in the status bar and title appear in the sidebar.
Since Reveal.js use marked to parse the markdown string you can use this in your document:
Fragments can be authored directly in markdown with attributes (no raw HTML needed):
- First point {.fragment}
- Then emphasize this {.fragment .highlight-red}
- Finally this one {.fragment data-fragment-index="2"}
Paragraph shown later {.fragment .fade-up}
To reveal every list item incrementally, set revealjs.incremental to true in VS Code settings or use incremental: true in a deck's front matter.
If you need a sample file you can get it here: https://raw.githubusercontent.com/evilz/vscode-reveal/master/sample.md
As soon as your markdown document has at least two slides, slides counter will appear in the status bar on right.

Clicking on slide counter will launch preview on right, and you can now see the local address of express server used to host Reveal presentation. Clicking on the address will launch presentation in the browser.
You can stop express server when you want by clicking on the red square.
Now in version 2, you can see a list of all your slides on the sidebar. The list will show the first line of text that is found in the slide, most of the time it will be a title, but it can also be an image or something else.
Blue icon is used to show horizontal slide, orange is used for vertical ones.
Clicking on slide name will move the cursor on beginning of the slide in the editor. If the preview is opened it will also show the selected slide on it.

reveal.js comes with a few themes built in:
You can set it using revealjs.theme parameter in Vs code config or in the document itself using front matter.
If you want a custom theme you can do it! Just add custom style to a CSS file in the same folder that your markdown.
example:
if your file name is my-theme.css just add this in the front matter header :
---
customTheme : "my-theme"
---
Note that you can use both theme and custom theme at the same time. Your custom theme will be loaded after to override default reveal.js theme.
Path resolution rules for local assets and export:
customTheme, css, init.js, and init.esm.js are resolved from the markdown document folder when the document is saved (file: and remote vscode-remote: documents).untitled: documents, relative paths resolve from the matching workspace folder (or the first workspace folder if no direct match exists).revealjs.exportHTMLPath keeps absolute paths as-is; relative export paths resolve from the same base folder rules above.You can use code block in your markdown that will be highlighted by highlight.js.
So you can configure the coloration theme by setting revealjs.highlightTheme parameter of VS Code, or set it using front matter.
---
highlightTheme : "other theme"
---
Get the theme list here https://highlightjs.org/
Diagram languages supported by Kroki (for example mermaid, plantuml, graphviz, etc.) can be rendered remotely.
revealjs.diagramServerEnabled (default: true) keeps current behavior and renders diagrams as images.revealjs.diagramServerUrl (default: https://kroki.io) lets you target your own Kroki-compatible endpoint.For a fully local/offline mode, set:
offline: true
In this mode, the extension does not load its CDN-hosted MathJax runtime or seminar socket client, and diagram code blocks are kept as plain code blocks rather than triggering remote diagram requests. Font Awesome and all other extension assets are bundled locally. User-authored remote images, stylesheets, and scripts remain under the presentation author's control.
Place an init.js file next to your markdown file to replace the default Reveal.js initialization script. If your initialization needs ECMAScript modules, use init.esm.js instead; it is loaded as <script type="module">, so it can use standard import statements for files served from the same folder. When both files exist, init.esm.js takes precedence. init.esm.js must be a complete custom initialization script and initialize Reveal itself, just like init.js.
You can customize many setting on for your reveal.js presentation.
Configuration contract notes (validated by unit tests):
author, autoPlayMedia, customHighlightTheme, customTheme, defaultTiming, description, display, enableTitleFooter, fragmentInURL, logLevel, logoImg, notesSeparator, separator, verticalSeparator.hashOneBasedIndex, showSlideNumber.| Name | Description | Default |
|---|---|---|
revealjs.notesSeparator | Revealjs markdown note delimiter | note: |
revealjs.separator | Revealjs markdown slide separator | ^(
?|
)---(
?|
)$ |
revealjs.verticalSeparator | Revealjs markdown vertical separator | ^(
?|
)--(
?|
)$ |
revealjs.theme | Revealjs Theme (black, white, league, beige, sky, night, serif, simple, solarized | black |
revealjs.highlightTheme | Highlight Theme | Zenburn |
revealjs.diagramServerEnabled | Enable remote diagram rendering through a Kroki-compatible server | true |
revealjs.diagramServerUrl | Base URL of the Kroki-compatible diagram server | https://kroki.io |
revealjs.offline | Disable externally hosted extension resources | false |
revealjs.controls | Display controls in the bottom right corner | true |
revealjs.progress | Display a presentation progress bar | true |
revealjs.slideNumber | Display the page number of the current slide | |
revealjs.history | Push each slide change to the browser history | |
revealjs.keyboard | Enable keyboard shortcuts for navigation | true |
revealjs.overview | Enable the slide overview mode | true |
revealjs.center | Vertical centering of slides | true |
revealjs.touch | Enables touch navigation on devices with touch input | true |
revealjs.loop | Loop the presentation | |
revealjs.rtl | Change the presentation direction to be RTL | |
revealjs.shuffle | Randomizes the order of slides each time the presentation loads | |
revealjs.fragments | Turns fragments on and off globally | true |
revealjs.embedded | Flags if the presentation is running in an embedded mode, i.e. contained within a limited portion of the screen | |
revealjs.help | Flags if we should show a help overlay when the questionmark key is pressed | true |
revealjs.showNotes | Flags if speaker notes should be visible to all viewers | |
revealjs.autoSlide | Number of milliseconds between automatically proceeding to the next slide, disabled when set to 0, this value can be overwritten by using a data-autoslide attribute on your slides | |
revealjs.autoSlideMethod | The direction in which the slides will move whilst autoslide is activet | Reveal.navigateNext |
revealjs.autoSlideStoppable | Stop auto-sliding after user input | true |
revealjs.mouseWheel | Enable slide navigation via mouse wheel | |
revealjs.hideAddressBar | Hides the address bar on mobile devices | true |
revealjs.previewLinks | Opens links in an iframe preview overlay | |
revealjs.transition | Transition style (none/fade/slide/convex/concave/zoom) | default |
revealjs.transitionSpeed | Transition speed (default/fast/slow) | default |
revealjs.backgroundTransition | Transition style for full page slide backgrounds (none/fade/slide/convex/concave/zoom) | default |
revealjs.viewDistance | Number of slides away from the current that are visible | 3 |
revealjs.parallaxBackgroundImage | Parallax background image | |
revealjs.parallaxBackgroundSize | Parallax background size (CSS syntax, e.g. 2100px 900px) | |
revealjs.parallaxBackgroundHorizontal | Number of pixels to move the parallax background per slide | |
revealjs.parallaxBackgroundVertical | Number of pixels to move the parallax background per slide | |
You can change settings directly in your markdown file using front matter style. You can change all extention settings like this :
---
theme : "white"
transition: "zoom"
---
Note do not add
revealjs.prefix before setting name.
You can scaffold a new presentation directly from built-in templates:
Revealjs: New presentation from templateMinimal, Code-heavy, Speaker notes, or Custom theme).md fileWhen a template needs local assets (for example Custom theme), the extension creates only the required supporting files next to your presentation.
To display the preview on the right side you can :
Revealjs: Show presentation by sideThe preview will be synchronize with the current cursor position.
To display presentation in the browser you can:
Revealjs: Open presentation in a browserThis uses VS Code's native external URL API by default (same behavior as opening a URL from VS Code).
If revealjs.browserPath is set, the extension uses that executable path to launch the presentation instead of the VS Code default external opener.
To open a dedicated presenter workflow (speaker notes + current/upcoming slide):
Revealjs: Open presenter view in browserRevealjs: Open presentation in a browser, then press SHow it works with the main deck preview:
note: / <aside class="notes">) are shown in the presenter windowSupported execution modes:
revealjs.browserPath): fully supportedTo export your presentation to pdf you can:
Revealjs: Export in PDFThis opens the print URL using the same browser resolution rules as above:
revealjs.browserPath is set and valid, that executable is usedPDF export uses Reveal.js print settings. Set revealjs.pdfSeparateFragments to false to keep fragments on the same exported page, set revealjs.pdfMaxPagesPerSlide to cap slide overflow pages, and use revealjs.slideNumber formats such as h/v when you need formatted slide numbers.
Be sure to set print setting correctly:
To export your presentation to a static website you can:
Revealjs: Export in HTMLThe export runs in the extension host and then opens the export folder using VS Code native APIs.
Folder-open fallback behavior:
revealFileInOS (native reveal in file manager)vscode.env.openExternal with a file:// URI---
enableMenu: false
---
---
enableChalkboard: false
---
---
enableTitleFooter: false
---
---
enableZoom: false
---
---
enableSearch: false
---
Note : The first time, Windows will ask you about the firewall. If you open the port for the application, you can see your presentation remotely.
Please add issues on github.
413 commits
148 commits
27 commits
26 commits
JavaScript
76.2%
TypeScript
12.2%
CSS
10.3%