# Astlide documentation > Astlide is an Astro integration for slide decks: write slides in MDX, Markdown or HTML under src/content/decks//, present them in the browser (presenter window, overview, pen), and export them to PDF, PNG or editable PowerPoint — also in a PowerPoint template's design. --- # Astlide Source: https://astlide.dev/ > Slides that live in your Astro site — many decks per site, written in MDX, Markdown or HTML, presented on the web and exported as editable PowerPoint in your own template. ## What sets it apart **Many decks, one site** Decks are content, not projects: every folder under `src/content/decks/` is a deck, with an index page out of the box. Keep a year of talks, a team's reports or a product's training decks in one repository — sharing themes, components and one deploy. **An SDK, not an app** `astlide()` goes into any Astro site — your blog, your Starlight docs, a portal of your own design. The pieces work on their own too: the deck loader, PowerPoint import and templates, and the layout engine behind the PPTX export. **Your PowerPoint template, editable PPTX out** Register a `.pptx` / `.potx` template as a theme and Markdown slides come out in its design. Export turns them into real PowerPoint text boxes, tables and shapes — laid out without a browser. **PowerPoint & Google Slides in** Drop a `.pptx` into a deck and its pages become slides, or import it as editable HTML slides — text stays text, placeholders keep their layout and master styles. **React, Vue & Svelte inside** Astro islands: put the charts, demos and design-system components you already have on a slide, interactive while you present. **Every slide a real page** `/my-talk/7` is static HTML — link straight to a slide, load fast, host anywhere, including sub-paths like GitHub Pages. ## What people build with it **A talk archive** Your own Speaker Deck: every talk at its own URL, searchable, with PDF and PPTX downloads for the event's upload form. **Slides next to the docs** Product docs and the decks that explain them in one Starlight site, reusing the same components and code samples. **An internal deck portal** Weekly reports, proposals and onboarding decks in the company template, reviewed as pull requests and handed out as PowerPoint. **Decks written by agents** Markdown and HTML are what language models write best; Astlide turns them into on-brand, editable PowerPoint without a browser in the loop. ## Everything you expect when presenting **Presenter window** Next-slide preview, steps left, notes and timer. Overview, go-to-slide, pen and laser — mirrored to the audience screen. **Reveals & code** `` / `` with `until` and `hide`; Shiki code with `{1|3-5|all}` line steps. **Diagrams & math** Mermaid diagrams loaded on demand, KaTeX rendered at build time. **Export** PDF and PNG, editable PowerPoint with your speaker notes, or one-click PDF in the browser. - [Is Astlide right for you?](https://astlide.dev/why/): How it compares to Slidev, Marp, reveal.js and Quarto — and when to pick something else. --- # Why Astlide? Source: https://astlide.dev/why/ > What Astlide is good at, how it compares to Slidev, Marp, reveal.js and Quarto, and when to choose something else. Astlide is for people who want slides to be part of a website — and who still have to hand over PowerPoint. ## What makes it different **Decks are content, not projects.** Most slide tools build one deck per project. In Astlide every folder under `src/content/decks/` is a deck of an Astro content collection, and the site serves an index of them. A year of talks, a team's weekly reports, a product's training decks: one repository, one set of themes and components, one deploy. **It's an SDK, not an app.** Astlide is `astlide()` in your `astro.config.mjs`, so it goes into whatever site you build — a blog, Starlight docs, a portal with your own navigation. Its pieces work on their own too: the deck loader (`astlideDeckLoader`), PowerPoint import and templates (`@astlide/core/pptx`), and the layout engine behind the PPTX export (`@astlide/engine`). **Your PowerPoint template, editable PowerPoint out.** Register a `.pptx` / `.potx` / `.thmx` [template as a theme](https://astlide.dev/guides/templates/) and Markdown slides take its backgrounds, fonts, colors and placeholder positions. [Export](https://astlide.dev/guides/export/) writes real PowerPoint text boxes, tables and shapes with your speaker notes, laid out by Astlide's own engine — no browser or LibreOffice involved, so it runs anywhere Node runs. **PowerPoint and Google Slides in.** A `.pptx` dropped into a deck folder shows as slides; `astlide import` turns one into editable HTML slides ([Import](https://astlide.dev/guides/import/)). Moving an existing deck into the site — or updating last quarter's — doesn't start from scratch. **Any framework's components.** Slides are Astro, so React, Vue, Svelte, Solid and Preact components work on them, interactive while you present ([guide](https://astlide.dev/guides/frameworks/)). **Every slide is a static page.** Each slide is its own URL and HTML file (`/my-talk/7`): link to a single slide, load without a client app booting, host anywhere — including sub-paths such as GitHub Pages. **HTML is a first-class slide format.** Alongside `.mdx` and `.md`, a slide can be a plain `.html` file rendered verbatim — hand-made layouts, or HTML written by an AI assistant. ## How it compares | | Astlide | Slidev | Marp | reveal.js | Quarto | |---|---|---|---|---|---| | Built on | Astro (integration) | Vite + Vue (app) | Markdown converter | JavaScript library | Pandoc | | Decks per project | Many (content collection) | One | One per file | One per page | One per file | | Embed in an existing site | Yes (any Astro site) | Separate build | Separate output | Library | Separate output | | Components | React, Vue, Svelte, Solid, Preact, Astro | Vue | — | — | — | | Editable PPTX | Yes, without a browser | Yes, measured in a browser | Experimental (browser + LibreOffice) | No | Yes (Pandoc) | | Company `.potx` template | Template as theme, any layout | — | — | — | Reference doc, fixed layouts | | PPTX / Google Slides import | Yes | — | — | — | — | | Presenter mode, pen, overview | ✓ | ✓ | Limited | ✓ (plugins) | ✓ (reveal.js) | | Ecosystem & maturity | Young | Large, mature | Mature | Very mature | Mature | *Summaries as of October 2026 — check each project's docs for current details.* ## When to choose something else - **You want the biggest ecosystem of themes and add-ons** → [Slidev](https://sli.dev) is more mature and has far more community themes. - **You want a single Markdown file and nothing else** → [Marp](https://marp.app) is simpler. - **Your slides come out of notebooks or R / Python analysis** → [Quarto](https://quarto.org) fits that workflow. - **You don't use Astro and don't want a build step** → reveal.js or Marp will be lighter. - **You need to edit slides visually** → a GUI tool (Keynote, PowerPoint, Google Slides) fits better. Astlide is code-first. ## Where Astlide is still young Astlide is new. Its theme and plugin ecosystem is small, and some features other tools have are still on the [roadmap](https://github.com/r-hashi01/astlide/issues) — contributions are welcome. --- # Getting Started Source: https://astlide.dev/getting-started/ > Create a new Astlide project or add Astlide to an existing Astro site. Astlide is an [Astro](https://astro.build) integration. It needs **Astro 7.2.10 or later** and is developed with [Bun](https://bun.sh). ## Create a new project ```bash bun create astlide my-slides cd my-slides bun install bun run dev ``` Open the dev server URL — you'll see the deck index; pick a deck to start presenting. ## Add to an existing Astro project ```bash bun add @astlide/core ``` Register the integration: ```js // astro.config.mjs import { defineConfig } from "astro/config"; import astlide from "@astlide/core"; export default defineConfig({ integrations: [astlide()], }); ``` Define the `decks` content collection with Astlide's loader and schema: ```ts // src/content.config.ts import { defineCollection } from "astro:content"; import { astlideDeckLoader, slideSchema } from "@astlide/core"; const decks = defineCollection({ // Renders .mdx, .md, and .html slides from src/content/decks// loader: astlideDeckLoader(), schema: slideSchema, }); export const collections = { decks }; ``` :::caution Use `astlideDeckLoader()` rather than `glob({ pattern: "**/*.mdx" })` — it also handles `.md` and `.html` slides and keeps them in numeric order. ::: ## Project structure ``` src/ ├── content.config.ts └── content/ └── decks/ └── my-talk/ ├── _config.json # title, author, date, theme ├── 01-cover.mdx ├── 02-intro.md └── 03-demo.html ``` Every directory under `src/content/decks/` is a deck, served at `//`. The deck index lives at `/`. ## Next steps - Follow the [tutorial](https://astlide.dev/tutorial/first-deck/) to build, present and publish a talk - [Create your first deck](https://astlide.dev/guides/decks/) - [Present it](https://astlide.dev/guides/presenting/) — keyboard shortcuts, presenter window, pen and laser - See every layout and theme in the [Gallery](https://astlide.dev/gallery/), or [try the live demo](https://astlide.dev/demo/tour/1/) --- # Tutorial: Your First Deck Source: https://astlide.dev/tutorial/first-deck/ > Build a short talk from scratch, present it, export a PDF and publish it on GitHub Pages. In this tutorial you'll build a five-slide talk, present it with the presenter window, export a PDF and publish it. It takes about 15 minutes. You'll need [Bun](https://bun.sh) and a terminal. ## 1. Create a project ```bash bun create astlide my-talks cd my-talks bun install bun run dev ``` Open the URL the dev server prints. You'll see the **deck index** — every folder under `src/content/decks/` is a deck. ## 2. Create a deck ```bash bunx create-astlide deck hello-astro --theme default --format mdx ``` This creates `src/content/decks/hello-astro/` with a `_config.json` and a few starter slides. Open `_config.json` and set your own details: ```json { "title": "Hello, Astro", "author": "Your Name", "date": "2026-10-09", "theme": "default" } ``` Delete the starter slides — we'll write our own. Slides are numbered files; the number sets the order. ## 3. A cover slide Create `01-cover.mdx`: ```mdx --- slideLayout: cover notes: "Introduce yourself." --- # Hello, Astro Why I build my slides with code ``` The page updates as you save. `slideLayout: cover` centres the title; `notes` are only visible to you in the presenter window. ## 4. Reveal points one by one Create `02-why.mdx`: ```mdx --- slideLayout: default --- # Why slides as code? - Version control and reviews - Reuse components across talks - Export to PDF and PowerPoint ``` Press →: each bullet appears on its own step before the deck moves on. [Fragments](https://astlide.dev/guides/fragments/) can do much more — reveal several items together, hide them again, or highlight. ## 5. Walk through code Create `03-code.mdx`. The `{1|3-5|all}` after the language steps through the highlighted lines: ````mdx --- slideLayout: code --- # A component ```astro {1|3-5|all}

