mdeck 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +259 -0
- package/LICENSE +21 -0
- package/README.md +156 -0
- package/assets/base.css +196 -0
- package/assets/extensions/layouts/chapter/extension.toml +26 -0
- package/assets/extensions/layouts/chapter/layout.jsx +21 -0
- package/assets/extensions/layouts/chapter/starter.md +8 -0
- package/assets/extensions/layouts/focus/extension.toml +8 -0
- package/assets/extensions/layouts/focus/layout.jsx +10 -0
- package/assets/extensions/layouts/focus/starter.md +4 -0
- package/assets/extensions/layouts/full-bleed-image/extension.toml +31 -0
- package/assets/extensions/layouts/full-bleed-image/layout.jsx +19 -0
- package/assets/extensions/layouts/full-bleed-image/starter.md +6 -0
- package/assets/extensions/layouts/generic/extension.toml +8 -0
- package/assets/extensions/layouts/generic/layout.jsx +8 -0
- package/assets/extensions/layouts/generic/starter.md +4 -0
- package/assets/extensions/layouts/image-text/extension.toml +25 -0
- package/assets/extensions/layouts/image-text/layout.jsx +17 -0
- package/assets/extensions/layouts/image-text/starter.md +6 -0
- package/assets/extensions/layouts/split/extension.toml +25 -0
- package/assets/extensions/layouts/split/layout.jsx +19 -0
- package/assets/extensions/layouts/split/starter.md +14 -0
- package/assets/extensions/layouts/title/extension.toml +26 -0
- package/assets/extensions/layouts/title/layout.jsx +14 -0
- package/assets/extensions/layouts/title/starter.md +5 -0
- package/assets/extensions/palettes/brand/extension.toml +29 -0
- package/assets/extensions/palettes/cobalt/extension.toml +27 -0
- package/assets/extensions/palettes/ember/extension.toml +27 -0
- package/assets/extensions/palettes/forest/extension.toml +27 -0
- package/assets/extensions/palettes/graphite/extension.toml +27 -0
- package/assets/extensions/palettes/lagoon/extension.toml +27 -0
- package/assets/extensions/palettes/neon/extension.toml +27 -0
- package/assets/extensions/palettes/nordic/extension.toml +27 -0
- package/assets/extensions/palettes/pastel/extension.toml +30 -0
- package/assets/extensions/palettes/phosphor/extension.toml +27 -0
- package/assets/extensions/palettes/swiss/extension.toml +27 -0
- package/assets/extensions/palettes/terra/extension.toml +27 -0
- package/assets/extensions/themes/academic/extension.toml +53 -0
- package/assets/extensions/themes/academic/styles.css +631 -0
- package/assets/extensions/themes/aurora/extension.toml +37 -0
- package/assets/extensions/themes/aurora/styles.css +644 -0
- package/assets/extensions/themes/duet/extension.toml +46 -0
- package/assets/extensions/themes/duet/styles.css +573 -0
- package/assets/extensions/themes/editorial/extension.toml +46 -0
- package/assets/extensions/themes/editorial/styles.css +574 -0
- package/assets/extensions/themes/fhnw/extension.toml +61 -0
- package/assets/extensions/themes/fhnw/styles.css +604 -0
- package/assets/extensions/themes/neue/extension.toml +46 -0
- package/assets/extensions/themes/neue/styles.css +489 -0
- package/assets/extensions/themes/sketch/extension.toml +48 -0
- package/assets/extensions/themes/sketch/styles.css +633 -0
- package/assets/extensions/themes/terminal/extension.toml +38 -0
- package/assets/extensions/themes/terminal/styles.css +550 -0
- package/assets/logo/avatar.png +0 -0
- package/assets/logo/logo-dark.svg +10 -0
- package/assets/logo/logo-light.svg +10 -0
- package/assets/logo/mark.svg +15 -0
- package/bin/mdeck.js +2 -0
- package/docs/README.md +8 -0
- package/docs/reference/authoring.md +795 -0
- package/docs/reference/claude-skill.md +96 -0
- package/docs/reference/extensions.md +250 -0
- package/docs/reference/layouts.md +153 -0
- package/docs/reference/palettes.md +106 -0
- package/docs/reference/structured-slides.md +120 -0
- package/docs/reference/themes.md +133 -0
- package/docs/site/assets/favicon.svg +15 -0
- package/docs/site/assets/github-logo.svg +1 -0
- package/docs/site/assets/site.css +162 -0
- package/docs/site/assets/site.js +123 -0
- package/docs/site/build.js +148 -0
- package/docs/site/content/appearance.md +203 -0
- package/docs/site/content/audience.md +178 -0
- package/docs/site/content/commands.md +153 -0
- package/docs/site/content/components.md +134 -0
- package/docs/site/content/drawing.md +72 -0
- package/docs/site/content/editing.md +59 -0
- package/docs/site/content/getting-started.md +103 -0
- package/docs/site/content/layouts.md +126 -0
- package/docs/site/content/media.md +107 -0
- package/docs/site/content/more-content.md +130 -0
- package/docs/site/content/presenting.md +93 -0
- package/docs/site/content/reusable-layouts.md +74 -0
- package/docs/site/content/sharing.md +88 -0
- package/docs/site/content/theme-authoring.md +144 -0
- package/docs/site/content/theme-repository.md +76 -0
- package/docs/site/content/troubleshooting.md +92 -0
- package/docs/site/content/views.md +56 -0
- package/docs/site/content/welcome.md +71 -0
- package/docs/site/content/writing.md +121 -0
- package/docs/site/examples/first-talk.md +88 -0
- package/docs/site/examples/notebook.svg +58 -0
- package/docs/site/images/themes/academic-dark.webp +0 -0
- package/docs/site/images/themes/academic-light.webp +0 -0
- package/docs/site/images/themes/academic.webp +0 -0
- package/docs/site/images/themes/aurora-dark.webp +0 -0
- package/docs/site/images/themes/aurora-light.webp +0 -0
- package/docs/site/images/themes/aurora.webp +0 -0
- package/docs/site/images/themes/duet-dark.webp +0 -0
- package/docs/site/images/themes/duet-light.webp +0 -0
- package/docs/site/images/themes/duet.webp +0 -0
- package/docs/site/images/themes/editorial-dark.webp +0 -0
- package/docs/site/images/themes/editorial-light.webp +0 -0
- package/docs/site/images/themes/editorial.webp +0 -0
- package/docs/site/images/themes/fhnw.webp +0 -0
- package/docs/site/images/themes/neue-dark.webp +0 -0
- package/docs/site/images/themes/neue-light.webp +0 -0
- package/docs/site/images/themes/neue.webp +0 -0
- package/docs/site/images/themes/sketch-dark.webp +0 -0
- package/docs/site/images/themes/sketch-light.webp +0 -0
- package/docs/site/images/themes/sketch.webp +0 -0
- package/docs/site/images/themes/terminal-dark.webp +0 -0
- package/docs/site/images/themes/terminal-light.webp +0 -0
- package/docs/site/images/themes/terminal.webp +0 -0
- package/docs/site/package.json +9 -0
- package/docs/site/pages.js +27 -0
- package/docs/site/server.js +58 -0
- package/examples/custom-layouts/extensions/comparison/extension.toml +35 -0
- package/examples/custom-layouts/extensions/comparison/layout.jsx +15 -0
- package/examples/custom-layouts/extensions/comparison/starter.md +17 -0
- package/examples/custom-layouts/extensions/comparison/styles.css +4 -0
- package/examples/custom-layouts/slides.md +60 -0
- package/examples/poll/slides.md +127 -0
- package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T08-36-47Z.json +19 -0
- package/examples/python/.mdeck-backups/slides.drawings-2026-10-06T11-27-30Z.json +6 -0
- package/examples/python/slides.drawings.json +6 -0
- package/examples/python/slides.md +493 -0
- package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T08-08-30Z.json +10 -0
- package/examples/showcase/.mdeck-backups/slides.drawings-2026-10-06T11-41-35Z.json +13 -0
- package/examples/showcase/img/image.jpg +0 -0
- package/examples/showcase/img/mdeck.svg +66 -0
- package/examples/showcase/slides.drawings.json +11 -0
- package/examples/showcase/slides.md +427 -0
- package/package.json +75 -0
- package/skills/write-slides/SKILL.md +144 -0
- package/src/build/check.js +49 -0
- package/src/build/chrome.js +130 -0
- package/src/build/components.js +44 -0
- package/src/build/config.js +61 -0
- package/src/build/drawings.js +14 -0
- package/src/build/editorPlugin.js +272 -0
- package/src/build/editorServer.js +36 -0
- package/src/build/fonts.js +84 -0
- package/src/build/homePlugin.js +208 -0
- package/src/build/inkPlugin.js +192 -0
- package/src/build/ownWrites.js +18 -0
- package/src/build/pairing.js +81 -0
- package/src/build/pdf.js +34 -0
- package/src/build/relayAccess.js +85 -0
- package/src/build/slidesPlugin.js +371 -0
- package/src/build/themeCheck.js +151 -0
- package/src/build/tunnelClient.js +184 -0
- package/src/cli/args.js +76 -0
- package/src/cli/index.js +758 -0
- package/src/cli/migrate.js +123 -0
- package/src/cli/skill.js +40 -0
- package/src/cli/themes.js +140 -0
- package/src/components/CodeBlock.jsx +168 -0
- package/src/components/ConnectedViews.jsx +25 -0
- package/src/components/Icon.jsx +8 -0
- package/src/components/Poll.jsx +67 -0
- package/src/components/QrCode.jsx +29 -0
- package/src/components/QrCodeTag.jsx +27 -0
- package/src/components/Question.jsx +28 -0
- package/src/components/Scale.jsx +47 -0
- package/src/components/VideoPlayer.jsx +108 -0
- package/src/components/WordCloud.jsx +106 -0
- package/src/components/activity.jsx +35 -0
- package/src/components/callout.css +78 -0
- package/src/components/code-block.css +123 -0
- package/src/components/columns.css +11 -0
- package/src/components/poll.css +81 -0
- package/src/components/video-player.css +14 -0
- package/src/core/devPath.js +4 -0
- package/src/core/editDeck.js +230 -0
- package/src/core/icons.js +69 -0
- package/src/core/ink.js +221 -0
- package/src/core/labels.js +144 -0
- package/src/core/outline.js +33 -0
- package/src/core/parseSlides.js +152 -0
- package/src/core/source.js +137 -0
- package/src/core/urls.js +34 -0
- package/src/core/validateDeck.js +139 -0
- package/src/editor/api.js +67 -0
- package/src/editor/components/App.jsx +75 -0
- package/src/editor/components/ConflictBanner.jsx +10 -0
- package/src/editor/components/DeckSettings.jsx +108 -0
- package/src/editor/components/DesignApp.jsx +252 -0
- package/src/editor/components/Diagnostics.jsx +10 -0
- package/src/editor/components/ExtensionEditor.jsx +66 -0
- package/src/editor/components/ExtensionForms.jsx +134 -0
- package/src/editor/components/ExtensionsPanel.jsx +114 -0
- package/src/editor/components/Field.jsx +24 -0
- package/src/editor/components/Inspector.jsx +36 -0
- package/src/editor/components/LayoutPicker.jsx +23 -0
- package/src/editor/components/LayoutSelect.jsx +25 -0
- package/src/editor/components/LookThumbnail.jsx +8 -0
- package/src/editor/components/MetaFields.jsx +24 -0
- package/src/editor/components/Outline.jsx +28 -0
- package/src/editor/components/PalettePicker.jsx +32 -0
- package/src/editor/components/Preview.jsx +63 -0
- package/src/editor/components/PropsForm.jsx +46 -0
- package/src/editor/components/RawSlideEditor.jsx +9 -0
- package/src/editor/components/RegionEditor.jsx +15 -0
- package/src/editor/components/Resizer.jsx +18 -0
- package/src/editor/designLink.js +19 -0
- package/src/editor/editor.css +139 -0
- package/src/editor/extensions.js +86 -0
- package/src/editor/keyboard.js +21 -0
- package/src/editor/model.js +38 -0
- package/src/editor/sampleDeck.js +165 -0
- package/src/editor/saveQueue.js +47 -0
- package/src/editor/schema.js +36 -0
- package/src/editor/state.js +92 -0
- package/src/editor/useDeckDocument.js +67 -0
- package/src/extensions/appearance.js +79 -0
- package/src/extensions/contrast.js +57 -0
- package/src/extensions/discover.js +126 -0
- package/src/extensions/manifest.js +209 -0
- package/src/extensions/packs.js +268 -0
- package/src/extensions/tokens.js +25 -0
- package/src/home/Home.jsx +362 -0
- package/src/home/home.css +148 -0
- package/src/layouts/layoutApi.jsx +205 -0
- package/src/layouts/layoutProps.js +30 -0
- package/src/layouts/renderSlide.jsx +17 -0
- package/src/live/answer/answer.css +34 -0
- package/src/live/answer/answer.html +14 -0
- package/src/live/answer/answer.js +130 -0
- package/src/live/client.js +290 -0
- package/src/live/code.js +19 -0
- package/src/live/follow.js +17 -0
- package/src/live/pairing.js +34 -0
- package/src/live/presence.js +33 -0
- package/src/live/roomTag.js +38 -0
- package/src/live/rooms.js +249 -0
- package/src/live/server.js +82 -0
- package/src/live/tunnel.js +180 -0
- package/src/paths.js +9 -0
- package/src/runtime/ReaderView.jsx +193 -0
- package/src/runtime/SlideErrorBoundary.jsx +28 -0
- package/src/runtime/chrome.jsx +55 -0
- package/src/runtime/deck-stage.js +1533 -0
- package/src/runtime/design.html +12 -0
- package/src/runtime/design.jsx +5 -0
- package/src/runtime/editor.html +12 -0
- package/src/runtime/editor.jsx +5 -0
- package/src/runtime/editorBridge.js +58 -0
- package/src/runtime/fit.js +149 -0
- package/src/runtime/home.html +13 -0
- package/src/runtime/home.jsx +5 -0
- package/src/runtime/index.html +15 -0
- package/src/runtime/ink/InkLayer.jsx +17 -0
- package/src/runtime/ink/Toolbar.jsx +145 -0
- package/src/runtime/ink/attach.js +69 -0
- package/src/runtime/ink/bus.js +126 -0
- package/src/runtime/ink/controller.js +132 -0
- package/src/runtime/ink/room.js +101 -0
- package/src/runtime/ink/select.js +124 -0
- package/src/runtime/ink/server.js +75 -0
- package/src/runtime/ink/store.js +55 -0
- package/src/runtime/ink/toolbar.css +79 -0
- package/src/runtime/main.jsx +863 -0
- package/src/runtime/markedSetup.js +147 -0
- package/src/runtime/reader.css +59 -0
- package/src/runtime/registry.jsx +26 -0
- package/src/runtime/syncOrder.js +32 -0
- package/src/runtime/themeLoader.js +68 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.3.0 — unreleased
|
|
4
|
+
|
|
5
|
+
- mdeck moved to GitHub (<https://github.com/tilman-schieber/mdeck>) and is published on npmjs.com as `mdeck`: install it with `npm install -g mdeck`. The docs are at <https://gh.tschieber.de/mdeck/>. The GitLab project is archived; remove the old package with `npm uninstall -g @tilman.schieber/mdeck`.
|
|
6
|
+
- New `mdeck themes`: themes and palettes from the theme repository (<https://github.com/tilman-schieber/mdeck-themes>). `search` lists the packs, `install <pack> [slides.md]` copies one into the deck's `extensions/`, or with `--global` into `~/.mdeck/extensions` for every deck; `update`, `remove` and `list` work on what is installed, and refuse to overwrite files changed by hand without `--force`. Packs hold only `extension.toml` and `styles.css`, fonts only from Google Fonts or Bunny Fonts, and are checked against the checksum the repository lists. The design page lists the repository's packs with pictures and an Install button.
|
|
7
|
+
- Extensions installed for every deck are found by every deck; a deck's own extension with the same id replaces one installed for every deck. `mdeck check` warns when a deck uses one, since the slide file then works only on that computer.
|
|
8
|
+
- `mdeck themes build <packs> -o <out> --check` builds the repository: it checks each pack, runs the theme check on every theme and palette in it (light and dark, every kind of slide) and renders a picture of each. The theme check behind `npm run test:themes` moved into mdeck for this (`src/build/themeCheck.js`).
|
|
9
|
+
- The `write-slides` skill looks in the theme repository before making a theme from scratch.
|
|
10
|
+
- New `mdeck design [slides.md | folder]`: a page for looking at themes and palettes and fine-tuning them, instead of the editor's second mode, which both chose and edited them. Its preview shows a sample deck with one slide of every kind, light or dark, in a theme and palette chosen above it, or the deck itself. The pictures in its list show the sample deck too. Without a deck it works on a folder and saves into that folder's `extensions/`, where any deck kept there finds them; no slide file is read or written. In `mdeck edit` it is **Design themes**.
|
|
11
|
+
- The design page lists the deck's own themes and palettes first. A built-in one shows what it is and **Copy to customise**, instead of a form that could not be changed; new themes always start as such a copy, new palettes may also start from plain colours. **Use in my deck** puts a theme or palette in the slide file. The theme form groups its tokens into fonts, sizes and spacing, chooses the default palette from a list with its colours, offers palettes with tick boxes, and keeps `styles.css` under *Advanced*. Layouts are no longer edited in the browser; ask the assistant for one, or write it by hand.
|
|
12
|
+
- Editor: the deck's look is chosen only in the Deck tab, where themes are pictures of the first slide. **Customise theme** and **Customise palette** open the design page on a copy of the deck's, or on the deck's own.
|
|
13
|
+
- The `write-slides` skill also makes themes and palettes: as an extension beside the deck, copied from the closest built-in theme, checked with `mdeck check`, and handed over with `mdeck design` to look at and fine-tune.
|
|
14
|
+
- `npm run test:themes` and the design page use the same sample deck (`src/editor/sampleDeck.js`).
|
|
15
|
+
|
|
16
|
+
## 2.2.0 — 2026-10-07
|
|
17
|
+
|
|
18
|
+
- Lecture blocks look different from each other in every theme, not only academic and sketch: theorems, lemmas and corollaries in the accent with the statement in italics, definitions in the second accent, and a proof without a box, opening with “Proof.” and ending with ∎ right after its last word (terminal writes `[proof]`, like its other log lines). Aurora's callout titles are readable on light glass too.
|
|
19
|
+
- `npm run test:themes` (also in CI) shows every theme, light and dark, on a deck with every built-in layout and kind of content, and fails when content does not fit, text is cut off at the slide's edge or is hard to read on what is behind it, or the page reports an error.
|
|
20
|
+
- Callout titles are readable on light and dark slides: their colour is the signal colour mixed with the text colour (warnings were yellow on white in neue, editorial and FHNW).
|
|
21
|
+
- Fixed: terminal's chapter slide with a picture was 4 px too tall and cut off at the bottom; sketch's sticky notes are a little more compact, so three fit on a slide.
|
|
22
|
+
- Chapter slides say “Kapitel” in German decks (the label `slide.chapter`); layouts get the deck's words with `t` from `mdeck/layout`.
|
|
23
|
+
- Fixed: callout titles were English in decks with a regional language code such as `lang: de-CH`.
|
|
24
|
+
- `mdeck check` warns about an unknown callout type such as `::: warnign` and suggests the nearest one; types named under `callouts:` count as the deck's own.
|
|
25
|
+
- Editor: the deck's palette is chosen from a list that shows each palette's colours in the current light or dark, the theme's own first; light or dark is a sun/moon switch. A palette written out that is also the theme's default shows as chosen instead of an empty field, and switching to a theme that does not offer the deck's palette removes it from the file instead of leaving an error.
|
|
26
|
+
- Editor: palettes, themes and layouts are tabs on the left, in a wider column. Like the presenter view, the view tries one look at a time: choosing a theme keeps the palette where the theme offers it, choosing a palette keeps the theme, and the thumbnails show palettes in that theme and themes with that palette. A bar above the preview names the look and applies it to the deck with “Use for this deck”. Palettes the theme does not offer (FHNW offers only its own) are dimmed.
|
|
27
|
+
- The presenter view shows the theme, palette and light/dark row by default. Its fold button folds it, like the drawing toolbar, into a round button beside Draw that shows the palette's accent; the choice is remembered.
|
|
28
|
+
- The reader view keeps the sender's theme and palette: instead of the Look menu it has one button to switch between light and dark (`reader.themes: false` removes it). Files from `mdeck send` and `mdeck build --reader`, and the page `mdeck pdf` prints, carry only the deck's theme and palette. Other themes in a sent file used to show in fallback fonts, because only the deck theme's fonts are embedded. The labels `reader.look`, `reader.theme`, `reader.colors`, `reader.themeColors`, `reader.resetLook`, `reader.resetLookHint` and `reader.senderLook` are gone.
|
|
29
|
+
- New theme `academic`, for lectures: Source Sans with Source Serif for statements, smaller type so a slide holds a definition, a formula and a few points, the heading in the same place on every slide with the rest centred below it, a running head with the section (§), chapter slides with the number beside a rule, booktabs tables, a short rule above footnotes, and key-idea statement slides set like a theorem. Its default palette is `nordic`.
|
|
30
|
+
- New theme `sketch`, a sketchbook: Caveat headings and Patrick Hand text on dotted paper (a chalkboard in dark), a marker scribble under headings, arrows as bullets, circled numbers and chapter numbers, highlighter on bold, sticky-note callouts with tape, photos taped in like polaroids, statement slides as speech bubbles and code in a hand-drawn box. The drawn marks take the palette's colours. Its default palette is `pastel`.
|
|
31
|
+
- New palette `pastel`: soft pastels in the style of Catppuccin, Latte in light and Mocha in dark, with mauve and peach.
|
|
32
|
+
- New callout types for lectures: `definition`, `theorem`, `lemma`, `corollary`, `proof`, `example` and `remark`, labelled in English or German (`Satz`, `Beweis`, `Beispiel` …). Every theme shows them; academic sets theorems in italics and ends a proof with ∎.
|
|
33
|
+
- Polls, scales, word clouds and questions in a PDF, an `mdeck send` file or a build without a poll server show their question and options with “Answered live during the talk”, instead of “Phones cannot reach this computer”, empty counts and “0 answers”. A `<qrcode join />` slide says that phones joined there. Printing hides join codes and the presenter's buttons. Results still show whenever a poll server answers.
|
|
34
|
+
- Fixed: SVG pictures referenced only in speaker notes are excluded from exports without notes; `--notes` keeps them. Adding or removing themed SVG pictures while previewing refreshes the inline pictures without restarting the server.
|
|
35
|
+
- Fixed: with three or more presenter and audience windows, tied navigation changes keep the last winning sender, including forwarded positions, so a late lower-priority change does not take a window back.
|
|
36
|
+
- The “Change the look” guide shows every theme: a large preview in its default look, and, in a tab for each theme, its chapter slide in every palette, light and dark (`npm run theme-images` renders them).
|
|
37
|
+
- SVG pictures can use the palette's colours (`var(--accent)` …): they are drawn inline and follow the theme, palette and light or dark, in slide text and as the picture of the title, chapter, image-text and full-bleed layouts. Local layouts get the same with `Picture` from `mdeck/layout`. The tour's title picture is such a drawing.
|
|
38
|
+
- Fixed: on duet's title slide, emphasis in the subtitle took the background colour and disappeared; it now keeps the slide's text colour, underlined in the second accent, like the headline.
|
|
39
|
+
- Fixed: a picture path shown inside a code example (`image: ./img/photo.jpg`, ``) was replaced by the embedded picture in PDFs, `mdeck send` files and `--single-file` builds, and a large picture could make the PDF time out. Code examples now stay text.
|
|
40
|
+
- Fixed: the editorial theme showed two dashes before a statement slide's attribution.
|
|
41
|
+
- The guides start from handing your own slides, documents or notes to an AI assistant, and explain the file format so you can read and adjust what it writes. The `write-slides` skill works from source material: it keeps its content and pictures, and says what it left out, moved to the notes or added.
|
|
42
|
+
- The browser editor is no longer marked experimental.
|
|
43
|
+
- The examples are reworked: the tour has four chapters, more varied layouts and exports to PDF again; the Python lesson gives code more room and something to try on every code slide; each example uses a different theme; the docs home page shows a short talk about lab notebooks. The FHNW example is removed.
|
|
44
|
+
|
|
45
|
+
## 2.1.0 — 2026-10-06
|
|
46
|
+
|
|
47
|
+
- Aurora: code blocks no longer have a line of light along their top edge.
|
|
48
|
+
- The terminal theme is redesigned as a terminal session: headings are typed at a `~/talk $` prompt, the title waits at a blinking block cursor (still in print and with reduced motion), chapter slides start like a command (`$ ./chapter 2`, the part as a comment), statement slides are printed by `cat`, callouts are log lines (`[tip]`, `[warning]`), lists use `>` and `[1]`, split slides are divided like tmux panes, the footer is a tmux status bar with the deck's title, and code sits in a window with a title bar. Its default palette is the new `phosphor`: green text on near-black with amber, like an old terminal screen, and a printout on paper in light. A faint scanline shows on chapter slides on screen only.
|
|
49
|
+
- Aurora: a title slide with an image shows it on the right at full height, with the title at the lower left, instead of a banner below the title that pushed it up into the brightest light.
|
|
50
|
+
- Output of run code stays on the slide: when it appears, the code first gets smaller type and then scrolls to make room, and output that is still too long scrolls as well, in the code's type size and with a fade at the lower edge while there is more.
|
|
51
|
+
- Fixed: Python code that imports a package Pyodide provides (`numpy`, `pandas` …) failed with `ModuleNotFoundError`; the package now loads before the code runs.
|
|
52
|
+
- The duet theme is redesigned as two voices: its two accents take turns on every slide. The footer rule changes colour halfway, list markers and poll bars alternate between the accents, split slides become a dialogue of two tinted colour fields, title slides are the boldest, all in the first accent with a slanted band of the second, chapter slides are cut diagonally (the number on a field of the first accent, a seam of the second, the title beside it), statement slides stand beside a bar in each accent, and callouts carry their title as a tab (tips in the first accent, warnings in the second). Headings are heavier and tighter Zilla Slab. Its default palette is now `cobalt` instead of `neon`, whose second accent is now a vivid orange (`#e8590c`, dark `#ff922b`) instead of a brownish amber.
|
|
53
|
+
- The neue theme is redesigned in a Swiss style: large, tight, flush-left type, a rule across the top instead of floating labels, square accent markers, and callouts and code marked by a coloured rule instead of a grey box. Chapter slides set their title in the accent colour at the bottom left, with a large chapter number as a tint on the right, sharing its baseline and clear of the page number; statement slides are inverted. Its default palette is `swiss`: signal red on white. Palettes keep working, using their text-on-accent colour on chapter slides.
|
|
54
|
+
- PDFs, `mdeck send` files and `--single-file` builds carry the theme's own fonts (Latin character sets, embedded once even for variable fonts) instead of falling back to system fonts, so they look like the slides on screen, offline too. Fonts are fetched once and cached in `~/.cache/mdeck/fonts` (`MDECK_CACHE_DIR`); without network and cache the build goes on with the fallback fonts and says so.
|
|
55
|
+
- The aurora theme is redesigned as northern lights: slanted curtains of light in the palette's accents, strong on title slides and as a faint shimmer on content slides; chapter and statement slides are night skies in the palette's other variant, with the chapter number glowing in the accent gradient. Tips, code and the section label are frosted glass with a gradient edge. The light drifts slowly while presenting, never in print or with reduced motion.
|
|
56
|
+
- The editorial theme is redesigned as a magazine spread: a double masthead rule, a centred cover with an ornament, headlines in Newsreader (in place of Playfair Display, calmer and easier to read) with italic emphasis, a drop cap opening the text after a heading, em-dash bullets and italic numerals, callouts as margin notes, code set like a figure between hairlines, and statement slides as pull quotes with a large quotation mark, the key words in the accent within the same italic. Chapter slides open like a new section with the number as a Roman numeral (`number: 2` shows II). The chapter layout passes a whole chapter number to themes as `--chapter-number`, for a counter in another style.
|
|
57
|
+
- Drawings follow light and dark: on dark slides the pen's red, blue and green are lighter and its black is the palette's text colour (white), also for drawings saved before. The toolbar calls that colour "Text colour".
|
|
58
|
+
- Fixed: in the presenter view on a touch screen the draw button could stay off although drawing had started, when the slide frame started it before the presenter view listened.
|
|
59
|
+
- Chapter numbers show as written, without a leading zero: `number: 2` shows 2 (write `"02"` for the old look).
|
|
60
|
+
- Code that is too tall for its place first gets smaller type, down to 22 px, before it scrolls; most examples now fit whole.
|
|
61
|
+
- The presenter view and the reader view switch light and dark with sun and moon icons.
|
|
62
|
+
- Code that is taller than its place on a slide no longer runs under the heading: it gets a smaller height and scrolls, with a fade at the lower edge while there is more; editable code scrolls together with its highlighting. Centred columns start at the top when their content is too tall. A slide that is still too full is marked (`data-overflow`) and named in the browser console.
|
|
63
|
+
- Colours come only from palettes, and palettes are new: nine families with a light and a dark variant each: `lagoon`, `swiss`, `cobalt`, `nordic`, `graphite`, `terra`, `forest`, `ember` and `neon`. `appearance: light` or `dark` picks the variant; the presenter view and the reader view switch both. Themes use the other variant for inverted slides, so neue's statement slides stay readable in every palette. Each theme names a default palette (neue `swiss`, editorial `terra`, duet and aurora `neon`, terminal `forest`, dark); the FHNW theme uses its own palette `brand` and offers no other.
|
|
64
|
+
- Removed: `accent` and `accent2` in decks, the accent colour fields in the presenter view and the editor, colour parameters of themes, and the old palettes `paper`, `sage`, `mono`, `dark-slate`, `dark-ember`, `dark-neon` and `dark-mono`. `mdeck check` says so and lists the palettes to use instead.
|
|
65
|
+
- Extension format: a palette has `[light]` and `[dark]` tables with all nine colours (and may be private to a theme with `theme = "…"`); a theme names its default `palette`, may limit `palettes`, sets `appearance` instead of `dark`, and may not set colours in `[tokens]`. `mdeck check` warns when a deck's own palette has colours too close to read.
|
|
66
|
+
- Fingers keep operating the deck while drawing: the pencil and the mouse draw, a finger's swipe to the left or right moves the slides, a finger's tap on a stroke selects it, and buttons, polls and other controls on a slide keep working. Fingers draw only with the toolbar's hand button. Gestures are read from pointer events instead of the tap zones, so they work on every touch screen, including iPads whose pencil can hover, and no longer cover controls at the sides of a slide.
|
|
67
|
+
- The laser pointer replaces the fading marker: a red dot with a white core and a trail that retracts within a second. It follows a hovering pencil without touching, is shown live in the audience window and on other devices, and is never saved.
|
|
68
|
+
- Select and move: a loop around strokes, or a tap on one (a finger's tap with any tool), selects them; the pen drags inside the selection's box to move them, saved in their new place and undone with undo. Delete (or the toolbar's bin) removes the selection. A selection takes the pen with any tool; elsewhere the pen draws.
|
|
69
|
+
- Straight lines: holding the pen still for half a second at the end of a stroke makes it a straight line, whose end follows the pen until it lifts. A selected straight line shows handles at its ends; the pen moves them.
|
|
70
|
+
- The highlighter has its own colours (yellow, green, pink, blue, orange) and remembers its colour and size apart from the pen's; its strokes are drawn below the pen's.
|
|
71
|
+
- The drawing toolbar folds into one button in the bottom right corner (↘), which shows the current tool; drawing goes on while it is folded. Colours and sizes show only for the pen and the highlighter.
|
|
72
|
+
- Drawing starts with the laser pointer, and on a touch screen (an iPad) it is on as soon as the presenter view opens, and in the deck as soon as the pencil touches it, with the toolbar folded. A phone or tablet only browsing the deck keeps tapping through it: a tap on the right or left third moves the slides while not drawing. While drawing, the page no longer pans or bounces under the pencil (in the presenter view neither the page around the slide).
|
|
73
|
+
- Zoom into a slide: two fingers zoom and move the slide itself, one finger moves a zoomed slide, Ctrl + scroll (a trackpad pinch) zooms at the pointer. Bars, the toolbar and the presenter's controls keep their size, drawings and the laser stay exact, and the audience window and paired devices show the same part. **1:1** or the next slide shows the whole slide again. Safari's page zoom is turned off on the stage and around it.
|
|
74
|
+
- `<poll answer="…">`: a button with a tick outlines the right answer's row in green; the audience window and paired devices show it too. Activities show **Reset** all the time (greyed out while there are no answers), also on a touch screen without hover; the audience window shows neither.
|
|
75
|
+
- With a standalone server and its key (`MDECK_SERVER_KEY`), `mdeck run` keeps the stage room (position and live drawing between a paired iPad and the audience window) on the local network; only polls and phones go to the server.
|
|
76
|
+
- Finished strokes reach the point where the pen lifted (perfect-freehand's `last`, and the final position is kept); strokes trail the pen less while drawn.
|
|
77
|
+
- Fixed: when a slide got its id with its first drawing, the audience window and other devices kept the old id, so they showed only that first stroke, and later the laser and the zoom did not match. The new id now reaches every window.
|
|
78
|
+
- Fixed: a live stroke could stay on the live layer of a window that was hidden while it ended, showing on every slide. It is now removed by a timer as well, and the live layer is cleared on every slide change.
|
|
79
|
+
|
|
80
|
+
## 2.0.1 — 2026-10-06
|
|
81
|
+
|
|
82
|
+
- The split layout's shared heading is styled like every other slide heading; it used the browser's default font and size, outside the slide body that themes style.
|
|
83
|
+
- A numbered list right after a bullet list (or the other way round) gets the usual space between them.
|
|
84
|
+
- The examples follow the current way of writing: `:::meta` settings and named `:::slot` sides. The showcase is now a tour that shows each feature's Markdown beside its result, from headings to live code, notes, drawing, a poll and sharing. The Python lesson asks a poll to check understanding and invites drawing on the loop; the FHNW deck sets `lang: de`, describes its pictures and no longer uses a removed layout.
|
|
85
|
+
- The drawing guide names the buttons as they now look.
|
|
86
|
+
- The drawing toolbar fits on one line: its previous/next arrows and the white colour are gone (the deck and the presenter view turn slides as before), amber is replaced by **Accent**, the theme's accent colour, which a drawing keeps following when the palette changes, and the button that stops drawing is an ×.
|
|
87
|
+
- The full-screen button shows whether it will enter or leave full screen, and leaves it reliably on older iPad Safari too.
|
|
88
|
+
- Polls, scales and the other questions have room above the line with the number of answers; themes' paragraph spacing no longer removes it.
|
|
89
|
+
- A presenter or audience window could be pulled back to an earlier slide when both were used quickly one after the other: a reset was reported twice, and the late copy won. Positions between the windows are now ordered.
|
|
90
|
+
- Chrome, used for `mdeck pdf` and the checks, gets a time limit per step instead of one for the whole run, so a long deck or check no longer fails at an arbitrary step once the total ran out; a step that hangs names itself.
|
|
91
|
+
|
|
92
|
+
## 2.0.0 — 2026-10-05
|
|
93
|
+
|
|
94
|
+
A cleaner interface, and presenting from an iPad on any network. This release renames commands, options, settings and files so that each word means one thing. Everything old stops with a message that names its replacement, so nothing changes silently. Decks, extensions and room servers need the changes in the tables below.
|
|
95
|
+
|
|
96
|
+
### Presenting from an iPad on any network
|
|
97
|
+
|
|
98
|
+
`mdeck run --server` presents from an iPad on any network without opening a port on your computer and without hosting the deck. The computer connects out to your server (`mdeck server`), which passes the iPad's requests to it. The slides are never stored there. The pairing code on the launch page then points at your server; drawings are still saved beside the deck, edits reload the iPad, and polls and the audience window use the same server.
|
|
99
|
+
|
|
100
|
+
Slide and reveal navigation works in both directions between the audience window and the iPad, including the presenter's notes and next-slide preview. Received positions do not echo back. The launch page offers Presenter, Audience and Reader; fullscreen is a control within a view, replacing the separate full-screen deck button.
|
|
101
|
+
|
|
102
|
+
The address is the option's value, else the deck's `server` setting, else `MDECK_SERVER`; the key is `MDECK_SERVER_KEY`. Only what the presenter and audience pages need is passed on; the launch page, the editor and the rest of your folder are not reachable. The server needs this version, a key, and a web server that passes WebSocket connections on (see the audience guide). New dependency: `ws`. Check it with `npm run test:server`.
|
|
103
|
+
|
|
104
|
+
### Breaking changes
|
|
105
|
+
|
|
106
|
+
Commands:
|
|
107
|
+
|
|
108
|
+
| Before | Now |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `mdeck dev`, `mdeck present` | `mdeck run`, which always opens the launch page |
|
|
111
|
+
| `mdeck live` | `mdeck server` |
|
|
112
|
+
| `mdeck build --share --self-contained -o f.html` | `mdeck send` |
|
|
113
|
+
| `mdeck build --share` | `mdeck build --reader` |
|
|
114
|
+
| `mdeck build --with-notes`, `--no-pdf` | `mdeck send --notes`, `--no-pdf` |
|
|
115
|
+
| `mdeck build --self-contained`, `-S` | `mdeck build --single-file` |
|
|
116
|
+
| `mdeck build --presenter-launchers` | `mdeck build --launchers` |
|
|
117
|
+
| `mdeck build --pdf`, `--inline-images`, `-I` | removed; use `mdeck pdf` and `--single-file` |
|
|
118
|
+
| `mdeck run --host` | `mdeck run --network` |
|
|
119
|
+
| `mdeck templates`, `mdeck extensions` | `mdeck list [layouts\|themes\|palettes]` and `mdeck starter <layout>` |
|
|
120
|
+
| `--no-ink` | `--no-drawings` |
|
|
121
|
+
| `npm run dev`, `npm run present` | `npm start` |
|
|
122
|
+
|
|
123
|
+
Commands that take `slides.md` use the one in the current folder when you leave it out, and `mdeck preview` takes a folder.
|
|
124
|
+
|
|
125
|
+
Deck settings:
|
|
126
|
+
|
|
127
|
+
| Before | Now |
|
|
128
|
+
|---|---|
|
|
129
|
+
| `design` | `theme` |
|
|
130
|
+
| `institution`, `authorDate`, `pageNumbers`, `sections` | `show.organization`, `show.author`, `show.numbers`, `show.sections` |
|
|
131
|
+
| `share.themes`, `share.notes` | `reader.themes`, `reader.notes` |
|
|
132
|
+
| `live.server`, `live.id`, `live.code` | `server`, `session.id`, `session.code` |
|
|
133
|
+
| slide `note:` and `notes:` | removed; write a `:::notes` block |
|
|
134
|
+
|
|
135
|
+
Names in files, addresses and code:
|
|
136
|
+
|
|
137
|
+
| Before | Now |
|
|
138
|
+
|---|---|
|
|
139
|
+
| `<deck>.ink.json` | `<deck>.drawings.json` (use `mdeck migrate`; run and exports report a leftover) |
|
|
140
|
+
| `?view=share`, `?v=d`, `?v=s`, `?v=p`, `?v=a` | `?view=reader`; the short forms are gone |
|
|
141
|
+
| `MDECK_LIVE_KEY`, `?livekey=` | `MDECK_SERVER_KEY`, `?serverkey=` |
|
|
142
|
+
| `kind = "template"` in `extension.toml` | `kind = "layout"` |
|
|
143
|
+
| `import … from 'mdeck/template-api'` | `'mdeck/layout'` |
|
|
144
|
+
| `examples/custom-templates` | `examples/custom-layouts` |
|
|
145
|
+
|
|
146
|
+
`mdeck migrate [slides.md] --dry-run` previews updates to deck settings, local extension manifests and imports, and drawings filenames. Applying it preserves unrelated text and creates backups. Conflicts stop it before writing. Metadata notes have been removed and are not migrated. `mdeck check` also reports old settings with their replacements.
|
|
147
|
+
|
|
148
|
+
The package is version 2.0.0; the serialized registry envelope is schema 2. Extension TOML manifests and drawings remain schema/version 1. Old URL parameters produce an explicit correction, and `MDECK_LIVE_KEY` stops startup with its replacement.
|
|
149
|
+
|
|
150
|
+
### Also new
|
|
151
|
+
|
|
152
|
+
- `mdeck build --reader` makes a hosted reader folder with separate media and speaker notes removed; `--notes` keeps them. The launch page’s folder-to-host button uses this mode.
|
|
153
|
+
- CLI commands reject unknown flags, missing values and surplus filenames before starting a server or changing outputs.
|
|
154
|
+
- Relay access follows the deck’s module graph and referenced assets. Pairing URLs keep the master server key on the laptop; tokens are scoped to a tunnel and its session, and unpairing revokes them.
|
|
155
|
+
|
|
156
|
+
- Drawing: the icons of the toolbar and the presenter view are redrawn as line icons; the colours have names instead of hex codes; clearing a slide asks in a small popover over the button instead of the browser's confirm dialog.
|
|
157
|
+
- The launch page and the guides call the server a server, drawings drawings and layouts layouts.
|
|
158
|
+
|
|
159
|
+
## 1.4.0 — 2026-10-05
|
|
160
|
+
|
|
161
|
+
Draw on your slides, also from an iPad, and ask the audience more than polls. A room server started with `mdeck live` needs 1.4 to pass live drawings to other devices; polls keep working with older ones.
|
|
162
|
+
|
|
163
|
+
- Slides can carry drawings (ink) from `<deck>.ink.json` beside the deck: pen strokes with pressure and highlighter, drawn above the slide in the deck, the reader view, builds and PDFs. `I` hides them; `mdeck build` and `mdeck pdf` leave them out with `--no-ink`; `mdeck check` reports a broken ink file and drawings for slides that no longer exist.
|
|
164
|
+
- Drawing in the full-screen deck: `D` starts it. Pen (with pressure) and highlighter are kept, a marker fades after a few seconds, the eraser removes whole strokes; undo/redo (also Cmd/Ctrl+Z), clear slide, colours and sizes are on a floating toolbar. Once a pen is used, fingers no longer draw unless switched on; tap zones are off while drawing. Until a server saves the ink, it is kept in the browser and can be downloaded as the ink file.
|
|
165
|
+
- `mdeck dev` saves drawings in `<deck>.ink.json` as they are made, without reloading the open windows. A slide that gets its first drawing and has no `id:` gets one from its heading, so the drawing stays with it when slides are added or moved; when an id is changed in the editor, the drawing moves along. Drawings from several windows or devices are merged stroke by stroke, and the ink file is backed up once per session in `.mdeck-backups`.
|
|
166
|
+
- Drawing in the presenter view: **✎ Draw** (or `D`) turns it on for the current slide, with the toolbar on the slide. The audience window, the next-slide preview and other deck windows in the same browser show strokes while they are drawn, the marker fading there too.
|
|
167
|
+
- For an iPad: the presenter view has a layout where the slide fills the screen, with a small bar (timer, previous/next, draw, notes, full screen) and the notes and next slide in a drawer (`N`). It is the default on touch screens and is remembered. `F` and a button go full screen where the browser allows it, in the presenter view and the deck. The deck's controls gain a draw button, the ink toolbar has previous/next, and buttons are larger on touch screens. Added to the Home Screen, a deck opens without Safari's bars.
|
|
168
|
+
- Present from an iPad while the laptop drives the projector: with `mdeck dev --host`, the launch page shows a one-time QR code ("Present from an iPad") that opens the presenter view on the iPad, paired with the dev server so it may save drawings and steer the phones; "Unpair" ends it. The audience window follows a presenter view on another device, slide, step and drawings as they are drawn, through the room server (the one in `mdeck dev` or `mdeck live`, with its presenter code). A window that opens later gets the drawings made so far.
|
|
169
|
+
- The room server orders the presenter's announcements by when it heard them, so two devices with clocks that disagree no longer take the phones back to an older slide. New route `POST /rooms/<id>/ink` (presenter only) for live drawings.
|
|
170
|
+
- More kinds of audience questions: `<scale>` (a number from `min` to `max`, with counts and the average), `<wordcloud>` (a real word cloud of short answers, packed around the middle and sized by how often they came in) and `<question>` (open answers as cards). Phones answer them on the same page as polls.
|
|
171
|
+
- `<qrcode join />` shows the deck's join code, large and with its link, for a slide at the start; `qr="false"` on a poll or another question leaves out its own code.
|
|
172
|
+
- QR codes (`<qrcode>` and the questions) are drawn as SVG in the slide's own colours instead of black on white, so they fit dark themes too; `--qr-ink` and `--qr-bg` override them.
|
|
173
|
+
|
|
174
|
+
## 1.3.2 — 2026-10-01
|
|
175
|
+
|
|
176
|
+
- Fixed: on plain `http://` network addresses, as with `mdeck dev --host`, browsers offer no `crypto.randomUUID`. A phone on the answer page then got a new identity with every reload, so a changed vote could count twice, and the presenter view did not open at all. Both now use a fallback that works everywhere.
|
|
177
|
+
|
|
178
|
+
## 1.3.1 — 2026-09-30
|
|
179
|
+
|
|
180
|
+
- Phones no longer flip between two screens showing the same presentation: the room server follows the screen where the slides were changed last, a screen that only opened does not take over, and the presenter view says when another screen has the phones. A screen that cannot read its theme yet no longer sends an empty look, which made the phones' fonts jump.
|
|
181
|
+
|
|
182
|
+
## 1.3.0 — 2026-09-30
|
|
183
|
+
|
|
184
|
+
Polls work without hosting the slides. This changes how phones join; see *Removed*.
|
|
185
|
+
|
|
186
|
+
- Polls use relay mode: phones no longer load the slides. They open the room server's own answer page at `<server>/<code>`, and the presenter's screen sends it the activity on screen, what the phones should show, the deck's look and the words in its language. You present from your own computer with the slides as they are; only the room server has to be reachable, and it works the same inside `mdeck dev` on localhost. The session code comes from the deck (`live.id`, `live.code`).
|
|
187
|
+
- Components describe their phone side with a static `phone` function returning a `choice`, `text` or `scale` form; answers arrive as `data.value`.
|
|
188
|
+
- The poll guide shows how to keep `mdeck live` running with systemd, and the nginx settings live connections need.
|
|
189
|
+
- Removed: `?view=respond` and the `live.audience` setting, which `mdeck check` now reports. Custom activities that drew their own phone page with `respond` now describe it with `phone`.
|
|
190
|
+
|
|
191
|
+
## 1.2.0 — 2026-09-30
|
|
192
|
+
|
|
193
|
+
### Launch page
|
|
194
|
+
|
|
195
|
+
- `mdeck dev` opens a launch page at the dev server's plain address; the slides are at `?view=deck`. It has a live preview of the deck; links to the presenter view and an audience window that belong together, the full-screen deck and the reader view; the visual editor and the guides, started on first click; buttons that build the folder, the file to send and the PDF; and the `mdeck check` results. It uses the same dark styling as the presenter view and the editor, and answers only on this computer.
|
|
196
|
+
- `mdeck dev` and `mdeck present` accept `--host` (reachable from phones in the same network), `--port` and `--no-open`.
|
|
197
|
+
|
|
198
|
+
### Audience polls
|
|
199
|
+
|
|
200
|
+
- `<poll room=… options=…>` shows live results and a QR code; people vote on their phones and can change their vote. Every poll in a deck shares one answer link, `?view=respond`, and phones follow the presenter to whichever poll is on screen, including a theme picked in the presenter view.
|
|
201
|
+
- Rooms run inside `mdeck dev`, or on a room server started with `mdeck live` for hosted decks, set with the `live:` deck setting. Only the presenter moves the phones along and resets polls; on a room server this takes the `MDECK_LIVE_KEY` presenter code, which the launch page shows along with the server's health and the viewers' link. The presenter view says whether phones follow it.
|
|
202
|
+
- Answers are anonymous and kept in memory only, with size and rate limits.
|
|
203
|
+
- Components can build their own activities with `useRoom` and `QrCode` from `mdeck/live`.
|
|
204
|
+
- New example deck `examples/poll` and the guide "Ask your audience".
|
|
205
|
+
|
|
206
|
+
### Language
|
|
207
|
+
|
|
208
|
+
- `lang` is the deck's language: built pages are marked with it, and the reader view, the deck controls, polls and the answer page use German or English words to match. The `labels:` setting replaces single words.
|
|
209
|
+
|
|
210
|
+
### Components
|
|
211
|
+
|
|
212
|
+
- Decks can share components: the `components:` setting lists extra folders, searched after the deck's own `components/` folder. The dev server watches them and follows changes to the list without a restart.
|
|
213
|
+
- PDFs, printouts and the reader's Read mode show interactive slides in their finished state: every step is revealed and slides sit inside `[data-deck-static]`; the stage dispatches `printchange` when printing starts or ends.
|
|
214
|
+
|
|
215
|
+
### Editing, slides and docs
|
|
216
|
+
|
|
217
|
+
- The editor keeps a copy of the deck in `.mdeck-backups/` before the first change of each session, the ten newest per deck.
|
|
218
|
+
- A slide's `title:` setting names it in the outline for slides without a heading.
|
|
219
|
+
- Code blocks stay left-aligned in centred layouts. Step lists have the same spacing as ordinary lists.
|
|
220
|
+
- New guide "Views, commands and servers".
|
|
221
|
+
- The presenter view and the launch page show what is connected to the deck: presenter views, audience windows and phones, and on which devices, such as a paired iPad. Windows say what they are when they connect to the room server; the launch page asks `GET /rooms/<id>/presence`. A standalone `mdeck server` needs this version for it.
|
|
222
|
+
- The launch page explains that the iPad runs the same presenter view, and that pairing is what lets it save drawings and steer.
|
|
223
|
+
- One icon set everywhere: the launch page, presenter, reader, deck controls, drawing toolbar, code blocks and editor use the same line icons ([Lucide](https://lucide.dev), ISC license) instead of a mix of drawings and text symbols.
|
|
224
|
+
|
|
225
|
+
### Fixes and maintenance
|
|
226
|
+
|
|
227
|
+
- Dependencies are up to date with no known vulnerabilities: Vite 8, marked 18, KaTeX 0.18, js-yaml 4.3.
|
|
228
|
+
- The launch page and the editor answer on `*.localhost` names, as used by local development proxies.
|
|
229
|
+
- A leftover temporary Chrome profile no longer fails `mdeck pdf`.
|
|
230
|
+
- The real-browser check runs in CI.
|
|
231
|
+
|
|
232
|
+
## 1.1.0 — 2026-09-17
|
|
233
|
+
|
|
234
|
+
- One address parameter selects the view: `?view=deck`, `?view=share`, `?view=presenter`, `?view=audience`, with the short forms `?v=d`, `?v=s`, `?v=p`, `?v=a`. The former `?presenter=1`, `?audience=1` and `?share=1` are gone; launchers, the presenter command and the editor use the new form.
|
|
235
|
+
- The reader's Look menu always offers "Reset to default", and every reader button has an icon and the same style.
|
|
236
|
+
|
|
237
|
+
## 1.0.2 — 2026-09-17
|
|
238
|
+
|
|
239
|
+
- The reader view no longer shows speaker notes just because the file contains them. Notes appear in Read mode only when the deck sets `share.notes: true`, so one build can serve both the presenter and the people you send the link to.
|
|
240
|
+
|
|
241
|
+
## 1.0.1 — 2026-09-16
|
|
242
|
+
|
|
243
|
+
- The slide-writing skill follows the Agent Skills format and works with any assistant; `mdeck skill` installs it for Claude Code, Codex, Cursor, GitHub Copilot and Gemini CLI, or prints it for other tools.
|
|
244
|
+
- The skill finds the reference docs in the installed package, asks `mdeck templates` and `mdeck extensions` for the deck's real layouts and looks, and checks its result with `mdeck check`.
|
|
245
|
+
- README with rendered example slides and a theme GIF; corrected theme descriptions in the authoring reference; package homepage points at the docs site.
|
|
246
|
+
|
|
247
|
+
## 1.0.0 — 2026-09-16
|
|
248
|
+
|
|
249
|
+
The first release. Everything below is included.
|
|
250
|
+
|
|
251
|
+
- Slides written in Markdown with YAML settings, named content areas and speaker notes.
|
|
252
|
+
- Seven built-in layouts, six themes and eight colour palettes; deck-local templates, themes and palettes described by one `extension.toml` format.
|
|
253
|
+
- Presenter view with notes, timer and a synchronised audience window.
|
|
254
|
+
- Reader view for shared decks: outline, Read mode for phones, look picker, deep links, PDF download; `mdeck build --share` strips speaker notes and renders the PDF with a local Chrome.
|
|
255
|
+
- `mdeck pdf` renders a PDF on its own, one page per slide with real text.
|
|
256
|
+
- Builds as a folder or as one self-contained HTML file, with optional presenter launchers.
|
|
257
|
+
- Browser editor (`mdeck edit`, experimental): outline, live preview, form-based slide and deck settings, autosave with undo, and editors for palettes, themes and templates.
|
|
258
|
+
- Validation (`mdeck check`), listings (`mdeck templates`, `mdeck extensions`), a scaffolding wizard (`mdeck new`) and offline documentation (`mdeck docs`).
|
|
259
|
+
- A slide-writing skill for Claude Code.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tilman Schieber
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo/logo-light.svg" alt="mdeck" width="280">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center"><b>Hand your slides, papers and notes to an AI assistant. Get a clean deck to present in the browser. Share it as one HTML file or a PDF.</b></p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://gh.tschieber.de/mdeck/">Docs</a> ·
|
|
9
|
+
<a href="https://www.npmjs.com/package/mdeck">Package</a> ·
|
|
10
|
+
<a href="CHANGELOG.md">Changelog</a> ·
|
|
11
|
+
<a href="LICENSE">MIT license</a>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
## Start from what you have
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
/write-slides Rebuild lecture-03.pptx and my notes in notes.md as a
|
|
18
|
+
20-minute talk for second-year students. Keep the figures, split the
|
|
19
|
+
crowded slides, and start with a poll.
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Old PowerPoint decks, PDFs, Word documents, papers and rough notes all work.
|
|
23
|
+
mdeck ships a `write-slides` skill for Claude Code, Codex, Cursor, Copilot,
|
|
24
|
+
Gemini and any other assistant. It reads your material, keeps your content and
|
|
25
|
+
pictures, rebuilds it in the layouts and looks your folder provides, writes
|
|
26
|
+
speaker notes from your text, and checks the result with mdeck. Then you keep
|
|
27
|
+
asking: “split slide 4”, “use a dark look”, “you left out the table on page 3”.
|
|
28
|
+
|
|
29
|
+
## A presentation is a text file
|
|
30
|
+
|
|
31
|
+
mdeck slides are Markdown, which is close to the native language of AI
|
|
32
|
+
assistants: they write it all day, so they write good slides without operating
|
|
33
|
+
any slide software. And it stays plain text you can read, review and change
|
|
34
|
+
yourself:
|
|
35
|
+
|
|
36
|
+
```markdown
|
|
37
|
+
---
|
|
38
|
+
theme: neue
|
|
39
|
+
meta:
|
|
40
|
+
title: Enzyme kinetics
|
|
41
|
+
author: Alex Morgan
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
:::meta
|
|
46
|
+
layout: title
|
|
47
|
+
:::
|
|
48
|
+
# Enzyme kinetics
|
|
49
|
+
## How fast, and why
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
# Rate depends on substrate
|
|
53
|
+
|
|
54
|
+
- Michaelis–Menten describes saturation
|
|
55
|
+
- *K*<sub>m</sub> is the half-saturation point
|
|
56
|
+
|
|
57
|
+
:::notes
|
|
58
|
+
Ask who has seen the curve before.
|
|
59
|
+
:::
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Saved as `talk.md`, `mdeck run talk.md` turns it into a slide deck with a title slide, a content
|
|
63
|
+
slide, a theme, and your notes in the presenter view. The preview reloads
|
|
64
|
+
whenever you or the assistant change the file.
|
|
65
|
+
|
|
66
|
+
<p align="center"><img src="docs/images/hero.png" alt="The tour deck's title slide in the Neue theme" width="800"></p>
|
|
67
|
+
|
|
68
|
+
## One file, any look
|
|
69
|
+
|
|
70
|
+
The same slide file rendered with each of the six built-in themes. Change one
|
|
71
|
+
line in the settings, or pick from the presenter view, and the whole deck
|
|
72
|
+
repaints.
|
|
73
|
+
|
|
74
|
+
<p align="center"><img src="docs/images/themes.gif" alt="The same slide cycling through the Aurora, Duet, Editorial, FHNW, Neue and Terminal themes" width="800"></p>
|
|
75
|
+
|
|
76
|
+
Try it yourself: the [docs home page](https://gh.tschieber.de/mdeck/)
|
|
77
|
+
embeds a live deck with a theme switcher.
|
|
78
|
+
|
|
79
|
+
## Install
|
|
80
|
+
|
|
81
|
+
You need [Node.js](https://nodejs.org) 22 or newer:
|
|
82
|
+
|
|
83
|
+
```sh
|
|
84
|
+
npm install -g mdeck
|
|
85
|
+
mdeck --help
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Installed mdeck from the FHNW GitLab registry before? Switch with
|
|
89
|
+
`npm uninstall -g @tilman.schieber/mdeck`, then install as above.
|
|
90
|
+
|
|
91
|
+
Working from a clone instead? See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
92
|
+
|
|
93
|
+
Then teach your assistant about mdeck:
|
|
94
|
+
|
|
95
|
+
```sh
|
|
96
|
+
mdeck skill --install claude # or codex, cursor, copilot, gemini; --print for anything else
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
See [Work with an AI assistant](docs/reference/claude-skill.md) for briefing
|
|
100
|
+
tips, follow-up requests and what to check before presenting.
|
|
101
|
+
|
|
102
|
+
## First steps
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
mdeck new # no assistant? answer a few questions, get a starter file
|
|
106
|
+
mdeck run talk.md # launch page: present, edit, send and check; reloads on save
|
|
107
|
+
mdeck run talk.md --network # also reachable from phones, e.g. for a poll
|
|
108
|
+
mdeck run talk.md --server # present from an iPad on any network, through your server
|
|
109
|
+
mdeck build talk.md --reader # dist/ reader folder to host, notes removed
|
|
110
|
+
mdeck send talk.md # one file to email, with a PDF inside
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## What you get
|
|
114
|
+
|
|
115
|
+
- **Layouts:** title, chapter, big statement, image and text, split, full-bleed image, and plain content slides, with points that appear one at a time.
|
|
116
|
+
- **Looks:** six themes and ten colour palettes, each light or dark, changeable without touching the slides. Make your own as small `extension.toml` folders beside the deck.
|
|
117
|
+
- **One launch page:** `mdeck run` opens a page with a live preview, the presenter and audience views, the deck and reader views, the editor, the guides, one-click builds and PDF, the deck's check results, and for decks with a server its health and the presenter code.
|
|
118
|
+
- **Presenting:** a presenter view with notes and timer, and an audience window that stays in sync.
|
|
119
|
+
- **Drawing on slides:** pen with pressure, highlighter and a fading marker, with a mouse, a finger or an iPad pencil (`D`). Drawings are saved in `<deck>.drawings.json` beside the deck and appear in every view, build and PDF. An iPad can present on its own, or pair with the laptop through a QR code on the launch page while the laptop's audience window follows it.
|
|
120
|
+
- **Audience questions:** `<poll room="lunch" options="A|B|C" />` shows live results and a QR code; people vote on their phones. `<scale>`, `<wordcloud>` and `<question>` ask for a rating, words or open answers, and `<qrcode join />` shows the join code once for all of them. Rooms run inside `mdeck run --network` or on a small server (`mdeck server`).
|
|
121
|
+
- **Sharing:** a reader view with an outline, a phone-friendly Read mode and a PDF download; speaker notes are stripped from shared builds, and interactive slides appear in their finished state.
|
|
122
|
+
- **Content:** pictures, video, tables, callouts, code with syntax highlighting and live execution, formulas, QR codes, and your own Preact components, kept with one deck or shared between decks.
|
|
123
|
+
- **New designs on request:** ask your assistant for a palette, theme, layout or interactive component; it keeps them as small folders beside the deck.
|
|
124
|
+
- **Editing in the browser:** `mdeck edit talk.md` opens an editor with a live preview and forms for slides and settings, and `mdeck design` shows themes and palettes on a sample deck for fine-tuning. It writes back into your text file.
|
|
125
|
+
|
|
126
|
+
## Read the docs
|
|
127
|
+
|
|
128
|
+
The docs are written for people who have never used Markdown or a terminal.
|
|
129
|
+
They start with working alongside an AI assistant and explain the file format
|
|
130
|
+
so you can read and adjust what it writes:
|
|
131
|
+
|
|
132
|
+
- Online: <https://gh.tschieber.de/mdeck/>
|
|
133
|
+
- Offline, from any folder once mdeck is installed: `mdeck docs`
|
|
134
|
+
|
|
135
|
+
Technical references for layout, theme and tool authors live in
|
|
136
|
+
[docs/reference](docs/reference/).
|
|
137
|
+
|
|
138
|
+
## Examples
|
|
139
|
+
|
|
140
|
+
Each example keeps its assets beside its slide source so it can be copied as a
|
|
141
|
+
complete folder.
|
|
142
|
+
|
|
143
|
+
| Example | Theme | What it demonstrates |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| [Tour](examples/showcase/slides.md) | Aurora | Start here: each slide shows the Markdown beside what it becomes, from headings to layouts, live code, notes, drawing, a poll and sharing |
|
|
146
|
+
| [Python](examples/python/slides.md) | FHNW | A real lesson: live code to try out, points revealed step by step, notes on every slide, a poll to check understanding |
|
|
147
|
+
| [Poll](examples/poll/slides.md) | Duet | A join slide, then a poll, a scale, a word cloud and open questions; start it with `mdeck run slides.md --network` |
|
|
148
|
+
| [Custom layouts](examples/custom-layouts/slides.md) | Terminal | A deck-local comparison design and named regions |
|
|
149
|
+
|
|
150
|
+
The docs home page embeds a short talk in the Editorial theme, and the
|
|
151
|
+
screenshots above show Neue.
|
|
152
|
+
|
|
153
|
+
## Made at FHNW
|
|
154
|
+
|
|
155
|
+
mdeck is developed at the School of Life Sciences FHNW for lectures, labs and
|
|
156
|
+
talks. Issues and ideas: <https://github.com/tilman-schieber/mdeck/issues>.
|