Skip to content

v1.1.0

Choose a tag to compare

@jaapstronks jaapstronks released this 24 Jul 17:05
9960884

1.1.0 (2026-07-24)

Added

  • a11y/seo: HTML semantics audit — landmarks, native lists, RTL, meta/JSON-LD (#247) (46d018f)
  • a11y: nested document heading outline for visual export/embed (tier 3) (#251) (4b2760f)
  • activity: a bundled slide.added feed event (#84) (b6b79c5)
  • activity: slide-preview thumb next to comments in the "from others" rail (#86) (2f8ffa0)
  • ai-review: click-to-preview grid, hover-select, peek nav (#115) (b6ccee2)
  • api,mcp: comments via public API v1 + MCP write tools (6b96292)
  • auth: self-hosted single-IdP SSO via OIDC (Track 1) (#280) (780c074)
  • branding: configurable app name (APP_NAME) + help/docs link (HELP_URL) (#58) (1234f7f)
  • builds: typewriter-per-bullet reveal style (build-animations phase 1) (#263) (f92049a)
  • capture: deterministic docs screenshot factory (Phase 0) (#324) (499e568)
  • chart: chart-data editing moves to a bottom-panel "Data" tab (f2573db)
  • chart: chart-data editor as a roomy modal with live preview (#210) (2776dd7)
  • chart: spreadsheet keyboard-nav + smarter header-cell paste (#127) (b765edb)
  • chart: spreadsheet-style data grid editor with raw-CSV toggle (#121) (868eb94)
  • collab: deck ⇄ Y.Doc codec — CRDT schema + serializer (fase 2, stap 1) (#7) (ca1a69b)
  • collab: editor live-doc binder - Y.Doc as write target (fase 2, stap 3) (#9) (38b0946)
  • collab: presence round 2 - notes co-typing, presence on all edit surfaces, robust focus state (#14) (a491b4a)
  • collab: presence round 3 — gliding slide-list labels + fallback focus chip (#17) (0730cf3)
  • collab: server-as-collaborator - facade writes reach the live doc (fase 2, stap 4) (#10) (332e53a)
  • collab: step-5 finish - conflict-semantics tests, lock retirement, revision hygiene (fase 2, stap 5) (#11) (af6cc6c)
  • collab: Y.Doc persistence — storage adapters + Hocuspocus hooks (fase 2, stap 2) (#8) (bd18db9)
  • comments: @mentions met autocomplete + toegangs-prompt (fase 3) (da04498)
  • comments: @mentions met inline autocomplete, toegangs-prompt en comment_mention-notificatie (0dec0b6)
  • comments: comment-activiteit voedt de notificatie-bel, bel ook in de editor (04aa0a2)
  • comments: comments voeden de bel + bel in de editor-topbar (fase 1) (628c7f0)
  • comments: link button in the composer (#167) (c054a5c)
  • comments: per-user leesstatus + 'wacht op mij'-filter (fase 2) (c2324ee)
  • comments: per-user leesstatus met unread-dots en 'wacht op mij'-filter (170c6fe)
  • comments: render @mention markers as inline chips everywhere (#105) (66fe50d)
  • comments: show mentions as chips while typing (#163) (baccbf9)
  • comments: subscriptions + voorkeuren (fase 4) (e6cb5cf)
  • comments: subscriptions à la GitHub - participating default, per-deck override, voorkeuren (9cc9f21)
  • content-columns: col{n}* image keys → ImageRef (datamodel step 4, laatste stap) (89641b4)
  • content-columns: resolve col{n}* image keys into the ImageRef (datamodel step 4) (678760c)
  • create: creation view + reuse consolidation (create-flow track, Slices 1-4) (#76) (78d9439)
  • data-model: .deck bundle import / re-hydrate (PR 5b) (#219) (02786e8)
  • data-model: declare field-type vocabulary as single source (move 1a) (ad32de7)
  • data-model: field-type vocabulary as single source (move 1a) (2a59898)
  • data-model: generate + serve the deck JSON Schema (move 1c) (#213) (a3f1e21)
  • data-model: pull markdown dialect toward CommonMark (PR 9) (#215) (6e7fbe2)
  • data-model: schemaVersion stamp + single migration runner (move 1b) (#212) (7a8e444)
  • data-model: self-contained .deck bundle export (PR 5a) (#218) (f049699)
  • data-model: semantic reflowable HTML reader export (PR 7) (#217) (af81b14)
  • data-model: slide-type identity, namespaces + collision detection (PR 6) (#216) (e6704b6)
  • editor: "Settings" chip on images opens the inspector to their section (#173) (beeac1f)
  • editor: clickable empty image slots - add a first image from the slide (#24) (03a0ac0)
  • editor: comments-pane krijgt scope-switch, filters worden één dropdown (4a870e4)
  • editor: Cover/Contain fit toggle on images (wysiwyg) (#172) (42cf3b3)
  • editor: drag & drop image files onto empty canvas placeholders (cac98c4)
  • editor: drag & drop image files onto empty canvas placeholders (a1ebe4d)
  • editor: draggable focal point on cropped images (#171) (39525eb)
  • editor: finish selection-aware inspector — image-text per-image focus + content-columns element tab (55a4c22)
  • editor: finish selection-aware inspector (image-text focus + content-columns element tab) (2b3a730)
  • editor: flag empty required fields in the form, not just on save (00d78fc)
  • editor: focal point + fit on per-item images (gallery, team-cards, content-columns) (#176) (eb55c2e)
  • editor: icon-cards krijgen een inline icon-picker op de canvas (63239d8)
  • editor: images single-source in the inspector (retire pill/chip/popover) (ef4dd9b)
  • editor: inline card reorder via overlay grip handles (#23) (d26ef3a)
  • editor: inspector leidt met settings, grote per-type blokken inklapbaar (d280a63)
  • editor: keyboard-operable focal point (arrow keys + Home) (d44f4eb)
  • editor: keyboard-operable focal point (arrow keys + Home) (5cc226b)
  • editor: loading skeleton + faster deck open (#19) (7bb3e82)
  • editor: notes under the slide, discoverable comment placement (#64) (402a169)
  • editor: Option A — full-width slide bar with labeled Inspector/Comments openers (#149) (72d014d)
  • editor: presenter notes worden de derde inspector-pane (fc0e872)
  • editor: reflect the selected slide in the URL (?slideId=) (726fd7f)
  • editor: retire the 3x3 cover-focus grid from the inspector (aa9c3e2)
  • editor: retire the 3x3 cover-focus grid from the inspector (4d6c2f8)
  • editor: selection-aware inspector with [This element | Slide] tabs (#175) (0868d2f)
  • editor: show personal + team slides in insert-slide library strip (008b1b9)
  • editor: topbar in zones, gelabelde pane-switcher, slide-toolbar boven de canvas (18f9c87)
  • editor: topbar wordt deck-only, pane-tabs verhuizen naar de slide-toolbar (a4da34b)
  • editor: unified Background section + logo-wall 30-cap and colour (#20) (14a5314)
  • editor: unify Share into one tabbed dialog; polish Export rows (#164) (27db530)
  • export: compress images before embedding in server-side PDF (f4bcd5d)
  • export: unified export modal with colour-coded formats and one PDF entry (#131) (32917c9)
  • follow: collapsible Q&A so the slide fills a landscape phone (#264) (67953aa)
  • home: building-blocks shelf replaces the theme-picker create zone (#78) (1a18ad0)
  • home: coherent, content-first dashboard layout (#63) (f5d4fd1)
  • home: per-user reuse tracking + "New to you" badge on the blocks shelf (#81) (d2b34fa)
  • home: show comment text in the from-others rail; drop Popular's 0-count badge (#80) (3a15ee4)
  • home: single /api/home aggregation replacing the client fan-out (#83) (75d9c11)
  • home: two-column canvas with a from-others activity rail (#77) (2b234fa)
  • i18n: honor ?lang=/?locale= URL param for initial UI locale (#317) (b94793c)
  • image-blocks: justified rows for imageAspect: original (#59) (f61299b)
  • image-slide: split conflated layout into ImageRef fit + bleed (datamodel step 3) (ce57bdd)
  • image-slide: split layout into ImageRef fit + bleed (datamodel step 3) (940308c)
  • image-text: datamodel step 2 - fold focus + alt into the canonical ImageRef (#182 follow-up) (#183) (a12abb8)
  • image-text: fit becomes an ImageRef property (datamodel step 2b) (3d3b667)
  • image-text: layout-catalogus fase 1 - breedtereeks (1/3-2/3), hoekbeeld, layout-switcher (bf9fdf5)
  • image-text: layout-catalogus fase 1 - breedtereeks, hoekbeeld, layout-switcher (d3de142)
  • image-text: layout-catalogus fase 2 - beeldrijen, duo en de images[]-migratie (c75ba88)
  • image-text: layout-catalogus fase 2 - beeldrijen, duo en de images[]-migratie (a1e4593)
  • image-text: layout-catalogus fase 3 - cross-type tegels, spiegel-toggle en polish (1d8813a)
  • image-text: layout-catalogus fase 3 - cross-type tegels, spiegel-toggle en polish (bb5de58)
  • image-text: optionele twee tekstkolommen bij beeldrij en duo (2824349)
  • image-text: optionele twee tekstkolommen bij beeldrij en duo (35ae672)
  • image-text: unify fit CSS + move fit onto the ImageRef (datamodel step 2b) (45b0c0b)
  • inline-edit: block-level text alignment & colour ('This text' tab) (d9be868)
  • inline-edit: block-level text alignment & colour ('This text' tab) (5e7f116)
  • inline-edit: edit markdown fields in place on the canvas (editing-surfaces text phase 1) (b4e673e)
  • inline-edit: floating selection toolbar for rich edits (c9b9560)
  • inline-edit: floating selection toolbar for rich edits (editing-surfaces text, step 2) (113900f)
  • inline-edit: image-picker parity for logo-wall, image-blocks, quote (#148) (adfe3b2)
  • inline-edit: text-size scale (S/M/L) on the 'This text' tab (#194) (2f52f83)
  • inline-edit: theme text swatches on the 'This text' colour control (#199) (4f499cd)
  • inspector: enforce the element/slide split for image-text and image-slide (e31d2a4)
  • inspector: honest accessibility status chip + collapsible/flat rule (#200) (a6f025d)
  • install: agent-native install flow + non-interactive setup flags (#284) (c248d14)
  • install: one-command installer + interactive .env setup wizard (#281) (2ad0a07)
  • mcp: read comments across decks (list_comments, list_recent_comments) (#5) (4e04c86)
  • nav: consolidate 9 sidebar items to 6 with a unified Presentations view (#79) (328e612)
  • notifications: bundled "someone worked on your deck" notification (#106) (1108d32)
  • notifications: events-inbox + auto-archive bij eigen reply (fase 5) (c16886a)
  • notifications: events-inbox met archiveren, filters en auto-archive bij eigen reply (8b4608a)
  • pdf: video slides export as 'watch online' placeholder (#104) (24cf8de)
  • picker: schematic slide-type view + shared schematic renderer (#134) (44156bb)
  • quote-slide: canvas add/remove for 2nd/3rd quote + content-aware sizing (#206) (0a75f15)
  • quote-slide: edit-mode fixes, centre-align block, 2 portraits on extras (#208) (0e9232a)
  • quote: optional round portrait photos (1-2) next to the attribution (#26) (c83dc8a)
  • quote: support up to 3 quotes with alternating alignment (03fbbd1)
  • real-time collaboration — presence + live CRDT edits (ADR 001) (#12) (1c2860a)
  • sandbox: example decks + focused Home, conditional ImageKit source (4c265f4)
  • sandbox: explain agent-native instead of a dead 'connect an agent' CTA (65101ce)
  • sandbox: grey out irrelevant settings (export, notifications, digest) (ea85c20)
  • sandbox: library explainer page + theme-picker production hint (c5897ef)
  • sandbox: public-playground guards (publish off, banner, stock media) (#290) (ba4f3a9)
  • sandbox: sample media + logos in the image library, greyed source hint (742ac4e)
  • security: fail closed on multi-workspace over a non-org-isolating backend (#286) (04c711e)
  • self-install: UX round 3 (cleaner Home, agent onboarding, MCP id alias, quiet locks) (#291) (8343ccd)
  • settings: redesign the settings page as a real settings UI (#147) (2432f35)
  • slide-types: archive split-partner-title-slide (#197) (e5f78b8)
  • slide-types: count-aware semantic projection + url field type (2a substrate) (#254) (c2b6868)
  • slide-types: drag-to-reorder custom types in settings (4467c85)
  • slide-types: full template syntax reference in the type editor (86e6b0c)
  • slide-types: import/export custom slide-type definitions (#124) (77d034b)
  • slide-types: migrate text-blocks to the nested rows model + relation-aware projection (PR B) (#257) (99946ae)
  • slide-types: park lead-capture pending cookie-consent wiring (#318) (21b0ced)
  • slide-types: roll out text-role vocabulary, retire quote hardcode (PR 2) (#226) (7b5d2c6)
  • slide-types: text-role affordance model, kill centered-bullet bug (PR 1) (#225) (f615cf0)
  • slides: layout setting + optional subheading on section title slide (53e5f58)
  • theme: edit surfaces, heading treatment and locks in the theme editor (#136) (a2f19c4)
  • theme: enforce override locks at edit- and render-time (#130) (a529292)
  • theme: name background options in the theme editor (#141) (c99454e)
  • theme: name the two built-in backgrounds (#142) (a5dc830)
  • theme: preview real slides in the theme editor (#133) (26824e5)
  • themes: replace sandbox base themes with sharp archetype set (#152) (778cfbd)
  • theme: store a rich config on database themes (#120) (c69bb6e)
  • theme: the theme owns its background presets (#119) (7355401)
  • theme: upload background images to a theme from the editor (#137) (553afb7)
  • theme: wire theme surface tokens into the slide design system (#129) (b985c5f)
  • title-slide: theme-driven layout (bottom/center/top) (f864405)
  • title-slide: theme-driven layout (bottom/center/top) (4bd9c63)
  • title-slide: title/subtitle/meta field model + subtitle render fix (349c73c)
  • title-slide: title/subtitle/meta field model + subtitle render fix (116e036)
  • title-slide: unify background onto shared slideBgImage (#196) (228c4c3)
  • ui: Inter as the app-chrome sans, self-hosted with system fallback (#135) (b1ee8c8)
  • ultrawide: let a wide screen actually buy width (#155) (5b98e84)
  • wysiwyg: afbeelding toevoegen/verwijderen als directe intentie (type-wissel text ↔ image-text) (928de2e)

Fixed

  • ai-catalog: expose image-grid slide types to the AI (9bd9b3d)
  • ai-catalog: expose image-grid slide types to the AI (233f416)
  • ai-prompts: stop advertising buildThemeContextSection as overridable (#203) (57e8182)
  • ai: stop the catalog offering the deprecated content-columns-slide (F6) (#323) (f2127f8)
  • analytics: store slide IDs as text, not uuid (7f8f833)
  • analytics: store slide IDs as text, not uuid (4727739)
  • api: layoutVariants meesturen in /api/slide-types (867f281)
  • api: require If-Match for admins too on presentation writes (#262) (fc7deeb)
  • api: unify the internal error envelope on a machine-code contract (#261) (34daeb0)
  • authz: per-deck authorization for MCP tools and public API (#6) (9a29feb)
  • authz: stop leaking decks without view access on Home/overviews (fb78386)
  • chart: route canvas chart click to the Data tab; tighten grid in panel (d30362d)
  • collab: presence label polish + clipping fix + stale slide-dot (#15) (f8d3cba)
  • collab: review blockers - traversal, custom-html gate, load race, store consistency (#13) (6fcb513)
  • comments: drop href on composer link nodes; document paren-URL limit (#169) (ba0bc8b)
  • comments: let presentation owner delete any comment on their deck (#1) (bee5661)
  • comments: review-fixes op de notificatie-stack (3c88c00)
  • create: active-tab highlight, optional theme in library, language up top (#138) (3ddc54d)
  • css: map analytics dashboard onto --app-* tokens (was undefined --ps-*) (#316) (d6e613f)
  • css: map auto-advance bar onto --app-* tokens (was undefined --ps-*) (#314) (032f5fa)
  • css: use the accent tokens that exist (#146) (3f50024)
  • data-model: stop leaking owner email into public surfaces (move 3, narrow) (#214) (5b5b058)
  • editor: clickable comment markers, whole-thread jump, dropdown factory (#61) (5945e5e)
  • editor: close two low-frequency edge cases in cards and comments (6810ccd)
  • editor: grab-bag polish — search-focus, notes close, presence dot, card titles (#60) (f686743)
  • editor: keep the slide preview fully in view, no vertical scrollbar (#66) (660d8b8)
  • editor: preview-collapse-val weg, icon-cards remove-fix, bredere bulk-modal, hint-regel weg (7a1560b)
  • editor: rebuild element tab on image fit change so the cover-only focus grid toggles with the mode (63b6bcc)
  • editor: reserve "Layout" for the toolbar chip, dedup the naming (#151) (425e005)
  • editor: stop insert-row + button flickering on edge hover (#65) (bad18d4)
  • editor: unify empty-image placeholders and gate the alt field (#166) (c59065a)
  • editor: WYSIWYG card add/remove + per-item affordance reveal + column-major 5-card grid (#258) (684ff0a)
  • export: embed local fonts in standalone HTML for offline rendering (#108) (60acae3)
  • hardening: prune rate-limit map + weak-config startup warnings (#117) (c422e57)
  • i18n: complete NL/EN coverage and make strings translatable (#174) (043cfae)
  • icon-card-grid: make the tiles layout fill its grid, drop numbering (1a98973)
  • icon-card-grid: tint icons via CSS mask, not <img> currentColor (#3) (8639fcc)
  • image-text: per-beeld cover-override wint ook van de multi-contain frame-regel (f93bce6)
  • inline-edit: band-aware muted colour + drop the inverse token (rollout QA) (#195) (f3e248c)
  • inline-edit: de-collide affordance chips across anchors (#315) (978296a)
  • inline-edit: don't live-truncate rich edits via textContent (37290ea)
  • inline-edit: keep the + Subheading ghost chip off the first body line (#114) (faacd48), closes #113
  • inspector: a11y heading proxy mirrors export's heading fields (#202) (f194be3)
  • inspector: per-type coverage audit — no config field is bulk-only (#192) (c48ac43)
  • inspector: surface video source and embed URL in the inspector (098ab6e)
  • inspector: surface video source and embed URL in the inspector (0f33b2e)
  • install: make the default file-storage install actually usable end-to-end (#285) (7a37b97)
  • layout-switcher: set van cross-type tegels na conversie echt toepassen (a718862)
  • list: stop the deck-card menu leaking a document click listener (F7) (#322) (d5e83da)
  • llm: stop sending temperature to OpenAI models that reject it (#85) (e712222)
  • markdown: stop infinite loop on unsupported heading lines (# / ###) (2f6356c)
  • mcp: pass acting owner to updatePresentation so author-locked slides stay editable for the author (#30) (91d714d)
  • mobile: shorten the long-press compat-click guard to 350ms (#158) (3acdf6a)
  • new-deck: put the deck's own name on the opening title slide (#112) (0c94758)
  • notifications: give the bell dropdown a real row design (#111) (6c0dafb)
  • notifications: guard fire-and-forget comment email against unhandled rejection (#328) (d0d5166)
  • partner-split: readable subheading, and no hardcoded demo photo (#126) (34a742a)
  • pdf-export: configurable timeout for server-rendered PDF (#4) (c389b9d)
  • picker: make "Content columns" the explicit two-column choice (#143) (c116af8)
  • picker: polish add-slide schematics (#140) (12ada28)
  • quote: don't render an empty portrait circle - portraits are fully optional (#28) (e4844e2)
  • rate-limit: await allowRequest so the limiter trips under Redis (#229) (5cd280a)
  • sandbox: fill theme picker, drop library/AI, breathe under topbar (#293) (8ae9adc)
  • sandbox: keep the examples shelf on Home after the first deck (83b857d)
  • save: stale-tab follow-ups - wake-up refresh, volgorde-behoud en merge-audit (5a13125)
  • save: staleness-cap + per-slide conflictdetectie op de slide-level merge (8951677)
  • save: staleness-cap + per-slide conflictdetectie op de slide-level merge (d9f1b64)
  • security: cap public SSE connections (MH3) + clear prod-tree advisories (M4) (cluster 5) (#240) (a465958)
  • security: cap publish/follow-codes body + CSRF-check sandbox cookie (#123) (043cab2)
  • security: close file-read + IDOR holes in export/api-keys/jobs (cluster 1) (#231) (1c0e088)
  • security: LOW-batch hardening — SSRF, CSS filter, error/log leaks (cluster 7, L2/L4/L5/L6/L7/L8) (#248) (2655cab)
  • security: per-resource authz on present-sessions + csv-url SSRF + share-link IDOR (cluster 4, H4/MH1/MH2) (#235) (70807ed)
  • security: stop stack-trace leaks + add framing/security headers (cluster 3) (#233) (ddbd1a3)
  • security: trust rightmost XFF hop + CSPRNG follow codes (cluster 6, M2/M3) (#246) (ce87a8f)
  • security: versioned scrypt cost + AUTH_SECRET boot floor (cluster 8, L1/L3) (#250) (285c9c5)
  • server: guard fire-and-forget email/notify tasks against unhandled rejection (F8) (#321) (75ea614)
  • settings: hide Fonts/Slide Types panels when leaving their tab (#150) (a87e370)
  • share: guard presenter-control link, inline created link, drop dead edit perm (#110) (1ef7104)
  • share: persist isViewOnly on Postgres so workspace pills survive reload (#165) (8da7b6a)
  • slide-library: persist i18n per-language content on both backends (#107) (7466e94)
  • slides: background-aware link colour token for slide-body links (#222) (4fd1ae9)
  • slides: use shadow tokens so print drops elevation (no grey blocks) (#230) (636f5e7)
  • storage: route version history through the storage adapter + import migration (#237) (df7c5c8)
  • theme-editor: keep Save reachable, and stop shadowing it (#139) (d52fe2a)
  • theme: let /change-theme switch the theme via a gated escape hatch (#236) (5f03a8e)
  • theme: load database themes in the client, and invalidate on save (#132) (845445f)
  • theme: one shared normalizeTheme, and emit the legacy alias tokens (#116) (c5b6c99)
  • theme: pin accent-contrast token in the config back-compat fixture (#122) (43a12f4)
  • theme: readable quote author/byline on deckyard's dark quote slide (#16) (8ee2f7c)
  • timeline: keep cards readable on every background (92bc5c1)
  • timeline: keep cards readable on every background (a6dd602)
  • title-slide: apply muted caption colour on dark-text canonical backgrounds (43f8aa6)
  • validate: accept the '' cleared-value convention for optional enum fields (e0ffd1f)

Security

  • auth: brute-force throttle on password login (918d5c2)
  • auth: gate AUTH_DEV_BYPASS on NODE_ENV=development (1471e1b)
  • auth: hard-fail instead of failing open to anonymous admin (9fc371d)
  • container: run as non-root, gate Chromium sandbox behind env (7b8ef4a)
  • csrf: origin-check on cookie-authed state-changing requests (18e5710)
  • export: SSRF guard for remote images in render/export (1f91de2)
  • http: cap request-body size to prevent memory DoS (898606e)
  • media: confine LocalProvider keys to uploadsDir (6953fb2)
  • ssrf: block IPv4-mapped/compatible IPv6 in hex-group form (91b22b2)
  • uploads: serve user-uploaded SVG inert (stored-XSS fix) (a7b09f2)

Changed

  • export: embed images in parallel with a per-run dedupe cache (#223) (3bca65a)
  • list: downscale ImageKit thumbnail images to card size (Fase A, rest) (#289) (b1463c2)
  • list: front-page-perf follow-ups — slim payload, themed placeholder, warm-on-publish (58fa1f9)
  • list: front-page-perf follow-ups — slim payload, themed placeholder, warm-on-publish (5ca30f3)
  • list: lazy-render deck thumbnails with skeletons (front-page phase 1) (#287) (34da75d)
  • list: serve resized variants for local-upload thumbnails (Fase A deel 3) (39777a1)
  • list: serve resized variants for local-upload thumbnails (Fase A deel 3) (#292) (5b5f2f9)
  • list: server-rasterized PNG thumbnails for the deck grid (Fase B) (29ae4e2)
  • list: server-rasterized PNG thumbnails for the deck grid (Fase B) (2c72007)