Slides can render real components

``` ```` ## 6. Two columns and a diagram Create `04-compare.mdx`: ```mdx --- slideLayout: two-column --- # Before and after ### Before Slides in a GUI app, exported by hand. ### After Markdown in git, built by CI. ``` And `05-flow.md` — a plain Markdown slide with a [Mermaid](https://astlide.dev/guides/diagrams/) diagram (run `bun add mermaid` first): ````md --- slideLayout: default --- # How it ships ```mermaid flowchart LR Write --> Commit --> CI --> Pages ``` ```` Mixing `.mdx` and `.md` (and `.html`) in one deck is fine. ## 7. Present Go back to slide 1 and press p to open the **presenter window**. It shows the next slide, how many steps are left, your notes and a timer. Move it to your laptop screen and put the original window on the projector — they stay in sync. ![Presenter window: the current slide on the left; next-slide preview, steps left, notes and timer on the right](../../../assets/tutorial/presenter.png) A few more keys worth knowing: | Key | | |---|---| | o | Overview of all slides | | g | Go to a slide by number or title | | d / l | Pen / laser pointer — shown on the audience screen too | | f | Fullscreen | ![Overview grid of all slides](../../../assets/tutorial/overview.png) ![Go-to dialog filtering slides by the word "code"](../../../assets/tutorial/goto.png) ![A pen annotation circling a diagram](../../../assets/tutorial/pen.png) The full list is in [Presenting](https://astlide.dev/guides/presenting/). ## 8. Export a PDF ```bash bunx playwright install chromium # once — Playwright comes with @astlide/core bun run export hello-astro # or: bunx astlide export hello-astro ``` Astlide builds the site, renders it and writes `exports/hello-astro.pdf`, with every slide in its final state (all steps revealed). Add `--pptx` for an editable PowerPoint, or `--png` for images; see [Export](https://astlide.dev/guides/export/). ## 9. Publish on GitHub Pages Tell Astro where the site will live: ```js // astro.config.mjs export default defineConfig({ site: "https://.github.io", base: "/my-talks", integrations: [astlide()], }); ``` Push the project to a GitHub repository named `my-talks`, enable **Settings → Pages → Source: GitHub Actions**, and add Astro's [GitHub Pages workflow](https://docs.astro.build/en/guides/deploy/github/). Your talk is then at `https://.github.io/my-talks/hello-astro/1/`. ## What's next - Browse every layout and theme in the [Gallery](https://astlide.dev/gallery/). - Try the [feature tour deck](https://astlide.dev/demo/tour/1/). - Make it yours with [themes, plugins and decorators](https://astlide.dev/guides/themes-and-plugins/). --- # Gallery Source: https://astlide.dev/gallery/ > Every built-in layout and theme, rendered from the feature tour deck. Screenshots come from the [feature tour deck](https://astlide.dev/demo/tour/1/) — open it to see each slide live, then press o for the overview. ## Layouts Set with `slideLayout` in a slide's frontmatter. See [Layouts & Components](https://astlide.dev/guides/layouts-and-components/) for the markup each one expects. **cover** (Picture: cover layout: centred title, subtitle and hint) Centred title — opening and closing slides. **section** (Picture: section layout: a chapter divider) Chapter divider. **default** (Picture: default layout: heading, text and a table) Standard content slide. **two-column** (Picture: two-column layout with a full-width title above Left and Right columns) `` / `` under a full-width title. **image-left** (Picture: image-left layout: illustration on the left, text on the right) `` + ``. **image-right** (Picture: image-right layout: text on the left, illustration on the right) The same, mirrored. **image-full** (Picture: image-full layout: full-bleed background image with white text) Full-bleed `background` image. **code** (Picture: code layout: a CodeBlock with highlighted lines) Tighter padding for code. **quote** (Picture: quote layout: a centred blockquote) Centred blockquote. **statement** (Picture: statement layout: one large sentence) One large sentence. ## Themes Set per deck with `"theme"` in `_config.json`. The same slide in each built-in theme: **default** (Picture: Slide in the default theme) **dark** (Picture: Slide in the dark theme) **minimal** (Picture: Slide in the minimal theme) **corporate** (Picture: Slide in the corporate theme) **gradient** (Picture: Slide in the gradient theme) **rose** (Picture: Slide in the rose theme) **forest** (Picture: Slide in the forest theme) Want your own? See [custom themes](https://astlide.dev/guides/themes-and-plugins/#custom-theme). --- # Creating a Deck Source: https://astlide.dev/guides/decks/ > Deck folders, _config.json, slide files in .mdx, .md and .html, and frontmatter. A deck is a folder under `src/content/decks/`. Its slides are numbered files that sort by name. ## Scaffold with the CLI ```bash bunx create-astlide deck my-talk --theme dark --format mdx # or md | html ``` ## Or create it by hand 1. Add `src/content/decks/my-talk/_config.json`: ```json { "title": "My Talk", "author": "Your Name", "date": "2025-01-15", "theme": "default" } ``` 2. Add slides as numbered files. `.mdx`, `.md` and `.html` can be mixed: ``` src/content/decks/my-talk/ ├── _config.json ├── 01-cover.mdx ├── 02-intro.md └── 03-demo.html ``` The slide number in the URL (`/my-talk/2`) follows the sorted file order. ## Slide formats - **`.mdx`** — Markdown plus components (``, ``, ``, …). Astlide's components are available without imports. - **`.md`** — plain Markdown, including code highlighting and diagrams. - **`.html`** — a self-contained HTML slide. The body is rendered verbatim (inline `

