A Docker image that turns a Slidev-format Markdown presentation into three outputs in one step: a static SPA build, a plain PDF, and a separate speaker-notes PDF. Default theme: neversink.
# Put your presentation (slides.md + any pages/, images, assets) in a folder,
# then mount it under /slides:
docker run --rm -v "$(pwd):/slides" idomi27/slidev-builder:latest
Output lands in a new out/ subfolder of that same directory:
out/
dist/ -- static SPA, hostable with any web server
slides.pdf -- plain slides PDF
slides-notes.pdf -- separate speaker notes PDF
Use the image directly as the job image (override the entrypoint so you can call slidev yourself, or just run the image with no command to get the same three outputs it produces locally):
stages:
- build
- release
build_slides:
stage: build
image:
name: idomi27/slidev-builder:latest
entrypoint: [""]
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
script:
- slidev build slides.md --out dist
- slidev export slides.md --output "${CI_PROJECT_NAME}.pdf" --wait 5000
- slidev export-notes slides.md --output "${CI_PROJECT_NAME}-notes.pdf" --wait 5000
- (cd dist && zip -r "../${CI_PROJECT_NAME}-site.zip" .)
artifacts:
paths:
- dist
- "*.pdf"
- "*.zip"
expire_in: never
create_release:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
needs: ["build_slides"]
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
allow_failure: true
script:
- echo "Releasing pipeline $CI_PIPELINE_IID"
release:
tag_name: "v$CI_PIPELINE_IID"
description: "Slides build (pipeline $CI_PIPELINE_IID)"
assets:
links:
- name: "${CI_PROJECT_NAME}.pdf"
url: "$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_REF_NAME/raw/${CI_PROJECT_NAME}.pdf?job=build_slides"
- name: "${CI_PROJECT_NAME}-notes.pdf"
url: "$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_REF_NAME/raw/${CI_PROJECT_NAME}-notes.pdf?job=build_slides"
- name: "${CI_PROJECT_NAME}-site.zip"
url: "$CI_PROJECT_URL/-/jobs/artifacts/$CI_COMMIT_REF_NAME/raw/${CI_PROJECT_NAME}-site.zip?job=build_slides"
allow_failure: true on the release job because the release-cli image on this GitLab instance occasionally reports a false failure even though the release is created correctly -- check the Releases tab if the job shows red.
entrypoint: [""])SLIDEV_ENTRY -- input markdown file (default: slides.md)SLIDEV_OUT_DIR -- output subfolder (default: out)SLIDEV_THEME -- theme override for build/export (default: neversink)SLIDEV_WAIT -- milliseconds to wait before capturing each slide during build/export (default: 5000). Icon-heavy themes like neversink can render blank PDF pages if this is too low -- raise it if you see empty pages.Example:
docker run --rm -v "$(pwd):/slides" -e SLIDEV_ENTRY=talk.md -e SLIDEV_WAIT=8000 idomi27/slidev-builder:latest
node:22-slim + @slidev/cli + @slidev/theme-default + slidev-theme-neversink + playwright-chromium (with Chromium installed) + zip.
The VERSION file's content is used for two Docker Hub tags on every push to main: <version> and latest.
Content type
Image
Digest
sha256:85cf3e427…
Size
740.9 MB
Last updated
21 days ago
docker pull idomi27/slidev-builder