Beem Slide

Export

A static site, a PDF, or a PPTX of images — none of which need a server.

A deck has to leave the tool eventually: someone wants to read it who was not in the room, or a client wants it in the format their company uses. There are three ways out and none of them require anything running.

A static site

npx beem-slide build      # emits dist/
npx beem-slide preview    # serves dist/ so you can check it

dist/ is ordinary files. Everything renders in the browser, but there is no server component to keep alive — put it on Vercel, Cloudflare Pages, Netlify, Zeabur, GitHub Pages, or an S3 bucket behind a CDN. The scaffold ships vercel.json and netlify.toml so the first two need no configuration.

From the app

The download menu in the deck header offers three formats:

Export as HTML — one self-contained file. Opens by double-clicking it out of a folder, works from a USB stick, survives being emailed.

Export as PDF — a page per slide at 1920 × 1080 landscape, so nothing is letterboxed or reflowed. The export waits for fonts to load and for animations to settle before it captures, which is why a page with an entrance animation comes out in its final state rather than mid-flight.

Export as image PPTX — a PowerPoint file where each slide is a full-bleed image. Use it when the recipient's process is PowerPoint-shaped and they will not be editing the content. The slides are pictures: nobody can retype your headline, and nobody can fix your typo either.

Choosing what ships

beem-slide.config.ts decides what a build contains. This matters most for a deck you are sending outside your team, where the framework's own furniture is not something you want to hand over:

beem-slide.config.ts
import type { BeemSlideConfig } from '@beem-slide/core';

const config: BeemSlideConfig = {
  build: {
    slides: ['q2-launch'],      // only this deck; omit for all of them
    showSlideBrowser: false,    // no deck index
    showSlideUi: false,         // no on-canvas chrome
    allowHtmlDownload: false,   // no download button in the viewer
    basePath: '/decks/q2',      // if it is not served from the domain root
  },
};

export default config;

Two things worth knowing about that block.

slides only applies to build. dev always serves everything under slides/, so restricting what you publish never costs you decks to work against locally.

Naming exactly one deck and turning showSlideBrowser off makes that deck the site — it renders at the root, instead of the root being the deck index that no longer exists.

basePath sets the asset base and the router basename together, so the same bundle works under any path prefix without touching a link.

On this page