Everything in one HTML file

``` ## Frontmatter ```yaml --- slideLayout: default transition: fade title: "Optional — used by the go-to-slide dialog" background: "#1e293b" class: "text-light" notes: "Speaker notes shown in presenter / notes mode" hidden: false --- ``` :::caution Use **`slideLayout`**, not `layout` — Astro's MDX pipeline reserves `layout`. ::: See the [frontmatter reference](https://astlide.dev/reference/frontmatter/) for every field, and [layouts](https://astlide.dev/guides/layouts-and-components/) for the built-in `slideLayout` values. ## Speaker notes Notes are hidden from the audience and show in the presenter window (`p`) and the notes overlay (`n`). Write them in whichever way suits the slide: - **``** — full Markdown, in `.mdx` slides: ```mdx # My Slide Content here. Key points to mention: - **First** important thing - Second point with `code` ``` - **A comment at the end of the slide** — like Slidev and Marp; works in `.md`, `.mdx` and `.html` slides, Markdown included: ```md # My Slide Content here. ``` Only a comment that *ends* the slide becomes notes — comments elsewhere stay comments. (In `.mdx`, HTML comments are otherwise not allowed; use `{/* … */}` for those.) - **Frontmatter** — `notes: "…"` for a short line. If a slide has more than one, `` wins, then frontmatter `notes`, then the trailing comment. `` still works as an alias of ``. ## Editing in the browser While `astro dev` is running, press e on a slide to open its source file in a panel next to it, and just type: changes are saved a moment after you stop typing (or right away with Cmd/Ctrl+S) and the slide updates **live, without a page reload**: only the parts of the slide you changed are swapped in, so nothing flickers — your caret, the current fragment step, rendered diagrams and things like the camera or a running recording stay as they are. Esc (or ✕) saves and closes the panel. Speaker notes follow along too — frontmatter `notes` and `` alike: the notes overlay and every other window showing the same slide (such as the presenter window) update in place. Adding, removing or renaming slide files is picked up live too: every window on the deck updates its slide count and outline and stays on the slide it was showing (now perhaps at a different number), at the same step. If that slide's file was removed, it shows the slide now at that position. The panel stays open as you move between slides and switches to each slide's source. - Dev server only: the editor and its endpoint don't exist in production builds. - It edits slide files (`.mdx`, `.md`, `.html` under `src/`) and nothing else; writes must come from the dev server's own page. - Edits are written to disk as you type — use undo in the panel or your version control to roll back. ## Hidden slides `hidden: true` keeps a slide in development but skips it in production builds: ← / →, Home / End, the toolbar, the presenter window's next-slide preview, the overview and the go-to dialog all jump over it, and a direct link redirects to the next visible slide. --- # Layouts & Components Source: https://astlide.dev/guides/layouts-and-components/ > Built-in slide layouts and the components available in MDX slides. ## Layouts Choose a layout per slide with `slideLayout`: | `slideLayout` | Description | |---|---| | `default` | Standard content slide | | `cover` | Centred title / closing slide | | `section` | Chapter divider | | `two-column` | Side-by-side with `` / `` | | `image-full` | Background image with text overlay | | `image-left` | Image on the left, text on the right | | `image-right` | Image on the right, text on the left | | `code` | Optimised padding for code blocks | | `quote` | Centred blockquote | | `statement` | Single large sentence | Plugins can add more — see [Themes & Plugins](https://astlide.dev/guides/themes-and-plugins/). ### Two columns ```mdx --- slideLayout: two-column --- # Comparison ### Before Old approach ### After New approach ``` ### Image + text ```mdx --- slideLayout: image-left --- ## Caption Description text here. ``` ## Components All components are available in `.mdx` slides without imports. ### `` ```mdx
### Option A First option details.
### Option B Second option details.
### Option C Third option details.
``` | Prop | Description | |---|---| | `columns` | Number of columns (detected from children if omitted) | | `gap` | Gap between columns (CSS value, default `2rem`) | | `align` | `start` \| `center` \| `end` \| `stretch` | | `widths` | Custom widths, e.g. `1fr 2fr 1fr` | ### `` Wraps a code fence with a filename header and a copy button: ````mdx ```ts export const collections = { decks }; ``` ```` See [Code](https://astlide.dev/guides/code/) for line highlighting. ### `` KaTeX, rendered at build time: ```mdx Inline: ``` ### `` Privacy-enhanced embed; accepts an ID or a full URL: ```mdx ``` Exported slides (PDF / PPTX) can't run the player: they show the video's thumbnail with a play button instead, linked to the video. #### Static stand-ins for your own embeds Mark an element with `data-astlide-static` to show it in place of a live embed when slides are printed or exported. It is hidden everywhere else; give it its own `display` and position it over the embed: ```html ``` An `